handle double spends
This commit is contained in:
parent
8b892edfbc
commit
a920abdcd9
@ -70,8 +70,29 @@ function spec(b) {
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
TransactionDb.prototype.fromTxId = function(txid, cb) {
|
TransactionDb.prototype._addSpendInfo = function(r, txid, index) {
|
||||||
|
if (r.spendTxId) {
|
||||||
|
if (!r.multipleSpendAttempts) {
|
||||||
|
r.multipleSpendAttempts = [{
|
||||||
|
txid: r.spendTxId,
|
||||||
|
index: r.index,
|
||||||
|
}];
|
||||||
|
}
|
||||||
|
r.multipleSpendAttempts.push({
|
||||||
|
txid: txid,
|
||||||
|
index: parseInt(index),
|
||||||
|
});
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
r.spendTxId = txid;
|
||||||
|
r.spendIndex = parseInt(index);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// This is not used now
|
||||||
|
TransactionDb.prototype.fromTxId = function(txid, cb) {
|
||||||
|
var self = this;
|
||||||
var k = OUTS_PREFIX + txid;
|
var k = OUTS_PREFIX + txid;
|
||||||
var ret=[];
|
var ret=[];
|
||||||
var idx={};
|
var idx={};
|
||||||
@ -93,6 +114,7 @@ function spec(b) {
|
|||||||
return cb(err);
|
return cb(err);
|
||||||
})
|
})
|
||||||
.on('end', function () {
|
.on('end', function () {
|
||||||
|
|
||||||
var k = SPEND_PREFIX + txid;
|
var k = SPEND_PREFIX + txid;
|
||||||
db.createReadStream({start: k, end: k + '~'})
|
db.createReadStream({start: k, end: k + '~'})
|
||||||
.on('data', function (data) {
|
.on('data', function (data) {
|
||||||
@ -102,15 +124,7 @@ function spec(b) {
|
|||||||
assert(typeof j !== 'undefined','Spent could not be stored: tx ' + txid +
|
assert(typeof j !== 'undefined','Spent could not be stored: tx ' + txid +
|
||||||
'spend in TX:' + k[2] + ',' + k[3]+ ' j:' + j);
|
'spend in TX:' + k[2] + ',' + k[3]+ ' j:' + j);
|
||||||
|
|
||||||
/// TODO Handle multiple addresses here!
|
self._addSpendInfo(ret[j], k[4], k[5]);
|
||||||
if (ret[j].spendTxId) {
|
|
||||||
// double spend!
|
|
||||||
assert(0);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
ret[j].spendTxId = k[4];
|
|
||||||
ret[j].spendIndex = parseInt(k[5]);
|
|
||||||
}
|
|
||||||
})
|
})
|
||||||
.on('error', function (err) {
|
.on('error', function (err) {
|
||||||
return cb(err);
|
return cb(err);
|
||||||
@ -135,7 +149,7 @@ function spec(b) {
|
|||||||
if (err || !addr || !valueSat ) {
|
if (err || !addr || !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);
|
||||||
incompleteInputs = 1;
|
incompleteInputs = 1;
|
||||||
return c_in(); // error not scaled
|
return c_in(); // error not scalated
|
||||||
}
|
}
|
||||||
i.addr = addr;
|
i.addr = addr;
|
||||||
i.valueSat = valueSat;
|
i.valueSat = valueSat;
|
||||||
@ -202,12 +216,37 @@ function spec(b) {
|
|||||||
o.isConfirmed = is;
|
o.isConfirmed = is;
|
||||||
if (!o.spendTxId) return cb();
|
if (!o.spendTxId) return cb();
|
||||||
|
|
||||||
self.isConfirmed(o.spendTxId, function(err,is) {
|
if (o.multipleSpendAttempts) {
|
||||||
if (err) return cb(err);
|
|
||||||
|
|
||||||
o.spendIsConfirmed = is;
|
var isConfirmed = 0;
|
||||||
return cb();
|
var txid, index;
|
||||||
});
|
async.each(o.multipleSpendAttempts,
|
||||||
|
function (oi) {
|
||||||
|
self.isConfirmed(oi.spendTxId, function(err,is) {
|
||||||
|
if (err) return cb(err);
|
||||||
|
isConfirmed = 1;
|
||||||
|
txid = oi.spendTxId;
|
||||||
|
index = oi.index;
|
||||||
|
return cb();
|
||||||
|
});
|
||||||
|
},
|
||||||
|
function (err) {
|
||||||
|
// write the spended TXid into main register
|
||||||
|
if (isConfirmed) {
|
||||||
|
o.spendTxId = txid;
|
||||||
|
o.index = index;
|
||||||
|
o.spendIsConfirmed = 1;
|
||||||
|
}
|
||||||
|
return cb(err);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
self.isConfirmed(o.spendTxId, function(err,is) {
|
||||||
|
if (err) return cb(err);
|
||||||
|
o.spendIsConfirmed = is;
|
||||||
|
return cb();
|
||||||
|
});
|
||||||
|
}
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -238,16 +277,7 @@ function spec(b) {
|
|||||||
db.createReadStream({start: k, end: k + '~'})
|
db.createReadStream({start: k, end: k + '~'})
|
||||||
.on('data', function (data) {
|
.on('data', function (data) {
|
||||||
var k = data.key.split('-');
|
var k = data.key.split('-');
|
||||||
var v = data.value;
|
self._addSpendInfo(o, k[4], k[5]);
|
||||||
if (o.spendTxId) {
|
|
||||||
// double spend!
|
|
||||||
assert(0);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
o.spendTxId = k[4];
|
|
||||||
o.spendIndex = parseInt(k[5]);
|
|
||||||
o.spendTs = parseInt(v);
|
|
||||||
}
|
|
||||||
})
|
})
|
||||||
.on('error', function (err) {
|
.on('error', function (err) {
|
||||||
return e_c(err);
|
return e_c(err);
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user