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
不同。