From 1800294dfe690749e2f6bdbc8c4c486b05716f1c Mon Sep 17 00:00:00 2001 From: Braydon Fuller Date: Wed, 18 May 2016 10:20:18 -0400 Subject: [PATCH] bitcoind: change dataformat of addresstxid event Adds the address to the message to quickly determine the address associated with the event. --- lib/services/bitcoind.js | 112 ++++++++++++++++++++------------------- 1 file changed, 58 insertions(+), 54 deletions(-) diff --git a/lib/services/bitcoind.js b/lib/services/bitcoind.js index 4d638cef..38d8fddb 100644 --- a/lib/services/bitcoind.js +++ b/lib/services/bitcoind.js @@ -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 + }); } } }