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:
parent
6fbadb6c42
commit
1800294dfe
@ -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
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user