首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >松露+ testrpc时间操作

松露+ testrpc时间操作
EN

Ethereum用户
提问于 2017-07-18 11:47:25
回答 2查看 4.9K关注 0票数 10

我使用块菌+ testrpc测试我的合同,我需要测试一些依赖时间的代码(我想这种情况很常见)。我设置了一些对象,检查了一些条件,然后我需要模拟时间转发来再次检查条件。

Testrpc实现了evm_increaseTime函数。我能用它做松露测试吗?如果是,它是否仅限于javascript书面测试?到目前为止,我只写了坚实的测试。

我不知道使用evm_increaseTime函数的最佳方法是什么,也不知道如何使用,尽管我确信很多人已经解决了这个问题。

EN

回答 2

Ethereum用户

回答已采纳

发布于 2017-07-18 13:10:34

您可以使用松露控制台的evm_increaseTime来调整下一个块的时间戳。下面是一个示例(来自这个答案):

代码语言:javascript
复制
> web3.eth.getBlock(web3.eth.blockNumber).timestamp
1500300000
> web3.currentProvider.send({jsonrpc: "2.0", method: "evm_increaseTime", params: [12345], id: 0})
{ id: 0, jsonrpc: '2.0', result: 12345 }
> web3.currentProvider.send({jsonrpc: "2.0", method: "evm_mine", params: [], id: 0})
> web3.eth.getBlock(web3.eth.blockNumber).timestamp
1500312345

这是不可能称为这从坚实的测试。通常的做法是重写nowblock.timestamp并手动更新它的值:

代码语言:javascript
复制
contract X {
  struct FakeBlock {
    uint timestamp;
  }

  FakeBlock block;

  uint now;

  function setBlockTime(uint val) {
    now = val;
    block.timestamp = val;
  }
}

注意,nowblock.timestamp的别名,但是当只覆盖其中一个时,另一个就不会更新。

票数 16
EN

Ethereum用户

发布于 2018-01-19 14:56:24

我在松露测试中使用齐柏林飞艇-固体功能。

代码语言:javascript
复制
const increaseTime = function(duration) {
  const id = Date.now()

  return new Promise((resolve, reject) => {
    web3.currentProvider.sendAsync({
      jsonrpc: '2.0',
      method: 'evm_increaseTime',
      params: [duration],
      id: id,
    }, err1 => {
      if (err1) return reject(err1)

      web3.currentProvider.sendAsync({
        jsonrpc: '2.0',
        method: 'evm_mine',
        id: id+1,
      }, (err2, res) => {
        return err2 ? reject(err2) : resolve(res)
      })
    })
  })
}
票数 8
EN
页面原文内容由Ethereum提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

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

复制
相关文章

相似问题

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