test: block sigops tests.

This commit is contained in:
Christopher Jeffrey 2017-02-01 23:00:38 -08:00
parent 5b1966a6c3
commit 0f1a62b0de
No known key found for this signature in database
GPG Key ID: 8962AB9DE6666BBD
7 changed files with 93 additions and 11 deletions

View File

@ -8,6 +8,8 @@ var Headers = require('../lib/primitives/headers');
var MerkleBlock = require('../lib/primitives/merkleblock');
var CoinView = require('../lib/coins/coinview');
var Coin = require('../lib/primitives/coin');
var Coins = require('../lib/coins/coins');
var UndoCoins = require('../lib/coins/undocoins');
var consensus = require('../lib/protocol/consensus');
var Script = require('../lib/script/script');
var encoding = require('../lib/utils/encoding');
@ -21,6 +23,37 @@ var cmpct2block = fs.readFileSync(__dirname + '/data/cmpct2.bin');
cmpct1 = cmpct1.trim().split('\n');
cmpct2 = cmpct2.trim();
function applyUndo(block, undo) {
var view = new CoinView();
var i, j, tx, input, prev, coins;
for (i = block.txs.length - 1; i > 0; i--) {
tx = block.txs[i];
for (j = tx.inputs.length - 1; j >= 0; j--) {
input = tx.inputs[j];
prev = input.prevout.hash;
if (!view.has(prev)) {
assert(!undo.isEmpty());
if (undo.top().height === -1) {
coins = new Coins();
coins.hash = prev;
coins.coinbase = false;
view.add(coins);
}
}
undo.apply(view, input.prevout);
}
}
assert(undo.isEmpty(), 'Undo coins data inconsistency.');
return view;
}
describe('Block', function() {
var mblock, raw, block, raw2;
@ -240,7 +273,7 @@ describe('Block', function() {
assert(headers.verify());
});
it('should handle compact block', function(cb) {
it('should handle compact block', function() {
var block = Block.fromRaw(cmpct1[1], 'hex');
var cblock1 = bip152.CompactBlock.fromRaw(cmpct1[0], 'hex');
var cblock2 = bip152.CompactBlock.fromBlock(block, false, cblock1.keyNonce);
@ -275,11 +308,9 @@ describe('Block', function() {
assert.equal(
cblock1.toBlock().toRaw().toString('hex'),
block.toRaw().toString('hex'));
cb();
});
it('should handle half-full compact block', function(cb) {
it('should handle half-full compact block', function() {
var block = Block.fromRaw(cmpct1[1], 'hex');
var cblock1 = bip152.CompactBlock.fromRaw(cmpct1[0], 'hex');
var cblock2 = bip152.CompactBlock.fromBlock(block, false, cblock1.keyNonce);
@ -331,11 +362,9 @@ describe('Block', function() {
assert.equal(
cblock1.toBlock().toRaw().toString('hex'),
block.toRaw().toString('hex'));
cb();
});
it('should handle compact block', function(cb) {
it('should handle compact block', function() {
var block = Block.fromRaw(cmpct2block);
var cblock1 = bip152.CompactBlock.fromRaw(cmpct2, 'hex');
var cblock2 = bip152.CompactBlock.fromBlock(block, false, cblock1.keyNonce);
@ -368,11 +397,9 @@ describe('Block', function() {
assert.equal(
cblock1.toBlock().toRaw().toString('hex'),
block.toRaw().toString('hex'));
cb();
});
it('should handle half-full compact block', function(cb) {
it('should handle half-full compact block', function() {
var block = Block.fromRaw(cmpct2block);
var cblock1 = bip152.CompactBlock.fromRaw(cmpct2, 'hex');
var cblock2 = bip152.CompactBlock.fromBlock(block, false, cblock1.keyNonce);
@ -420,7 +447,62 @@ describe('Block', function() {
assert.equal(
cblock1.toBlock().toRaw().toString('hex'),
block.toRaw().toString('hex'));
});
cb();
it('should count sigops for block 928828 (testnet)', function() {
var blockRaw = fs.readFileSync(__dirname + '/data/block928828.raw');
var undoRaw = fs.readFileSync(__dirname + '/data/undo928828.raw');
var block = Block.fromRaw(blockRaw);
var undo = UndoCoins.fromRaw(undoRaw);
var view = applyUndo(block, undo);
var sigops = 0;
var flags = Script.flags.VERIFY_P2SH | Script.flags.VERIFY_WITNESS;
var i, tx;
for (i = 0; i < block.txs.length; i++) {
tx = block.txs[i];
sigops += tx.getSigopsCost(view, flags);
}
assert.equal(sigops, 23236);
assert.equal(block.getWeight(), 2481560);
});
it('should count sigops for block 928927 (testnet)', function() {
var blockRaw = fs.readFileSync(__dirname + '/data/block928927.raw');
var undoRaw = fs.readFileSync(__dirname + '/data/undo928927.raw');
var block = Block.fromRaw(blockRaw);
var undo = UndoCoins.fromRaw(undoRaw);
var view = applyUndo(block, undo);
var sigops = 0;
var flags = Script.flags.VERIFY_P2SH | Script.flags.VERIFY_WITNESS;
var i, tx;
for (i = 0; i < block.txs.length; i++) {
tx = block.txs[i];
sigops += tx.getSigopsCost(view, flags);
}
assert.equal(sigops, 10015);
assert.equal(block.getWeight(), 3992391);
});
it('should count sigops for block 1087400 (testnet)', function() {
var blockRaw = fs.readFileSync(__dirname + '/data/block1087400.raw');
var undoRaw = fs.readFileSync(__dirname + '/data/undo1087400.raw');
var block = Block.fromRaw(blockRaw);
var undo = UndoCoins.fromRaw(undoRaw);
var view = applyUndo(block, undo);
var sigops = 0;
var flags = Script.flags.VERIFY_P2SH | Script.flags.VERIFY_WITNESS;
var i, tx;
for (i = 0; i < block.txs.length; i++) {
tx = block.txs[i];
sigops += tx.getSigopsCost(view, flags);
}
assert.equal(sigops, 1298);
assert.equal(block.getWeight(), 193331);
});
});

BIN
test/data/block1087400.raw Normal file

Binary file not shown.

BIN
test/data/block928828.raw Normal file

Binary file not shown.

BIN
test/data/block928927.raw Normal file

Binary file not shown.

BIN
test/data/undo1087400.raw Normal file

Binary file not shown.

BIN
test/data/undo928828.raw Normal file

Binary file not shown.

BIN
test/data/undo928927.raw Normal file

Binary file not shown.