使用 etherjs 创建数据交易

Create a transaction with data using etherjs

我正在研究 Solidity,我想了解如何与 smartcotnract 和 etherjs 进行交互。

我有一个像这样的简单函数:

function buyNumber(uint256 _number) public payable {
      
      
      if(msg.value < 0.1 ether){
        revert("more eth!");
      }

      ...todoStuff

    }

而且我有测试

 const tx = {
        from: owner.address,
        to: myContract.address,
        value: ethers.utils.parseEther('0.1'),
        data: '0x4b729aff0000000000000000000000000000000000000000000000000000000000000001'
      }

      let sendTx = await owner.sendTransaction(tx);

      console.log(sendTx)

现在,交易成功了,因为我得到 0x4b729aff0000000000000000000000000000000000000000000000000000000000000001 函数签名和参数

 let iface = new ethers.utils.Interface(ABI)
 iface.encodeFunctionData("buyNumber", [ 1 ])
0x4b729aff0000000000000000000000000000000000000000000000000000000000000001

我可以用简单的方法得到相同的结果吗?我如何在我的合同中使用参数调用函数?我可以将 msg.value 作为参数,但我更喜欢使用较少的参数

您可以使用 ethers Contract 助手 class,它允许根据提供的合同 ABI JSON 以更 developer-friedly 的方式调用其方法。

它在后台与您的脚本执行相同的操作 - 将函数调用编码为 data 值。

const contract = new ethers.Contract(contractAddress, abiJson, signerInstance);

// the Solidity function accepts 1 param - a number
// the last param is the `overrides` object - see docs below
await contract.buyNumber(1, {
    value: ethers.utils.parseEther('0.1')
});

您还可以使用 overrides 对象来指定 non-default 交易参数。比如它的value(默认值为0)。