{"content":{"title":"每日一学-day001","body":"*今天主要学习了ethers.js中provider和signer,如何通过provider和signer来构建一个合约实例，并调用合约的方法*\r\n\r\n# 一，ethers.js中如何构建合约实例并调用合约方法\r\n## 1，准备合约的地址和ABI\r\n```\r\nconst contractAddress = \"your contract address\";//合约地址\r\nconst contractABI = [];\r\n可以从合约部署文件的 artifacts/contracts/contractname/contractname.json 里面去找,是一个数组\r\n注：\r\n可以将合约ABI放在其他文件加，然后export出去\r\n```\r\n## 2，获得合约的provider或者signer\r\n### 1,JsonRpcProvider\r\n\r\n```\r\nconst provider = new ethers.providers.JsonRpcProvider('http://localhost:8545');//也可以用infura的URL\r\nconst signer = provider.getSigner();\r\n```\r\n### 2,web3Provider\r\n\r\n```\r\nconst provider = new ethers.providers.Web3Provider(window.ethereum);\r\nconst signer = provider.getSigner();\r\n\r\n注：\r\nwindow.ethereum是一个全局对象，他是由以太坊浏览器插件注入到其中，里面有一些常用的属性：\r\nrequest({ method, params })：这是一个用于发送 JSON-RPC 请求的函数。method是你想要调用的方法名，params是一个包含方法参数的数组。\r\nselectedAddress：这个属性包含了当前选中的账户的地址。如果用户  没有授权网页访问他们的账户，这个属性将为null。\r\nenable()：这个方法会弹出一个窗口，请求用户授权网页访问他们的账户。\r\nisMetaMask：这个属性是一个布尔值，如果 `window.ethereum` 是由 MetaMask 插件注入的，这个值将为 true。\r\n```\r\n\r\n## 3，生成合约的实例\r\n```\r\nconst contract = ethers.Contract(contractAddress,contractABI,provider);\r\n或者\r\nconst contract = ethers.Contract(contractAddress,contractABI,signer);\r\n注：\r\n如果只是查询这用provider就可以了，需要修改链上数据则需要用signer\r\n```\r\n## 4，调用合约的mint方法（假设合约有一个mint方法）\r\n```\r\nconst tx = await contract.mint(parameters,{\r\n    gasLimit:1000000,\r\n    gasPrice:ethers.utils.parseUints('10','gwei')，\r\n    value:ethers.utils.parseEther('1')//表示1 eth\r\n});\r\n注：\r\n这个{}对象里面包含一些可选的字段用户控制交易\r\ngasLimit:设置你愿意为这笔交易支付的最大gas数量\r\ngasPrice:设置你愿意为每个gas单位支付的价格\r\nvalue:设置你想要发送的以太币数量，这个参数只有在调用payable函数时有用\r\nnonce:设置交易的nonce,一般不用管\r\nchainId:设置交易的链ID，一般不用管\r\n```\r\n## 5，等待mint完成，返回交易结果\r\n```\r\nconst result = await tx.wait();//result这个对象包含了交易被挖矿后的信息\r\n```"},"author":{"user":"https://learnblockchain.cn/people/18943","address":"0xb9c0f50035bed4aebfd5e3508c48c9704a3af744"},"history":null,"timestamp":1712577493,"version":1}