test: add coins test.
This commit is contained in:
parent
db85d6db18
commit
fc2827a5bd
@ -222,7 +222,7 @@ describe('Chain', function() {
|
||||
assert.equal(yield addBlock(attempt), 'bad-txns-inputs-missingorspent');
|
||||
}));
|
||||
|
||||
it('should fail to connect block with coins on an alternate chain', co(function* () {
|
||||
it('should fail to connect coins on an alternate chain', co(function* () {
|
||||
var block = yield chain.db.getBlock(tip1.hash);
|
||||
var cb = block.txs[0];
|
||||
var mtx = new MTX();
|
||||
|
||||
139
test/coins-test.js
Normal file
139
test/coins-test.js
Normal file
@ -0,0 +1,139 @@
|
||||
'use strict';
|
||||
|
||||
var assert = require('assert');
|
||||
var util = require('../lib/utils/util');
|
||||
var encoding = require('../lib/utils/encoding');
|
||||
var crypto = require('../lib/crypto/crypto');
|
||||
var consensus = require('../lib/protocol/consensus');
|
||||
var Network = require('../lib/protocol/network');
|
||||
var TX = require('../lib/primitives/tx');
|
||||
var Block = require('../lib/primitives/block');
|
||||
var Coin = require('../lib/primitives/coin');
|
||||
var Output = require('../lib/primitives/output');
|
||||
var Script = require('../lib/script/script');
|
||||
var Witness = require('../lib/script/witness');
|
||||
var Input = require('../lib/primitives/input');
|
||||
var Outpoint = require('../lib/primitives/outpoint');
|
||||
var CoinView = require('../lib/coins/coinview');
|
||||
var Coins = require('../lib/coins/coins');
|
||||
var UndoCoins = require('../lib/coins/undocoins');
|
||||
var StaticWriter = require('../lib/utils/staticwriter');
|
||||
var BufferReader = require('../lib/utils/reader');
|
||||
var KeyRing = require('../lib/primitives/keyring');
|
||||
var parseTX = require('./util/common').parseTX;
|
||||
var opcodes = Script.opcodes;
|
||||
|
||||
var data = parseTX('data/tx1.hex');
|
||||
var tx1 = data.tx;
|
||||
|
||||
function collect(coins) {
|
||||
var outputs = [];
|
||||
var i;
|
||||
|
||||
for (i = 0; i < coins.outputs.length; i++) {
|
||||
if (!coins.isUnspent(i))
|
||||
continue;
|
||||
outputs.push(coins.getOutput(i));
|
||||
}
|
||||
|
||||
return outputs;
|
||||
}
|
||||
|
||||
function reserialize(coins) {
|
||||
var raw = coins.toRaw();
|
||||
return Coins.fromRaw(raw);
|
||||
}
|
||||
|
||||
function deepCoinsEqual(a, b) {
|
||||
assert(a.outputs.length > 0);
|
||||
assert(b.outputs.length > 0);
|
||||
|
||||
assert.strictEqual(a.version, b.version);
|
||||
assert.strictEqual(a.height, b.height);
|
||||
assert.strictEqual(a.coinbase, b.coinbase);
|
||||
assert.strictEqual(a.length(), b.length());
|
||||
assert.deepStrictEqual(collect(a), collect(b));
|
||||
}
|
||||
|
||||
describe('Coins', function() {
|
||||
it('should instantiate coinview from tx', function() {
|
||||
var hash = tx1.hash('hex');
|
||||
var view = new CoinView();
|
||||
var prevout = new Outpoint(hash, 0);
|
||||
var input = Input.fromOutpoint(prevout);
|
||||
var coins, entry, output;
|
||||
|
||||
view.addTX(tx1, 1);
|
||||
|
||||
coins = view.get(hash);
|
||||
|
||||
assert.equal(coins.version, 1);
|
||||
assert.equal(coins.height, 1);
|
||||
assert.equal(coins.coinbase, false);
|
||||
assert.equal(coins.outputs.length, tx1.outputs.length);
|
||||
|
||||
entry = coins.get(0);
|
||||
assert(entry);
|
||||
assert(!entry.spent);
|
||||
|
||||
assert.equal(entry.offset, 0);
|
||||
assert.equal(entry.size, 0);
|
||||
assert.equal(entry.raw, null);
|
||||
assert(entry.output instanceof Output);
|
||||
assert.equal(entry.spent, false);
|
||||
|
||||
output = view.getOutput(input);
|
||||
assert(output);
|
||||
|
||||
deepCoinsEqual(coins, reserialize(coins));
|
||||
});
|
||||
|
||||
it('should spend an output', function() {
|
||||
var hash = tx1.hash('hex');
|
||||
var view = new CoinView();
|
||||
var coins, entry, length;
|
||||
|
||||
view.addTX(tx1, 1);
|
||||
|
||||
coins = view.get(hash);
|
||||
assert(coins);
|
||||
length = coins.length();
|
||||
|
||||
view.spendOutput(hash, 0);
|
||||
|
||||
coins = view.get(hash);
|
||||
assert(coins);
|
||||
|
||||
entry = coins.get(0);
|
||||
assert(entry);
|
||||
assert(entry.spent);
|
||||
|
||||
deepCoinsEqual(coins, reserialize(coins));
|
||||
assert.strictEqual(coins.length(), length);
|
||||
|
||||
assert.equal(view.undo.items.length, 1);
|
||||
});
|
||||
|
||||
it('should handle coin view', function() {
|
||||
var hash = tx1.hash('hex');
|
||||
var view = new CoinView();
|
||||
var i, tx, size, bw, br;
|
||||
var raw, res, prev, coins;
|
||||
|
||||
for (i = 1; i < data.txs.length; i++) {
|
||||
tx = data.txs[i];
|
||||
view.addTX(tx, 1);
|
||||
}
|
||||
|
||||
size = view.getFastSize(tx1);
|
||||
bw = new StaticWriter(size);
|
||||
raw = view.toFast(bw, tx1).render();
|
||||
br = new BufferReader(raw);
|
||||
res = CoinView.fromFast(br, tx1);
|
||||
|
||||
prev = tx1.inputs[0].prevout;
|
||||
coins = res.get(prev.hash);
|
||||
|
||||
assert.deepStrictEqual(coins.get(0), reserialize(coins).get(0));
|
||||
});
|
||||
});
|
||||
@ -1,4 +1,3 @@
|
||||
01000000022f196cf1e5bd426a04f07b882c893b5b5edebad67da6eb50f066c372ed736d5f000000006a47304402201f81ac31b52cb4b1ceb83f97d18476f7339b74f4eecd1a32c251d4c3cccfffa402203c9143c18810ce072969e4132fdab91408816c96b423b2be38eec8a3582ade36012102aa5a2b334bd8f135f11bc5c477bf6307ff98ed52d3ed10f857d5c89adf5b02beffffffffff8755f073f1170c0d519457ffc4acaa7cb2988148163b5dc457fae0fe42aa19000000009200483045022015bd0139bcccf990a6af6ec5c1c52ed8222e03a0d51c334df139968525d2fcd20221009f9efe325476eb64c3958e4713e9eefe49bf1d820ed58d2112721b134e2a1a530347304402206da827fb26e569eb740641f9c1a7121ee59141703cbe0f903a22cc7d9a7ec7ac02204729f989b5348b3669ab020b8c4af01acc4deaba7c0d9f8fa9e06b2106cbbfeb01ffffffff010000000000000000016a00000000
|
||||
010000000143d4b858145e44fbd121dbc592ae931b459f9ec99418a83e8cb6d94330a80c24010000006b483045022100f85c9fceb6d4d38c82a9121acbf68ffffe784017b05554b586464fdbe473340d0220077780b2022c2d97752961c2cb03ed9202cbe57647510746c6bd31276c8a3c5201210314ffdda8717bc586284c05f37192990f774c391e2088516d2983094d3a33e7c3ffffffff02a0860100000000001976a91419660c27383b347112e92caba64fb1d07e9f63bf88ac40c33800000000001976a914825537afe6d73324f862027690651a64c688dfb788ac00000000
|
||||
01000000017a2133643a513a004ff4d09bbcc7a05d7ee7d3a1d28889f0c06d06f9db1d1d8000000000fd4d0200473044022011cb94542051b8be5563b39da022d7531673ed4b53b6b3f8536794150f7d75e802205a6774c0630964457c2d4a087e5a23167155f661082746dc711ba348ca4d4187014d01025121033d1d799df4bbb828cb8fd9146407ec974948609031e50224b491a6291b77d76b21033d1d799df4bbb828cb8fd9146407ec974948609031e50224b491a6291b77d76b21033d1d799df4bbb828cb8fd9146407ec974948609031e50224b491a6291b77d76b21033d1d799df4bbb828cb8fd9146407ec974948609031e50224b491a6291b77d76b21033d1d799df4bbb828cb8fd9146407ec974948609031e50224b491a6291b77d76b21033d1d799df4bbb828cb8fd9146407ec974948609031e50224b491a6291b77d76b21033d1d799df4bbb828cb8fd9146407ec974948609031e50224b491a6291b77d76b21033d1d799df4bbb828cb8fd9146407ec974948609031e50224b491a6291b77d76b21033d1d799df4bbb828cb8fd9146407ec974948609031e50224b491a6291b77d76b21033d1d799df4bbb828cb8fd9146407ec974948609031e50224b491a6291b77d76b21033d1d799df4bbb828cb8fd9146407ec974948609031e50224b491a6291b77d76b21033d1d799df4bbb828cb8fd9146407ec974948609031e50224b491a6291b77d76b21033d1d799df4bbb828cb8fd9146407ec974948609031e50224b491a6291b77d76b21033d1d799df4bbb828cb8fd9146407ec974948609031e50224b491a6291b77d76b21033d1d799df4bbb828cb8fd9146407ec974948609031e50224b491a6291b77d76b5faeffffffff01a08601000000000091483045022015bd0139bcccf990a6af6ec5c1c52ed8222e03a0d51c334df139968525d2fcd20221009f9efe325476eb64c3958e4713e9eefe49bf1d820ed58d2112721b134e2a1a53037552210378d430274f8c5ec1321338151e9f27f4c676a008bdf8638d07c0b6be9ab35c71210378d430274f8c5ec1321338151e9f27f4c676a008bdf8638d07c0b6be9ab35c7152ae00000000
|
||||
|
||||
|
||||
@ -16,6 +16,7 @@ var Witness = require('../lib/script/witness');
|
||||
var Input = require('../lib/primitives/input');
|
||||
var CoinView = require('../lib/coins/coinview');
|
||||
var KeyRing = require('../lib/primitives/keyring');
|
||||
var parseTX = require('./util/common').parseTX;
|
||||
var opcodes = Script.opcodes;
|
||||
|
||||
var valid = require('./data/tx_valid.json');
|
||||
@ -28,23 +29,6 @@ var tx4 = parseTX('data/tx4.hex');
|
||||
var wtx = parseTX('data/wtx.hex');
|
||||
var coolest = parseTX('data/coolest-tx-ever-sent.hex');
|
||||
|
||||
function parseTX(file) {
|
||||
var data = fs.readFileSync(__dirname + '/' + file, 'utf8');
|
||||
var parts = data.trim().split(/\n+/);
|
||||
var raw = parts[0];
|
||||
var tx = TX.fromRaw(raw.trim(), 'hex');
|
||||
var view = new CoinView();
|
||||
var i, prev;
|
||||
|
||||
for (i = 1; i < parts.length; i++) {
|
||||
raw = parts[i];
|
||||
prev = TX.fromRaw(raw.trim(), 'hex');
|
||||
view.addTX(prev, -1);
|
||||
}
|
||||
|
||||
return { tx: tx, view: view };
|
||||
}
|
||||
|
||||
function clearCache(tx, noCache) {
|
||||
if (!noCache) {
|
||||
assert.equal(tx.hash('hex'), tx.clone().hash('hex'));
|
||||
|
||||
28
test/util/common.js
Normal file
28
test/util/common.js
Normal file
@ -0,0 +1,28 @@
|
||||
'use strict';
|
||||
|
||||
var fs = require('fs');
|
||||
var TX = require('../../lib/primitives/tx');
|
||||
var CoinView = require('../../lib/coins/coinview');
|
||||
|
||||
exports.parseTX = function parseTX(file) {
|
||||
var data = fs.readFileSync(__dirname + '/../' + file, 'utf8');
|
||||
var parts = data.trim().split(/\n+/);
|
||||
var raw = parts[0];
|
||||
var tx = TX.fromRaw(raw.trim(), 'hex');
|
||||
var view = new CoinView();
|
||||
var txs = [tx];
|
||||
var i, prev;
|
||||
|
||||
for (i = 1; i < parts.length; i++) {
|
||||
raw = parts[i];
|
||||
prev = TX.fromRaw(raw.trim(), 'hex');
|
||||
view.addTX(prev, -1);
|
||||
txs.push(prev);
|
||||
}
|
||||
|
||||
return {
|
||||
tx: tx,
|
||||
view: view,
|
||||
txs: txs
|
||||
};
|
||||
};
|
||||
Loading…
Reference in New Issue
Block a user