首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用介电常数模拟时间的推移

用介电常数模拟时间的推移
EN

Ethereum用户
提问于 2017-05-02 22:08:18
回答 4查看 5.9K关注 0票数 13

对于如何使用块菌在testrpc测试客户端上模拟真实的网络条件,有什么建议吗?我有一些功能,可以查看块号,并尝试处理传递时间。有没有人想出一个好办法来测试这类东西?

我想知道是否只是在循环中调用一些空事务,并相应地增加块号。任何关于这些事情的内部运作的信息都将不胜感激。

EN

回答 4

Ethereum用户

回答已采纳

发布于 2017-05-03 07:24:14

默认情况下,在testrpc中调用的每个事务都会立即被挖掘,并且块高度会增加。当使用命令行选项--blocktime启动testrpc时,挖掘每个块所需的时间可以设置为-b

此外,testrpc还提供了一个可以用来操作块高度的自定义rpc方法

evm_mine:强迫一个街区被开采。不需要参数。一个独立于是否开始或停止采矿的区块。

可以从web3中使用web3.currentProvider.sendAsync()调用Testrpc的自定义方法,如下所示:

代码语言:javascript
复制
web3.currentProvider.sendAsync({
  jsonrpc: "2.0",
  method: "evm_mine",
  id: 12345
}, function(err, result) {
  // this is your callback
});
票数 12
EN

Ethereum用户

发布于 2019-09-03 10:33:33

通过使用自己的包装器,我找到了一种编写时间精确测试的方法:

代码语言:javascript
复制
const { time } = require('openzeppelin-test-helpers');    

async function timeIncreaseTo (seconds) {
    const delay = 1000 - new Date().getMilliseconds();
    await new Promise(resolve => setTimeout(resolve, delay));
    await time.increaseTo(seconds);
}

我注意到Ganache-cli会在主机切换秒时切换EVM秒。因此,我增加了等待新的秒,然后增加了EVM的时间。因此,我有一个准确的秒来执行所有必要的事务和调用,直到EVM时间将被切换。

用法:

代码语言:javascript
复制
const { time } = require('openzeppelin-test-helpers');    

// Skip 10 sec to have exact 1 second
await timeIncreaseTo((await time.latest()).addn(10));

await this.contract.deposit(1000000);
const timeDeposited = await time.latest();

// Skip 1 year
await timeIncreaseTo(timeDeposited.add(time.duration.years(1)).subn(1));

expect(await this.contract.balanceOf(wallet)).to.be.bignumber.equal('1060000'); // +6%
await this.contract.withdrawAll();
票数 4
EN

Ethereum用户

发布于 2019-08-07 14:45:39

我写了一整篇关于这方面的文章:编写精确的随时间变化的信托测试

TLDR;

虽然我强烈建议你去看看(其中涉及到一些微妙之处),但下面是一个简短的故事。

在您的项目中执行npm install ganache-time-traveler或复制粘贴以下内容:

代码语言:javascript
复制
const advanceBlockAtTime = (time) => {
  return new Promise((resolve, reject) => {
    web3.currentProvider.send(
      {
        jsonrpc: "2.0",
        method: "evm_mine",
        params: [time],
        id: new Date().getTime(),
      },
      (err, _) => {
        if (err) {
          return reject(err);
        }
        const newBlockHash = web3.eth.getBlock("latest").hash;

        return resolve(newBlockHash);
      },
    );
  });
};
票数 3
EN
页面原文内容由Ethereum提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

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

复制
相关文章

相似问题

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