fcoin/test/util/reorg.js
2019-06-05 12:11:57 -07:00

64 lines
1.5 KiB
JavaScript

'use strict';
const assert = require('bsert');
const Chain = require('../../lib/blockchain/chain');
const CPUMiner = require('../../lib/mining/cpuminer');
/**
* Reorgs the chain to given height using miners.
* @param {Chain} chain chain
* @param {CPUMiner} cpu cpuminer
* @param {Number} height height
* @returns {Promise} null
*/
async function reorg(chain, cpu, height) {
assert(chain instanceof Chain);
assert(cpu instanceof CPUMiner);
assert(typeof height === 'number');
let tip1, tip2 = null;
for (let i = 0; i < height; i++) {
const job1 = await cpu.createJob(tip1);
const job2 = await cpu.createJob(tip2);
const blk1 = await job1.mineAsync();
const blk2 = await job2.mineAsync();
const hash1 = blk1.hash();
const hash2 = blk2.hash();
assert(await chain.add(blk1));
assert(await chain.add(blk2));
assert.bufferEqual(chain.tip.hash, hash1);
tip1 = await chain.getEntry(hash1);
tip2 = await chain.getEntry(hash2);
assert(tip1);
assert(tip2);
assert(!await chain.isMainChain(tip2));
}
const entry = await chain.getEntry(tip2.hash);
assert(entry);
assert.strictEqual(chain.height, entry.height);
const block = await cpu.mineBlock(entry);
assert(block);
let forked = false;
chain.once('reorganize', () => {
forked = true;
});
assert(await chain.add(block));
assert(forked);
assert.bufferEqual(chain.tip.hash, block.hash());
assert(chain.tip.chainwork.gt(tip1.chainwork));
}
module.exports = reorg;