net: drop getutxos impl.
This commit is contained in:
parent
66ec0ae36e
commit
e407c08668
@ -57,8 +57,6 @@ exports.types = {
|
||||
FILTERADD: 19,
|
||||
FILTERCLEAR: 20,
|
||||
MERKLEBLOCK: 21,
|
||||
GETUTXOS: 22,
|
||||
UTXOS: 23,
|
||||
FEEFILTER: 24,
|
||||
SENDCMPCT: 25,
|
||||
CMPCTBLOCK: 26,
|
||||
@ -2422,339 +2420,6 @@ MerkleBlockPacket.fromRaw = function fromRaw(data, enc) {
|
||||
return new MerkleBlockPacket().fromRaw(data);
|
||||
};
|
||||
|
||||
/**
|
||||
* Represents a `getutxos` packet.
|
||||
* @exports GetUTXOsPacket
|
||||
* @constructor
|
||||
* @param {Boolean} mempool
|
||||
* @param {Outpoint[]} prevout
|
||||
* @property {Boolean} mempool
|
||||
* @property {Outpoint[]} prevout
|
||||
*/
|
||||
|
||||
function GetUTXOsPacket(mempool, prevout) {
|
||||
if (!(this instanceof GetUTXOsPacket))
|
||||
return new GetUTXOsPacket(mempool, prevout);
|
||||
|
||||
Packet.call(this);
|
||||
|
||||
this.mempool = mempool || false;
|
||||
this.prevout = prevout || [];
|
||||
}
|
||||
|
||||
util.inherits(GetUTXOsPacket, Packet);
|
||||
|
||||
GetUTXOsPacket.prototype.cmd = 'getutxos';
|
||||
GetUTXOsPacket.prototype.type = exports.types.GETUTXOS;
|
||||
|
||||
/**
|
||||
* Get serialization size.
|
||||
* @returns {Number}
|
||||
*/
|
||||
|
||||
GetUTXOsPacket.prototype.getSize = function getSize() {
|
||||
var size = 0;
|
||||
size += 1;
|
||||
size += encoding.sizeVarint(this.prevout.length);
|
||||
size += this.prevout.length * 36;
|
||||
return size;
|
||||
};
|
||||
|
||||
/**
|
||||
* Serialize getutxos packet to writer.
|
||||
* @param {BufferWriter} bw
|
||||
*/
|
||||
|
||||
GetUTXOsPacket.prototype.toWriter = function toWriter(bw) {
|
||||
var i, prevout;
|
||||
|
||||
bw.writeU8(this.mempool ? 1 : 0);
|
||||
bw.writeVarint(this.prevout.length);
|
||||
|
||||
for (i = 0; i < this.prevout.length; i++) {
|
||||
prevout = this.prevout[i];
|
||||
prevout.toWriter(bw);
|
||||
}
|
||||
|
||||
return bw;
|
||||
};
|
||||
|
||||
/**
|
||||
* Serialize getutxos packet.
|
||||
* @returns {Buffer}
|
||||
*/
|
||||
|
||||
GetUTXOsPacket.prototype.toRaw = function toRaw() {
|
||||
var size = this.getSize();
|
||||
return this.toWriter(new StaticWriter(size)).render();
|
||||
};
|
||||
|
||||
/**
|
||||
* Inject properties from buffer reader.
|
||||
* @private
|
||||
* @param {BufferReader} br
|
||||
*/
|
||||
|
||||
GetUTXOsPacket.prototype.fromReader = function fromReader(br) {
|
||||
var i, count;
|
||||
|
||||
this.mempool = br.readU8() === 1;
|
||||
|
||||
count = br.readVarint();
|
||||
|
||||
for (i = 0; i < count; i++)
|
||||
this.prevout.push(Outpoint.fromReader(br));
|
||||
|
||||
return this;
|
||||
};
|
||||
|
||||
/**
|
||||
* Inject properties from serialized data.
|
||||
* @private
|
||||
* @param {Buffer} data
|
||||
*/
|
||||
|
||||
GetUTXOsPacket.prototype.fromRaw = function fromRaw(data) {
|
||||
return this.fromReader(new BufferReader(data));
|
||||
};
|
||||
|
||||
/**
|
||||
* Instantiate getutxos packet from buffer reader.
|
||||
* @param {BufferReader} br
|
||||
* @returns {GetBlocksPacket}
|
||||
*/
|
||||
|
||||
GetUTXOsPacket.fromReader = function fromReader(br) {
|
||||
return new GetUTXOsPacket().fromReader(br);
|
||||
};
|
||||
|
||||
/**
|
||||
* Instantiate getutxos packet from serialized data.
|
||||
* @param {Buffer} data
|
||||
* @param {String?} enc
|
||||
* @returns {GetBlocksPacket}
|
||||
*/
|
||||
|
||||
GetUTXOsPacket.fromRaw = function fromRaw(data, enc) {
|
||||
if (typeof data === 'string')
|
||||
data = new Buffer(data, enc);
|
||||
return new GetUTXOsPacket().fromRaw(data);
|
||||
};
|
||||
|
||||
/**
|
||||
* Represents a `utxos` packet.
|
||||
* @exports UTXOsPacket
|
||||
* @constructor
|
||||
* @param {Object} options
|
||||
* @property {Number} height
|
||||
* @property {Hash} tip
|
||||
* @property {Boolean[]} hits
|
||||
* @property {Coin[]} coins
|
||||
*/
|
||||
|
||||
function UTXOsPacket(options) {
|
||||
if (!(this instanceof UTXOsPacket))
|
||||
return new UTXOsPacket(options);
|
||||
|
||||
Packet.call(this);
|
||||
|
||||
this.height = -1;
|
||||
this.tip = encoding.NULL_HASH;
|
||||
this.hits = [];
|
||||
this.coins = [];
|
||||
|
||||
if (options)
|
||||
this.fromOptions(options);
|
||||
}
|
||||
|
||||
util.inherits(UTXOsPacket, Packet);
|
||||
|
||||
UTXOsPacket.prototype.cmd = 'utxos';
|
||||
UTXOsPacket.prototype.type = exports.types.UTXOS;
|
||||
|
||||
/**
|
||||
* Inject properties from options.
|
||||
* @private
|
||||
* @param {Buffer} data
|
||||
*/
|
||||
|
||||
UTXOsPacket.prototype.fromOptions = function fromOptions(options) {
|
||||
if (options.height != null) {
|
||||
assert(util.isNumber(options.height));
|
||||
this.height = options.height;
|
||||
}
|
||||
|
||||
if (options.tip) {
|
||||
assert(typeof options.tip === 'string');
|
||||
this.tip = options.tip;
|
||||
}
|
||||
|
||||
if (options.hits) {
|
||||
assert(Array.isArray(options.hits));
|
||||
this.hits = options.hits;
|
||||
}
|
||||
|
||||
if (options.coins) {
|
||||
assert(Array.isArray(options.coins));
|
||||
this.coins = options.coins;
|
||||
}
|
||||
|
||||
return this;
|
||||
};
|
||||
|
||||
/**
|
||||
* Instantiate utxos packet from options.
|
||||
* @param {Buffer} data
|
||||
* @param {String?} enc
|
||||
* @returns {GetBlocksPacket}
|
||||
*/
|
||||
|
||||
UTXOsPacket.fromOptions = function fromOptions(options) {
|
||||
return new UTXOsPacket().fromOptions(options);
|
||||
};
|
||||
|
||||
/**
|
||||
* Get serialization size.
|
||||
* @returns {Number}
|
||||
*/
|
||||
|
||||
UTXOsPacket.prototype.getSize = function getSize() {
|
||||
var size = 0;
|
||||
var i;
|
||||
|
||||
size += 4;
|
||||
size += 32;
|
||||
size += encoding.sizeVarlen((this.hits.length + 7) / 8 | 0);
|
||||
size += encoding.sizeVarint(this.coins.length);
|
||||
|
||||
for (i = 0; i < this.coins.length; i++)
|
||||
size += 12 * this.coins[i].script.getVarSize();
|
||||
|
||||
return size;
|
||||
};
|
||||
|
||||
/**
|
||||
* Serialize utxos packet to writer.
|
||||
* @param {BufferWriter} bw
|
||||
*/
|
||||
|
||||
UTXOsPacket.prototype.toWriter = function toWriter(bw) {
|
||||
var map = new Buffer((this.hits.length + 7) / 8 | 0);
|
||||
var i, bit, oct, coin, height;
|
||||
|
||||
for (i = 0; i < this.hits.length; i++) {
|
||||
bit = i % 8;
|
||||
oct = (i - bit) / 8;
|
||||
map[oct] |= +this.hits[i] << (7 - bit);
|
||||
}
|
||||
|
||||
bw.writeU32(this.height);
|
||||
bw.writeHash(this.tip);
|
||||
bw.writeVarBytes(map);
|
||||
bw.writeVarInt(this.coins.length);
|
||||
|
||||
for (i = 0; i < this.coins.length; i++) {
|
||||
coin = this.coins[i];
|
||||
height = coin.height;
|
||||
|
||||
if (height === -1)
|
||||
height = 0x7fffffff;
|
||||
|
||||
bw.writeU32(coin.version);
|
||||
bw.writeU32(height);
|
||||
bw.write64(coin.value);
|
||||
bw.writeVarBytes(coin.script.toRaw());
|
||||
}
|
||||
|
||||
return bw;
|
||||
};
|
||||
|
||||
/**
|
||||
* Serialize utxos packet.
|
||||
* @returns {Buffer}
|
||||
*/
|
||||
|
||||
UTXOsPacket.prototype.toRaw = function toRaw() {
|
||||
var size = this.getSize();
|
||||
return this.toWriter(new StaticWriter(size)).render();
|
||||
};
|
||||
|
||||
/**
|
||||
* Inject properties from buffer reader.
|
||||
* @private
|
||||
* @param {BufferReader} br
|
||||
*/
|
||||
|
||||
UTXOsPacket.prototype.fromReader = function fromReader(br) {
|
||||
var i, bit, oct, coin, output;
|
||||
var version, height, map, count;
|
||||
|
||||
this.height = br.readU32();
|
||||
this.tip = br.readHash('hex');
|
||||
|
||||
map = br.readVarBytes();
|
||||
count = br.readVarint();
|
||||
|
||||
for (i = 0; i < map.length * 8; i++) {
|
||||
bit = i % 8;
|
||||
oct = (i - bit) / 8;
|
||||
this.hits.push((map[oct] >> (7 - bit)) & 1);
|
||||
}
|
||||
|
||||
for (i = 0; i < count; i++) {
|
||||
version = br.readU32();
|
||||
height = br.readU32();
|
||||
coin = new Coin();
|
||||
|
||||
if (height === 0x7fffffff)
|
||||
height = -1;
|
||||
|
||||
output = Output.fromReader(br);
|
||||
|
||||
coin.version = version;
|
||||
coin.height = height;
|
||||
coin.script = output.script;
|
||||
coin.value = output.value;
|
||||
|
||||
this.coins.push(coin);
|
||||
}
|
||||
|
||||
return this;
|
||||
};
|
||||
|
||||
/**
|
||||
* Inject properties from serialized data.
|
||||
* @private
|
||||
* @param {Buffer} data
|
||||
*/
|
||||
|
||||
UTXOsPacket.prototype.fromRaw = function fromRaw(data) {
|
||||
return this.fromReader(new BufferReader(data));
|
||||
};
|
||||
|
||||
/**
|
||||
* Instantiate utxos packet from buffer reader.
|
||||
* @param {BufferReader} br
|
||||
* @returns {UTXOsPacket}
|
||||
*/
|
||||
|
||||
UTXOsPacket.fromReader = function fromReader(br) {
|
||||
return new UTXOsPacket().fromReader(br);
|
||||
};
|
||||
|
||||
/**
|
||||
* Instantiate utxos packet from serialized data.
|
||||
* @param {Buffer} data
|
||||
* @param {String?} enc
|
||||
* @returns {UTXOsPacket}
|
||||
*/
|
||||
|
||||
UTXOsPacket.fromRaw = function fromRaw(data, enc) {
|
||||
if (typeof data === 'string')
|
||||
data = new Buffer(data, enc);
|
||||
return new UTXOsPacket().fromRaw(data);
|
||||
};
|
||||
|
||||
/**
|
||||
* Represents a `feefilter` packet.
|
||||
* @exports FeeFilterPacket
|
||||
@ -3862,10 +3527,6 @@ exports.fromRaw = function fromRaw(cmd, data) {
|
||||
return FilterClearPacket.fromRaw(data);
|
||||
case 'merkleblock':
|
||||
return MerkleBlockPacket.fromRaw(data);
|
||||
case 'getutxos':
|
||||
return GetUTXOsPacket.fromRaw(data);
|
||||
case 'utxos':
|
||||
return UTXOsPacket.fromRaw(data);
|
||||
case 'feefilter':
|
||||
return FeeFilterPacket.fromRaw(data);
|
||||
case 'sendcmpct':
|
||||
@ -3918,8 +3579,6 @@ exports.FilterLoadPacket = FilterLoadPacket;
|
||||
exports.FilterAddPacket = FilterAddPacket;
|
||||
exports.FilterClearPacket = FilterClearPacket;
|
||||
exports.MerkleBlockPacket = MerkleBlockPacket;
|
||||
exports.GetUTXOsPacket = GetUTXOsPacket;
|
||||
exports.UTXOsPacket = UTXOsPacket;
|
||||
exports.FeeFilterPacket = FeeFilterPacket;
|
||||
exports.SendCmpctPacket = SendCmpctPacket;
|
||||
exports.CmpctBlockPacket = CmpctBlockPacket;
|
||||
|
||||
@ -1504,12 +1504,6 @@ Peer.prototype.handlePacket = co(function* handlePacket(packet) {
|
||||
case packetTypes.MERKLEBLOCK:
|
||||
yield this.handleMerkleBlock(packet);
|
||||
break;
|
||||
case packetTypes.GETUTXOS:
|
||||
yield this.handleGetUTXOs(packet);
|
||||
break;
|
||||
case packetTypes.UTXOS:
|
||||
yield this.handleUTXOs(packet);
|
||||
break;
|
||||
case packetTypes.FEEFILTER:
|
||||
yield this.handleFeeFilter(packet);
|
||||
break;
|
||||
@ -1735,77 +1729,6 @@ Peer.prototype.handleFeeFilter = co(function* handleFeeFilter(packet) {
|
||||
this.emit('feefilter', rate);
|
||||
});
|
||||
|
||||
/**
|
||||
* Handle `utxos` packet.
|
||||
* @private
|
||||
* @param {UTXOsPacket}
|
||||
*/
|
||||
|
||||
Peer.prototype.handleUTXOs = co(function* handleUTXOs(utxos) {
|
||||
this.logger.debug('Received %d utxos (%s).',
|
||||
utxos.coins.length, this.hostname);
|
||||
this.emit('utxos', utxos);
|
||||
});
|
||||
|
||||
/**
|
||||
* Handle `getutxos` packet.
|
||||
* @private
|
||||
*/
|
||||
|
||||
Peer.prototype.handleGetUTXOs = co(function* handleGetUTXOs(packet) {
|
||||
var i, utxos, prevout, hash, index, coin;
|
||||
|
||||
if (!this.chain.synced)
|
||||
return;
|
||||
|
||||
if (this.options.selfish)
|
||||
return;
|
||||
|
||||
if (this.chain.options.spv)
|
||||
return;
|
||||
|
||||
if (packet.prevout.length > 15)
|
||||
return;
|
||||
|
||||
utxos = new packets.UTXOsPacket();
|
||||
|
||||
for (i = 0; i < packet.prevout.length; i++) {
|
||||
prevout = packet.prevout[i];
|
||||
hash = prevout.hash;
|
||||
index = prevout.index;
|
||||
|
||||
if (this.mempool && packet.mempool) {
|
||||
coin = this.mempool.getCoin(hash, index);
|
||||
|
||||
if (coin) {
|
||||
utxos.hits.push(1);
|
||||
utxos.coins.push(coin);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (this.mempool.isSpent(hash, index)) {
|
||||
utxos.hits.push(0);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
coin = yield this.chain.db.getCoin(hash, index);
|
||||
|
||||
if (!coin) {
|
||||
utxos.hits.push(0);
|
||||
continue;
|
||||
}
|
||||
|
||||
utxos.hits.push(1);
|
||||
utxos.coins.push(coin);
|
||||
}
|
||||
|
||||
utxos.height = this.chain.height;
|
||||
utxos.tip = this.chain.tip.hash;
|
||||
|
||||
this.send(utxos);
|
||||
});
|
||||
|
||||
/**
|
||||
* Handle `getheaders` packet.
|
||||
* @private
|
||||
|
||||
Loading…
Reference in New Issue
Block a user