专栏电商日志财经减肥爱情
投稿投诉
爱情常识
搭配分娩
减肥两性
孕期塑形
财经教案
论文美文
日志体育
养生学堂
电商科学
头戴业界
专栏星座
用品音乐

NO。7Web3世界使用Reactethers。js开发简单

  互联网的技术日新月异,互联网不断深入人们的生活;
  web3。0将是彻底改变人们生活的互联网形式;
  web3。0使所有网上公民不再受到现有资源积累的限制;
  具有更加平等地获得财富和声誉的机会。
  web3。0会从哪里开始呢?
  本合集文章,授权转载,侵权必究。
  Web3。0世界系列文章
  来源:代码与野兽
  【Web3系列文章】
  NO。1遇见Web3:在Web3的世界中写下第一行HelloWorld
  NO。2全面系统的Web3学习路线,助你成为Web3开发专家
  NO。3Web3世界:区块链、比特币、以太坊和智能合约
  NO。4RemixIDE使用与VSCode搭建Solidity开发环境
  NO。5深入聊聊Web3世界中的协议和硬盘:IPFS
  NO。6一文聊透Solidity语法:助你成为智能合约专家
  最近在开发一个NFT二创平台,其中包含了很多概念和技术。我会更新一个系列的文章来总结和沉淀在这个过程中的一些知识与思考。
  本文是对ethers。js进行一个全方位介绍,非常适合web3入门学习。什么是ethers。js?
  Web3中的各类DApp,都需要与智能合约进行交互。如果用原生JS来做这些事会很麻烦。这时就需要使用专属的SDK。
  目前JS环境中有两个主流的库可以用来和智能合约进行交互,一个是web3。js,另一个是ethers。js。ethers。jsVSweb3。js
  web3。js比ethers。js出现的更早。但是目前ethers。js更受欢迎。
  主要原因有如下两点:体积:ethers。js体积仅有116。5kb,web3。js有590。6kb。相差5倍左右。设计理念:由于设计理念不同。web3。js认为用户会在本地部署以太坊节点,私钥和网络连接状态由这个节点管理。但实际上大部分人都不会在本地部署以太坊节点。ethers。js充分考虑了这一点,它是用Provider管理网络连接状态,用Wallet管理密钥,更加安全和灵活。而且原生支持ENS。ethers。js基本使用介绍节点即服务
  由于在本地部署一个区块链节点的成本并不低,很少会有人真的部署一个节点,而是选择使用节点即服务。
  这类服务有很多,比如老牌的Alchemy、Infura、Moralis以及今年估值102亿美金的新秀Tenderly。
  在这里我们选择Alchemy,目前它的市场占有率是最高的。
  alchemy的网址在这:dashboard。alchemy。com。具体的注册登陆就不讲了。
  登陆之后我们创建一个App。
  Chain选择Ethereum,Network选择Goerli。
  这样就成功创建了一个App,点击后面的viewkey,就可以查看key。
  我们把它复制下来,后面会用到。
  构造合约
  在对合约进行读取或交互之前,我们首先需要构造一个合约对象。
  合约对象有三个构造参数,第一个是合约地址,是一个字符串。第二个是合约的abi,可以是一个JSON,第三个参数是provider对象,它用于管理网络连接状态。
  下面的例子中就是使用alchemy提供的JSONRPC接口作为网络连接。constrpchttps:ethgoerli。g。alchemy。comv2{process。env。NEXTPUBLICALCHEMYAPIKEY};constprovidernewethers。providers。JsonRpcProvider(rpc);constcontractnewethers。Contract(contractAddress,abi,provider)
  除了JsonRpcProvider以外,ethers还有IpcProvider、InfuraProvider、AlchemyProvider、Web3Provider等多种Provider。读取合约信息
  abi中的方法会直接挂载到contract对象上,我们可以直接调用。
  不过需要注意,所有的操作都是异步的。(async(){constownerawaitcontract。owner();console。log(owner);})();连接钱包
  由于和合约交互需要支付gas费用,所以必须有一个数字钱包。
  钱包有很多种,比如MetaMask、Rainbow、CoinbaseWallet等。其中MetaMask是最常用的一种数字钱包。
  这里主要介绍如何连接到MetaMask。
  MetaMask有一个浏览器插件,如果用户安装了该插件,在window对象下会有一个ethereum对象。我们可以调用ethereum。request方法发起请求,参数是一个对象,对象的method描述该次请求的操作。
  ethereum。request方法是异步的,会返回一个数组,该数组是所有登陆钱包的账户地址字符串,第一个账户就是当前激活的账户。如果返回的数组长度为0,则意味着没有登陆任何账户。(async(){constaccountsawaitethereum。request({method:ethrequestAccounts})if(accounts。length0){throwError(未登录任何账户)}constactiveAccountaccounts〔0〕console。log(activeAccount)})()
  我们还可以通过ethereum。request方法获取当前的网络状态。(async(){constchainIdawaitethereum。request({method:ethchainId})console。log(chainId)})()
  它会返回一个字符串。0x1表示以太网主网;0x5表示Goerli测试网,更多网络的chainId可以在这个网站查看:chainlist。org。
  下面是使用ethers。js来连接MetaMask的代码。(async(){constprovidernewethers。providers。Web3Provider(window。ethereum)constaccountsawaitprovider。send(ethrequestAccounts,〔〕)constactiveAccountaccounts〔0〕})()
  如果使用MetaMask作为provider,那么就不需要再使用alchemy了。钱包
  在转账交易之前,我们需要创建一个Wallet实例,它的作用是对交易和消息进行签名。
  创建Wallet对象的方法有三种。
  通过Wallet。createRandom创建随机钱包
  这种方式创建的是一个单机钱包,需要连接网络。constwalletethers。Wallet。createRandom()wallet。connect(provider)
  通过助记词创建constwalletnewethers。Wallet。fromMnemonic(mnenonic。phrase)
  通过私钥和provider创建constwalletnewethers。Wallet(privateKey,provider)钱包信息
  我们可以在创建好的钱包上面获取很多有用的信息,比如钱包地址、助记词、私钥、交易次数等。console。log(wallet。address)console。log(awaitwallet。getAddress())console。log(wallet。mnemonic)console。log(wallet。privateKey)console。log(wallet。getTransactionCount())转账
  一旦又了钱包,我们就可以向其他人发起转账交易。
  创建一个tx对象,它最少需要两个属性,to和value,分别表示接受钱包地址和转账额度。
  然后使用wallet。sendTransaction方法发送转账,它会返回一个receipt对象。这个对象有一个异步的wait方法,当交易上链后会返回。consttx{to:address,value:ethers。utils。parseEther(0。1),}console。log(开始转账)constreceiptawaitwallet。sendTransaction(tx)awaitreceipt。wait()console。log(完成转账)通过合约转账交易
  交易需要使用Wallet对象。再通过wallet作为合约的第三个构造参数创建Contract对象。
  调用合约的transfer方法,进行转账交易。该方法需要两个参数,转入的钱包地址字符串和转入的数量。
  transfer会返回一个tx对象,该对象有一个异步的wait方法,会在交易完成后执行。constwalletnewethers。Wallet(privateKey,provider)constcontractnewethers。Contract(contractAddress,abi,wallet)(async(){consttxawaitcontract。transfer(toAddress,ethers。utils。parseEther(1))awaittx。wait()})()通过signer进行转账
  通常我们无法直接拿到privateKey,但是可以通过signer对象间接使用privateKey。只需要进行签名就可以进行交易。这也是最常用的交易方式。constsignerwalletProvider。getSigner();consttx{to,value,};constreceiptawaitsigner。sendTransaction(tx);awaitreceipt。wait();使用React和ethers。js开发加密钱包
  接下来我们开发一个最简单的加密钱包,具备最基础的转账功能和查询余额功能。创建项目
  我们首先创建一个Next。js项目。npxcreatenextapp
  需要选择TypeScript。安装依赖安装ethers。jsnpmiethers安装tailwindcssnpminstallDtailwindcsspostcssautoprefixernpxtailwindcssinitp
  修改tailwind。cinfig。js。type{import(tailwindcss)。Config}module。exports{content:〔。pages。{js,ts,jsx,tsx},。components。{js,ts,jsx,tsx},〕,theme:{extend:{},},plugins:〔〕,}
  修改stylesglobals。css。tailwindbase;tailwindcomponents;tailwindutilities;安装headlessuinpminstallheadlessuireact整体架构设计
  由于业务并不复杂,我们可以将它简单划分为几个组件。使用Context足够应对这个场景,而不需要额外导入状态管理库来增加复杂性。
  Wallet是根组件,内部维护了很多state,以Context的方式将数据和操作注入到子组件。
  Connect负责连接钱包和断开连接。
  Details负责显示钱包信息,是纯展示型组件。
  Transfer负责向其他账户进行转账。
  Loading负责渲染加载动画,是纯展示型组件。创建上下文typeIWalletCtx{walletProvider:any;setWalletProvider:(walletProvider:any)void;msgIsOpen:boolean;setMsgIsOpen:(msgIsOpen:boolean)void;msg:string;setMsg:(msg:string)void;account:string;setAccount:(account:string)void;networkName:string;setNetworkName:(networkName:string)void;balance:string;setBalance:(balance:string)void;showMessage:(message:string)void;refresh:boolean;setRefresh:(refresh:boolean)void;};constWalletCtxcreateContextIWalletCtx({}asIWalletCtx);
  通过初始化一个对象,然后断言为IWalletCtx的方式,可以避免在使用WalletCtx时添加是否为undefined或null的判断。因为我们一定会注入数据。Loading组件
  Loading作为纯展示型组件,是最简单的组件。SVG的代码是直接从tailwindcss文档中搬运过来的。仅仅是添加了一个size属性,用来展示不同大小的尺寸。functionLoading({sizemd}:{size?:smmdlgxl}){constsizes{sm:h3w3,md:h5w5,lg:h7w7,xl:h9w9,};return(svgclassName{animatespinml1mr3{sizes〔size〕}textblack}xmlnshttp:www。w3。org2000svgfillnoneviewBox002424circleclassNameopacity25cx12cy12r10strokecurrentColorstrokeWidth4circlepathclassNameopacity75fillcurrentColordM412a8800188V0C5。373005。373012h4zm25。291A7。9627。962001412H0c03。0421。1355。82437。938l32。647zpathsvg);}Wallet组件
  在Wallet组件中创建这些state,并注入到context中。exportdefaultfunctionWallet(){const〔walletProvider,setWalletProvider〕useState(null);const〔msgIsOpen,setMsgIsOpen〕useState(false);const〔msg,setMsg〕useState();const〔account,setAccount〕useStatestring();const〔networkName,setNetworkName〕useStatestring();const〔balance,setBalance〕useStatestring();const〔refresh,setRefresh〕useStateboolean(false);useEffect((){setWalletProvider(newethers。providers。Web3Provider(window。ethereum));},〔〕);constshowMessage(message:string){setMsg(message);setMsgIsOpen(true);setTimeout((){setMsg();setMsgIsOpen(false);},2000);};return(WalletCtx。Providervalue{{walletProvider,setWalletProvider,msgIsOpen,setMsgIsOpen,msg,setMsg,account,setAccount,networkName,setNetworkName,balance,setBalance,showMessage,refresh,setRefresh,}}Dialogopen{msgIsOpen}as{p}onClose{()setMsgIsOpen(false)}Dialog。PanelclassNameinlineflexflexcolbggreen400textslate600p4shadowxlrounded3xlDialog。Title{msg}Dialog。TitleDialog。PanelDialogConnectDetailsTransferWalletCtx。Provider);}
  Wallet组件基本上没有什么逻辑,它的主要作用有三个:向context注入数据。创建ethers。provider。使用Dialog组件作为全局消息提示。Connect组件
  在stylesglobals。css中添加按钮样式。layercomponents{。btn{applybgblacktextwhitepy2px4rounded3xl;}}
  在index。tsx中编写逻辑。functionConnect(){const{walletProvider,account,setAccount,setNetworkName,setBalance,showMessage,refresh,}useContext(WalletCtx);constrefreshBalanceuseCallback(async(){if(!walletProvider!account)return;constbalanceawaitwalletProvider。getBalance(account);setBalance(ethers。utils。formatEther(balance));},〔setBalance,walletProvider,account〕);useEffect((){refreshBalance();},〔refresh,refreshBalance〕);constconnectToMetamaskasync(){try{awaitwindow。ethereum。enable();constaccountsawaitwalletProvider。send(ethrequestAccounts,〔〕);constnetworkawaitwalletProvider。getNetwork();constbalanceawaitwalletProvider。getBalance(accounts〔0〕);setAccount(accounts〔0〕);setNetworkName(network。name);setBalance(ethers。utils。formatEther(balance));}catch(error){console。log(error);showMessage(failedtoconnecttometamask);}};constdisconnectasync(){setAccount();};if(!account){return({walletProvider?(buttonclassNamebtnonClick{connectToMetamask}connecttometamaskbutton):(Loading)});}return(h1classNametextendHello,{account}h1buttonclassNamebtnonClick{disconnect}disconnectbutton);}
  我们连接钱包后会获取3个重要的信息:钱包账户地址、连接的网络和余额。
  分别通过walletProvider。listAccounts()、walletProvider。getNetwork()和walletProvider。getBalance(accounts〔0〕)来获取,需要注意它们都是异步操作。Details组件
  Details作为纯展示型组件没有什么逻辑,主要是一些样式。functionDetails(){const{account,networkName,balance}useContext(WalletCtx);if(!account){returnnull;}return(balancenetwork:{networkName}{balance}ETH);}
  现在我们看一下Connect和Details组件一起使用的效果。
  Transfer组件
  Transfer的功能比较简单,它在UI上仅仅包含两个输入框和一个send按钮。
  两个输入框分别可以输入to和value,表示转账的钱包地址和转账金额。functionTransfer(){const{walletProvider,account,showMessage,refresh,setRefresh}useContext(WalletCtx);const〔to,setTo〕useStatestring();const〔amount,setAmount〕useStatestring();const〔transferring,setTransferring〕useStateboolean(false);consttransferasync(){try{constvalueethers。utils。parseEther(amount);constsignerwalletProvider。getSigner();consttx{to,value,};setTransferring(true);constreceiptawaitsigner。sendTransaction(tx);awaitreceipt。wait();setTo();setAmount();showMessage(successfullytransferred);}catch(error){console。log(error);showMessage(failedtotransfer);}finally{setTransferring(false);setRefresh(!refresh);}};if(!account){returnnull;}return(Transfer{transferring?(transferring。。。Loadingsizexl):(inputclassNameinputvalue{to}onInput{(e:any)setTo(e。target。value)}typetextplaceholderaddressinputclassNameinputvalue{amount}onInput{(e:any)setAmount(e。target。value)}typenumberplaceholderamountbuttonclassNamebtnonClick{transfer}sendbutton)});}
  转账是通过signer。sendTransaction方法进行的,它会返回收据对象receipt。
  在转账时使用到了ethers。utils。parseEther,因为value默认的单位是wei,它非常小,10的18次方才是一个ehter。在JS中需要使用BigInt类型表示,并不方便操作,而我们更喜欢用ether来描述货币。所以这个API可以帮我们转换货币单位。
  需要注意,在测试时需要选择goerli网或者其他测试网,否则会浪费gas费。
  你至少要有两个钱包账户,这样可以从一个钱包账户转到另一个钱包账户。
  下面我们来测试一下转账。
  这时MetaMask钱包会弹出来签名界面。
  点击确认后,需要等待一段时间上链,大约1分钟,或者更久。
  转账成功后,当前账户的余额会刷新。
  完成
  现在一个简单的加密钱包就完成了。通过这个项目的学习,相信你已经学会了ethers。js常规API的使用。
  源码链接:https:github。comluzhenqianweb3examples
  线上地址:web3examples。vercel。app
  web3。0生态系统
  Web3世界非常精彩。
  如果你对Web3感兴趣,右上角记得加个关注。
  我会持续更新更多Web3相关的高质量文章。
  头条创作挑战赛web3。0

韶山军博园项目顺利推进预计11月开园接待游客红网时刻韶山频道讯(全媒体记者杨扬成瑶)日前,记者从韶山市文旅兴城建设指挥部了解到,韶山市文旅兴城重点项目韶山军博园项目总体进展顺利,预计可于11月开园接待游客。韶山军博园项目位于海口交通又要大爆发,靠谱率怎样,如何影响我们的生活海口的交通,又出新规划了!10月10日,海口市综合交通体系规划(含枢纽规划)(20202035年)公示。(以下简称规划)。规划透露了海口多项交通策略,涉及高铁快速路轨道交通铁路等规诗溢天路,畅享乡情潍坊这些村子里藏着远方天虹飞入彩云间,秋色映满山外山。秋天的天路,浓浓秋思,满目斑斓,伴着山峦田野古村银杏炊烟止不住的诗情画意,刹那之间潍坊就变成了童话世界。安丘天路秋色如画,五彩缤纷。移步异景,似走入云开雾散!让我们相约青木川云开雾散终有时风雨过后是晴天2022年国庆青木川迎来了一场秋雨缠绵的细雨不断落下给静谧的古镇增添了几分诗意一夜之间,烟雨笼罩着青木川古镇此时此刻,已然拨云见日久违的朝阳播洒在古镇的在对话中增进相互理解能守护两处世界文化遗产,我感到非常荣幸。故宫博物院院长王旭东代表曾在敦煌莫高窟工作了28年。在30多年的文物保护工作经历中,王旭东曾参与或主持多个国际合作项目。在与不同国家同行的交最美的秋色,藏在每一片秋叶里几场秋雨过境,沈城到处都弥漫着秋天的香气。有秋菊装点的巷陌里,过往的路人闻到了今秋第一缕菊香放学回家的孩童,被街边甜甜的糖炒栗子绊住了脚步越来越高的云朵之下,两片似火的枫叶竞相探出我们的十年曲阜孔繁鹏说在口中的史书,越来越耐听记者易雪康岩通讯员张艳孔大儒宋大壮游客步入景区,要想真正领略这里的文化,单靠提前做功课人生感悟显然力不从心。一个好的讲解员让人受益匪浅,尤其是在孔子故里曲阜,讲解员还是一位优秀传统全球最受欢迎的爱尔兰威士忌TOP10,哪一款最得你心?提起爱尔兰威士忌你能想起什么?在鸡尾酒爱好者的眼里,爱尔兰威士忌是一杯香浓的爱尔兰咖啡。它让人们在冰天雪地中暖透全身,我们在意的是那片温暖的爱尔兰柔情。无论在爱尔兰的什么地方游览,第三波来了,杭州人今天大喜是真的昨天咱们就告诉大家杭州第三波桂花已经呼之欲出这次势必满城飘香,让大家满意而随着昨天气温再次升高今天,桂花开得更旺盛了!网友也很惊喜第三波,是真的要来了趁着天气好西湖边的赏桂人也很多麟游县文化馆专栏讲好麟游故事,传承优秀文化(第十五期)麟游县文化馆专栏讲好麟游故事,传承优秀文化(第十五期)为迎接党的二十大胜利召开,传承和发扬中华民族优秀文化,让文旅融合得到全面提升,麟游县文化馆特推出线上讲好麟游故事,传承优秀文化周恩来民族区域自治有利于民族团结和共同进步(一九五七年三月二十五日)这次座谈会开得好,收获很大,各方面的意见都听到了。在个别具体问题上,少数人的意见有些出入,这是难免的,因为各人从不同的角度看问题,意见总会有出入的。可是在
语文教师的基本功是什么?我是一名有二十年左右工作经验的小学语文老师。我认为语文教师的基本功对于自己教学是十分重要的。语文教师的基本功是什么呢?具体有以下几个方面一是三字,具体是钢笔字粉笔字毛笔字。我记得印尿酸高到什么程度会引发痛风?具体的说尿酸高的人可能一辈子不会发生痛风,然而痛风的人一定是尿酸高的人。也就是说尿酸高是痛风的生化基础。很多人是无症状的高尿酸血症,只有发生关节炎症状时,才能成为痛风。但并不是所有血脂高为什么让吃药三个月再复检是什么意思?有高血脂问题,医生让吃药控制,还要三个月后复查,复查什么?为什么要复查?对于这样的问题,如果医生不说明白,病人确实会一头雾水,今天就这个问题来给大家介绍下高血脂服药调理的那些事儿。有些成年人,什么保险都没买,只买了社保。你怎么看?感谢邀请,更感谢楼主的提问。楼主你好,有些成年人什么保险都没有买,只买了社保,你怎么看这个问题?我觉得这是非常正常的。比如说像我确实什么保险基本上都是没有购买的,但是我依然拥有一份你们见过最不听话的小孩儿是怎样的?我见过一个,20年前,吃饭要坐到桌子上。主要原因,前面生了一个女孩,二胎是个男孩,爸妈宠爱得不得了。然后就出现这种情况了。现在这个孩子已经长大成家了。素质一般,但生活还可以。最不听有没有好的免费的影视网站推荐?要说影视网站那可是有很多很多,但是大部分都需要会员,因为现在是产权保护的年代。当然也有很多的免费的网站,废话我就不多说了,直接看图。我先给你介绍一个叫莉莉影院的网站。它里面既有最新联想负债率高达百分之九十,为什么还能正常运行?其实仔细看一看联想集团,就能发现这个全球最大的电脑组装公司,真正的业务也没赚多少钱,研发也没啥投入,研发经费的比例很低。联想真正利润的来源,可不一定是业务赚到的,有可能是通过金融放山西太行山哪里有好玩的且不收门票?前几天和家人自驾游览了山西平顺县井底村。井底村座落在大山深处,平均气温比市内要低5到6度,我们一行7人,把车到停在了半山中的一处景观台,然后徒步穿越挂壁公路,一路景色不断,悬崖峭壁2021双十一冰箱哪款好?前段时间我在天猫购买的TCL650升大容量养鲜冰箱R650T1S,是一款非常值得购买的保鲜冰箱。第一眼看到这款冰箱的时候没想到有这么大容量,因为这款冰箱看起来并不很大,尤其厚度和普北京到哈尔滨大广和京哈哪个好走?现在应该差不多了吧?以前我去北京都是走G1京哈高速,之前几年里四平站都是个堵点,不论什么时候都是要堵上一个小时左右。而且出辽宁境时也容易堵车。大广G45本人只跑过哈尔滨大庆内蒙古这哈尔滨有哪些五星级酒店?哈尔滨最早的五星级酒店是位于道里区友谊路555号的香格里拉大酒店,这家酒店建于1999年,2016年进行了重新装修。酒店地理位置优越,毗邻松花江畔,沿着江边散步去哈尔滨的防洪纪念塔
友情链接:快好找快生活快百科快传网中准网文好找聚热点快软网