option to skip double speed confirmations

This commit is contained in:
Matias Alejo Garcia 2014-02-15 20:26:17 -03:00
parent 04f0cf7b08
commit 10c69762bf
2 changed files with 26 additions and 6 deletions

View File

@ -24,9 +24,9 @@ function spec(b) {
// Inputs => add index + coinBase flag // Inputs => add index + coinBase flag
var n =0; var n =0;
info.vin.forEach(function(i) { info.vin.forEach(function(i) {
if (i.coinbase) info.isCoinBase = true;
i.n = n++; i.n = n++;
delete i.scriptSig['hex']; if (i.coinbase) info.isCoinBase = true;
if (i.scriptSig) delete i.scriptSig['hex'];
}); });
// Outputs => add total // Outputs => add total

View File

@ -24,6 +24,7 @@ function spec(b) {
var CONCURRENCY = 10; var CONCURRENCY = 10;
var MAX_OPEN_FILES = 500; var MAX_OPEN_FILES = 500;
var CONFIRMATION_NR_TO_NOT_CHECK = 10;
/** /**
* Module dependencies. * Module dependencies.
*/ */
@ -192,7 +193,7 @@ function spec(b) {
var incompleteInputs = 0; var incompleteInputs = 0;
async.eachLimit(info.vin, CONCURRENCY, function(i, c_in) { async.eachLimit(info.vin, CONCURRENCY, function(i, c_in) {
self.fromTxIdN(i.txid, i.vout, function(err, ret) { self.fromTxIdN(i.txid, i.vout, info.confirmations, function(err, ret) {
//console.log('[TransactionDb.js.154:ret:]',ret); //TODO //console.log('[TransactionDb.js.154:ret:]',ret); //TODO
if (!ret || !ret.addr || !ret.valueSat) { if (!ret || !ret.addr || !ret.valueSat) {
console.log('Could not get TXouts in %s,%d from %s ', i.txid, i.vout, info.txid); console.log('Could not get TXouts in %s,%d from %s ', i.txid, i.vout, info.txid);
@ -206,7 +207,16 @@ function spec(b) {
i.addr = ret.addr; i.addr = ret.addr;
i.valueSat = ret.valueSat; i.valueSat = ret.valueSat;
i.value = ret.valueSat / util.COIN; i.value = ret.valueSat / util.COIN;
valueIn += i.valueSat;
/*
* If confirmed by bitcoind, we could not check for double spends
* but we prefer to keep the flag of double spend attempt
*
if (info.confirmations
&& info.confirmations >= CONFIRMATION_NR_TO_NOT_CHECK)
return c_in();
*/
// Double spend? // Double spend?
if (ret.multipleSpendAttempt || !ret.spendTxId || if (ret.multipleSpendAttempt || !ret.spendTxId ||
(ret.spendTxId && ret.spendTxId !== info.txid) (ret.spendTxId && ret.spendTxId !== info.txid)
@ -227,8 +237,6 @@ function spec(b) {
} else { } else {
i.doubleSpendTxID = null; i.doubleSpendTxID = null;
} }
valueIn += i.valueSat;
return c_in(); return c_in();
}); });
}, },
@ -271,7 +279,7 @@ function spec(b) {
}); });
}; };
TransactionDb.prototype.fromTxIdN = function(txid, n, cb) { TransactionDb.prototype.fromTxIdN = function(txid, n, confirmations, cb) {
var self = this; var self = this;
var k = OUTS_PREFIX + txid + '-' + n; var k = OUTS_PREFIX + txid + '-' + n;
@ -288,6 +296,18 @@ function spec(b) {
valueSat: parseInt(a[1]), valueSat: parseInt(a[1]),
}; };
/*
* If this TxID comes from an RPC request
* the .confirmations value from bitcoind is available
* so we could avoid checking if the input were double spended
*
* This speed up address calculations by ~30%
*
if (confirmations >= CONFIRMATION_NR_TO_NOT_CHECK) {
return cb(null, ret);
}
*/
// Spend? // Spend?
var k = SPEND_PREFIX + txid + '-' + n; var k = SPEND_PREFIX + txid + '-' + n;
db.createReadStream({ db.createReadStream({