在RSKRegtest上开发时如何提高块号?
我有一个智能合约,可以检查实际块编号是否高于执行某些功能的固定块编号,我需要编写一个单元测试来验证该行为。我在 Regtest 模式下使用 RSK 来执行测试,我需要增加块号而不实际等待时间过去。
智能合约使用区块编号,我需要增加区块编号,而无需实际等待时间过去。
context('once deployed', function () {
it('can only be released after cliff', async function () {
// TODO here I need to increment time or block number
await this.lockup.release();
});
)};
我怎样才能在像上面那样的松露(摩卡)测试中做到这一点?
回答
快速说明,强调这是不是可能在“实际” RSK blockchains(Mainnet和Testnet),因为它涉及到“假”开采。
然而,在Regtest,这是的确是可能的:
(1)
使用evm_mineJSON-RPC 方法挖掘区块。
function evmMine () {
return new Promise((resolve, reject) => {
web3.currentProvider.send({
jsonrpc: "2.0",
method: "evm_mine",
id: new Date().getTime()
}, (error, result) => {
if (error) {
return reject(error);
}
return resolve(result);
});
});
};
await evmMine(); // Force a single block to be mined.
这与以太坊开发工具中使用的方法一致,例如 Ganache。
(2)
使用evm_increaseTimeJSON-RPC 方法增加块的时间:
function evmIncreaseTime(seconds) {
return new Promise((resolve, reject) => {
web3.currentProvider.send({
method: "evm_increaseTime",
params: [seconds],
jsonrpc: "2.0",
id: new Date().getTime()
}, (error, result) => {
if (error) {
return reject(error);
}
return asyncMine().then( ()=> resolve(result));
});
});
}
await evmIncreaseTime(600); // Force block to be mined such that ~10 minutes has passed