diff --git a/lib/bcoin/protocol/framer.js b/lib/bcoin/protocol/framer.js index 58bd1120..784fe38d 100644 --- a/lib/bcoin/protocol/framer.js +++ b/lib/bcoin/protocol/framer.js @@ -341,14 +341,15 @@ Framer.prototype.addr = function addr(peers) { c += utils.writeU64(p, 1, c); // ipv6 - c += utils.writeU32BE(p, utils.readU32BE(peer.ipv6, 0), c); - c += utils.writeU16BE(p, utils.readU16BE(peer.ipv6, 4), c); + c += utils.writeU32BE(p, utils.readU32BE(peer.ipv6, 4), c); + c += utils.writeU32BE(p, utils.readU32BE(peer.ipv6, 8), c); + c += utils.writeU32BE(p, utils.readU32BE(peer.ipv6, 12), c); // ipv4 c += utils.writeU32BE(p, utils.readU32BE(peer.ipv4, 0), c); // port - c += utils.writeU16BE(peer.port, c); + c += utils.writeU16BE(p, peer.port, c); } return this.packet('addr', p); diff --git a/test/protocol-test.js b/test/protocol-test.js index 6da53bc1..88b2b166 100644 --- a/test/protocol-test.js +++ b/test/protocol-test.js @@ -11,7 +11,7 @@ describe('Protocol', function() { function packetTest(command, payload, test) { it('should encode/decode ' + command, function(cb) { - var ver = framer[command](); + var ver = framer[command](payload); parser.once('packet', function(packet) { assert.equal(packet.cmd, command); test(packet.payload); @@ -28,4 +28,69 @@ describe('Protocol', function() { packetTest('verack', {}, function(payload) { }); + + var peers = [ + { + ipv6: '0000:0000:0000:0000:0000:0000:0000:ffff', + ipv4: '127.0.0.1', + port: 8333 + }, + { + ipv6: '0000:0000:0000:0000:0000:7f00:0001:ffff', + ipv4: '10.0.0.1', + port: 18333 + } + ]; + + // Convert peers to framer payload format, backup strings. + peers.forEach(function(addr) { + addr._ipv4 = addr.ipv4; + addr.ipv4 = addr.ipv4.split('.').map(function(n) { + return +n; + }); + addr._ipv6 = addr.ipv6; + addr.ipv6 = addr.ipv6.split(':').map(function(n) { + return [(parseInt(n, 16) >> 8) & 0xff, parseInt(n, 16) & 0xff]; + }).reduce(function(out, val) { + return out.concat(val); + }, []); + addr._ipv6 = '::' + addr._ipv6.split(':').slice(2).join(':'); + }); + + packetTest('addr', peers, function(payload) { + if (parser.parseAddr) { + payload = parser.parseAddr(payload); + } else { + // XXX Legacy + var addrs = []; + bcoin.peer.prototype._handleAddr.call({ + emit: function(_, obj) { + addrs.push(obj); + } + }, payload); + payload = addrs; + payload.forEach(function(addr) { + addr.date = addr.date.getTime() / 1000 | 0; + delete addr.address; + delete addr.host; + delete addr.host6; + addr.ipv6 = '::' + addr.ipv6; + }); + } + + assert.equal(typeof payload.length, 'number'); + assert.equal(payload.length, 2); + + assert.equal(typeof payload[0].date, 'number'); + assert.equal(payload[0].network, 1); + assert.equal(payload[0].ipv6, peers[0]._ipv6); + assert.equal(payload[0].ipv4, peers[0]._ipv4); + assert.equal(payload[0].port, peers[0].port); + + assert.equal(typeof payload[1].date, 'number'); + assert.equal(payload[1].network, 1); + assert.equal(payload[1].ipv6, peers[1]._ipv6); + assert.equal(payload[1].ipv4, peers[1]._ipv4); + assert.equal(payload[1].port, peers[1].port); + }); });