ethers.js 智能合约对象
在Ethers.js中,创建一个智能合约对象通常需要使用提供者(Provider)、合约地址和ABI。以下是一个创建智能合约对象的例子
// 引入ethers
const { ethers } = require("ethers");
// 创建提供者(使用Infura或者Alchemy等)
const provider = new ethers.providers.JsonRpcProvider("https://mainnet.infura.io/v3/YOUR_INFURA_PROJECT_ID");
在ethers中,Contract类是部署在以太坊网络上的合约(EVM字节码)的抽象。通过它,开发者可以非常容易的对合约进行读取call和交易transaction,并可以获得交易的结果和事件。以太坊强大的地方正是合约,所以对于合约的操作要熟练掌握。
// 合约ABI
const contractAbi = [
// 这里是合约的ABI数组,包含了函数、事件等定义
];
// 合约地址
const contractAddress = "0x1234567890123456789012345678901234567890";
// 创建智能合约对象
const contract = new ethers.Contract(contractAddress, contractAbi, provider);
在这个例子中,contractAbi是一个包含了合约所有函数和事件的定义的数组,contractAddress是合约在区块链上的地址,provider是一个提供者实例,用于与区块链网络进行通信。 通过ethers.Contract构造函数创建的contract对象可以用来调用合约的函数。
只读和可读写Contract
Contract对象分为两类,只读和可读写。只读Contract只能读取链上合约信息,执行call操作,即调用合约中view和pure的函数,而不能执行交易transaction。创建这两种Contract变量的方法有所不同:
- 只读
Contract:参数分别是合约地址,合约abi和provider变量(只读)。
const contract = new ethers.Contract(`address`, `abi`, `provider`);
- 可读写
Contract:参数分别是合约地址,合约abi和signer变量。Signer签名者是ethers中的另一个类,用于签名交易,之后我们会讲到。
const contract = new ethers.Contract(`address`, `abi`, `signer`);
注意 ethers中的call指的是只读操作,与solidity中的call不同。