bitcoind: change dataformat of addresstxid event

Adds the address to the message to quickly determine the address
associated with the event.
This commit is contained in:
Braydon Fuller 2016-05-18 10:20:18 -04:00
parent 6fbadb6c42
commit 1800294dfe

View File

@ -214,30 +214,52 @@ Bitcoin.prototype.unsubscribe = function(name, emitter) {
}; };
Bitcoin.prototype.subscribeAddress = function(emitter, addresses) { Bitcoin.prototype.subscribeAddress = function(emitter, addresses) {
for(var i = 0; i < addresses.length; i++) { var self = this;
var hashHex = bitcore.Address(addresses[i]).hashBuffer.toString('hex');
if(!this.subscriptions.address[hashHex]) { function addAddress(addressStr) {
this.subscriptions.address[hashHex] = []; if(self.subscriptions.address[addressStr]) {
var emitters = self.subscriptions.address[addressStr];
var index = emitters.indexOf(emitter);
if (index === -1) {
self.subscriptions.address[addressStr].push(emitter);
}
} else {
self.subscriptions.address[addressStr] = [emitter];
} }
this.subscriptions.address[hashHex].push(emitter);
} }
for(var i = 0; i < addresses.length; i++) {
if (bitcore.Address.isValid(addresses[i], this.node.network)) {
addAddress(addresses[i]);
}
}
log.info(emitter.remoteAddress, 'subscribe:', 'bitcoind/addresstxid', 'total:', _.size(this.subscriptions.address)); log.info(emitter.remoteAddress, 'subscribe:', 'bitcoind/addresstxid', 'total:', _.size(this.subscriptions.address));
}; };
Bitcoin.prototype.unsubscribeAddress = function(emitter, addresses) { Bitcoin.prototype.unsubscribeAddress = function(emitter, addresses) {
var self = this;
if(!addresses) { if(!addresses) {
return this.unsubscribeAddressAll(emitter); return this.unsubscribeAddressAll(emitter);
} }
for(var i = 0; i < addresses.length; i++) {
var hashHex = bitcore.Address(addresses[i]).hashBuffer.toString('hex'); function removeAddress(addressStr) {
if(this.subscriptions.address[hashHex]) { var emitters = self.subscriptions.address[addressStr];
var emitters = this.subscriptions.address[hashHex]; var index = emitters.indexOf(emitter);
var index = emitters.indexOf(emitter); if(index > -1) {
if(index > -1) { emitters.splice(index, 1);
emitters.splice(index, 1); if (emitters.length === 0) {
delete self.subscriptions.address[addressStr];
} }
} }
} }
for(var i = 0; i < addresses.length; i++) {
if(this.subscriptions.address[addresses[i]]) {
removeAddress(addresses[i]);
}
}
log.info(emitter.remoteAddress, 'unsubscribe:', 'bitcoind/addresstxid', 'total:', _.size(this.subscriptions.address)); log.info(emitter.remoteAddress, 'unsubscribe:', 'bitcoind/addresstxid', 'total:', _.size(this.subscriptions.address));
}; };
@ -533,61 +555,43 @@ Bitcoin.prototype._updateTip = function(node, message) {
} }
}; };
Bitcoin.prototype._getAddressHashesFromInput = function(input, addressHashes) { Bitcoin.prototype._getAddressesFromTransaction = function(transaction) {
if (!input.script) { var addresses = [];
return;
}
var hashBuffer;
var script = input.script;
if (script.isPublicKeyHashIn()) {
hashBuffer = bitcore.crypto.Hash.sha256ripemd160(input.script.chunks[1].buf);
} else if (script.isScriptHashIn()) {
hashBuffer = bitcore.crypto.Hash.sha256ripemd160(input.script.chunks[input.script.chunks.length - 1].buf);
} else {
return;
}
addressHashes.push(hashBuffer.toString('hex'));
};
Bitcoin.prototype._getAddressHashesFromOutput = function(output, addressHashes) {
if (!output.script) {
return;
}
var script = output.script;
var hashBuffer;
if (script.isPublicKeyHashOut()) {
hashBuffer = script.chunks[2].buf;
} else if (script.isScriptHashOut()) {
hashBuffer = script.chunks[1].buf;
} else {
return;
}
addressHashes.push(hashBuffer.toString('hex'));
};
Bitcoin.prototype._getAddressHashesFromTransaction = function(transaction) {
var addressHashes = [];
for (var i = 0; i < transaction.inputs.length; i++) { for (var i = 0; i < transaction.inputs.length; i++) {
var input = transaction.inputs[i]; var input = transaction.inputs[i];
this._getAddressHashesFromInput(input, addressHashes); if (input.script) {
var inputAddress = input.script.toAddress(this.node.network);
if (inputAddress) {
addresses.push(inputAddress.toString());
}
}
} }
for (var j = 0; j < transaction.outputs.length; j++) { for (var j = 0; j < transaction.outputs.length; j++) {
var output = transaction.outputs[j]; var output = transaction.outputs[j];
this._getAddressHashesFromOutput(output, addressHashes); if (output.script) {
var outputAddress = output.script.toAddress(this.node.network);
if (outputAddress) {
addresses.push(outputAddress.toString());
}
}
} }
return addressHashes; return addresses;
}; };
Bitcoin.prototype._notifyAddressTxidSubscribers = function(txid, transaction) { Bitcoin.prototype._notifyAddressTxidSubscribers = function(txid, transaction) {
var addressHashes = this._getAddressHashesFromTransaction(transaction); var addresses = this._getAddressesFromTransaction(transaction);
for (var i = 0; i < addressHashes.length; i++) { for (var i = 0; i < addresses.length; i++) {
if(this.subscriptions.address[addressHashes[i]]) { var address = addresses[i];
var emitters = this.subscriptions.address[addressHashes[i]]; if(this.subscriptions.address[address]) {
var emitters = this.subscriptions.address[address];
for(var j = 0; j < emitters.length; j++) { for(var j = 0; j < emitters.length; j++) {
emitters[j].emit('bitcoind/addresstxid', txid); emitters[j].emit('bitcoind/addresstxid', {
address: address,
txid: txid
});
} }
} }
} }