3

我有一个利用当前时间(now)的函数。合约作为一个整体是众筹代币,代币的成本因购买代币的日期和时间而异。

在测试智能合约时如何模拟不同的时间?例如,对于下面的代码,我想做单元测试,看看设置价格的代码是否正确,但我无法更改now.

now简单地将关键字替换为另一个临时测试变量,例如now_sim然后now_sim在模拟期间手动更改,这是一个很好的解决方案吗?

    if (now < (startTime + 1 days)) {
        currentPrice = safeDiv(safeMul(price, 80), 100);  // 20 % discount (x * 80 / 100)
    } 
    else if (now < (startTime + 2 days)) {
        currentPrice = safeDiv(safeMul(price, 90), 100);  // 10 % discount (x * 90 / 100)
    }
    else if (now < (startTime + 12 days)) {
        // 1 % reduction in the discounted rate from day 2 until day 12 (sliding scale per second)
        // 8640000 is 60 x 60 x 24 x 100 (100 for 1%) (60 x 60 x 24 for seconds per day)
        currentPrice = price - safeDiv(safeMul((startTime + 12 days) - now), price), 8640000);
    }
    else {
        currentPrice = price;
    }
4

1 回答 1

3

如果你使用 pyethereum 进行测试——我强烈推荐,它很可爱——你可以直接更改正在挖掘你的交易的模拟块的时间戳。

self.s = t.state()
self.s.block.timestamp = self.s.block.timestamp + 86400
self.s.mine(1)
some_val = your_contract.do_something(some_parameter)
self.assertEqual(some_val, whatever)

在这里查看一个工作示例(可能有点过时):https ://github.com/realitykeys/subjectivocracy/blob/master/contracts/test.py#L85

于 2017-04-10T09:30:02.663 回答