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) {
for(var i = 0; i < addresses.length; i++) {
var hashHex = bitcore.Address(addresses[i]).hashBuffer.toString('hex');
if(!this.subscriptions.address[hashHex]) {
this.subscriptions.address[hashHex] = [];
var self = this;
function addAddress(addressStr) {
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));
};
Bitcoin.prototype.unsubscribeAddress = function(emitter, addresses) {
var self = this;
if(!addresses) {
return this.unsubscribeAddressAll(emitter);
}
for(var i = 0; i < addresses.length; i++) {
var hashHex = bitcore.Address(addresses[i]).hashBuffer.toString('hex');
if(this.subscriptions.address[hashHex]) {
var emitters = this.subscriptions.address[hashHex];
var index = emitters.indexOf(emitter);
if(index > -1) {
emitters.splice(index, 1);
function removeAddress(addressStr) {
var emitters = self.subscriptions.address[addressStr];
var index = emitters.indexOf(emitter);
if(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));
};
@ -533,61 +555,43 @@ Bitcoin.prototype._updateTip = function(node, message) {
}
};
Bitcoin.prototype._getAddressHashesFromInput = function(input, addressHashes) {
if (!input.script) {
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 = [];
Bitcoin.prototype._getAddressesFromTransaction = function(transaction) {
var addresses = [];
for (var i = 0; i < transaction.inputs.length; 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++) {
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) {
var addressHashes = this._getAddressHashesFromTransaction(transaction);
for (var i = 0; i < addressHashes.length; i++) {
if(this.subscriptions.address[addressHashes[i]]) {
var emitters = this.subscriptions.address[addressHashes[i]];
var addresses = this._getAddressesFromTransaction(transaction);
for (var i = 0; i < addresses.length; i++) {
var address = addresses[i];
if(this.subscriptions.address[address]) {
var emitters = this.subscriptions.address[address];
for(var j = 0; j < emitters.length; j++) {
emitters[j].emit('bitcoind/addresstxid', txid);
emitters[j].emit('bitcoind/addresstxid', {
address: address,
txid: txid
});
}
}
}