refactor merkleblock.
This commit is contained in:
parent
9afb141dce
commit
da701cbef4
@ -360,10 +360,6 @@ RollingFilter.prototype.added = function added(val, enc) {
|
|||||||
return false;
|
return false;
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
|
||||||
* Murmur3
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Murmur3 hash.
|
* Murmur3 hash.
|
||||||
* @memberof Bloom
|
* @memberof Bloom
|
||||||
|
|||||||
@ -30,8 +30,8 @@ var constants = bcoin.protocol.constants;
|
|||||||
* @property {Buffer[]} hashes
|
* @property {Buffer[]} hashes
|
||||||
* @property {Buffer} flags
|
* @property {Buffer} flags
|
||||||
* @property {TX[]} txs - Transaction vector.
|
* @property {TX[]} txs - Transaction vector.
|
||||||
* @property {Hash[]} tx - List of matched tx hashes.
|
* @property {Hash[]} matches - List of matched tx hashes.
|
||||||
* @property {Object} txMap - Map of matched tx hashes.
|
* @property {Object} map - Map of matched tx hashes.
|
||||||
* @property {ReversedHash} rhash - Reversed block hash (uint256le).
|
* @property {ReversedHash} rhash - Reversed block hash (uint256le).
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@ -50,8 +50,8 @@ function MerkleBlock(data) {
|
|||||||
this.flags = data.flags || [];
|
this.flags = data.flags || [];
|
||||||
|
|
||||||
// List of matched TXs
|
// List of matched TXs
|
||||||
this.txMap = {};
|
this.map = {};
|
||||||
this.tx = [];
|
this.matches = [];
|
||||||
this._validPartial = null;
|
this._validPartial = null;
|
||||||
|
|
||||||
// TXs that will be pushed on
|
// TXs that will be pushed on
|
||||||
@ -100,12 +100,17 @@ MerkleBlock.prototype.getRaw = function getRaw() {
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
MerkleBlock.prototype.addTX = function addTX(tx) {
|
MerkleBlock.prototype.addTX = function addTX(tx) {
|
||||||
|
var index, hash;
|
||||||
|
|
||||||
if (!(tx instanceof bcoin.tx))
|
if (!(tx instanceof bcoin.tx))
|
||||||
tx = new bcoin.tx(tx);
|
tx = new bcoin.tx(tx);
|
||||||
|
|
||||||
|
hash = tx.hash('hex');
|
||||||
|
index = this.map[hash];
|
||||||
|
|
||||||
this.txs.push(tx);
|
this.txs.push(tx);
|
||||||
|
|
||||||
tx.setBlock(this, -1);
|
tx.setBlock(this, index);
|
||||||
|
|
||||||
return tx;
|
return tx;
|
||||||
};
|
};
|
||||||
@ -122,12 +127,12 @@ MerkleBlock.prototype.hasTX = function hasTX(hash) {
|
|||||||
|
|
||||||
this.verifyPartial();
|
this.verifyPartial();
|
||||||
|
|
||||||
return this.txMap[hash] === true;
|
return this.map[hash] != null;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Verify the partial merkletree. Push leaves onto
|
* Verify the partial merkletree. Push leaves onto
|
||||||
* {@link MerkleBlock#tx} and into {@link MerkleBlock#txMap}.
|
* {@link MerkleBlock#tx} and into {@link MerkleBlock#map}.
|
||||||
* @private
|
* @private
|
||||||
* @returns {Boolean}
|
* @returns {Boolean}
|
||||||
*/
|
*/
|
||||||
@ -145,8 +150,8 @@ MerkleBlock.prototype.verifyPartial = function verifyPartial() {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
this.tx = tree.matches;
|
this.matches = tree.matches;
|
||||||
this.txMap = utils.toMap(tree.matches);
|
this.map = tree.map;
|
||||||
this._validPartial = true;
|
this._validPartial = true;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
@ -167,6 +172,7 @@ MerkleBlock.prototype.extractTree = function extractTree() {
|
|||||||
var hashUsed = 0;
|
var hashUsed = 0;
|
||||||
var matches = [];
|
var matches = [];
|
||||||
var indexes = [];
|
var indexes = [];
|
||||||
|
var map = {};
|
||||||
var failed = false;
|
var failed = false;
|
||||||
var bits = new Array(flags.length * 8);
|
var bits = new Array(flags.length * 8);
|
||||||
var totalTX = this.totalTX;
|
var totalTX = this.totalTX;
|
||||||
@ -179,7 +185,7 @@ MerkleBlock.prototype.extractTree = function extractTree() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function traverse(height, pos) {
|
function traverse(height, pos) {
|
||||||
var parent, hash, left, right;
|
var parent, hash, left, right, txid;
|
||||||
|
|
||||||
if (bitsUsed >= bits.length) {
|
if (bitsUsed >= bits.length) {
|
||||||
failed = true;
|
failed = true;
|
||||||
@ -195,8 +201,10 @@ MerkleBlock.prototype.extractTree = function extractTree() {
|
|||||||
}
|
}
|
||||||
hash = hashes[hashUsed++];
|
hash = hashes[hashUsed++];
|
||||||
if (height === 0 && parent) {
|
if (height === 0 && parent) {
|
||||||
matches.push(hash.toString('hex'));
|
txid = hash.toString('hex');
|
||||||
|
matches.push(txid);
|
||||||
indexes.push(pos);
|
indexes.push(pos);
|
||||||
|
map[txid] = pos;
|
||||||
}
|
}
|
||||||
return hash;
|
return hash;
|
||||||
}
|
}
|
||||||
@ -219,7 +227,7 @@ MerkleBlock.prototype.extractTree = function extractTree() {
|
|||||||
if (totalTX == 0)
|
if (totalTX == 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (totalTX > (constants.block.MAX_SIZE / 60 | 0))
|
if (totalTX > constants.block.MAX_SIZE / 60)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (hashes.length > totalTX)
|
if (hashes.length > totalTX)
|
||||||
@ -246,7 +254,8 @@ MerkleBlock.prototype.extractTree = function extractTree() {
|
|||||||
return {
|
return {
|
||||||
root: root.toString('hex'),
|
root: root.toString('hex'),
|
||||||
matches: matches,
|
matches: matches,
|
||||||
indexes: indexes
|
indexes: indexes,
|
||||||
|
map: map
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -306,7 +315,7 @@ MerkleBlock.prototype.inspect = function inspect() {
|
|||||||
hashes: this.hashes.map(function(hash) {
|
hashes: this.hashes.map(function(hash) {
|
||||||
return hash.toString('hex');
|
return hash.toString('hex');
|
||||||
}),
|
}),
|
||||||
tx: this.tx,
|
map: this.map,
|
||||||
flags: this.flags
|
flags: this.flags
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|||||||
@ -51,16 +51,16 @@ describe('Block', function() {
|
|||||||
|
|
||||||
it('should parse partial merkle tree', function() {
|
it('should parse partial merkle tree', function() {
|
||||||
assert(mblock.verify());
|
assert(mblock.verify());
|
||||||
assert.equal(mblock.tx.length, 2);
|
assert.equal(mblock.matches.length, 2);
|
||||||
assert.equal(mblock.hash('hex'),
|
assert.equal(mblock.hash('hex'),
|
||||||
'8cc72c02a958de5a8b35a23bb7e3bced8bf840cc0a4e1c820000000000000000');
|
'8cc72c02a958de5a8b35a23bb7e3bced8bf840cc0a4e1c820000000000000000');
|
||||||
assert.equal(mblock.rhash,
|
assert.equal(mblock.rhash,
|
||||||
'0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c');
|
'0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c');
|
||||||
assert.equal(
|
assert.equal(
|
||||||
mblock.tx[0],
|
mblock.matches[0],
|
||||||
'7393f84cd04ca8931975c66282ebf1847c78d8de6c2578d4f9bae23bc6f30857');
|
'7393f84cd04ca8931975c66282ebf1847c78d8de6c2578d4f9bae23bc6f30857');
|
||||||
assert.equal(
|
assert.equal(
|
||||||
mblock.tx[1],
|
mblock.matches[1],
|
||||||
'ec8c51de3170301430ec56f6703533d9ea5b05c6fa7068954bcb90eed8c2ee5c');
|
'ec8c51de3170301430ec56f6703533d9ea5b05c6fa7068954bcb90eed8c2ee5c');
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@ -631,5 +631,12 @@ describe('TX', function() {
|
|||||||
assert.equal(wtx.getSize(), 62138);
|
assert.equal(wtx.getSize(), 62138);
|
||||||
assert.equal(wtx.getVirtualSize(), 61813);
|
assert.equal(wtx.getVirtualSize(), 61813);
|
||||||
assert.equal(wtx.getCost(), 247250);
|
assert.equal(wtx.getCost(), 247250);
|
||||||
|
var raw1 = wtx.render();
|
||||||
|
clearCache(wtx, true);
|
||||||
|
var raw2 = wtx.render();
|
||||||
|
assert.deepEqual(raw1, raw2);
|
||||||
|
var wtx2 = bcoin.tx.fromRaw(raw2);
|
||||||
|
assert.equal(wtx.hash('hex'), wtx2.hash('hex'));
|
||||||
|
assert.equal(wtx.witnessHash('hex'), wtx2.witnessHash('hex'));
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user