Как увеличить номер блока при разработке на RSK Regtest?

У меня есть смарт-контракт, который проверяет, больше ли фактический номер блока, чем фиксированный, для выполнения определенных функций, и мне нужно написать модульный тест для проверки этого поведения. Я использую RSK в режиме Regtest для выполнения тестов, и мне нужно будет увеличить номер блока, фактически не дожидаясь истечения времени.

Смарт-контракт использует номер блока, и мне нужно увеличить номер блока, фактически не дожидаясь истечения времени.

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();
   });
)};

Как я могу сделать это в тесте на трюфель (мокко), подобном приведенному выше?


person Owans    schedule 25.01.2021    source источник


Ответы (1)


Небольшое замечание: подчеркнем, что это невозможно в реальных блокчейнах RSK (Mainnet и Testnet), так как это связано с фальшивым майнингом.

Однако в 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.

Это согласуется с подходом, используемым в инструментах разработчика Ethereum, например. Ганаш.

(2)

Используйте метод evm_increaseTime JSON-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
person bguiz    schedule 25.01.2021