当我在 RSK Regtest 上开发时,如何提高块号?

Posted

技术标签:

【中文标题】当我在 RSK Regtest 上开发时,如何提高块号?【英文标题】:How to advance block number when I’m developing on RSK Regtest? 【发布时间】:2021-01-25 13:01:29 【问题描述】:

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

如何在上述松露(摩卡)测试中做到这一点?

【问题讨论】:

【参考方案1】:

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

但是,在 Regtest 中,这确实可能的:

(1)

使用evm_mine JSON-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.

这与以太坊开发者工具中使用的方法一致,例如甘纳许。

(2)

使用evm_increaseTime JSON-RPC方法增加block的时间:

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

【讨论】:

以上是关于当我在 RSK Regtest 上开发时,如何提高块号?的主要内容,如果未能解决你的问题,请参考以下文章

在 Windows 机器上运行 RSKj 节点时如何修复 LevelDB 库加载错误?

如何配置 truffle 以连接到 RSK 测试网公共节点?

如何在 RSK 上获取诸如 ERC20 代币符号之类的信息?

如何通过 websockets 在本地 RSK 节点上订阅“newBlockHeaders”?

如何查明 RSK 交易在 RSK 区块链上被确认的次数?

如何计算 RSK 上代币的总交易量?