ethers.js5:与智能合约交互

创建可写Contract变量

声明可写的Contract变量的规则:

const contract = new ethers.Contract(address, abi, signer)

其中address为合约地址,abi是合约的abi接口,signerwallet对象。注意,这里你需要提供signer,而在声明可读合约时你只需要提供provider

你也可以利用下面的方法,将可读合约转换为可写合约:

const contract2 = contract.connect(signer)

读取合约信息,它不需要gas。写入合约信息,需要构建交易,并且支付gas。该交易将由整个网络上的每个节点以及矿工验证,并改变区块链状态。

可以用下面方法方法进行合约交互:

// 发送交易
const tx = await contract.METHOD_NAME(args [, overrides])
// 等待链上确认交易
await tx.wait() 

其中METHOD_NAME为调用的函数名,args为函数参数,[, overrides]是可以选择传入的数据,包括:

  • gasPrice:gas价格
  • gasLimit:gas上限
  • value:调用时传入的ether(单位是wei)
  • no
  • nce:nonce

注意: 此方法不能获取合约运行的返回值,如有需要,要使用Solidity事件记录,然后利用交易收据去查询。

例子:与测试网WETH合约交互

WETH (Wrapped ETH)是ETH的带包装版本,将以太坊原生代币用智能合约包装成了符合ERC20的代币。

1、创建providerwallet变量。

import { ethers } from "ethers";

// 利用Infura的rpc节点连接以太坊网络
const INFURA_ID = '184d4c5ec78243c290d151d3f1a10f1d'
// 连接Rinkeby测试网
const provider = new ethers.providers.JsonRpcProvider(`https://rinkeby.infura.io/v3/${INFURA_ID}`)

// 利用私钥和provider创建wallet对象
const privateKey = '0x227dbb8586117d55284e26620bc76534dfbd2394be34cf4a09cb775d593b6f2b'
const wallet = new ethers.Wallet(privateKey, provider)

 2、

你可能感兴趣的:(智能合约)