首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在铸造“锻造试验”中开采一个新区块

在铸造“锻造试验”中开采一个新区块
EN

Ethereum用户
提问于 2023-04-27 18:54:46
回答 1查看 108关注 0票数 3

我与一个使用blockhash(block.number -1)的函数有一个契约,我想测试它的值在挖掘了一个新块之后是否发生了变化。是否有办法在单元测试过程中以某种方式挖掘一个新块,或者使用Vm.sol来更改blockhash的返回值?

代码语言:javascript
运行
复制
import "forge-std/Test.sol"

contract MyContract {
  function someFunction() public returns (bytes32) {
    return blockhash(block.number - 1); // Using blockhash
  }
}

contract TestMyContract is Test {
  MyContract myContract;

  function setUp() public {
    myContract = new MyContract();
  }

  function testResultChange() public {
    bytes32 firstResult = myContract.someFunction();

    // <--- Is it possible to change something here?

    bytes32 secondResult = myContract.someFunction();

    assertFalse(firstResult == secondResult);
  }
}
EN

回答 1

Ethereum用户

发布于 2023-04-27 20:13:56

  1. 首先,有skiprewind,但它们只用于更改时间戳:https://book.getfoundry.sh/reference/forge-std/skip
  2. 本质上,问题似乎是整个测试是在一个事务中执行的,所以无论如何它都将是同一个块

我会尝试将计算和比较分成两个测试,伪编码如下:

代码语言:javascript
运行
复制
contract TestMyContract is Test {
  MyContract myContract;

  bytes32 lastResult;

  function setUp() public {
    myContract = new MyContract();
  }

  function testRecordResult() public {
    lastResult = myContract.someFunction();
  }

  function testResultChange() public {
    bytes32 newResult = myContract.someFunction();

    assertFalse(newResult == lastResult, "Value haven't changed");
  }
}

免责声明:我还没试过。

  1. 如果它不起作用,您可以查看ffi以将结果保存在链外,并检查两次不同的测试运行。

https://book.getfoundry.sh/forge/differential-ffi-testing?highlight=ffi#primer-the-ffi-cheatcode

  1. 另外,还有两种更有侵扰性的方法:
  • 您可能会考虑更改您的函数,以采用其他更易于更改的值,如block.timestampprevrandaomsg.sender等。
  • 使someFunction成为一个纯函数,并将块哈希作为参数传递。它保证它会改变,你不需要测试它。您想测试您的代码是否为不同的块提供了不同的值?当然,根据您的业务逻辑,可能会有一些不同。
票数 0
EN
页面原文内容由Ethereum提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://ethereum.stackexchange.com/questions/149571

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档