chaindb: better rescan algo.
This commit is contained in:
parent
f5b7d7f2d9
commit
015eaa1f2d
@ -21,6 +21,7 @@ var ldb = require('../db/ldb');
|
|||||||
var LRU = require('../utils/lru');
|
var LRU = require('../utils/lru');
|
||||||
var Block = require('../primitives/block');
|
var Block = require('../primitives/block');
|
||||||
var Coin = require('../primitives/coin');
|
var Coin = require('../primitives/coin');
|
||||||
|
var Outpoint = require('../primitives/outpoint');
|
||||||
var TX = require('../primitives/tx');
|
var TX = require('../primitives/tx');
|
||||||
var Address = require('../primitives/address');
|
var Address = require('../primitives/address');
|
||||||
var ChainEntry = require('./chainentry');
|
var ChainEntry = require('./chainentry');
|
||||||
@ -1096,8 +1097,8 @@ ChainDB.prototype.getTXByAddress = co(function* getTXByAddress(addresses) {
|
|||||||
|
|
||||||
ChainDB.prototype.scan = co(function* scan(start, filter, iter) {
|
ChainDB.prototype.scan = co(function* scan(start, filter, iter) {
|
||||||
var total = 0;
|
var total = 0;
|
||||||
var i, j, entry, hashes;
|
var i, j, entry, hash, tx, txs, block;
|
||||||
var hash, tx, txs, block;
|
var found, input, output, prevout;
|
||||||
|
|
||||||
if (start == null)
|
if (start == null)
|
||||||
start = this.network.genesis.hash;
|
start = this.network.genesis.hash;
|
||||||
@ -1116,7 +1117,7 @@ ChainDB.prototype.scan = co(function* scan(start, filter, iter) {
|
|||||||
throw new Error('Cannot rescan an alternate chain.');
|
throw new Error('Cannot rescan an alternate chain.');
|
||||||
|
|
||||||
while (entry) {
|
while (entry) {
|
||||||
block = yield this.getFullBlock(entry.hash);
|
block = yield this.getBlock(entry.hash);
|
||||||
txs = [];
|
txs = [];
|
||||||
total++;
|
total++;
|
||||||
|
|
||||||
@ -1134,11 +1135,32 @@ ChainDB.prototype.scan = co(function* scan(start, filter, iter) {
|
|||||||
|
|
||||||
for (i = 0; i < block.txs.length; i++) {
|
for (i = 0; i < block.txs.length; i++) {
|
||||||
tx = block.txs[i];
|
tx = block.txs[i];
|
||||||
hashes = tx.getHashes();
|
found = false;
|
||||||
|
|
||||||
|
for (j = 0; j < tx.outputs.length; j++) {
|
||||||
|
output = tx.outputs[j];
|
||||||
|
hash = output.getHash();
|
||||||
|
|
||||||
|
if (!hash)
|
||||||
|
continue;
|
||||||
|
|
||||||
for (j = 0; j < hashes.length; j++) {
|
|
||||||
hash = hashes[j];
|
|
||||||
if (filter.test(hash)) {
|
if (filter.test(hash)) {
|
||||||
|
prevout = Outpoint.fromTX(tx, j);
|
||||||
|
filter.add(prevout.toRaw());
|
||||||
|
found = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (found) {
|
||||||
|
txs.push(tx);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (j = 0; j < tx.inputs.length; j++) {
|
||||||
|
input = tx.inputs[j];
|
||||||
|
prevout = input.prevout;
|
||||||
|
|
||||||
|
if (filter.test(prevout.toRaw())) {
|
||||||
txs.push(tx);
|
txs.push(tx);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user