From f99064750acc5589e74444650a0828416d7d8ead Mon Sep 17 00:00:00 2001 From: Christopher Jeffrey Date: Fri, 17 Nov 2017 21:22:23 -0800 Subject: [PATCH] net: move netaddress. --- lib/bcoin-browser.js | 2 +- lib/bcoin.js | 2 +- lib/net/hostlist.js | 76 +++++++++++++++------------ lib/net/index.js | 1 + lib/{primitives => net}/netaddress.js | 4 +- lib/net/packets.js | 2 +- lib/net/peer.js | 2 +- lib/net/pool.js | 1 + lib/node/rpc.js | 2 +- lib/primitives/index.js | 1 - test/protocol-test.js | 2 +- 11 files changed, 53 insertions(+), 42 deletions(-) rename lib/{primitives => net}/netaddress.js (99%) diff --git a/lib/bcoin-browser.js b/lib/bcoin-browser.js index 082fca14..de45f8ac 100644 --- a/lib/bcoin-browser.js +++ b/lib/bcoin-browser.js @@ -75,6 +75,7 @@ bcoin.net = require('./net'); bcoin.bip150 = require('./net/bip150'); bcoin.bip151 = require('./net/bip151'); bcoin.bip152 = require('./net/bip152'); +bcoin.netaddress = require('./net/netaddress'); bcoin.packets = require('./net/packets'); bcoin.peer = require('./net/peer'); bcoin.pool = require('./net/pool'); @@ -95,7 +96,6 @@ bcoin.invitem = require('./primitives/invitem'); bcoin.keyring = require('./primitives/keyring'); bcoin.merkleblock = require('./primitives/merkleblock'); bcoin.mtx = require('./primitives/mtx'); -bcoin.netaddress = require('./primitives/netaddress'); bcoin.outpoint = require('./primitives/outpoint'); bcoin.output = require('./primitives/output'); bcoin.tx = require('./primitives/tx'); diff --git a/lib/bcoin.js b/lib/bcoin.js index e40e79c1..3c6118bc 100644 --- a/lib/bcoin.js +++ b/lib/bcoin.js @@ -110,6 +110,7 @@ bcoin.define('net', './net'); bcoin.define('bip150', './net/bip150'); bcoin.define('bip151', './net/bip151'); bcoin.define('bip152', './net/bip152'); +bcoin.define('netaddress', './net/netaddress'); bcoin.define('packets', './net/packets'); bcoin.define('peer', './net/peer'); bcoin.define('pool', './net/pool'); @@ -130,7 +131,6 @@ bcoin.define('invitem', './primitives/invitem'); bcoin.define('keyring', './primitives/keyring'); bcoin.define('merkleblock', './primitives/merkleblock'); bcoin.define('mtx', './primitives/mtx'); -bcoin.define('netaddress', './primitives/netaddress'); bcoin.define('outpoint', './primitives/outpoint'); bcoin.define('output', './primitives/output'); bcoin.define('tx', './primitives/tx'); diff --git a/lib/net/hostlist.js b/lib/net/hostlist.js index b5013732..ae54131f 100644 --- a/lib/net/hostlist.js +++ b/lib/net/hostlist.js @@ -15,10 +15,15 @@ const Logger = require('blgr'); const {murmur3} = require('bfilter'); const util = require('../utils/util'); const Network = require('../protocol/network'); -const NetAddress = require('../primitives/netaddress'); +const NetAddress = require('./netaddress'); const List = require('../utils/list'); const common = require('./common'); const seeds = require('./seeds'); + +/* + * Constants + */ + const POOL32 = Buffer.allocUnsafe(32); /** @@ -67,13 +72,11 @@ class HostList { init() { const options = this.options; const scores = HostList.scores; - const hosts = IP.getPublic(); - const port = this.address.port; - for (let i = 0; i < this.options.maxBuckets; i++) + for (let i = 0; i < options.maxBuckets; i++) this.fresh.push(new Map()); - for (let i = 0; i < this.options.maxBuckets; i++) + for (let i = 0; i < options.maxBuckets; i++) this.used.push(new List()); this.setSeeds(options.seeds); @@ -82,6 +85,9 @@ class HostList { this.pushLocal(this.address, scores.MANUAL); this.addLocal(options.host, options.port, scores.BIND); + const hosts = IP.getPublic(); + const port = this.address.port; + for (const host of hosts) this.addLocal(host, port, scores.IF); } @@ -355,18 +361,19 @@ class HostList { return null; const now = this.network.now(); + let factor = 1; for (;;) { - let index = random(buckets.length); - const bucket = buckets[index]; + const i = random(buckets.length); + const bucket = buckets[i]; if (bucket.size === 0) continue; - index = random(bucket.size); - + let index = random(bucket.size); let entry; + if (buckets === this.used) { entry = bucket.head; while (index--) @@ -375,7 +382,7 @@ class HostList { for (entry of bucket.values()) { if (index === 0) break; - index--; + index -= 1; } } @@ -431,7 +438,6 @@ class HostList { let entry = this.map.get(addr.hostname); if (entry) { - const now = this.network.now(); let penalty = 2 * 60 * 60; let interval = 24 * 60 * 60; @@ -445,6 +451,7 @@ class HostList { entry.addr.services >>>= 0; // Online? + const now = this.network.now(); if (now - addr.time < 24 * 60 * 60) interval = 60 * 60; @@ -490,7 +497,7 @@ class HostList { entry = new HostEntry(addr, src); - this.totalFresh++; + this.totalFresh += 1; } const bucket = this.freshBucket(entry); @@ -502,7 +509,7 @@ class HostList { this.evictFresh(bucket); bucket.set(entry.key(), entry); - entry.refCount++; + entry.refCount += 1; this.map.set(entry.key(), entry); this.needsFlush = true; @@ -524,7 +531,7 @@ class HostList { if (--entry.refCount === 0) { this.map.delete(entry.key()); - this.totalFresh--; + this.totalFresh -= 1; } continue; @@ -546,7 +553,7 @@ class HostList { if (--old.refCount === 0) { this.map.delete(old.key()); - this.totalFresh--; + this.totalFresh -= 1; } } @@ -605,7 +612,7 @@ class HostList { for (const bucket of this.used) { if (bucket.head === head) { bucket.remove(entry); - this.totalUsed--; + this.totalUsed -= 1; head = null; break; } @@ -615,10 +622,10 @@ class HostList { } else { for (const bucket of this.fresh) { if (bucket.delete(entry.key())) - entry.refCount--; + entry.refCount -= 1; } - this.totalFresh--; + this.totalFresh -= 1; assert(entry.refCount === 0); } @@ -639,7 +646,7 @@ class HostList { if (!entry) return; - entry.attempts++; + entry.attempts += 1; entry.lastAttempt = now; } @@ -686,17 +693,17 @@ class HostList { assert(entry.refCount > 0); // Remove from fresh. - let old; + let old = null; for (const bucket of this.fresh) { if (bucket.delete(entry.key())) { - entry.refCount--; + entry.refCount -= 1; old = bucket; } } assert(old); assert(entry.refCount === 0); - this.totalFresh--; + this.totalFresh -= 1; // Find room in used bucket. const bucket = this.usedBucket(entry); @@ -704,12 +711,13 @@ class HostList { if (bucket.size < this.options.maxEntries) { entry.used = true; bucket.push(entry); - this.totalUsed++; + this.totalUsed += 1; return; } // No room. Evict. const evicted = this.evictUsed(bucket); + let fresh = this.freshBucket(evicted); // Move to entry's old bucket if no room. @@ -724,8 +732,8 @@ class HostList { evicted.used = false; fresh.set(evicted.key(), evicted); assert(evicted.refCount === 0); - evicted.refCount++; - this.totalFresh++; + evicted.refCount += 1; + this.totalFresh += 1; } /** @@ -937,7 +945,7 @@ class HostList { if (!local) return false; - local.score++; + local.score += 1; return true; } @@ -954,7 +962,7 @@ class HostList { for (const seed of this.dnsSeeds) jobs.push(this.populateSeed(seed)); - await Promise.all(jobs); + return Promise.all(jobs); } /** @@ -969,7 +977,7 @@ class HostList { for (const node of this.dnsNodes) jobs.push(this.populateNode(node)); - await Promise.all(jobs); + return Promise.all(jobs); } /** @@ -1078,11 +1086,12 @@ class HostList { fromJSON(json) { const sources = new Map(); const map = new Map(); - let totalFresh = 0; - let totalUsed = 0; const fresh = []; const used = []; + let totalFresh = 0; + let totalUsed = 0; + assert(json && typeof json === 'object'); assert(json.version === HostList.VERSION, @@ -1092,6 +1101,7 @@ class HostList { for (const addr of json.addrs) { const entry = HostEntry.fromJSON(addr, this.network); + let src = sources.get(entry.src.hostname); // Save some memory. @@ -1116,8 +1126,8 @@ class HostList { const entry = map.get(key); assert(entry); if (entry.refCount === 0) - totalFresh++; - entry.refCount++; + totalFresh += 1; + entry.refCount += 1; bucket.set(key, entry); } @@ -1143,7 +1153,7 @@ class HostList { assert(entry.refCount === 0); assert(!entry.used); entry.used = true; - totalUsed++; + totalUsed += 1; bucket.push(entry); } diff --git a/lib/net/index.js b/lib/net/index.js index 77968eb1..8233a22d 100644 --- a/lib/net/index.js +++ b/lib/net/index.js @@ -17,6 +17,7 @@ exports.common = require('./common'); exports.external = require('./external'); exports.Framer = require('./framer'); exports.HostList = require('./hostlist'); +exports.NetAddress = require('./netaddress'); exports.packets = require('./packets'); exports.Parser = require('./parser'); exports.Peer = require('./peer'); diff --git a/lib/primitives/netaddress.js b/lib/net/netaddress.js similarity index 99% rename from lib/primitives/netaddress.js rename to lib/net/netaddress.js index 6a0730e1..fdb24e9a 100644 --- a/lib/primitives/netaddress.js +++ b/lib/net/netaddress.js @@ -9,14 +9,14 @@ const assert = require('assert'); const bio = require('bufio'); const IP = require('binet'); -const common = require('../net/common'); const Network = require('../protocol/network'); const util = require('../utils/util'); +const common = require('./common'); /** * Net Address * Represents a network address. - * @alias module:primitives.NetAddress + * @alias module:net.NetAddress * @property {Host} host * @property {Number} port * @property {Number} services diff --git a/lib/net/packets.js b/lib/net/packets.js index 7ca9fbdd..0b1d41c4 100644 --- a/lib/net/packets.js +++ b/lib/net/packets.js @@ -17,7 +17,7 @@ const {BloomFilter} = require('bfilter'); const common = require('./common'); const util = require('../utils/util'); const bip152 = require('./bip152'); -const NetAddress = require('../primitives/netaddress'); +const NetAddress = require('./netaddress'); const Headers = require('../primitives/headers'); const InvItem = require('../primitives/invitem'); const MemBlock = require('../primitives/memblock'); diff --git a/lib/net/peer.js b/lib/net/peer.js index ef981ed9..53ca78ca 100644 --- a/lib/net/peer.js +++ b/lib/net/peer.js @@ -26,7 +26,7 @@ const BIP150 = require('./bip150'); const BIP152 = require('./bip152'); const Block = require('../primitives/block'); const TX = require('../primitives/tx'); -const NetAddress = require('../primitives/netaddress'); +const NetAddress = require('./netaddress'); const Network = require('../protocol/network'); const services = common.services; const invTypes = InvItem.types; diff --git a/lib/net/pool.js b/lib/net/pool.js index 3ebd6fc1..db44dc72 100644 --- a/lib/net/pool.js +++ b/lib/net/pool.js @@ -3329,6 +3329,7 @@ class Pool extends EventEmitter { throw new Error('Peer is destroyed (getdata).'); let now = Date.now(); + const items = []; for (const hash of hashes) { diff --git a/lib/node/rpc.js b/lib/node/rpc.js index 4287bce3..9ff36495 100644 --- a/lib/node/rpc.js +++ b/lib/node/rpc.js @@ -19,7 +19,7 @@ const secp256k1 = require('bcrypto/lib/secp256k1'); const util = require('../utils/util'); const common = require('../blockchain/common'); const Amount = require('../btc/amount'); -const NetAddress = require('../primitives/netaddress'); +const NetAddress = require('../net/netaddress'); const Script = require('../script/script'); const Address = require('../primitives/address'); const Block = require('../primitives/block'); diff --git a/lib/primitives/index.js b/lib/primitives/index.js index b37920fb..1d2cebdc 100644 --- a/lib/primitives/index.js +++ b/lib/primitives/index.js @@ -21,7 +21,6 @@ exports.KeyRing = require('./keyring'); exports.MemBlock = require('./memblock'); exports.MerkleBlock = require('./merkleblock'); exports.MTX = require('./mtx'); -exports.NetAddress = require('./netaddress'); exports.Outpoint = require('./outpoint'); exports.Output = require('./output'); exports.TX = require('./tx'); diff --git a/test/protocol-test.js b/test/protocol-test.js index 221431fd..69d0ab1c 100644 --- a/test/protocol-test.js +++ b/test/protocol-test.js @@ -7,7 +7,7 @@ const assert = require('./util/assert'); const Network = require('../lib/protocol/network'); const util = require('../lib/utils/util'); -const NetAddress = require('../lib/primitives/netaddress'); +const NetAddress = require('../lib/net/netaddress'); const TX = require('../lib/primitives/tx'); const Framer = require('../lib/net/framer'); const Parser = require('../lib/net/parser');