7

我有一个智能合约,它检查实际块号是否高于固定块号以执行某些功能,我需要编写一个单元测试来验证该行为。我在 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();
   });
)};

我怎样才能在像上面这样的松露(摩卡)测试中做到这一点?

4

1 回答 1

7

快速说明,强调这在“实际”RSK 区块链(主网和测试网)中是不可能的,因为它涉及“假”挖掘。

但是,在 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
于 2021-01-25T13:08:45.280 回答