ethers.js 智能合约对象

推特@Hita_DAO   DiscordHitaDAO

在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操作,即调用合约中viewpure的函数,而不能执行交易transaction。创建这两种Contract变量的方法有所不同:

  • 只读Contract:参数分别是合约地址,合约abiprovider变量(只读)。
const contract = new ethers.Contract(`address`, `abi`, `provider`);
  • 可读写Contract:参数分别是合约地址,合约abisigner变量。Signer签名者是ethers中的另一个类,用于签名交易,之后我们会讲到。
const contract = new ethers.Contract(`address`, `abi`, `signer`);

注意 ethers中的call指的是只读操作,与solidity中的call不同。