{"content":{"title":"ethers.js  v6使用！","body":"## 一、Provider 链接网络\r\nprovider就是用于链接网络的，链接到了EVM相关网络，查可以链上查询相关数据，也才能进行操作。\r\n### 1、BrowserProvider\r\n这种就是通过链接安装的浏览器插件钱包，钱包链接网络。\r\nMetaMask钱包就用这个就行。如果安装了MetaMask钱包，它会注入一个window.ethereum；\r\n```\r\n  let ethereum = (window as any).ethereum;\r\n  let provider = new BrowserProvider(ethereum);\r\n```\r\n如果安装了Ronin钱包，它会注入一个window.ronin。\r\n\r\n```\r\n  let ronin = (window as any).ronin;\r\n  let provider = new BrowserProvider(ronin.provider);\r\n```\r\n其他钱包应该也类似，都是注入了一个变量。\r\n\r\n调用provider.getSigner()方法，如果没有链接过钱包的话，会弹出链接钱包界面，链接成功以后可以获取钱包的地址，也可以发起签名请求和交易等\r\n\r\n请求签名：\r\n```\r\n (provider as BrowserProvider).getSigner().then((signer) =>{\r\n         console.log(\"r.address:\", signer.address)\r\n         signer.signMessage(\"我需要签名\")\r\n  })\r\n```\r\n\r\n发起交易：\r\n```\r\n (provider as BrowserProvider).getSigner().then((signer) =>{\r\n         console.log(\"r.address:\", signer.address)\r\n         signer.sendTransaction({\r\n          to: \"0xCe06B0A53b08C10fa508BF16D02bBdDc6961E3B3\",\r\n          value: parseEther(\"0.01\")\r\n        });\r\n  })\r\n```\r\n\r\n\r\n### 2、JsonRpcProvider\r\n可以通过传入RPC节点来链接网络，节点可以调用第三方的，比如infura，可以在infura上注册一个账号，每个网络都可以生成一个RPC URL，\r\n\r\n```\r\n provider = new JsonRpcProvider(\"https://goerli.infura.io/v3/xxxxxx\")\r\n```\r\n\r\n### 3、Provider的一些方法\r\n获取到链接网络的Provider后，就可以操作了，有很多方法，我大概介绍一下吧。\r\n\r\n（1）、getBalance 可以获取某个账号的链代币余额\r\n\r\n（2）、getNetwork 可以获取当前链接的网络信息\r\n\r\n（3）、getBlock 和 getBlockNumber获取区块信息\r\n\r\n（4）、getResolver、getAvatar、resolveName、lookupAddress则是查询ENS域名相关方法\r\n\r\n（5）、getTransaction、getTransactionResult、getTransactionReceipt、getTransactionCount则是用于查询交易相关信息。\r\n\r\n（6）、getSigner、listAccounts 是BrowserProvider专有的，getSigner上面说过了。\r\n\r\n\r\n\r\n## 二、Wallet 管理账号\r\nWallet主要是用来创建新账号，或者通过私钥助记词等导入账号\r\n\r\n### 1、创建一个钱包账号 Wallet.createRandom()\r\n\r\n```\r\n let w = Wallet.createRandom(provider);\r\n console.log(\"privateKey:\", w.privateKey)  //私钥\r\n console.log(\"address:\", w.address)  //地址\r\n console.log(\"phrase:\", w.mnemonic?.phrase)  //助记词\r\n```\r\n\r\n### 2、导入私钥获取钱包信息 new Wallet(privateKey)\r\n\r\n```\r\n let w = new Wallet(input_your_privateKey, provider)\r\n console.log(\"address:\", w.address)\r\n```\r\n\r\n### 3、导入助记词获取钱包信息 Wallet.fromPhrase(phrase)\r\n注意一下，助记词中间是有空格的哈。\r\n\r\n```\r\nlet w = Wallet.fromPhrase(input_your_phrase, provider)\r\nconsole.log(\"privateKey:\", w.privateKey)\r\nconsole.log(\"address:\", w.address)\r\n```\r\n\r\n### 4、一些方法\r\nw.sendTransaction 发送交易\r\nw.signMessage  发起签名\r\n   \r\n## 三、Contract\r\n\r\n### 1、new Contract() 调用合约\r\n需要传入合约地址，abi，以及signer\r\n```\r\n let contract = new Contract(合约地址, abi, signer)\r\n```\r\n**这里的signer可以是BrowserProvider.getSigner()方法获取到的signer，也可以是Wallet和HDNodeWallet，因为他们都继承自Signer。**\r\n### 2、调用合约方法\r\n调用这个合约上的读取方法，是不消耗gas的，如silidity的pure和view修饰的方法\r\n比如ERC20上面的balanceOf方法，symbol和decimals的get方法\r\n```\r\nlet sym = await contract.symbol()\r\nlet decimals = await contract.decimals()\r\nlet balance = await contract.balanceOf(signer.address)\r\nconsole.log(`balance: ${formatUnits(balance, decimals)} ${sym}`)\r\n```\r\n### 3、调用改变状态方法\r\n比如调用ERC20的转账transfer。\r\n```\r\nlet amount = parseUnits(\"1.0\", decimals)\r\nlet tx = await contract.transfer(\"0xCe06B0A53b08C10fa508BF16D02bBdDc6961E3B3\", amount)\r\nawait tx.wait()\r\n```\r\n\r\n### 4、监听事件\r\n监听Transfer事件\r\n```\r\ncontract.on(\"Transfer\", (from, to, amount, event) => { })\r\n```\r\n用* 可以监听所有事件\r\n\r\n```\r\ncontract.on(\"*\", (event) => { })\r\n```\r\n查询历史Transfer事件\r\n\r\n```\r\nlet filter = contract.filters.Transfer \r\nlet events = await contract.queryFilter(filter, -100)\r\n```"},"author":{"user":"https://learnblockchain.cn/people/15134","address":null},"history":null,"timestamp":1701677725,"version":1}