5 ethers根据区块号调用合约数据?

我看viem有这功能,传入区块号,可以调用合约当时区块的函数,获取数据。ethers没有看到,请问有这个功能吗?

请先 登录 后评论

最佳答案 2024-05-23 20:27

你好,可用 contract.methodName({blockTag: blockNumber})去调用某一区块的数据。

我现在部署SetNumber在sepolia测试网上。

// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.0;

contract SetNumber {

    address public owner;
    uint256 public number;

    // 构造函数,设置合约拥有者
    constructor() {
        owner = msg.sender;
    }

    // 仅限拥有者的修饰器
    modifier onlyOwner() {
        require(msg.sender == owner, "Only the owner can call this function");
        _;
    }

    // 自毁函数,仅限拥有者调用
    function setNumber(uint256 _number) external onlyOwner {
        number = _number;
    }
}

该合约的交易信息为:

image.png

部署区块是 5959517。

现在我调用setNumber(uint256 _number),并传入99,修改number。

之后我可以通过await contract.number({blockTag: 5959517})去调用原先的部署区块时合约的数据。

脚本如下:


const contract = new ethers.Contract(contractAddr, contractAbi, wallet);

async function main() {

    let number = ethers.utils.formatUnits(await contract.number());
    console.log(`number is :${number}`);

    let numberInitState = ethers.utils.formatUnits(await contract.number({blockTag: 5959517}));
    console.log(`numberInitState is :${numberInitState}`);

}

main()

结果:

image.png

请先 登录 后评论

其它 1 个回答

Tiny熊
  擅长:智能合约,以太坊
请先 登录 后评论
  • 2 关注
  • 0 收藏,1222 浏览
  • AlbertLiu 提出于 2024-05-13 16:16