我使用块菌+ testrpc测试我的合同,我需要测试一些依赖时间的代码(我想这种情况很常见)。我设置了一些对象,检查了一些条件,然后我需要模拟时间转发来再次检查条件。
Testrpc实现了evm_increaseTime函数。我能用它做松露测试吗?如果是,它是否仅限于javascript书面测试?到目前为止,我只写了坚实的测试。
我不知道使用evm_increaseTime函数的最佳方法是什么,也不知道如何使用,尽管我确信很多人已经解决了这个问题。
发布于 2017-07-18 13:10:34
您可以使用松露控制台的evm_increaseTime来调整下一个块的时间戳。下面是一个示例(来自这个答案):
> 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这是不可能称为这从坚实的测试。通常的做法是重写now或block.timestamp并手动更新它的值:
contract X {
struct FakeBlock {
uint timestamp;
}
FakeBlock block;
uint now;
function setBlockTime(uint val) {
now = val;
block.timestamp = val;
}
}注意,now是block.timestamp的别名,但是当只覆盖其中一个时,另一个就不会更新。
发布于 2018-01-19 14:56:24
我在松露测试中使用齐柏林飞艇-固体功能。
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)
})
})
})
}https://ethereum.stackexchange.com/questions/21509
复制相似问题