Skip to content

Commit

Permalink
Merge pull request #49 from ChainSafe/cayman/libp2p-compat
Browse files Browse the repository at this point in the history
Add libp2p compatability module
  • Loading branch information
wemeetagain committed Apr 10, 2020
2 parents 8b41e46 + 9c29659 commit 1cf6608
Show file tree
Hide file tree
Showing 6 changed files with 157 additions and 2 deletions.
37 changes: 37 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,40 @@
# discv5

A TypeScript implementation of the [DiscV5](https://github.com/ethereum/devp2p/blob/master/discv5/discv5.md) protocol

## Libp2p compatibility

![Peer Discovery Compatible](https://github.com/libp2p/js-libp2p-interfaces/raw/master/src/peer-discovery/img/badge.png)

Included is a libp2p peer-discovery compatibility module.

#### Example

```typescript
import { Discv5Discovery, ENR } from "@chainsafe/discv5";
import Libp2p from "libp2p";
import PeerInfo from "peer-info";

const myPeerInfo: PeerInfo = ...;

const bootstrapEnrs: ENR[] = [...];

const libp2p = new Libp2p({
peerInfo: myPeerInfo,
modules: {
peerDiscovery: [Discv5Discovery],
},
config: {
discv5: {
enr: ENR.createFromPeerId(myPeerInfo.id),
bindAddr: "/ip4/0.0.0.0/udp/9000",
bootstrapEnrs: bootstrapEnrs,
},
},
});

```

## License

Apache-2.0
1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@
"libp2p-crypto": "^0.17.5",
"multiaddr": "^7.4.2",
"peer-id": "^0.13.11",
"peer-info": "^0.17.5",
"rlp": "^2.2.4",
"strict-event-emitter-types": "^2.0.0"
}
Expand Down
1 change: 1 addition & 0 deletions src/index.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
export * from "./enr";
export * from "./kademlia";
export * from "./keypair";
export * from "./libp2p";
export * from "./service";
export * from "./session";
export * from "./transport";
Expand Down
81 changes: 81 additions & 0 deletions src/libp2p/discv5.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
import { EventEmitter } from "events";
import PeerInfo = require("peer-info");
import Multiaddr = require("multiaddr");
import { randomBytes } from "libp2p-crypto";

import { Discv5 } from "../service";
import { ENR, createNodeId } from "../enr";

export interface IDiscv5DiscoveryInputOptions {
/**
* Local ENR associated with the local libp2p peer id
*/
enr: ENR;
/**
* The bind multiaddr for the discv5 UDP server
*
* NOTE: This MUST be a udp multiaddr
*/
bindAddr: string;
/**
* Remote ENRs used to bootstrap the network
*/
bootEnrs: ENR[];
}

export interface IDiscv5DiscoveryOptions extends IDiscv5DiscoveryInputOptions {
peerInfo: PeerInfo;
}

/**
* Discv5Discovery is a libp2p peer-discovery compatable module
*/
export class Discv5Discovery extends EventEmitter {
static tag = "discv5";

public discv5: Discv5;
private started: NodeJS.Timer | boolean;

constructor(options: IDiscv5DiscoveryOptions) {
super();
this.discv5 = Discv5.create(options.enr, options.peerInfo.id, Multiaddr(options.bindAddr));
this.started = false;
options.bootEnrs.forEach((bootEnr) => this.discv5.addEnr(bootEnr));
}

async start(): Promise<void> {
if (this.started) {
return;
}
this.started = true;
await this.discv5.start();
setTimeout(() => this.findPeers, 1);
}

async stop(): Promise<void> {
if (!this.started) {
return;
}
this.started = false;
await this.discv5.stop();
}

async findPeers(): Promise<void> {
while (!this.started) {
// Search for random nodes
// emit discovered on all finds
const enrs = await this.discv5.findNode(createNodeId(randomBytes(32)));
if (!this.started) {
return;
}
for (const enr of enrs) {
const peerInfo = new PeerInfo(await enr.peerId());
const multiaddrTCP = enr.multiaddrTCP;
if (multiaddrTCP) {
peerInfo.multiaddrs.add(multiaddrTCP);
}
this.emit("peer", peerInfo);
}
}
}
}
1 change: 1 addition & 0 deletions src/libp2p/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export * from "./discv5";
38 changes: 36 additions & 2 deletions yarn.lock
Original file line number Diff line number Diff line change
Expand Up @@ -574,7 +574,7 @@ chokidar@^3.0.0:
optionalDependencies:
fsevents "~2.1.1"

cids@^0.8.0:
cids@^0.8.0, cids@~0.8.0:
version "0.8.0"
resolved "https://registry.yarnpkg.com/cids/-/cids-0.8.0.tgz#41bf050bc7669cc8d648e21ca834b747bf6fa673"
integrity sha512-HdKURxtSOnww3H28CJU2TauIklEBsOn+ouGl2EOnSfVCVkH6+sWTj7to2D/BmuWvwzEy2+ZIKdcIwsXHJBQVew==
Expand Down Expand Up @@ -1804,6 +1804,13 @@ lru-cache@4.1.x, lru-cache@^4.0.1:
pseudomap "^1.0.2"
yallist "^2.1.2"

mafmt@^7.1.0:
version "7.1.0"
resolved "https://registry.yarnpkg.com/mafmt/-/mafmt-7.1.0.tgz#4126f6d0eded070ace7dbbb6fb04977412d380b5"
integrity sha512-vpeo9S+hepT3k2h5iFxzEHvvR0GPBx9uKaErmnRzYNcaKb03DgOArjEMlgG4a9LcuZZ89a3I8xbeto487n26eA==
dependencies:
multiaddr "^7.3.0"

make-dir@^2.0.0, make-dir@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5"
Expand Down Expand Up @@ -1934,6 +1941,18 @@ ms@^2.1.1:
resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==

multiaddr@^7.3.0:
version "7.4.3"
resolved "https://registry.yarnpkg.com/multiaddr/-/multiaddr-7.4.3.tgz#0626945acf309f1c811a95613a0a4371c7aa6109"
integrity sha512-gFjXmjcCMyrx5KF1QOohUQm6a3E2XF4kydvClS8DmRJkY3qJaDPNNe0OC7mWvVUE0nnE8HjyToQfABnpKClXRA==
dependencies:
buffer "^5.5.0"
cids "~0.8.0"
class-is "^1.1.0"
is-ip "^3.1.0"
multibase "^0.7.0"
varint "^5.0.0"

multiaddr@^7.4.2:
version "7.4.2"
resolved "https://registry.yarnpkg.com/multiaddr/-/multiaddr-7.4.2.tgz#70021158dfcdc81d8e0e2664b82a7bc1b4c8dce2"
Expand Down Expand Up @@ -2288,7 +2307,7 @@ pathval@^1.1.0:
resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.0.tgz#b942e6d4bde653005ef6b71361def8727d0645e0"
integrity sha1-uULm1L3mUwBe9rcTYd74cn0GReA=

peer-id@^0.13.11:
peer-id@^0.13.11, peer-id@~0.13.2:
version "0.13.11"
resolved "https://registry.yarnpkg.com/peer-id/-/peer-id-0.13.11.tgz#d3b11e45d80839363aeac0e4fa1758368e3b93cd"
integrity sha512-CWDPr4ppKslARSe1qfMlGjTiDqL4Hl25Qyfq43PEPAeRD2meI8B2HfxO0NMMB8BUhNvNGPeDAwhLptyB9jVwkw==
Expand All @@ -2300,6 +2319,16 @@ peer-id@^0.13.11:
multihashes "~0.4.15"
protons "^1.0.2"

peer-info@^0.17.5:
version "0.17.5"
resolved "https://registry.yarnpkg.com/peer-info/-/peer-info-0.17.5.tgz#80afc709e03069cf94a29d8fcfa0426140fa7b69"
integrity sha512-ebbbnvdCnb0onWuW+QNXO4KvLPuQ+kih3zezhov2uxHqA6VLbtzMUyQ06IHtwYLr50AYYWyBOSn17g4zEBsFpw==
dependencies:
mafmt "^7.1.0"
multiaddr "^7.3.0"
peer-id "~0.13.2"
unique-by "^1.0.0"

pem-jwk@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/pem-jwk/-/pem-jwk-2.0.0.tgz#1c5bb264612fc391340907f5c1de60c06d22f085"
Expand Down Expand Up @@ -2950,6 +2979,11 @@ ultron@~1.1.0:
resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.1.1.tgz#9fe1536a10a664a65266a1e3ccf85fd36302bc9c"
integrity sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==

unique-by@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/unique-by/-/unique-by-1.0.0.tgz#5220c86ba7bc572fb713ad74651470cb644212bd"
integrity sha1-UiDIa6e8Vy+3E610ZRRwy2RCEr0=

universalify@^0.1.0:
version "0.1.2"
resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66"
Expand Down

0 comments on commit 1cf6608

Please sign in to comment.