你好,可用 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;
}
}
该合约的交易信息为:
部署区块是 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()
结果: