From 6513f713f658506ca558227e673e9f146d752bcd Mon Sep 17 00:00:00 2001 From: achingbrain Date: Thu, 3 Oct 2024 12:48:24 +0100 Subject: [PATCH] fix: grow routing table trie towards node kad-id Instead of having a balance trie, grow the routing table towards the current node's kad-id. This gives a better knowledge of the network as we get closer to our own kad-id. The previous behaviour can be replicated by setting `prefixLength` and `selfPrefixLength` to the same value. --- packages/kad-dht/README.md | 39 + packages/kad-dht/src/index.ts | 39 + packages/kad-dht/src/routing-table/index.ts | 5 +- .../kad-dht/src/routing-table/k-bucket.ts | 52 +- .../test/fixtures/prefixed-peer-ids.ts | 711 ++++++++++++++++++ packages/kad-dht/test/routing-table.spec.ts | 122 ++- 6 files changed, 886 insertions(+), 82 deletions(-) create mode 100644 packages/kad-dht/test/fixtures/prefixed-peer-ids.ts diff --git a/packages/kad-dht/README.md b/packages/kad-dht/README.md index 7d5c50f9c8..404cd51a2b 100644 --- a/packages/kad-dht/README.md +++ b/packages/kad-dht/README.md @@ -102,6 +102,45 @@ const peerInfo = await node.peerRouting.findPeer(peerId) console.info(peerInfo) // peer id, multiaddrs ``` +## The routing table + +This module uses a binary trie for it's routing table. By default the trie +will only grow in the direction of the KadID of the current peer: + +``` +Peer KadID: 01101... + + InternalBucket + 0 / \ 1 + InternalBucket LeafBucket + 0 / \ 1 +LeafBucket InternalBucket + 0 / \ 1 + LeafBucket InternalBucket + 0 / \ 1 + InternalBucket LeafBucket + 0 / \ 1 + LeafBucket InternalBucket + ...etc +``` + +This ensures that the closer we get to the node's KadID, the more peers the +trie contains, so we know about more of the network. + +This attempts to balance knowledge of the network with maintenance overhead, +since we will need to periodically contact peers in the routing table to +ensure that they are still online. + +The `prefixLength` parameter controls how deep the trie will grow await from +the KadID, and the `selfPrefixLength` parameter controls how deep it will +grow towards the KadID. + +Larger values will result in a bigger trie which in turn causes more memory +consumption and more network requests as the nodes are re-contacted. + +Setting these to the same value will create a balanced trie which will result +in queries with fewer hops but at the cost of higher maintenance overhead. + # Install ```console diff --git a/packages/kad-dht/src/index.ts b/packages/kad-dht/src/index.ts index 65ef605b0b..6e552e0973 100644 --- a/packages/kad-dht/src/index.ts +++ b/packages/kad-dht/src/index.ts @@ -78,6 +78,45 @@ * * console.info(peerInfo) // peer id, multiaddrs * ``` + * + * ## The routing table + * + * This module uses a binary trie for it's routing table. By default the trie + * will only grow in the direction of the KadID of the current peer: + * + * ``` + * Peer KadID: 01101... + * + * InternalBucket + * 0 / \ 1 + * InternalBucket LeafBucket + * 0 / \ 1 + * LeafBucket InternalBucket + * 0 / \ 1 + * LeafBucket InternalBucket + * 0 / \ 1 + * InternalBucket LeafBucket + * 0 / \ 1 + * LeafBucket InternalBucket + * ...etc + * ``` + * + * This ensures that the closer we get to the node's KadID, the more peers the + * trie contains, so we know about more of the network. + * + * This attempts to balance knowledge of the network with maintenance overhead, + * since we will need to periodically contact peers in the routing table to + * ensure that they are still online. + * + * The `prefixLength` parameter controls how deep the trie will grow await from + * the KadID, and the `selfPrefixLength` parameter controls how deep it will + * grow towards the KadID. + * + * Larger values will result in a bigger trie which in turn causes more memory + * consumption and more network requests as the nodes are re-contacted. + * + * Setting these to the same value will create a balanced trie which will result + * in queries with fewer hops but at the cost of higher maintenance overhead. */ import { KadDHT as KadDHTClass } from './kad-dht.js' diff --git a/packages/kad-dht/src/routing-table/index.ts b/packages/kad-dht/src/routing-table/index.ts index 5295dc394b..7d12cd1f48 100644 --- a/packages/kad-dht/src/routing-table/index.ts +++ b/packages/kad-dht/src/routing-table/index.ts @@ -15,7 +15,8 @@ import type { AdaptiveTimeoutInit } from '@libp2p/utils/adaptive-timeout' export const KAD_CLOSE_TAG_NAME = 'kad-close' export const KAD_CLOSE_TAG_VALUE = 50 export const KBUCKET_SIZE = 20 -export const PREFIX_LENGTH = 7 +export const PREFIX_LENGTH = 8 +export const SELF_PREFIX_LENGTH = 32 export const PING_NEW_CONTACT_TIMEOUT = 2000 export const PING_NEW_CONTACT_CONCURRENCY = 20 export const PING_NEW_CONTACT_MAX_QUEUE_SIZE = 100 @@ -33,6 +34,7 @@ export interface RoutingTableInit { logPrefix: string protocol: string prefixLength?: number + selfPrefixLength?: number splitThreshold?: number kBucketSize?: number pingNewContactTimeout?: AdaptiveTimeoutInit @@ -143,6 +145,7 @@ export class RoutingTable extends TypedEventEmitter implemen this.kb = new KBucket({ kBucketSize: init.kBucketSize, prefixLength: init.prefixLength, + selfPrefixLength: init.selfPrefixLength, splitThreshold: init.splitThreshold, numberOfOldContactsToPing: init.numberOfOldContactsToPing, lastPingThreshold: init.lastPingThreshold, diff --git a/packages/kad-dht/src/routing-table/k-bucket.ts b/packages/kad-dht/src/routing-table/k-bucket.ts index 6f9bf67770..679ba6835b 100644 --- a/packages/kad-dht/src/routing-table/k-bucket.ts +++ b/packages/kad-dht/src/routing-table/k-bucket.ts @@ -5,7 +5,7 @@ import { toString as uint8ArrayToString } from 'uint8arrays/to-string' import { xor as uint8ArrayXor } from 'uint8arrays/xor' import { PeerDistanceList } from '../peer-list/peer-distance-list.js' import { convertPeerId } from '../utils.js' -import { KBUCKET_SIZE, LAST_PING_THRESHOLD, PING_OLD_CONTACT_COUNT, PREFIX_LENGTH } from './index.js' +import { KBUCKET_SIZE, LAST_PING_THRESHOLD, PING_OLD_CONTACT_COUNT, PREFIX_LENGTH, SELF_PREFIX_LENGTH } from './index.js' import type { PeerId } from '@libp2p/interface' import type { AbortOptions } from 'it-protobuf-stream' @@ -58,10 +58,19 @@ export interface KBucketOptions { * this value, the deeper the tree will grow and the slower the lookups will * be but the peers returned will be more specific to the key. * - * @default 32 + * @default 8 */ prefixLength?: number + /** + * For the self key we let the trie grow up to this depth in order to store + * more specific peers as we get closer to our own KadID. The final leaf + * should contain the 20x Kad-closest peers known on the network. + * + * @default 32 + */ + selfPrefixLength?: number + /** * The number of nodes that a max-depth k-bucket can contain before being * full. @@ -135,6 +144,7 @@ export class KBucket { public root: Bucket public localPeer?: Peer private readonly prefixLength: number + private readonly selfPrefixLength: number private readonly splitThreshold: number private readonly kBucketSize: number private readonly numberOfNodesToPing: number @@ -148,6 +158,7 @@ export class KBucket { constructor (options: KBucketOptions) { this.prefixLength = options.prefixLength ?? PREFIX_LENGTH + this.selfPrefixLength = options.selfPrefixLength ?? SELF_PREFIX_LENGTH this.kBucketSize = options.kBucketSize ?? KBUCKET_SIZE this.splitThreshold = options.splitThreshold ?? this.kBucketSize this.numberOfNodesToPing = options.numberOfOldContactsToPing ?? PING_OLD_CONTACT_COUNT @@ -181,6 +192,11 @@ export class KBucket { * Adds a contact to the trie */ async add (peerId: PeerId, options?: AbortOptions): Promise { + // do not add self peer to trie + if (peerId.equals(this.localPeer?.peerId)) { + return + } + const peer = { peerId, kadId: await convertPeerId(peerId), @@ -202,6 +218,18 @@ export class KBucket { } } + private _canSplit (bucket: LeafBucket): boolean { + if (bucket.peers.length !== this.splitThreshold) { + return false + } + + if (bucket.containsSelf === true) { + return bucket.depth < this.selfPrefixLength + } + + return bucket.depth < this.prefixLength + } + private async _add (peer: Peer, options?: AbortOptions): Promise { const bucket = this._determineBucket(peer.kadId) @@ -211,7 +239,7 @@ export class KBucket { } // are there too many peers in the bucket and can we make the trie deeper? - if (bucket.peers.length === this.splitThreshold && bucket.depth < this.prefixLength) { + if (this._canSplit(bucket)) { // split the bucket await this._split(bucket) @@ -411,14 +439,13 @@ export class KBucket { */ private _determineBucket (kadId: Uint8Array): LeafBucket { const bitString = uint8ArrayToString(kadId, 'base2') - const prefix = bitString.substring(0, this.prefixLength) function findBucket (bucket: Bucket, bitIndex: number = 0): LeafBucket { if (isLeafBucket(bucket)) { return bucket } - const bit = prefix[bitIndex] + const bit = bitString[bitIndex] if (bit === '0') { return findBucket(bucket.left, bitIndex + 1) @@ -448,17 +475,15 @@ export class KBucket { * @param {any} bucket - bucket for splitting */ private async _split (bucket: LeafBucket): Promise { - const depth = bucket.prefix === '' ? bucket.depth : bucket.depth + 1 - // create child buckets const left: LeafBucket = { prefix: '0', - depth, + depth: bucket.depth + 1, peers: [] } const right: LeafBucket = { prefix: '1', - depth, + depth: bucket.depth + 1, peers: [] } @@ -466,7 +491,7 @@ export class KBucket { delete bucket.containsSelf const selfNodeBitString = uint8ArrayToString(this.localPeer.kadId, 'base2') - if (selfNodeBitString[depth] === '0') { + if (selfNodeBitString[bucket.depth] === '0') { left.containsSelf = true } else { right.containsSelf = true @@ -477,7 +502,7 @@ export class KBucket { for (const peer of bucket.peers) { const bitString = uint8ArrayToString(peer.kadId, 'base2') - if (bitString[depth] === '0') { + if (bitString[bucket.depth] === '0') { left.peers.push(peer) await this.onMove?.(peer, bucket, left) } else { @@ -497,6 +522,11 @@ function convertToInternalBucket (bucket: any, left: any, right: any): bucket is bucket.left = left bucket.right = right + if (bucket.prefix === '') { + delete bucket.depth + delete bucket.prefix + } + return true } diff --git a/packages/kad-dht/test/fixtures/prefixed-peer-ids.ts b/packages/kad-dht/test/fixtures/prefixed-peer-ids.ts new file mode 100644 index 0000000000..9bc9c24a2f --- /dev/null +++ b/packages/kad-dht/test/fixtures/prefixed-peer-ids.ts @@ -0,0 +1,711 @@ +import { peerIdFromString } from '@libp2p/peer-id' + +// 00010 +export const rootPeerId = peerIdFromString('12D3KooWNq99a7DtUgvzyiHwvBX4m7TDLmn6nLZvJUzSt72wc1Zu') + +export const prefixPeerIds = { + 10000: [ + peerIdFromString('12D3KooWQFAx7xdeor98niSpR7h6dVbgdpngKF8r3cR2RrS7cxT8'), + peerIdFromString('12D3KooWJssPDEpmAPUCNHKoAdfWrBUYNJh4yrmX6Zn3tuKsMTTq'), + peerIdFromString('12D3KooWFqviyazistNkkYFiTghqhBjFrANSvUCsptWw3LeZafsS'), + peerIdFromString('12D3KooWGNB7MuHP21WQJxjv6iVU1MGmF4cx1aSBfQYBCU1n8C9T'), + peerIdFromString('12D3KooW9zphZ7uWqyMMXTMKqspYkbxBqgGm389Ucgo4wV1QZzTK'), + peerIdFromString('12D3KooWMGNcPTAnxbz7vKtURBWWsRfA9vR539q7dicasjWq3kz2'), + peerIdFromString('12D3KooWPJbDFU4YKkgUJgnKuKtF6WcQHW2Hj6zvdoW272R7mN3n'), + peerIdFromString('12D3KooWRXasRN8yPuQTH538XeEjqz7U9gfbpQ1MbDCaMQPPqbeE'), + peerIdFromString('12D3KooWQi6dJmCuNH2BUNfwyzxpqWzW6MXLkmTmioYynNZyELib'), + peerIdFromString('12D3KooWRhUJ4bc6dxeZnw5iQix2DHcJadFz37nU8eoPdmZteERS'), + peerIdFromString('12D3KooWQwrZGgkxLuANm54ZBhdtBASk9v6YYsVCYHPDd68t2Tjs'), + peerIdFromString('12D3KooWLDC4231FEvezE4kpWPQMwhtWBKR5rLkr9Wcucph2gZjm'), + peerIdFromString('12D3KooWQX36NPsVLmZXicD1JTcDoPnF24moqZnpGaoBbHFKeoWa'), + peerIdFromString('12D3KooWSVP8Ws8YWfp6ea6aKwHHagRNeK1ce8EinMdtg2N7g2Wz'), + peerIdFromString('12D3KooWLPBCsjX3N58jMZfQLod5AAcat76s1hx3VKB8SZdaXHNR'), + peerIdFromString('12D3KooWPmXcQ52TrYJLyGEe56TPcyNjhaVtrb5KPj9pT4XbGpVb'), + peerIdFromString('12D3KooWC9MmNy6AK3YxeXvSAhKHizVMsrKHkMvj5Pq6Pue6tkxZ'), + peerIdFromString('12D3KooWM2fpeyECDDCVb7F45VzUaSrBRPLbPpCyzp1WdbNndfBt'), + peerIdFromString('12D3KooWPy1iwBuXfi5mGq3PDT7XoyVpLk31rrnQNFtCXv7AM8dS'), + peerIdFromString('12D3KooWSsA87yD9i82wYLoFcbmiz5pxCeuF9w8qPk7owzFq8LyZ') + ], + 10001: [ + peerIdFromString('12D3KooWB5RJPLwV6uPggBUuuCqGUqU2EH9YrS3crV7MEcnT7s9E'), + peerIdFromString('12D3KooWKGECvR7jm55Pjcyqtn5dWbwHUfGqb5hW935bENXzurrA'), + peerIdFromString('12D3KooWQteCkFnczZp99Vq952taN36YGMxdEWXBNQp4A8xHN6mb'), + peerIdFromString('12D3KooWBpae8uJ96mKy53mznwFyybRYBYYPr2tyCMVrgru7fyD8'), + peerIdFromString('12D3KooWPTwRwjnmNSMKatUp1hEiBMExgiz5fcRhXHyPkT9fCPT2'), + peerIdFromString('12D3KooWATmTxy3uKHiPWUaEp2RULxq5zpE2oDkKJ5rGgwXzpvw9'), + peerIdFromString('12D3KooWQFjZyxSsUT9qMsaVfmXdf47946PqYhHzyktEaaZv8EKj'), + peerIdFromString('12D3KooWCw927rCWAd4yAzYLGTVxbED1aBqZgwYMRi5D4TNbrKf5'), + peerIdFromString('12D3KooWQHtF8jtfGedTgzDzaFbqnkR8YBojqfFZ7RrJECqAQuUe'), + peerIdFromString('12D3KooWARv5RTaNUcbVaavgN9dRgUwZe9nYUX7nuR5m5VdoSDTm'), + peerIdFromString('12D3KooWB2Z1qmGqfeW9pRHnkRE3WBdXvF3aSajW2Vpep1Svy7jQ'), + peerIdFromString('12D3KooWBNjM4xSWyzqgPsZgEkw9DdC1xkKKLZmbpmXtL1YG46Bo'), + peerIdFromString('12D3KooWHMCdABUEQHurxortgrnqS2DUqV4TqtJkPZEH5iwVxJeL'), + peerIdFromString('12D3KooWNFRaYmQqtZfnJXjPbaGnhddsZJCfb5ftJpBeoEV4aLvf'), + peerIdFromString('12D3KooWJqbWM3yQ2yrmR4U3LP5Y5PmcpgdNacFoKPXeKSwaDFRj'), + peerIdFromString('12D3KooWLmsGyHL7SfMEW6z5wp5AqvAekJU3d2gDCbrguCZMQd3j'), + peerIdFromString('12D3KooWM3rvVGW9LaNookxC1kFNQFYUNMjpVLooHvZThVk1Pweb'), + peerIdFromString('12D3KooWQ6PxhZyTU96ZHYjg17uRCGoXMZzcKWi2heTvtE2WJDqj'), + peerIdFromString('12D3KooWKq8Gri7SVpFJ3k9ccKRYv6zHze8kPeaNTJEdPbrBatLC'), + peerIdFromString('12D3KooWHZDAqgTHS1ZvzcqRrhwbVRBt6FD7xbBvyEQLTZShmEk7') + ], + 10010: [ + peerIdFromString('12D3KooWE1K8V44mevsuD96BScJgJJidLMRk25nRX1bbNceieRpZ'), + peerIdFromString('12D3KooWL9w9bBvwGR9f3k5DM68oz9fRpWvZgXHXXKDrEpUC6Mj3'), + peerIdFromString('12D3KooWJXKcsmorEWwjnwGoEvv2c4U3STXnrXa2vQTVMbzoFDUH'), + peerIdFromString('12D3KooWKr7Xztu2EzwSY54phw9SA8TdvtsBwE3m451AXefgzpwt'), + peerIdFromString('12D3KooWBsZhXiRFJMZVamcv9oWE5XRtbN3sWPjPS5USW17Z4LBC'), + peerIdFromString('12D3KooWP9iJmWDy3rBt3s9CvQmQtKgxTTFp3xYkMR9ZXTzzkSu6'), + peerIdFromString('12D3KooWN1zzGGE4rhuF73VJVmwkpZMFxgpopL5TQKisJYKVjxDG'), + peerIdFromString('12D3KooWNN5P5Qp3U3iD5sRu9KnvJkcCXK5TzHbapEZY64nc9KdS'), + peerIdFromString('12D3KooWPHF4xf3zZmitPZrMYmcZB8MXhnWdE7GKXHWexXDYWs92'), + peerIdFromString('12D3KooWS1xLuYWDdfqZrngJp9FycckWEvXr9ch5rxH9JvmkY6iJ'), + peerIdFromString('12D3KooWJE6tNYTQBrawuPQTA3gw5VVe6Ak5ApvHAgjBQ82BijTZ'), + peerIdFromString('12D3KooWK5JBQvhnevDGXm2esXLGdr3bhdXHH9Nqhv4E3Nr6XJai'), + peerIdFromString('12D3KooWGZbUDQC1k1THWzqRN71ixjjZf7JxcujUncrLEY4fmCtP'), + peerIdFromString('12D3KooWSjzFusmyKPAWrDK9veUZVRG1oyoDaW9qh9RmfpyxqUof'), + peerIdFromString('12D3KooWBP3eW2FEG8YNEjY8DuFYYE93ygF6BdR27tLxHUB4tj9e'), + peerIdFromString('12D3KooW9qP98RtSSyJP6FRkWtvVD23xQbDb53FcmgUdegRQTxhA'), + peerIdFromString('12D3KooWALjY8pgN1HhcTUwNTiHRd7RpVUsSX6RQcW6BmWjdMTVs'), + peerIdFromString('12D3KooWEFBF5ZGPzWCtANPN1FJUQiALq5okkrHm1Ns3uVgb3Fi5'), + peerIdFromString('12D3KooWAkHhSgRgYSXiiCyoJWun18TUeah16r5jbQYHBbxy6kLh'), + peerIdFromString('12D3KooWCwLijnhfTiMMCKcwWjfRTRoJVbtDiR385nL9nf1sFeHq') + ], + 10011: [ + peerIdFromString('12D3KooWGGs6sG2FNeSYJDaWJ6EpsdW5D597BqftF8bY51J99Wv7'), + peerIdFromString('12D3KooWHnSENoPGfE6MQ4fsxFkE9deprgCsiMVmy11edBuDzBDx'), + peerIdFromString('12D3KooWCKy64fcsRGNFw7tmEefScRNyu6eZyAjr1nQNPnDa7CET'), + peerIdFromString('12D3KooWHzpRLEGc9HrrHikK6Gu2suzuGNraisev3E7tu6SVdjPp'), + peerIdFromString('12D3KooWA5VgVZbm9oTwxAB3DvTRJs8wDXzaYEDRrxEJ4vnuxyiK'), + peerIdFromString('12D3KooWFvZNYaJd7bMHSSgsvbJhyNi8MwGUu5oBnsspRZVFFJJU'), + peerIdFromString('12D3KooWJxpg6BVxd82sv6aDaQVMgu5Lfg5N3wWC9EizZdKUH1Yt'), + peerIdFromString('12D3KooWGd9rAYBi37FWhjVr97PNJ64xefUWWFbJ6QyZwGmbPrRV'), + peerIdFromString('12D3KooWSD2FXPoEf8Q2TTd4fRuoonXqLjyc23iHYcqSzATn2xoo'), + peerIdFromString('12D3KooWEpsjpoehpDAfbe3CmMm7MVUJ2cpbMeFKQAKtHSdQLZrj'), + peerIdFromString('12D3KooWGHCfYC9kit7sxU5zzUJQUcpftkANRn7hXW7ZBDg1K5b6'), + peerIdFromString('12D3KooWNnCrVpbDQKasXkM9d2rLN9NDhLjSSX2EARiBkoCD9UTt'), + peerIdFromString('12D3KooWFq2cn5EuEokhMDPbMVuGFnzCZ8BmU9LRpgxYhUruenUa'), + peerIdFromString('12D3KooWKdLEgHvjNLZEuKzVbRWgUdHZciXuyiGuxZGLenYm7PBy'), + peerIdFromString('12D3KooWRtVfBKAD4cdXdNwiBKMnQX436cTD9A15MY56h7NrENqD'), + peerIdFromString('12D3KooWNefjMMhYp288VVKZJ2pzrewpRdKpGyK32BK83WoubDAZ'), + peerIdFromString('12D3KooWGCBFG7g5ThBK8PXFzdComNEQSyPmFcZXDackYX3hU2p9'), + peerIdFromString('12D3KooWPQK1bFewWS9jbQ9cNinhDzgZ3YUXLVApDiBWDDcMqtio'), + peerIdFromString('12D3KooWKRNLdRjwzkr4FBgNUo92dLDwchLuBvnyvPczETEYBkGL'), + peerIdFromString('12D3KooWS9WQsDJaDvjudfzUg3ahYTeg1A4GnRUkpyorTHKeH13S') + ], + 10100: [ + peerIdFromString('12D3KooWHm8YMtymWhhRJgk5L9ywBB1efQv254WhLTZ8a6nApW2e'), + peerIdFromString('12D3KooWKFwDkCFftwXHteDBGRX71W1czc4hSHuxGmRtcYoHf1ym'), + peerIdFromString('12D3KooWDnMfntPEAzHno3thtY7jozKEM9nsKYRHXELBMNcPMSz1'), + peerIdFromString('12D3KooWHdtzfs7Xuk9BpieUtX74EXDGhnjRqZrSLQEwjoUp6Miz'), + peerIdFromString('12D3KooWAJ95U99wwfmGuiea4KFBa3YaBBX5AYvWCUpERrtx1p7V'), + peerIdFromString('12D3KooWPJCfTwCb3XEnFJq8872dc5YHJtHUgxtjPvMmcLm1i4GT'), + peerIdFromString('12D3KooWFk3BXoL3mJgBrBYgByHXy8NhSBRsqw43iTHnctjNVEoP'), + peerIdFromString('12D3KooWDn8ohUcqxT4zivt1uiwPEHs1Hdy2MDaVuvw5Teb7vGQg'), + peerIdFromString('12D3KooWMXFupiZkfbpGrE3QM1oWU6J751DiQAbuxEGiueWNmuuL'), + peerIdFromString('12D3KooWFLaXdtzuYaSQP4axemZ3hpJVcJ9jjFUUJyvX66hdtQW3'), + peerIdFromString('12D3KooWHWpFG54zZFKnDcpw5sbVuf1s5jNvdcfXswdn67Lk6eUq'), + peerIdFromString('12D3KooWSB2UGXBaB1kJzzEg8mNnASvqbY5YUNQ3BryXZVUbGPGV'), + peerIdFromString('12D3KooWCXCVbThxCPSsM9UHvjJ78QaEchg66WxzNLcHAvArwDwr'), + peerIdFromString('12D3KooWP3cAeRvGMSC4NNnX5k2KHV6httTknqaExc7TZoHQ32wW'), + peerIdFromString('12D3KooWQhyYTfwnZeSk4nf8RojR8Rqxee5AiTXoiAbp3bSKqXbT'), + peerIdFromString('12D3KooWSy7D8iCamjVBbA5QRRSHziBzoYyfEsMHcahtBu7evzPh'), + peerIdFromString('12D3KooWNgU5oxjzSVc2i33yAhnaT4VpP4P5oRXTPs2XenfDRk1f'), + peerIdFromString('12D3KooWGV7YMFywQzKsteiBx16LZduBngNMC4yspkeEgSFsACvJ'), + peerIdFromString('12D3KooWAiWo71CeF1tyUAnx5E1UjwFpUvddiTawNcpeatpHzPxz'), + peerIdFromString('12D3KooWPgHRZD9s8WuyKBjVnJG9UpzB8F8juzBvmY7b4o2GsMot') + ], + 10101: [ + peerIdFromString('12D3KooWKhj99SGRT81bQvfkVyVpJpN7tEEoBxFppyukuxXAw3R8'), + peerIdFromString('12D3KooWSxvqn5wUKQRohUT2QGsXTED5iCSE6HFSpx4ZhZ2csyWo'), + peerIdFromString('12D3KooWHH5FvnAZjtHiSSHaGZ83JHZC8gf4Z8URrVBzfRxS7sbX'), + peerIdFromString('12D3KooWJZhsZYic5BsKzZ4D3WFyYFEuHaD2sAuBcox8kwQ18m2T'), + peerIdFromString('12D3KooWLTKtBBdjbepCBrPdi48E3ihA51KfwBE2icMqP37GUpY5'), + peerIdFromString('12D3KooW9revAainUgVmVnvAzzZNBM3fkxq84amYv6A3hcYdVFB6'), + peerIdFromString('12D3KooWBzVu5ywevwLrcybadJzNZaffuYvZHeszN3BcWVby7mcF'), + peerIdFromString('12D3KooWQMGCksLLTS1ZDa8S2mcje7HpWm7q8Xf8WXDpurXKnPb3'), + peerIdFromString('12D3KooWMd2m7VeyD8Bd99s1DgpXZagVKxWzqQkzJHHy1BGGpAQq'), + peerIdFromString('12D3KooWNzYquuCqNwskT9os2f6XCubtpsaDc5LPgdvifxqTzRKP'), + peerIdFromString('12D3KooWM51QLeh9vxdMbS2swr7GZBumMBG72TG3sWZnAzjfh1Xt'), + peerIdFromString('12D3KooWJKXV2pdq8ZPKwcbZxoi1kDtBWmqfnu3nWbs3UMLbrp22'), + peerIdFromString('12D3KooWQUPRRrJuS4FyU15oNsca9Jd3miYkP21E8eu9vjm7Nc7N'), + peerIdFromString('12D3KooWFkVRfhCPhHPA11xLWmZ3xfWQMjXhP4yNuSm4p9ToBrw3'), + peerIdFromString('12D3KooWDipKZf3G7a89sEWKwSMizSaNw2oZL7gGhic7WCmULHe1'), + peerIdFromString('12D3KooWEHRKzgLDtQJY18miHyyo1G3nRRaADPpw5FH176noGFeF'), + peerIdFromString('12D3KooWHDpx4peqK62tXEe34b748LKfAKQ4ktYf4jyB59xzibCM'), + peerIdFromString('12D3KooWSswTmYgSyESkQfV9HHRtStBH2AenR191GYPJUG7atevK'), + peerIdFromString('12D3KooWQKp97D2ZSw6MJd9bei4MjXpoykhJGCatd3xedz6Bo7ZL'), + peerIdFromString('12D3KooWSxwz5DFM6vLXyDEyxjzPG3csKMyLVTLqPVpaQPfNWMcD') + ], + 10110: [ + peerIdFromString('12D3KooWM6Csiafcj5EncPrvyhX6JQQShb45i5kJrXN56ZXAaDD7'), + peerIdFromString('12D3KooWD7xG2KzDHQhoDdArmJgpMPMkWvxRjZ2hCgEppp8kEgcR'), + peerIdFromString('12D3KooWLfTqQgGRynhzojqqBmDsEtsDUB2A73U8xJ4yaXRuaa7E'), + peerIdFromString('12D3KooWC83oiYgzZZDnybSpn47H7kiA8XRiFAKGwbouUbwUkeWr'), + peerIdFromString('12D3KooWCwciwy1E2eAmKF3nj6wz9j2UkKUJBvqrJZZPvjUVoZm1'), + peerIdFromString('12D3KooWRuDH9koahVhekaxMEXpHkSrjnvxLXDHZeSoRykc8dGnX'), + peerIdFromString('12D3KooWJcFDoCaav4gGFbWwRU5fBHPGwg9tgfe1cRbVk6gvmWqM'), + peerIdFromString('12D3KooWCfBBed5uGr3pepovxxLE7TzCBNoLQ5PC5aC2QTjimuQC'), + peerIdFromString('12D3KooWFwka8ZGzT7fmcUvuCnEjggcN4YgJVsJttvfrQxiUKnr5'), + peerIdFromString('12D3KooWKv6ACYAPpiuN96NhK9nKNLzEUtM2Gs8BwUvDWYoiSwR2'), + peerIdFromString('12D3KooWLrTwHW5Vny7SoAMnCA8y8FAwQss1QvYefb7RxM25bc2x'), + peerIdFromString('12D3KooWKnWEC39niHpVywHrs9FXncTNoFynVP54pknehucfa9HE'), + peerIdFromString('12D3KooWE39NPzwjraWacRu5Q2sJg7Je2FzVMkAE7Cg3YUSmPKro'), + peerIdFromString('12D3KooWEGtb8BXQ1Ji549qCnssyj69wYYpdzXxG8G8TbhDNezGc'), + peerIdFromString('12D3KooWSNMxHvPg1CFBo7yDj4zWRGttAet1EV7p5YAf57zDJCgL'), + peerIdFromString('12D3KooWKdkikkp8MrbQo8xTpsFqC7oNrbJWobhf4rrzc8shRRYP'), + peerIdFromString('12D3KooWFLUn8U4R5HkiqQGCd7y5v67X78ecppMoQMUWam6cyU21'), + peerIdFromString('12D3KooWLsdxre3uxDqovrgXLyMAKmtrSkoPEejXnzmGjqBRTCNA'), + peerIdFromString('12D3KooWNLJmxKUGFhePSZHLNhymAcwbU2bVaLGt5ZBcdebz8dt8'), + peerIdFromString('12D3KooWRwZ7cWF87EywLGm9JHNZRSMK5Ed1BftwxyY4P8xA5zyW') + ], + 10111: [ + peerIdFromString('12D3KooWH2x53FoFSCKQFXTZ5ZaaDTm6gQZLXiv6siZhSaLruC55'), + peerIdFromString('12D3KooWJLLpPsHTauNZWNUm8sJoDVsZN7swfjvh53YyPEjaxW2D'), + peerIdFromString('12D3KooWKWh2GLD14dahVgvakag6R8JQyeVMjMsYhcZBCaTKMhw2'), + peerIdFromString('12D3KooWCBrMkwMjkEqewJY6vYiCdnU86T9eD85FaHdbKwnmg3gk'), + peerIdFromString('12D3KooWPGS6KYtAfcbQ14yCtjNvJscgrECgDUivtYhjDFvsUCFD'), + peerIdFromString('12D3KooWApLjYfdKapuohn9vudSbqRAHx8pYt6P6HEnwuJicY4vX'), + peerIdFromString('12D3KooWNKUfNc7Wb9sBUVGQPcLBBifJMBD9cC56yUSjK7W6nPpJ'), + peerIdFromString('12D3KooWAvoP9Kpe7Vp1EUtPZKN8BY4aZ2ynLgPnScjFcmMx2Bsp'), + peerIdFromString('12D3KooWE37t7yKzvj9LfSLzTve6mVtxgAtzRxFXu23LiviuF3Ha'), + peerIdFromString('12D3KooWFstJFkAGMGA1KjuFtEDxKi9PQtAzRoKCQ68TEzYmCs8B'), + peerIdFromString('12D3KooWQx6CqM1kNai8CvHri8EVcb8FcyEbxPfYqM7TwetWY2wd'), + peerIdFromString('12D3KooWHubBcfoQymmosDyHHWqkTfA8UZKjrvJ1sAX5pHHCCH7E'), + peerIdFromString('12D3KooWHDgaUhCgc21F5NisDVqZTt1NrNeWLDLWKyWdYWE12BFA'), + peerIdFromString('12D3KooWSrGGH68DiqKv6UL1oEwd4rmj5VeLvCXebQi2MNa2dQS6'), + peerIdFromString('12D3KooWBhT8fvkJC2HDnWxzzdKVSjjuphKr3t6QaCpEPFYHVFoS'), + peerIdFromString('12D3KooWFGuMHCFVD18PV5oKmTHETMJFqEHB8dTEF63LambC9fwT'), + peerIdFromString('12D3KooWNvYm5ZT6FGuAmNAh5aJ8MxJR42du9kvfz9NW3xUuG4Um'), + peerIdFromString('12D3KooWHt6q3csm5m23B8CLix47FwkGFJSe4eRuZz2d1EyCRbBM'), + peerIdFromString('12D3KooWExhkbzhB8fvTaKQBd5VqF1FXzARe2ivYFLSsi89b296E'), + peerIdFromString('12D3KooWM3pZAi5Wbwt5n6B6vFTyjKiRpPLPXpY73xdKmziNBCJ4') + ], + 11000: [ + peerIdFromString('12D3KooWHZGq2gXsNQPCnkaWBn4rbzMuF9bsv7AmSzWp4qQnmkxs'), + peerIdFromString('12D3KooWMiBqPTaSkau3RqBhAtrz4fYye8FGnAmDBf8KD5DuTVTX'), + peerIdFromString('12D3KooWFocsVBx9a1HHkuMM7oFGU9tFN5rqD2YqxnNrmxcVmS8p'), + peerIdFromString('12D3KooWCbGfppsnMhXJ94ZAMggrrAgZTKJ6BF9UjkXZ7E2kKBBA'), + peerIdFromString('12D3KooWD8twfPxyAefYKmEgMsS4aef3NvXQ71JWH1uZmGQYdwc6'), + peerIdFromString('12D3KooWCwBUyCcH767bKEHcb8mm8FvMmZbZqQ46Udgt2cSommFf'), + peerIdFromString('12D3KooWCtM1EvU53DNXDpYCcd6n4tVdmvdYCMb6tATZdCrFzaLc'), + peerIdFromString('12D3KooWJNvRfGNhpHPrRLXARpgDBi1LxpGBqkCdTpgm9iV2tkGW'), + peerIdFromString('12D3KooWFjdNPzNRCbAt3PTBzB747BKJDmq23x9rXuQZja7i3UUM'), + peerIdFromString('12D3KooWPRaG31m67GAmzuFoySSQyJFTQZnHxup36GdiSzTjbL9b'), + peerIdFromString('12D3KooWLx282ZJe8MeMGZkwo2Gp4VMm7zSBKazQeu3kpxVuHNDN'), + peerIdFromString('12D3KooWQJUAXP63T7VBpmDTZQ7zNt5xJfGr9TAJgBLMpMA6L7Lb'), + peerIdFromString('12D3KooWEEvp5h353M4gM15D4ZgvajnLMfbKQ1cL76hpU7hRFbYu'), + peerIdFromString('12D3KooWR9PqEpy29v5wCmtGSShPLyYn6ZqpczJtK9i643de8jxC'), + peerIdFromString('12D3KooWQMn3SfdUkrsakThZ6R3ux5WnhG9duSYt21fr4cb9ASYf'), + peerIdFromString('12D3KooWNjjkGQTzYTCNoxLvmS4v83wzrhCALnMng7cKhz6Rhrsx'), + peerIdFromString('12D3KooWP3m7dR9pgusjbcWudJN4rr27oMbqwfqE9LwyneExvAqb'), + peerIdFromString('12D3KooWPktdPexTKDd1sHKhTNMcMQRWhHQA66byW3gz6nMs8q71'), + peerIdFromString('12D3KooWHWNh36kiF25hy8E6UtS5sHECGwT5iKz2ahYSN8k3gz6E'), + peerIdFromString('12D3KooWH2kD6aGJmbvuMywwGubMJEN6uTH8UUVBLg4oVDsfZnNf') + ], + 11001: [ + peerIdFromString('12D3KooWAGFpTJG7TgEpx8ym62TfCvkYhXsTYAsmSJs5i83pDaj9'), + peerIdFromString('12D3KooWSpE3SdSopUofm6HVhFJwGKP7bsjnMDy1onpvDqwbCeeD'), + peerIdFromString('12D3KooWNLxZ8wn8fctKkFXq94MhrgG1DWekpFU2ohJC15B7u3wQ'), + peerIdFromString('12D3KooWKCQsfYj3KgeR2mmdzyoJFjYJ8qr3gEhEnJzLHLXMXLLa'), + peerIdFromString('12D3KooWSzcwcySEz1A6RKA8YxUBzJHpycWegYvYcXrcEM3bfYWM'), + peerIdFromString('12D3KooWFxcXzADQB37SFE1XZCP58QXSSkRbiWgVgpwH73TYDUid'), + peerIdFromString('12D3KooWRxYVHg9G3MCgqrrj8K9qP1yPetjNLTYoDRXtdxT35gUh'), + peerIdFromString('12D3KooWMxsbZe1t67ZaZF7GDzSe219WkkZRf8Yk7Z9AKjyWwGY8'), + peerIdFromString('12D3KooWP5DLEqpUpTJoQ1dVo6fudCyzYEYhpSxskRfX4EhoftqG'), + peerIdFromString('12D3KooWMaMUqwLj9MrhCJHNorRjV4A2xRJtpiDLhCokVG1zvbLM'), + peerIdFromString('12D3KooWDCpsYYXWpUj7LB6ChTHCv1VxngTGJBW7oR9bm6QV8kdK'), + peerIdFromString('12D3KooWCnyiGfzV2XRd4h8tJ8Ar2wED27NtLW1hwiGUMjhxs9D3'), + peerIdFromString('12D3KooWBmLMz7LsUL5j9JHWPoHoxDoH5BJ19jPVC69Dhow2mzi6'), + peerIdFromString('12D3KooWNWqhq7ewDPX1hiRi3Naosc4mrpbwxGgDEGBAW12a72bb'), + peerIdFromString('12D3KooWEUVwczCM21RckQvnD2h1rFB6EPXotsk6cCkLpe2h4xy4'), + peerIdFromString('12D3KooWJxApg3oCNtBSBY3YPKmPNytLehwKe6W8U4ajBpQdcayP'), + peerIdFromString('12D3KooWA8WEL33bKewkFRKj8BNTLp1THE6FXuCXzVr6TZwxD1MG'), + peerIdFromString('12D3KooWCTzL9Xy83RzGwpSuHRPvwMidcyemSYShuyot7mvDreMJ'), + peerIdFromString('12D3KooWQMtx84f7XkSzrtYPDrSioHPRbCCoLaUTjdp1KVQK5K8M'), + peerIdFromString('12D3KooWGcTbHRnJAwF72gu7fsTzVrn7UNP78hXFypBTAbe9yTxa') + ], + 11010: [ + peerIdFromString('12D3KooWAf8ZTbwddtUE6ZfRg8MDXwWpjm6FoSLmUrDcSmJnG4TX'), + peerIdFromString('12D3KooWAGeHiYCZeCNf9qqvv33o7wh9kfgJKrUhP4uJ3js7BvzX'), + peerIdFromString('12D3KooWJ92tUq9PEhFNCws3AL3wmfuDnzPEM7z2JYxQ6reyc6KK'), + peerIdFromString('12D3KooWGMwUgYL4aF8gjQR3WHjP2DqpBaMqPAyf3KE5phVtbwSd'), + peerIdFromString('12D3KooWJkTAFxsVGxMr2dkXPvuES6s9SjyUmrsj8rsemCcveAgp'), + peerIdFromString('12D3KooWDBjBsngcT47W3erxX9YnRWzGjAtXnuR3Avn8CtqR4HSz'), + peerIdFromString('12D3KooWMLjyDDenm6rSwuJCGP3ApzR5KE9TprbfUgkGLj3VeoLT'), + peerIdFromString('12D3KooWJ8axUJKLeH4xLjeLze7p87vmL5jDAFqjPZCkWgrCn4f7'), + peerIdFromString('12D3KooWBN2rDJnCaNhoc5ETdiM7gt4uk2uVjfdEW8GgtnhFYdg8'), + peerIdFromString('12D3KooWSR1i5DfV6CdJrWnBjB4GNZr44wDGrqFcamgQzBn4nwE1'), + peerIdFromString('12D3KooWNmhMCqnPxHjwv19pcw8vWDU3YH71rryRcyJ8tdSt243S'), + peerIdFromString('12D3KooWRknQmfY4iyr9da97CXdA45Vxjeo92BkSV1McBN6tuu2g'), + peerIdFromString('12D3KooWMTWrMieTw4k1JBgkHvSEDpxTW3n2Rj5RyrhcZTfTY12v'), + peerIdFromString('12D3KooWNo28ZX5GDyrpVE356rrf7w7chVeMhCRvDmLUXm5sazXu'), + peerIdFromString('12D3KooWLKTmFNYT334Nh3jf8iELwVtjVbA79TXMEukq7NZfnfnP'), + peerIdFromString('12D3KooWGj4FtZJuKc3KUpLwfFtfJy7FF157JLMzRCkUm3zmCZzp'), + peerIdFromString('12D3KooWEpXWSyQaGw8FPMCi7WeiKVzEZT16ZXioC5Uy4NZc457C'), + peerIdFromString('12D3KooWM15KhBnjN1pkfBD6LonGJqn26b6iiaPXgYavjZZjtSLE'), + peerIdFromString('12D3KooWS96jYvwniQ7ccAATMC3FX4JV2d5mhQsxGPp3psujrNyV'), + peerIdFromString('12D3KooWMFxzuek7rE1JjRrqURrDvrdk3f6BU9FGTJy6i7Xupxwz') + ], + 11011: [ + peerIdFromString('12D3KooWLAzVZsiRM3Fmgg6da8RAaeWrCSAYqx3guNAFfgUAFiez'), + peerIdFromString('12D3KooWGoyn4bGiaDFq9FY98sGPwCLXm5spGVgh1WXf2idUnyVM'), + peerIdFromString('12D3KooWFmWwWRnwtU7kxYqgvqLA4fRarri8AdM5mgqx5DR6oDUn'), + peerIdFromString('12D3KooWLvPXwrGSzKjb8Hp8qaExaDwzCZE3DMg2mY3q9JmVMiG7'), + peerIdFromString('12D3KooWGDYwdUj3CgUDxDiL2ao9kozkuzfHrPMovoCaNEFEdzhv'), + peerIdFromString('12D3KooWLZ2EooFjLFmMBj6YBuSaz52uDWQuqQXeV2GmXqfrkC3M'), + peerIdFromString('12D3KooWCFuNwXYsVFjSHJoKHGyfgJPY7PR54seFPmofeTaf3YHk'), + peerIdFromString('12D3KooWPtjV4AyU3APWcKaMcm3PUDpbKfwCs7VC3N6q3NzckpkH'), + peerIdFromString('12D3KooWHuodBUcmouSjCPPMMEi1x31Vvc5jEdjC6uZFodVRP7mT'), + peerIdFromString('12D3KooWNQRjscgmJqufAMzFdeBgzSoboo5cDF5p2ssKxBf3Twf4'), + peerIdFromString('12D3KooWEMqC15UiDFJYs15jgjfWHZ4dcFHMmfP2d4LiMjdh1zJh'), + peerIdFromString('12D3KooWJC3StbiTQBcGtCYyRLKkscnUeGBrzdwBsCqDaCZUD9qG'), + peerIdFromString('12D3KooWRLbXqS3Whz2qzPZZrwKmQes15SxpWGwWFUzzcSyaWBz1'), + peerIdFromString('12D3KooWGbi3bKaSzV86C8MmD3H434gikBPtjRemdoP1LebrS7WQ'), + peerIdFromString('12D3KooWBocf1LSYNbsSPJR9UptWdMHSGr5R6DTvJD4Pg5dq45Yt'), + peerIdFromString('12D3KooWAJj3cSHCXhQbzAc3aJf9GtAgCoTQwgH3g1mV8ZLeUouF'), + peerIdFromString('12D3KooWSzwNL57mGvmueuauxt5T4VEVCUfiDyLgzRtTnUEw5DA2'), + peerIdFromString('12D3KooWHYw3igtrN4wFmQzgxmrBvmbVqzKaxkC1nKCLp1a9MLpe'), + peerIdFromString('12D3KooWDAwtVn7Td9b6CPLGRqtysfdWyKUcpbisRhU8NtoDpwpR'), + peerIdFromString('12D3KooWRcfukmPaQBGRv5vnVBcrHQRVT8PJW3w3wpDfVAp62ZHs') + ], + 11100: [ + peerIdFromString('12D3KooWAyB3PUSZqEtHH14ckySRvbNKwDQvpUEixgLMRt8DJyzc'), + peerIdFromString('12D3KooWDu7uMr11tnYQHiCJiPVp5YTQa93M8PQyq9nDG6ycHVmP'), + peerIdFromString('12D3KooWM2PC2wSEncwUXWQnRonkZaqXUjgapJAN7E8wuiHckyz3'), + peerIdFromString('12D3KooWGAtHrxfz6mW2Birb5tuDVUw5HWSbzNqnrqzDH95Yghiq'), + peerIdFromString('12D3KooWMJxN9k9D7y8ExMN7hekNR54Goq4AVHR6eCqJXDLQBCZH'), + peerIdFromString('12D3KooWL8FpWgZV3fSHcQotZr78wtVpoFt6Z8U9N6bgNgqQkGnX'), + peerIdFromString('12D3KooWNwdtLaAzQJoC1TPBYBt5PiWGnPX351gBUEEVFRRaxeqL'), + peerIdFromString('12D3KooWEvPD8GrDpuE98ywbygcUrHz3THDwhHHQXy6VWNzihDw5'), + peerIdFromString('12D3KooWS4Bw9EQEBGSdFQBqnvhUK2Zzdc8ZGpPsSGcej9rStNKs'), + peerIdFromString('12D3KooWCe5oub8VeArPZb399bvQ8A8ZR3GY58ptm7N79Y97wWif'), + peerIdFromString('12D3KooWPsXE3LphNYAendJiRxVFP4cQUu8fxdes4bCkbyi8KU2v'), + peerIdFromString('12D3KooWHan1F3ZYze76WXyigpvDbYFcXxkMgFBButQ1kumESXTF'), + peerIdFromString('12D3KooWBm9YauVBptB27NxBZYuFbtykXBAkfNeGF8QihZStoaUJ'), + peerIdFromString('12D3KooWQj48izB1Qw2VbV9ztX4GswghTCAuJZWA2HyxdyhKVMQH'), + peerIdFromString('12D3KooWM6bVf4hDYTvBdTCci5wiXytkdnRdZQF5t62tmnUqkVhZ'), + peerIdFromString('12D3KooWGQv2Pw6whTEZ9w8km2tajRAERXMbhnqPzmrgrNCk5jGs'), + peerIdFromString('12D3KooWMr3q9QoPVsv9bF63BDdj8PfgVXuQv7UTj9HgNB1KqsoJ'), + peerIdFromString('12D3KooWJpjmC2tS9wj68hL2fVg32JFw9ehUaACMSTLHxVzafFjX'), + peerIdFromString('12D3KooWHCRnGGCJirzbsyxKYg2fsFibon664ix68XdcGmLcrLZo'), + peerIdFromString('12D3KooWB1XbCKmT1nkBNSDwaYa1coU68L5zfbJCFb3pYXHJTyt4') + ], + 11101: [ + peerIdFromString('12D3KooWRLpd3qH56Mqg8Q9Vy3uX8K8QhTVALCptpiK5aNGknq3D'), + peerIdFromString('12D3KooWD7j824HoezgKxFuS2tjGiT7LE2UvTWiuc35pi5ynwqNm'), + peerIdFromString('12D3KooWRm2xTZHxPBKWttNj2HVTDyHpDZ7ZcvouhLdijmYkVG6i'), + peerIdFromString('12D3KooWQhgQVMc26j9wPxqMMtyFEhQQd5sAXnN6VWrHR8WYs1fW'), + peerIdFromString('12D3KooWFuheXbg5HHoudZ7pjL5s8vFqszTbuDEN6WJE1K48KUK3'), + peerIdFromString('12D3KooWNT9xDE9rnm1E2Y3JjLUEFXCwWTcDCb6DSJR7yHazoPVY'), + peerIdFromString('12D3KooWFsX3rWTMdxEiS6v2Tv9XNw4Kqhhagq41r91giwwJrYYw'), + peerIdFromString('12D3KooWMEiyarnsQwGFXUaG2xjzuDRWhsXEz4Tdgtj9AmC5GfaT'), + peerIdFromString('12D3KooWNLZQm4UZxxKDPSLDaSx7AJR1JfzjtJH9sFy2W94jadUt'), + peerIdFromString('12D3KooWSWheHScq12yAEZH2bB5p51rz7fuJr8CL8kkCAKcxUB1k'), + peerIdFromString('12D3KooWKXwy6MjMrZ14KTiQDkW7pq33M1oY2SHZVjY9gnNm2am3'), + peerIdFromString('12D3KooWNbk7Dtkm7fMncqAxouCHVfBUbwTgdZfq5VQcY8o2gT11'), + peerIdFromString('12D3KooWCzahBNezdsuiFxknV5KPoLW5PmS9Y3hmQCVuzfz4Vusi'), + peerIdFromString('12D3KooWPjScFFXpUJBb7NKzPGY5yjcryfRDieFEw4fNQLrq8o47'), + peerIdFromString('12D3KooWCtk5TprunaWBNhURZrC1zBgkF6et9HJkqgqgDCKjwUeB'), + peerIdFromString('12D3KooWKo7ex5AaMWbcEdte7EtJLwb2pk5Ne2hRpvZHNQHvHqaZ'), + peerIdFromString('12D3KooWEu4RcTDu11jrWcgRUxmhZuXQEuKs2HArYYRoiC3gjybz'), + peerIdFromString('12D3KooWBFV23TnR8mLR6DV2e6PD1bAzn5qYunq3qUszqB9me65a'), + peerIdFromString('12D3KooWNyVYaT7F393aeXMqYSDM4W2ZkmA5sQtsh1LTW259Pfv8'), + peerIdFromString('12D3KooWKi5Gpr9wG529dUDFV3R9jttCRsYWYfyspyFCuGLu1zUe') + ], + 11110: [ + peerIdFromString('12D3KooWGmshJn2Y6oozSvDY5WQABoM7Hjtm32x1bVKFAemFv342'), + peerIdFromString('12D3KooWCbwMLTxoyM5PoTBdXpEweMejPFjwqazyyEzxGSN5yoWt'), + peerIdFromString('12D3KooWSgYwnzi5rWQoEKKG4Rp28KzFmc2vA1mfLwCbCkJZfrZn'), + peerIdFromString('12D3KooWFkvxoyimjWoBaT2udNhAaTdorxR7eYVF6uV18KhsRoP8'), + peerIdFromString('12D3KooWHoUsENpt7WwQxsPuArr4SvG3XapZB8p3aMuSNwKRyVz5'), + peerIdFromString('12D3KooWNsB3QUyTQsGwQERVmL4Mgqhh4YY4tnUXPinp5NtxDakb'), + peerIdFromString('12D3KooWRnfWKptyw8PetBRN3ocHGijr8dZExXNBC9pG2vCHkun5'), + peerIdFromString('12D3KooWGUZNf95W3kqmTwZk8nvfoszaAVMLQj1nmmiyUX3WgK7D'), + peerIdFromString('12D3KooWLTzZjem6gZCX3iw9J2Ei75SUiSkUbCpaJHKoXq4vZ8Dw'), + peerIdFromString('12D3KooWQDmSMuNbLziDiuEPJWSiWEiC1ZJhHZKhSUBZBkT1FeE4'), + peerIdFromString('12D3KooWQq8iyiGaHVwXxU7rZzCrxH4Qtdh6QRzu543RvEZsgRG3'), + peerIdFromString('12D3KooWFcvSCL734K4V8fu7GhsDQ4Vi4KYpNzdcBaxfakDRRDcz'), + peerIdFromString('12D3KooWECJftKLYTA3xQnvrTZm5xFSqkWD6a1NTKcCnCbp3qC2Q'), + peerIdFromString('12D3KooWDpQzDTFuUXkvq3auzpsiPKMFHR7C5Rb2dxujXx9bpeep'), + peerIdFromString('12D3KooWGLskkMb6ykZYYjnshyg2uk5P6noxpe9U7WsVCdrj1Sn8'), + peerIdFromString('12D3KooWSVfGvs1vxrhphSn19DygydZNyv3pXw4a9qFXi6UxUGWm'), + peerIdFromString('12D3KooWNmNYTJthQQmBcRrAjXjTGu4XAUHpS6gGvMqq5YQ8mMDZ'), + peerIdFromString('12D3KooWHSQ9QThR2ToKWrbvaykrzjN5KsU5S5tRUuEdXkwh5xMB'), + peerIdFromString('12D3KooWArDJd3ksugf5V5KVQ2R3znRQhT1WNMYc5XTLnSeD1uEa'), + peerIdFromString('12D3KooWHhBJTUDHAsvrUditC6YjUj6vgaDgAb1DqkNBnpP15eNG') + ], + 11111: [ + peerIdFromString('12D3KooWLFW319LPp4aozGP3jQQrjAsviG4V9P36GEsqtq5svvwj'), + peerIdFromString('12D3KooWSexsgGhMZiMPKae3QVTQNicYiSeHmPEGL4TfZL3WgXjM'), + peerIdFromString('12D3KooWCScYxNtJAGhgbMMdhgkimDYWE37jNnZZMe9hMoZfpZAC'), + peerIdFromString('12D3KooWKqVfK3nnEs2iwUZf2CdLkuJQ984ApSVVSqoJ7aDmRB7U'), + peerIdFromString('12D3KooWKKHt8T99mTaZ6JPUaBcYZaAQKhmmawk5D1x3YtCqTdtr'), + peerIdFromString('12D3KooWHdPap4nUxcpRZwcGsYvB5ypL29mQ8SPPDFHXpa6zcBSb'), + peerIdFromString('12D3KooWHfVLE8vc7Fdw4cT8bZcPzRyS8rUgf13aeJnLbm11RNPb'), + peerIdFromString('12D3KooWCWkLDoT3USpSxY2fUBa8gZiXBv4jqfmXXCqnE1RCer87'), + peerIdFromString('12D3KooWR8tatipZsaBXPsZvQ8qTgY4xt9bo9wdQUsCymEtBomE1'), + peerIdFromString('12D3KooWF87Zh2dykDwLKQXBD32gNj4LTncxSibdMdDFXuNdyHTx'), + peerIdFromString('12D3KooWC3zVirciJDMdFpcYbZtw3bCWAfYPtRgo2dxXuurFEMNH'), + peerIdFromString('12D3KooWMi33WQSLf9GcrjEpn4jbSUse3hWLqFTo9jSA1TtJxuaK'), + peerIdFromString('12D3KooWLr3zEZv3ANHm8Le4GRisYU4u56Ky3prss6ae2BVHsmkp'), + peerIdFromString('12D3KooWEn2ukVpmQj8myK7jbz9KPs3y9fhph41zsQst2ftnFNHb'), + peerIdFromString('12D3KooWRAWn5NA3knPQTVoRnsXQNLr3e5vkf5Fg7VmwwcTizWEY'), + peerIdFromString('12D3KooWQCc3bKYy7AARPVsCKKUWH8egw8jVDUiwwcuPhTpYuc1a'), + peerIdFromString('12D3KooWPGjT9sy3cZYGQ17pQY1pDhrFwvDf95zw1bSsbRoyrqUS'), + peerIdFromString('12D3KooWPKHYTkHbVZsBRK4qRpzaiAyyNDs7dHKXVRGaHMVdXXBE'), + peerIdFromString('12D3KooWRd1qU8VCcBcBE8KcQDEeQ8JLithdsLHUE8NeborgP5Fx'), + peerIdFromString('12D3KooWH3ac4x7cStRqhkavofNEN3umzuVcufHnghy6LmG21JTj') + ], + '00000': [ + peerIdFromString('12D3KooWAzTPtBoDdzJtF2Jt2mDcb3C9QysGGycAVSwy6gYZcW58'), + peerIdFromString('12D3KooWKJHZfMRWeojjUdUQ481Nn7jW52eBCoTubVBeeHJX775W'), + peerIdFromString('12D3KooWM7KUDkRFam2wn5KKxdP2niafbdN2pVjdzJKayoJ8rCY7'), + peerIdFromString('12D3KooW9yyqt6At4u9TR7ejU7tm1u9G6CFDtNWAxncx7PmH2BNx'), + peerIdFromString('12D3KooWRgTUSk9hSH3zFWx6pfaVQbxXz8P41z16orMVcAb7qQAw'), + peerIdFromString('12D3KooWS68cxTDKv22vXVAp5T94AQhdaRhn4pvT16yJD3gxZ4Ah'), + peerIdFromString('12D3KooWMPFwttPR2esxKeskTNn72U8ib8fHaRVhQS1gaydwRnav'), + peerIdFromString('12D3KooWNz58whLSsmmoQ9Qmr5D2V5gEFrtCoLNAmP2zSpK5EQtU'), + peerIdFromString('12D3KooWNzPoyQTy8QRsfjQzZWT99d7Cx9QJ1eLvEMr8Fk2LZeDQ'), + peerIdFromString('12D3KooWHF1DY5FGuMr2qvuSdjq27fsxTbfiBALASJGLAQJssWnn'), + peerIdFromString('12D3KooWHq96bccUnWQ4MyVNKnXdqnwfrQv5WYcfQL62NKXKRQjj'), + peerIdFromString('12D3KooWQDUfUdowvM2u3C3fzB1wRQi97vZebKSDCdBAaLMUchKV'), + peerIdFromString('12D3KooWSqTfPbU6LRsTYezeJ6J3C9abu1xKdUNSYcjEetarj7xP'), + peerIdFromString('12D3KooWRpzUyVJpLMpZf8F6WvMA7LcdU1ASqC6cfKBrVDeqHbfM'), + peerIdFromString('12D3KooWFD3bz7Phkaq8UH88V7LmD8H5r4h9z1cRXBQtFKGhN1UK'), + peerIdFromString('12D3KooWBrYD7Eyu8Xix4DTna7KP7FYiWF5Hsib1gQ7T4YNbe3as'), + peerIdFromString('12D3KooWS5Ap1r9c7czNf6KWEiNZifea3QCP84hHhYXQpQPuxRMZ'), + peerIdFromString('12D3KooWBqRbU1mD9pyjDCeMKxJQeWt5uZeLaPHsGKxbCMdcjVmu'), + peerIdFromString('12D3KooWBHAqtMRykQMZxkxwmHcUKiodjHhNGJusfqNiEW41c61K'), + peerIdFromString('12D3KooWHAo7mSy8PWe14wmUfiiWDMyKWUjfKZ1KAXd4H2an19wk') + ], + '00001': [ + peerIdFromString('12D3KooWBHHu9TShZ98xezr9roUm91U5PrBQunp6ovPqQnfUu1mk'), + peerIdFromString('12D3KooWELanDyt1Rdq2swH2hmTkYdRKMo1WoB8i1vDNczkgMPz2'), + peerIdFromString('12D3KooWNFdxQeT5u945pTb34SUsZSu6f5xnxtCZ8RPsN64M5ekx'), + peerIdFromString('12D3KooWECzEbfJSLjpavXSbAVLuCdkZniYLKiq8rtorkVcy23db'), + peerIdFromString('12D3KooWLFWw153YNxxQYJMg6jb5wuXLonoRftKPTVhUqW1ajGhP'), + peerIdFromString('12D3KooWB19yWiYTsn4VHvB5fw8m8d6LYjJyGLvB3DaBHQxus7Zs'), + peerIdFromString('12D3KooWKVAeqRVg5hXg3FR7Ur8skhnqVQGtWAJtGDxVNSgnbb2A'), + peerIdFromString('12D3KooWG5sB2Rq4WpW4XWnLZMwR6J86rratYp6YxHxVDNWPxCZ8'), + peerIdFromString('12D3KooWS46FFkA4HiqswfpaNYbzKLiTdNnGr6kYbQmV7GE6k6ys'), + peerIdFromString('12D3KooWHFPs6ATcgj34Akt6tB2P9P1BdCN7yEoXyNoAy5NwJScU'), + peerIdFromString('12D3KooWN9ouagM2cMLgKDwnGB7ECRuCRCFxQxUhEY4bbz3PFeR1'), + peerIdFromString('12D3KooWH4NdAoR9Rd9CFW3zPEVJAy8NwknyoLYT8ZXHLWCGaTFm'), + peerIdFromString('12D3KooWPkWxAQ4h7W4ZTqvdFR1ZhrfQt46yrko6ekTuqqXc6UYR'), + peerIdFromString('12D3KooWPZaPRD44LZF52eYzdAhMiBAMv3uDMJ83M79aEoonnq9Q'), + peerIdFromString('12D3KooWGqwvr8fXW23bzXhoXbRx5vHiEQPf972CvE3MseU54AKt'), + peerIdFromString('12D3KooWQV75aWZ9iVYr1bZ53338gatJBVXaiKTE8mm1Wbm6uspp'), + peerIdFromString('12D3KooWBw3KAbU1V4hLqVcg2C7hLTJ9AuWkvVN1jHzQjD4f8tVg'), + peerIdFromString('12D3KooWArsrBjf2FCWui3GTcLrcyi5MsnSJivJcWA2DqWccixi4'), + peerIdFromString('12D3KooWFYLJtm3GNpoEKGYecCUcFxuZJyVrxK3yynwxFxig198h'), + peerIdFromString('12D3KooWAmYw7aWVgoJ7Hf7u7rZf9akakLwGwJn82BDocCcfbwyy') + ], + '00010': [ + peerIdFromString('12D3KooWM1X9tqZkFfUVXQJnqw99Q5wDpJxXbX6H4RFfANdAu84y'), + peerIdFromString('12D3KooWRYG4eRJr1Qob8rPnBrtBW7vMraNCqCEbZi7M71gbncH8'), + peerIdFromString('12D3KooWMYy57kQJzruEP4UWVjupWAnGoJB6dFHpJPiJQFMBQJbg'), + peerIdFromString('12D3KooWM5znpH57BTm7DwD1Rd4VUYr6exkW3gmgVCtLD9n2Y1Ds'), + peerIdFromString('12D3KooWDPqWtnDYxxrXCYVBtN9mvkvgmHUhbgyn6cF2Ve7DKoun'), + peerIdFromString('12D3KooWCyuNd5FhwkwvHCDosnzNmfVT3jPMiqAQNtSRpXnLPTST'), + peerIdFromString('12D3KooWSVsfJBr6QtZV2yf1vgNwhQhwRL3iG2HhCM8dGGVgbonc'), + peerIdFromString('12D3KooWM4ete535zAEgeEvB2oJR3pGV9hBGbpJBvKBihJy3EqYn'), + peerIdFromString('12D3KooWJaEMKKsThhBq1tJ4Uav5GSCBWGxvkYSBTggf8r49ys7P'), + peerIdFromString('12D3KooWSonA8NPxTo3XzRJctiFcwrHPAtoS3kxdbW77atKXf7FN'), + peerIdFromString('12D3KooWP7ontkdkDSM9w7wesa8RmHGyFsYcwJ4ScxNvA5TxoZAv'), + peerIdFromString('12D3KooWCe67sWbtcLqFaiSyPLvVNzqfcvhcEUco5su4ecZFEzuZ'), + peerIdFromString('12D3KooWFcGQ5qqWo15db7NeHDaYfMDPha5d8hDrGqu3imAqdSAM'), + peerIdFromString('12D3KooWNFb5c1Mmry7x8V6PyFEMLRQ2ctrG4FJGL3HXNgfoEGEJ'), + peerIdFromString('12D3KooWE2yyk8S4rcYaLSKevd2txo4daNJxx5cF34jxkeM9QqZq'), + peerIdFromString('12D3KooWSAuBiiMYUKZSWAmUgcHCN8AxSjyewRX59XZoR73x4Gzs'), + peerIdFromString('12D3KooWMbVoJRQkDaykrTN7aQMwWrgeUEzmzVHkefvnwtQfwhTi'), + peerIdFromString('12D3KooWD9ZxEmSQaWmpjJJYuErDzVrz91cLNZYmnSdhDXVnJMui'), + peerIdFromString('12D3KooWAd1jAwqkU72QvAdAZdiWFpmy56o8asTQ5aESv1u33tja'), + peerIdFromString('12D3KooWCtNDRsYAqmSzdYE875E3pdRpmp8SiFmjEYa5vN4Mw6w5') + ], + '00011': [ + peerIdFromString('12D3KooWCv1fV1tinZEjgnMXDNJQ3EnK4YuqzXyuXJXcTX7Qc5f6'), + peerIdFromString('12D3KooWMvq5bDyfnBC88L15NpcbKKz4NKNa23XtnDjWs4pvkHcy'), + peerIdFromString('12D3KooWAFLCzR7Po6oM74NseMYmyVe4wM9uwoe6tip3itKDjbob'), + peerIdFromString('12D3KooWSgqfLgLs7irkvpgVXaQ4tuJg7dVkWj5WGk2NzuGXbDaT'), + peerIdFromString('12D3KooWDpNDbVcTgZx4otgaM8vwZjMfw62xcMRevdPQZ8TRuZoY'), + peerIdFromString('12D3KooWBbuWw5gUBB1A19cYQmKFm37k5LBv4SHEYda34qBvu1D8'), + peerIdFromString('12D3KooWCzEagbzt8itTBVSsj2okuDg17VA1pwfo23waAvHgdYnu'), + peerIdFromString('12D3KooWJ1XsgZ7hSgm3HbG7gBVuLHNMtDW93DAstvzGqPq26mbv'), + peerIdFromString('12D3KooWHkSABit5sKdBvqcEsXUAceHk1NRGctffYb7ZNzoVhete'), + peerIdFromString('12D3KooWBUgCnrM1cpaCozGXExzm9LmdkdJCkqdJQXQKz95EU8y2'), + peerIdFromString('12D3KooWDVc9WD5wJhSRE3gwrzorBPYb24HwtAh3dGDhGeAp2Bzv'), + peerIdFromString('12D3KooWNuzpmAPyxRBmNyQwWTrjigubP6gmbuzdeZLZEjP1idwg'), + peerIdFromString('12D3KooWPxyMGrHJkU5VfGp3ZztBTRGZwkMjKb9xE2B8zKjcwKZE'), + peerIdFromString('12D3KooWLMoZd3u2SnoGRDGp2zmtGC2awez4Tnc96bR2QUwG15hS'), + peerIdFromString('12D3KooWLbRAWpwYXXZUKoCSEXu3uSW7GQuEQdTxBEC1vGL2txs6'), + peerIdFromString('12D3KooWSQVJ4tegY8HGWXC6i4MATbfSER1TTcv6t4yEwmbD9kXh'), + peerIdFromString('12D3KooWHziFEi3qbcAUz9mZzfHrJ3Dvh9GvRf2H18wEdU1HmLwV'), + peerIdFromString('12D3KooWQUmiXBzVWQXfAoGzTBaG54JAWQbRSMnsExATuLWJz8yC'), + peerIdFromString('12D3KooWH45RJvw7ndREBRNzRuAvPFjapF8aMzqwZuDpt2EjqV2v'), + peerIdFromString('12D3KooWQSW2QC8zDiH3pbdbbQBGLSCc3kMH78N39RwnZskRngua') + ], + '00100': [ + peerIdFromString('12D3KooWD1f76aKepe6MFCUjXxhDaTeSdzdwbHpWFBELvXaKeVQ5'), + peerIdFromString('12D3KooW9sWJz78UCZgN3XLoW8nTCcFM61QsmbZzU7hWjjrw325x'), + peerIdFromString('12D3KooWEBH3QBkVL6ZwHigb1QJVMjMGpvoz17FhLCNBgwx3iegh'), + peerIdFromString('12D3KooWCMX5iueLz8uBZwHpKNFUjJehF2SdndBL8vzr2x6BFkiq'), + peerIdFromString('12D3KooWJxdCbTM4oMQsbuAFZyFUjFDU7egNKc15oXd5iFyXu71f'), + peerIdFromString('12D3KooWD1DgVaqBucLXmYSKuAVBni1ty6si397PVRrk5ECGkG38'), + peerIdFromString('12D3KooWGunwwbhD3SB9iUfiyZmyhPn3HierzufC6GFXFBFbB3Be'), + peerIdFromString('12D3KooWMVZFqjpiXq5rgZ7MxqLZSvVvCpjS3ZmS6iY7CP3R1REb'), + peerIdFromString('12D3KooWG2DM1adAigo4pxc85d15ESgJHj6cdRHZ4G24fe3VVDJK'), + peerIdFromString('12D3KooWHwXa7eqA1GzSv8k9Z5yVxwWLU8jZRLjHwVNKTvGeNEzY'), + peerIdFromString('12D3KooWRJzVp4jdPrGGyxBkkSq7tgGrtdBk6q1N2iowTYmthU4i'), + peerIdFromString('12D3KooWK2d71Ei2EE41T5ytp1ZsHTWeA8s4oBtXgnoy8hDckZPe'), + peerIdFromString('12D3KooWJwGCB4NSQqvaVE4DScdaADwHqzKpmtqUUyFYBjzQbcq3'), + peerIdFromString('12D3KooWH8bzqH44vMLU9mdJ2eJsnRZUHdDDgX9bGkkNp8PrpENv'), + peerIdFromString('12D3KooWMMkhXBfDinqfGPkGnJtQadvB6cvFP3PopgMzbBXw7crw'), + peerIdFromString('12D3KooWPLLMeozUC7Zvq4kfWHGadQkZsReUUi5TMnqeQJ6jHx8N'), + peerIdFromString('12D3KooWMQ6cXjPMCUkbmGjfbZqKvgYH5VLPeqkPngxzzRYNzoeK'), + peerIdFromString('12D3KooWJR2ooBx2romkBE7WXEpGVx1ZhdpF5XzfpGx8SE5TPoi3'), + peerIdFromString('12D3KooWSss7FFP5NUQasFz7eYng8aTyuNbTQuX3ESmGDjkqFVbp'), + peerIdFromString('12D3KooWNnPedPU3PqqASH3AQ1RmEWjFiPg6fEE3zz65pQ8eb1Zs') + ], + '00101': [ + peerIdFromString('12D3KooWQD498HyEPufQ5hqxnivPKzZbpxDFZRWTQHfvr5rNrzHg'), + peerIdFromString('12D3KooWMwZQX2jnUQmd3sS7Fje2WBEbgLXg27pncXWrc2Zj6cWU'), + peerIdFromString('12D3KooWAf7j9cc8vc83NknVDTkrQUVCVVMrpRDWwfZ8rsLti3yi'), + peerIdFromString('12D3KooWCbCrHk66ePVg12zc3uhEvCMCdAM9CVqa2m7E7dTu3Uw2'), + peerIdFromString('12D3KooWQguKU1vfnJ6ABwGPvYnVkYsyZPZoXS52pSKYTp7mq3rX'), + peerIdFromString('12D3KooWPSoJySg4bE8b35H1Kvxk12xhp7E1ni1Lhd7wnvmCEaRU'), + peerIdFromString('12D3KooWSoxEi3DCf3dXfD95L8kcRS8PT23oCXu4uWvFebf9aBNP'), + peerIdFromString('12D3KooWNUFRpDkuweeeSUWAVKVYF8sjF682oxdWLXD6Co8KNrCt'), + peerIdFromString('12D3KooWE2zxTnqgXsQd4DVKxUHLuCXuDfzzMPYKb5cGVwiM2qhs'), + peerIdFromString('12D3KooWBqZPMSr3hwBRw2aj1iuN49apEVzthr2XxJQLzv7CsMhQ'), + peerIdFromString('12D3KooWLEbEFXThY1yBWkMFUyt4asJ43zwnwNDmYMnzPaWnQu8g'), + peerIdFromString('12D3KooWMwzvxnFWUzK5rHGxwyMcxM3MTafvnr8aeuK7D7fUYfys'), + peerIdFromString('12D3KooWPsJrZH5687NePbnsUVdSAEE8q4ahuMsdJuHZPuLamZrq'), + peerIdFromString('12D3KooWAXpdkDLS7e7SuG4NWeBDNQkRpLCbUEK97mKc8Foe6eTZ'), + peerIdFromString('12D3KooWEd4Zh1g1fAWQ7Dfm2fynUxsBGZsABuTK7UvBD2y5y3kR'), + peerIdFromString('12D3KooWR4cScXXgwGCmJaw23K8fojcfXJkzUj4LU7UpjU2AqfTX'), + peerIdFromString('12D3KooWFQejGUjuhYrJredEuqZKhPB43Xm4bH7GWdtw5dPY2P6x'), + peerIdFromString('12D3KooWNs69MNdDL25k8RMUsCiiCYAfT1bXFetqNyM7q3RbjAQp'), + peerIdFromString('12D3KooWGdTiPZBwNfcSewTkqd2VVB4WG7YVt6b7wB6cBt4d7vg3'), + peerIdFromString('12D3KooWSi2zXayQTrTEQb3d4SS313VpT1wha7GtT8UXrMrTFJKw') + ], + '00110': [ + peerIdFromString('12D3KooWMwMsxWRm4MQocWdevTpn17C4A1AKmsPFEuLtWh2edrAZ'), + peerIdFromString('12D3KooWGmC1pJfnhJzLmeag89p8yYsZbswfYQ2mEH9Y9JLWUXK1'), + peerIdFromString('12D3KooWAGoTjFtg1pjHvkxdsWHRm1thyrheEhpM3BARqEso1fX6'), + peerIdFromString('12D3KooWStFCsgPjREPSUNFj7ot1aaubFWyCw4zKnFUJhtZCGXCX'), + peerIdFromString('12D3KooWA9vmLBWoRcTtfYY3c1Tau4jhzxbGsGiRAery1cCokRbX'), + peerIdFromString('12D3KooWFjMc8UTzi5tQSmgJym4npFrQjUgNnTvrXV3XLumv764y'), + peerIdFromString('12D3KooWGPrSCVxjkDvY8RXggAwQTYoQUzVDayws6xu6wMXA81NJ'), + peerIdFromString('12D3KooWHvahNXK79DtLHTQWZakuWfNMzh9ivM9wsj5FT5afnqgH'), + peerIdFromString('12D3KooWNujBxVXmNL163yr9sREdVk7qKyWuKuSutSwaxVYcr7iD'), + peerIdFromString('12D3KooWEcQwPjVbQaD1g6yfneeVk2edDgmxnDdKfHEpcKcvF9j6'), + peerIdFromString('12D3KooWNyBXqwz8iNH5rtuGZh9G1oXZxK1FDeDbm6MhqmvFib2G'), + peerIdFromString('12D3KooWPJNMZHfsWQaStC5jrp7rd1LYLggNs3znHeXfZWwuj3Mr'), + peerIdFromString('12D3KooWJvfM8y3fwSgtVy3P8VzbymXrxBQKuQfA6aaqeEfcwnbZ'), + peerIdFromString('12D3KooWPGSR4uZPp9JfiA8aNPGtSqmeqFF9ytVA7RtSiCVBF3X8'), + peerIdFromString('12D3KooWGxD5WDU28ruRnDx19G9vuzsF9KS7ZbjcEpY4ug2K1tme'), + peerIdFromString('12D3KooWQxSdchFNZv5Kf6DweQ4tQdUdEfoEnVQh3qq57dDF3Xsi'), + peerIdFromString('12D3KooWLsCpAD7FBB8gPgLNG3xPgCSRSqUVWuRncQZ1EDB8KxKd'), + peerIdFromString('12D3KooWPCZTUwNUpkCmyVrCNvbP7C4mjvXQgWZ68FihjFNNXuxf'), + peerIdFromString('12D3KooWHMiez4MkkAhoKhLvJRpWwkYhKfaKMW26ETu3ZKSMSTfe'), + peerIdFromString('12D3KooWSEAkVvyFrqUcYr6HHt62Q32zFqFpV2VY5e9ZBXWxdaJ7') + ], + '00111': [ + peerIdFromString('12D3KooWMzNcwbUmob2JseFqSLWKHUbM7y4oqaFKTEk9VjvohJva'), + peerIdFromString('12D3KooWLMGKNhzTsUQcrx4WGGti9SWJ5ScxBjsdqKDgNGwVJ1Tw'), + peerIdFromString('12D3KooWRc6EjzMekhd6K14K93DaAZrtArZmEEHMKuGHg4qdY1Ej'), + peerIdFromString('12D3KooWN3dtkThsd2xYmZABX8vyD3515Y8FNWNYymjG4Pk5wZDt'), + peerIdFromString('12D3KooWKDVUURURSwpmL23tGyiQqWEAQ9PgUMvreiQicaHfXbMY'), + peerIdFromString('12D3KooWFZbm11ipuribP7NKaXArz8tyvzV7AmyX5YPHPQ6C8S8C'), + peerIdFromString('12D3KooWQTPAYwBZdUhRi68AyHgE2mn3ZEgj9sQnQf7QpVqwesWd'), + peerIdFromString('12D3KooWEiUQog68NiD4HvaPvZVrrrPDPF27ExciegztQ1uGHxTA'), + peerIdFromString('12D3KooWPKf8tSBWNCoTfgwC6VovwRcqBgwMMv4rzmHRYXGxcKLS'), + peerIdFromString('12D3KooWCUZ33j8rEqJShQ7SaYBzbjQmx79y98STaztmbNcMxqQM'), + peerIdFromString('12D3KooWEKQEe7tC2Nq7tkAu5nkUJ3JVqS1PgswHQqPDzPwPc24U'), + peerIdFromString('12D3KooWPwD1Dn4ALGvPG3ycJcC8f1vS4DiRgtJKqfM2MW1X1sik'), + peerIdFromString('12D3KooWQyKmiVeTJguD71p7qn1Bffvj83MZrq5vfRD9M8FqPLaV'), + peerIdFromString('12D3KooWFw3vmMhwrBT14ycdRuWd1nUsP3EBbQGdqb56Yj7ATUPs'), + peerIdFromString('12D3KooWAmm76eQ7NQhPdEJow1JbN8uaaCQWYzyduR2BqsyY682e'), + peerIdFromString('12D3KooWHKN1zY1HR1hKZiJ1rvzTEiwETBarr3ZXFFrsYJ3UwgnB'), + peerIdFromString('12D3KooWNZ8A6Yy7KQKn4Eq6TCd5m17QadegNyDmYRvxGfvf7SGH'), + peerIdFromString('12D3KooWBfVv9RWDQzoDw5risNvkNaK8BPLkgsWtEnsaTcirmXSp'), + peerIdFromString('12D3KooWKFoXG8itb1Fsod7QPZHgi5eekDt5Hz5XGxr5D94m4tLz'), + peerIdFromString('12D3KooWRzrXCPgyByzbxC2WqzqGSKWeQtHWzeDBPybBRjvKeDPC') + ], + '01000': [ + peerIdFromString('12D3KooWQjBY67ja5wWLiR8brwrStDmHNPF7y1mqvRrvVVpkpxqN'), + peerIdFromString('12D3KooWC4JwYPzxXH7NByvVFpcPPJf5ybXG1C2DQGypgQgpQWbJ'), + peerIdFromString('12D3KooWC2AYa4xcQbgkjYCjvuXWHBqaeLivTUEu8745aWe9ZPwK'), + peerIdFromString('12D3KooWPSwTr5u8LKi3HVcdN299DKrAs2iR1TGKNgNKpfmas9sp'), + peerIdFromString('12D3KooWSESGoAaeNTbXSB56zEQNjRNxAREZkedT3o55oWCNuaAC'), + peerIdFromString('12D3KooWShyLJ9ftKCQcKScdFADg9ofqLujbMRPQQEKCQAmsqtnp'), + peerIdFromString('12D3KooWEUL2hpxPM9uESTtLw1nmZsoK5JEa5Rb4jb41tBLVrf6o'), + peerIdFromString('12D3KooWS4xs7EXVv2vzvV8F51VRKECGNL5bscAa8LrJY7rXnhY1'), + peerIdFromString('12D3KooWP3Wm112omiV6eW3XjRDVKFGGCsBXaSz2Xmfzh43cWoG5'), + peerIdFromString('12D3KooWP6aoXS5RrZsMpyMN7McappNP9chRPvHX8W3WKx1KdPqC'), + peerIdFromString('12D3KooWJGnWnMMZLEnrQyV8ZtT6BAUgRp4EC8BuRNDsYtnHqsTk'), + peerIdFromString('12D3KooWST3m3ohhqiK9drsGc5CfbVJm4fB62hVByHBA58sv4m3h'), + peerIdFromString('12D3KooWR2F34h4S63s8jq1DxEMiUatW82QNMMyqLrskEudt4YiG'), + peerIdFromString('12D3KooWBxRxcdznmdDWerfR8dPR9AwjeEEHquTvEtCfQimg7wnP'), + peerIdFromString('12D3KooWASvFfm6UR73MLtLXB4nJCwZMSZP3NhfdPRwtHxndMEtG'), + peerIdFromString('12D3KooWELNbWT6f3dbxjntcuzixFA5datMe83ZfBxa6PzhbZ4zN'), + peerIdFromString('12D3KooWJjFerDKJc4ArrD13ZAoJsKVjNL5nPNh6VCSSHzSnPMfc'), + peerIdFromString('12D3KooWDaKS48dvWEanxNzNE2ebWJirE5t75cSXv3B111V2gjX8'), + peerIdFromString('12D3KooWDfJQZD4beGkoXjceVHo35x6mwaMbhusCGM1TmFaEvcLT'), + peerIdFromString('12D3KooWJtBq2Wx8j2SGBzNMUx2tV62n6AL2mK3NbVMAeUPpxPHE') + ], + '01001': [ + peerIdFromString('12D3KooWQrgR9ARMe3tWWfTmr2d8c9fk9ShhYisyz7QaFEF2RScv'), + peerIdFromString('12D3KooWN81ZQ6vjcv2MtdXdnzgnNueFFmmhRh28kjvRXGYuYPjC'), + peerIdFromString('12D3KooWGPA4FWnwVT3K7Y1DqkXxDtT4JQR51KeghGqSRTHoA45U'), + peerIdFromString('12D3KooWSMGPinjtf5zZrdHXt2SaeJgLwwVBcB8QL7AB16qkw8zK'), + peerIdFromString('12D3KooWBe7NWEMrbeLZ6xRdgJmmPgMw2k6ytj3U35RsX8gSoYRv'), + peerIdFromString('12D3KooWBDK2hrFzqNqrRjiYG5cxk73z2fXj1pRmt9kQuFtqCiym'), + peerIdFromString('12D3KooWLj3VYyTWJS5MudVwfp8NvJz1BdeUFDVWc5Mbg5nnt6Wv'), + peerIdFromString('12D3KooWKHBvpdrDihefqDzt2kEJRoDCsypaKqbfLsQiigGaVdMU'), + peerIdFromString('12D3KooWM6mSAXjpCY4hNnduRBoGKfyGntYHfKdVFTT3wXEV5oyc'), + peerIdFromString('12D3KooWAN4WrCFQaZoS1zWcQkbRaoWS1pVSQAj7TVWHchwjgjgH'), + peerIdFromString('12D3KooWLExNJCpSy9x55eHYUyWJCG6U2JPee7eLwvAWb59dCmYk'), + peerIdFromString('12D3KooWGDseTBqbKmRbSppjjHoh2826BAPeko87ckuNsCNZQxcR'), + peerIdFromString('12D3KooWLTjhxSNGuBvwRfDy1udgnEVrtqf23k3ajNFepdGWhGbn'), + peerIdFromString('12D3KooWHn42z3B1DRTUPC9KKVisDxK8K98WNZ4vZbVFDuFrLUib'), + peerIdFromString('12D3KooWNqr62JMwXvL82ebe3ExPYkwoWCXwXCeQcVNwASe9UaVd'), + peerIdFromString('12D3KooWHJGpXmqEzzcVg4BrWAsp97uPCRzViMPDGQ36y7QLucRW'), + peerIdFromString('12D3KooWBXjofJU8VpKzaAJtBfFecASDjYs6wNX9hg6se5S9CGAA'), + peerIdFromString('12D3KooWLcREB4jUBvWS5CawgT8G6UGU6hgWqSTkDemrHZsjEiqz'), + peerIdFromString('12D3KooWSS641VpJRdAan2RPTDctpNtv32sEP2egXkDEirmDXaCK'), + peerIdFromString('12D3KooWFkFHoWdg8M4jkmH3KnjEHwdN4j8C3YBH8VRaRnUpHWyi') + ], + '01010': [ + peerIdFromString('12D3KooWPDGLLCULX9vDFxxnbLr2sLWbDQEsQBcNAK8xFLUDxFwA'), + peerIdFromString('12D3KooWDzVJm2bsMLmfvZgjQzhFW5628RMW2xVdxp5AQuHFksvP'), + peerIdFromString('12D3KooWJzgsUgbhHjf3f9F9111RCKvLnBHWBM8YQN4QWGzye5Pt'), + peerIdFromString('12D3KooWJvVCKy3umrewB2SwqxinDktAsFCedpjmHUwdX8MMcnHF'), + peerIdFromString('12D3KooWGfzEH2sB9gixxWMDgLePG7gRLk23bAWXbxVdU8yjtUhK'), + peerIdFromString('12D3KooWGrZPeh5a278g2Rdik2QfAG4AjrRS2Q5eEaZp6DL8tb42'), + peerIdFromString('12D3KooWENvRKxKjPywP5WuzGvbjavqLPCWVgKEuFiDTE569dqEM'), + peerIdFromString('12D3KooWDLCDg9Nm5Z611vuhiMYXxt6ayGKKh2sPeqsaiwvmdMBm'), + peerIdFromString('12D3KooWQLAaWXj8zmK2oWmEL3s5G2a8Sio32J8MVH4W6fegU8SL'), + peerIdFromString('12D3KooWFQEwnyYah1HsWidYZdiQmg1aAjtKAy4Rtqs5XomxJe7C'), + peerIdFromString('12D3KooWBND6zpB98Zc2KndRMKaJk54B9rrHwQJDQxucqRqJSvzi'), + peerIdFromString('12D3KooWQGrCQJomokVXWusyXKmwNhJWXv6MzNJGsPoMVGu3qvU1'), + peerIdFromString('12D3KooWE6vRzS3G3bWiHPsQ21136Cm7VjmaAHxpwg4Lggg8jomk'), + peerIdFromString('12D3KooWCyLN19BoYQu3RythDBYvNpYNngCfeYruCvchzeBqGtdc'), + peerIdFromString('12D3KooWRvFXRvs2cVS65uyWspC2RoFaXcQE4m2QVfpAdwWRhnYx'), + peerIdFromString('12D3KooWMaFXFhFgG6CVAAyWyvcVRUPpg52k7iUKnexQcdKtujzN'), + peerIdFromString('12D3KooWBjZcXXVc8foALUkgQkxrjMeAShbD8F8CHJXQ88LVG8id'), + peerIdFromString('12D3KooWN3WuMmEVZZghve2cmwwmpq8GEqgwJvU2xs6qPc6fcFK6'), + peerIdFromString('12D3KooWLjtmrcwanKhGCKwsYQ59gLBpzGeh64M9KzYwTgpc9Woe'), + peerIdFromString('12D3KooWAGNQqMoDofGUJVbnCi9vGTGEsEHBgPtoswtw2A79heqT') + ], + '01011': [ + peerIdFromString('12D3KooWDzFajQoyXKgd6tUSZzbYCmJD9BqvvjN3pyMFZ82bLiYH'), + peerIdFromString('12D3KooWSFDn9qhpMrauTbRRnMiVNv3qGpgKcyMXRiWwiF1bAqaN'), + peerIdFromString('12D3KooWC75xfo8JVnDBhEth7eQwMwVKsM518HpmfXvQvrwKwkit'), + peerIdFromString('12D3KooWDhsroKVLYfBFnqVa4DstLmmKV9zmRgCqCJrZmKuhcvhR'), + peerIdFromString('12D3KooWMkeLvZJMx1UGv35MJjuSgr4xAnGRzBB15xrUhQ1ZvaBP'), + peerIdFromString('12D3KooWRVGYGmQkYDkdnp6NqMU83MhT8tb3RtZXsFEyUTKXr8Uq'), + peerIdFromString('12D3KooWNDTmhtWskn5c6CWqn7GtgRVsouT4FB9jV1U4B3HqQRo4'), + peerIdFromString('12D3KooWCv12ULJadWQ3Usp6amXWgV5TwqVsyCbjRw7Vf8Y65RBH'), + peerIdFromString('12D3KooWEqjycr9pTMwkNPw6rdt8TsrZhpHWs8jEAusCvMwcdCSC'), + peerIdFromString('12D3KooWJhATzRMG4KA8b9BoRSWdK9AkYUa8MsqsZKSjnFVDRuEE'), + peerIdFromString('12D3KooWCMzmyDAJpkV23knfB8ZXsHhNWPQMkH2P6C7bRjXj9mge'), + peerIdFromString('12D3KooWCyN2NWfVdR4JZViD39xfxgLfQ1FmapSeyxe3c8NT5fc3'), + peerIdFromString('12D3KooWRsZ6v5CA7LvHgvh3RKaR7Lmouu33FKyCD1BoZr2Aks4W'), + peerIdFromString('12D3KooWDWQVpFWT45SRDPiM9AqpYHMA9pCktP8vFbK17FHN982D'), + peerIdFromString('12D3KooWCxaRPNgtRBfivgMRWH14TDXS1v5Agy6SDL2uzpxM3u7f'), + peerIdFromString('12D3KooWQwB5XiSYnFCkis4rnp7mKLzD5E7A7BWoVTvnXdzr7nEx'), + peerIdFromString('12D3KooWM1W2DziY4hdYkSNyp3ji2V4mmdt7vr3zJju4gCqbehFW'), + peerIdFromString('12D3KooWQAg9P8dF25szBxgtBkr2pg5rTGtyS2tqUF8n691vkFui'), + peerIdFromString('12D3KooWHE5mct2nvbyYhWjcEzoqXVRWipYCszixFNpMp4qAttQL'), + peerIdFromString('12D3KooWCHG81A52UPrr5GzVD3TKKkryCTqTkX7FMwHBXhfa5q24') + ], + '01100': [ + peerIdFromString('12D3KooWKqaPTcvAA4AHejTnBQuHemC4mwAPohNbdCo9bmQto3U9'), + peerIdFromString('12D3KooWAhSwUAetaeBJiiHFWuRfK8TVYvo8wjU2FBNfWLdhWmfi'), + peerIdFromString('12D3KooWQ3TsAL5i94WccUMcXFJn9JYMFNUZmZcrSYEKbXZhg9LE'), + peerIdFromString('12D3KooWMdSGVVMi98LLhri2VH9tKZ2uCv1zssNHNcqaTa4ptoby'), + peerIdFromString('12D3KooWSwPjsv7dXz8oxnpw7KNE1XQtH7cE4HJ2ksWq4BxHLLua'), + peerIdFromString('12D3KooWM2YFBDF4skdxgKyGfWTQ8k9TejND4DPBYtC3wyC1Dikh'), + peerIdFromString('12D3KooWEde7hQQM7Y8zRt4Fn2K9cEFEA2NwVxG8nv8yNppZMMq8'), + peerIdFromString('12D3KooWPgg51Uq7vXYc7qqH8MFi8rauqd3bFKCQeBpsabkuL9sj'), + peerIdFromString('12D3KooWCvHcFVcref73umkbmTShaapWNNw2KqWTCZh1VaACtsyn'), + peerIdFromString('12D3KooWGXyoxUJRhTa5p5RQQAU5oyYyp6SR5BFwJUDPi9VuVtD4'), + peerIdFromString('12D3KooWSUkX6ASu6Q7LPfGQ6eJhuZjeuVKmpPS34b29XvSo37NS'), + peerIdFromString('12D3KooWMA4K69U1bGPit3kmZoWtMf9vyhG7B7ManT9UHjAMZUcK'), + peerIdFromString('12D3KooWKvCKGZ3vCc4ZF1qRmiijQrCdrQxFiytfbgXUCi2Cxg9w'), + peerIdFromString('12D3KooWKKJ9KFaMb55RJ2WMmXdGLq524XFmCfjJ5UsAN9DSzdee'), + peerIdFromString('12D3KooWAotGepeRdbjzijaXormC28AVvyDTE9jV49k4pGVXuwdV'), + peerIdFromString('12D3KooWEjjpYtdiEhjCpMT4mXBoTNqo9pb1WqPQhj7tQAb3eGR9'), + peerIdFromString('12D3KooWQ8cDJp5YvBkRg1B9wEHXr6dLpAzKwQQGsb3Y3hdrzSDr'), + peerIdFromString('12D3KooWEdXeFAACycsoPQAKCjnxGv8V8bTrev4nKfpGG7MBawo6'), + peerIdFromString('12D3KooWBNBfmkNrkiubeBA7PQHczdboZTPsCajg17fgTCuvoJgN'), + peerIdFromString('12D3KooWSysa1KRLpQ6FrTCCWFnZ6oDQppmC36PJS7ZNWuanv4Z2') + ], + '01101': [ + peerIdFromString('12D3KooWEECWN6ZoKfwtgq8HUgvbcQhstniB1JjGC9sFychPmtFd'), + peerIdFromString('12D3KooWRQ1UGvqWjDT61Zyi5D7YoPE8see3FBehd6BnxKenBSbH'), + peerIdFromString('12D3KooWDFTkGGsT7yjRAi1DH8zE5BVo9TdFHWgGn119bF35NYGP'), + peerIdFromString('12D3KooWG629RVzqxbd2DgTwXExYJNm6oGx85DPeHtzHtKbyhH88'), + peerIdFromString('12D3KooWPsYcogHcNLNRnJK6TW5Z9cCb6Npg2hT52hcbQTPNV5XE'), + peerIdFromString('12D3KooWEAoL7LVdm8ebvcyUyA6yH91sniDkgQL5spEoZ4U5ArgB'), + peerIdFromString('12D3KooWFyCA8LaEKtiYvLTYxFA3zHLefBN759SwUAQT2K161kdr'), + peerIdFromString('12D3KooWQfVXEhdBQwMop65rxr7pMuPb7yzKswskUhjExQwpZvC9'), + peerIdFromString('12D3KooWLtb37MUvwkds8b6TxSHbRm5txyxDWH3bHDsMdWFiHk19'), + peerIdFromString('12D3KooWC7SQeUBWKfNGwaJrA4GDuPytrdnk4DjczHfveocVfB7j'), + peerIdFromString('12D3KooWLf2TfwpkoyE7tYNLrir7NH4uBHFrkdrBn9ZrWtFJHPh6'), + peerIdFromString('12D3KooWK2ZHX6UKDcv57BCo3Vuog58Q7L6BLwzMDSAQ771bfX3F'), + peerIdFromString('12D3KooWCfG4ERmvbMKUbCENmyHFiufFanrMfAfAK83JtuCpGJuy'), + peerIdFromString('12D3KooWL9pGHbnWJ6RAymzFXSSuzr5HbuM61yXM7jG15vrV8pEh'), + peerIdFromString('12D3KooWG5hEYQFmAzpkwx1K3AhNvSnLBj9wU1kqTB1cCzum1Bdg'), + peerIdFromString('12D3KooWNXQ1RysGuCqW4XcUoiooL7T6os5sYUkPqkyTJnBuYqnV'), + peerIdFromString('12D3KooWPcS8vcNSp1UPX4VvKcve63RWBxKCNZH84QaMgem5V5Q1'), + peerIdFromString('12D3KooWRRMbUGCuz1n9QUQGde3dcGS6VN6tBmKPtomStQhFqxbm'), + peerIdFromString('12D3KooWENedvuQ1HZfmeKvj7NqZwyaHakUkQSUnUaQrrC3faaFg'), + peerIdFromString('12D3KooWKYKcAh5KT1dApsE8QtQjxn8fL2zPZyHPDemDbQ6AjVG8') + ], + '01110': [ + peerIdFromString('12D3KooWFrEVQuczup7LWuGfg1DZSkBc9nMQNzJhpbQas6A3Vm6Q'), + peerIdFromString('12D3KooWFDRLnq6GqpGRxcz6pgKjHbEYeRtnUa47W5tbTe9nMmHt'), + peerIdFromString('12D3KooWQHidkqCnHHH63KREM8oacrous99tQJygq2NbPLdHf8BW'), + peerIdFromString('12D3KooWC7AE2xvPx5cK5mVMLBKes78dcrm9aRh9BxAUcy9fCgrv'), + peerIdFromString('12D3KooWPFqa8DLpZYLE5XHBaD1iM3kKpXFb9djBwZeWaGXBvLew'), + peerIdFromString('12D3KooWHCuREXP8oPZMYW5YmwrYULZxw13YPNAcXZ9NhaakxXKC'), + peerIdFromString('12D3KooWBixoUiDNj8AgeKjNMyDx89XYhHZJK1ebv6jepw4FozuB'), + peerIdFromString('12D3KooWJvB9Jom4bamoG1wsPnax8AKdRmYKEXaY63tk2MSmVWKN'), + peerIdFromString('12D3KooWACXH3wQJWSgT7S9JHwEB1B6EAyC3qDWo7xEP6bsLUtpW'), + peerIdFromString('12D3KooWD3xmszvaBQLogxp7Pie4zcmUYM98MYofXvHLq3F7feR6'), + peerIdFromString('12D3KooWFKtmeDzQibirZwfzuwQdEGYmtDbpqGnQ4dnvb3Zw2V12'), + peerIdFromString('12D3KooWH8JNpk8eBVDq5Mho9onjxswBU2PdKAJBcTkwA8BWmhcQ'), + peerIdFromString('12D3KooWCZhjLiCjwKVdUBboB3RNH1wUyPnefcqnu3qdAPso8w3g'), + peerIdFromString('12D3KooWBNCCNvAH9XtoWrFxfE68JHSiLRQAD2Q9dTonNS3Ybc9Q'), + peerIdFromString('12D3KooWGmtXcjNrjkr28bSPArjyksBqiaigGp2z8Jcu7e4Hm5gL'), + peerIdFromString('12D3KooWQXKPMJBd9KaT2enMmtWs55UfvzcJ5Q4CXozHBJZSvccz'), + peerIdFromString('12D3KooWGNoXExP43fGprwLqDjAGyCeshSmqDc5nESjTSj49Ph9z'), + peerIdFromString('12D3KooWHh2dw91giQLcnzDuSwVhseHPqZRZNPtJmndeAC7dWQBw'), + peerIdFromString('12D3KooWMssGC5wV4fnC68M9EF8iZgWEMPYjfK4p2immiUTnKYiA'), + peerIdFromString('12D3KooWLL7KRXokDUnuYZkkh9YSt5P2LNbUfVcwiPnDh79QvLCZ') + ], + '01111': [ + peerIdFromString('12D3KooWPvQYrgbcRhyh9CbE7XvJBJiNBMwujKux8vrEnuGEwD4E'), + peerIdFromString('12D3KooWDNYzxtRmLxz8b3gJpXvkzs349dn4AkHkGEWCAR4adoyx'), + peerIdFromString('12D3KooWSzef7EKfLUgV8YJJwHigmZSCr8mCSovPmerfyTsecCRY'), + peerIdFromString('12D3KooWAXZrQ5pNa25Qeu8MjEiP7EjFfuniRLQD4eXCVSFqDXBA'), + peerIdFromString('12D3KooWDHtkh5xsiZQiTTHbE1zg3v5z8L5S4nkCXiMMNCAyqvJ9'), + peerIdFromString('12D3KooWGAztaNPKEsXsG13E9TtGW6QLvhaeNnrWixJaB5TzqWn9'), + peerIdFromString('12D3KooWF5aRP1yJDfqwRXich6KVyNShvnW6E3QdJLhJwdJapKbw'), + peerIdFromString('12D3KooWQnwpMd4ssPRj2WHZfU1wPeW2pJsWnBVRsdopbMq4zLuU'), + peerIdFromString('12D3KooWJdiVYeQSjofyuSRUACYuBsj481C69WxYrMUTHTJBvD8H'), + peerIdFromString('12D3KooWSLb2k1UZMsYCHSnxf6AHB6SvjAyru4TgSPh9FLUp1ciQ'), + peerIdFromString('12D3KooWSS8yiCg3GPeBCpctSmzjVw112KvzzfGtoe8yrYPyQibP'), + peerIdFromString('12D3KooWMZF36JDtdT3Dp2pqB4BQbLvcM2Q41hX2PqMtSJEgAQiy'), + peerIdFromString('12D3KooWBXMhycxNqBhFBPhreXtBwdjTuFHMyQsdsa5pbAk9mgM9'), + peerIdFromString('12D3KooWL1Q4Uy1qMrJYdqxxMr4Bvmi9ZMNnE3oKRbUASPtxEj2j'), + peerIdFromString('12D3KooWPyiDHsPh7r3CVJbStDQCK75iZ5i1y4eHcecv1mz2J87Q'), + peerIdFromString('12D3KooWGX7spQ6FzBKgqUpG9iB6vvjDmog3v7LWadLj3LVkJm5R'), + peerIdFromString('12D3KooWBAP4QXa4aA5EczSRmxemNhfNuYg1NAixNfH88AFfj7Nr'), + peerIdFromString('12D3KooWHwZ98RvfQAmYu2KsKn2BCaa8BczLQy56htTpZHVtzVXi'), + peerIdFromString('12D3KooWLz9EdLQUnsSfWQarDiXMtSTvELHzSPDNYa2UMxbZMStX'), + peerIdFromString('12D3KooWEVCGJYg4NdvceHeiJ2VfFNMYzhxfCUTwZ2TZpov4rCys') + ] +} diff --git a/packages/kad-dht/test/routing-table.spec.ts b/packages/kad-dht/test/routing-table.spec.ts index 180e746580..587d5e4fc4 100644 --- a/packages/kad-dht/test/routing-table.spec.ts +++ b/packages/kad-dht/test/routing-table.spec.ts @@ -18,6 +18,7 @@ import { peerResponseEvent } from '../src/query/events.js' import { KAD_CLOSE_TAG_NAME, KAD_PEER_TAG_NAME, KAD_PEER_TAG_VALUE, RoutingTable, type RoutingTableComponents } from '../src/routing-table/index.js' import { isLeafBucket } from '../src/routing-table/k-bucket.js' import * as kadUtils from '../src/utils.js' +import { prefixPeerIds } from './fixtures/prefixed-peer-ids.js' import { createPeerId, createPeerIds } from './utils/create-peer-id.js' import type { Network } from '../src/network.js' import type { Bucket } from '../src/routing-table/k-bucket.js' @@ -75,96 +76,77 @@ describe('Routing Table', () => { logPrefix: '', protocol: PROTOCOL, kBucketSize: 2, - prefixLength: 3, + prefixLength: 1, + selfPrefixLength: 4, network }) await start(table) - const peerIds = [ - peerIdFromString('QmYobx1VAHP7Mi88LcDvLeQoWcc1Aa2rynYHpdEPBqHZi3'), // 00010 - peerIdFromString('QmYobx1VAHP7Mi88LcDvLeQoWcc1Aa2rynYHpdEPBqHZi7'), // 00011 - peerIdFromString('QmYobx1VAHP7Mi88LcDvLeQoWcc1Aa2rynYHpdEPBqHZiA'), // 00111 - peerIdFromString('QmYobx1VAHP7Mi88LcDvLeQoWcc1Aa2rynYHpdEPBqHZiB'), // 01000 - peerIdFromString('QmYobx1VAHP7Mi88LcDvLeQoWcc1Aa2rynYHpdEPBqHZiC'), // 11111 - peerIdFromString('QmYobx1VAHP7Mi88LcDvLeQoWcc1Aa2rynYHpdEPBqHZiD'), // 11110 - peerIdFromString('QmYobx1VAHP7Mi88LcDvLeQoWcc1Aa2rynYHpdEPBqHZiE'), // 10111 - peerIdFromString('QmYobx1VAHP7Mi88LcDvLeQoWcc1Aa2rynYHpdEPBqHZib') // 11001 - ] + // all new and old contacts are online + table.kb.verify = async () => true + table.kb.ping = async function * () {} - for (const peerId of peerIds) { - await table.add(peerId) - } + await table.add(prefixPeerIds['10000'][0]) + await table.add(prefixPeerIds['11100'][0]) + + await table.add(prefixPeerIds['00000'][0]) + await table.add(prefixPeerIds['01000'][0]) + await table.add(prefixPeerIds['00100'][0]) + await table.add(prefixPeerIds['00010'][0]) + await table.add(prefixPeerIds['00010'][1]) const trie = collect(table.kb.root) expect(trie).to.deep.equal({ - prefix: '', - depth: 0, - left: { + left: { // 0 prefix: '0', - depth: 0, - left: { + depth: 1, + left: { // 00 prefix: '0', - depth: 1, - left: { + depth: 2, + left: { // 000 prefix: '0', - depth: 2, - peers: [ - 'QmYobx1VAHP7Mi88LcDvLeQoWcc1Aa2rynYHpdEPBqHZi3', // 00010 - 'QmYobx1VAHP7Mi88LcDvLeQoWcc1Aa2rynYHpdEPBqHZi7' // 00011 - ], - containsSelf: true + depth: 3, + left: { // 0000 + prefix: '0', + depth: 4, + peers: [ + prefixPeerIds['00000'][0].toString() + ] + }, + right: { // 0001 + prefix: '1', + depth: 4, + peers: [ + prefixPeerIds['00010'][0].toString(), + prefixPeerIds['00010'][1].toString() + ], + containsSelf: true + } }, - right: { + right: { // 001 prefix: '1', - depth: 2, + depth: 3, peers: [ - 'QmYobx1VAHP7Mi88LcDvLeQoWcc1Aa2rynYHpdEPBqHZiA' // 00111 - ], - containsSelf: false + prefixPeerIds['00100'][0].toString() + ] } }, - right: { + right: { // 01 prefix: '1', - depth: 1, + depth: 2, peers: [ - 'QmYobx1VAHP7Mi88LcDvLeQoWcc1Aa2rynYHpdEPBqHZiB' // 01000 - ], - containsSelf: false + prefixPeerIds['01000'][0].toString() + ] } }, - right: { + right: { // 1 prefix: '1', - depth: 0, - left: { - prefix: '0', - depth: 1, - peers: [ - 'QmYobx1VAHP7Mi88LcDvLeQoWcc1Aa2rynYHpdEPBqHZiE' // 10111 - ], - containsSelf: false - }, - right: { - prefix: '1', - depth: 1, - left: { - prefix: '0', - depth: 2, - peers: [ - 'QmYobx1VAHP7Mi88LcDvLeQoWcc1Aa2rynYHpdEPBqHZib' // 11001 - ], - containsSelf: false - }, - right: { - prefix: '1', - depth: 2, - peers: [ - 'QmYobx1VAHP7Mi88LcDvLeQoWcc1Aa2rynYHpdEPBqHZiC', // 11111 - 'QmYobx1VAHP7Mi88LcDvLeQoWcc1Aa2rynYHpdEPBqHZiD' // 11110 - ], - containsSelf: false - } - } + depth: 1, + peers: [ + prefixPeerIds['10000'][0].toString(), + prefixPeerIds['11100'][0].toString() + ] } }) @@ -174,7 +156,7 @@ describe('Routing Table', () => { prefix: bucket.prefix, depth: bucket.depth, peers: bucket.peers.map(p => p.peerId.toString()), - containsSelf: Boolean(bucket.containsSelf) + containsSelf: bucket.containsSelf } } else { obj.prefix = bucket.prefix @@ -183,7 +165,7 @@ describe('Routing Table', () => { obj.right = collect(bucket.right, {}) } - return obj + return JSON.parse(JSON.stringify(obj)) } })