Skip to content

A CLI for starting an Amino DHT bootstrapper

License

Unknown and 2 other licenses found

Licenses found

Unknown
LICENSE
Unknown
LICENSE-APACHE
MIT
LICENSE-MIT
Notifications You must be signed in to change notification settings

libp2p/js-libp2p-amino-dht-bootstrapper

Folders and files

NameName
Last commit message
Last commit date

Latest commit

1fef6e6 · Oct 25, 2024
Oct 7, 2024
Sep 19, 2024
Sep 30, 2024
Oct 7, 2024
Oct 24, 2024
Sep 29, 2023
Aug 13, 2024
Oct 24, 2024
Oct 25, 2024
Sep 30, 2024
Sep 29, 2023
Sep 29, 2023
Sep 29, 2023
Oct 24, 2024
Aug 13, 2024
Oct 2, 2024
Oct 24, 2024
Oct 25, 2024
Oct 25, 2024
Sep 29, 2023
Sep 29, 2023

Repository files navigation

@libp2p/amino-dht-bootstrapper

libp2p.io Discuss codecov CI

Run an Amino DHT boostrapper with js-libp2p

Install

$ npm i @libp2p/amino-dht-bootstrapper

Bootstrap details

EPIC tracking issue: https://github.com/protocol/bifrost-infra/issues/2778

Find more info at https://github.com/protocol/bifrost-infra/blob/master/docs/bootstrap.md

Rust bootstrapper: https://github.com/libp2p/rust-libp2p/tree/master/misc/server

Requirements of a bootstrap node

  • The Peer IDs of the default bootstrap nodes are set explicitly, to assert that you only trust a specific peer at a given ip or dns entry.
    • This makes it harder for attackers to spoof or otherwise MITM attack, as they would also have to compromise our infrastructure to steal the private key behind the Peer ID.
  • Defaults
    • The default addresses for the bootstrap nodes are set in the ipfs/go-ipfs-config configuration

Start the bootstrapper

$ npx --package=@libp2p/amino-dht-bootstrapper -- amino
Options:
      --config <CONFIG>              Path to IPFS config file (required)
      --metrics-path <METRICS_PATH>  Metric endpoint path [default: /metrics]
      --metrics-port <PORT>          Metric endpoint path [default: 8888]
      --enable-kademlia              Whether to run the libp2p Kademlia protocol and join the IPFS DHT
      --enable-autonat               Whether to run the libp2p Autonat protocol
      --api-port <PORT>              Port to serve the RPC API [default: 8899]
      --api-host <HOST>              Host to serve the RPC API on [default: 127.0.0.1]
  -h, --help                         Print help

RPC API

To make a request via CURL, you can use the following command:

# run garbage collection
$ curl http://${HOST}:${RPC_PORT}/api/v0/nodejs/gc

# execute a heapdump
$ curl http://${HOST}:${RPC_PORT}/api/v0/nodejs/heapdump

# change the log level
$ curl http://${HOST}:${RPC_PORT}/api/v0/nodejs/log?namespace=libp2p:*

Please note that the RPC API server only listens on the loopback interface (127.0.0.1) by default. If you decide to change the api-host option, please make sure that the RPC API server is only used for development purposes and is not accessible publicly.

Configuring bootstrapper options

{
  "config": {
    "description": "Path to IPFS config file",
    "type": "string"
  },
  "enable-kademlia": {
    "description": "Whether to run the libp2p Kademlia protocol and join the IPFS DHT",
    "type": "boolean"
  },
  "enable-autonat": {
    "description": "Whether to run the libp2p Autonat protocol",
    "type": "boolean"
  },
  "metrics-path": {
    "description": "Metric endpoint path",
    "default": "/metrics",
    "type": "string"
  },
  "metrics-port": {
    "description": "Port to serve metrics",
    "default": "8888",
    "type": "string"
  },
  "api-port": {
    "description": "Port for api endpoint",
    "default": "8899",
    "type": "string"
  },
  "api-host": {
    "description": "The listen address hostname for the RPC API server",
    "default": "127.0.0.1",
    "type": "string"
  },
  "help": {
    "description": "Show help text",
    "type": "boolean"
  }

Config file example

A config file will be generated for you automatically, and stored at $HOME/.config/@libp2p/amino-dht-bootstrapper/config.json. The default config we generate looks like this:

{
  "addresses": {
    "announce": [],
    "noAnnounce": [],
    "listen": [
      "/ip4/0.0.0.0/tcp/4003/ws",
      "/ip4/0.0.0.0/tcp/4001",
      "/ip6/::/tcp/4004/ws",
      "/ip6/::/tcp/4001",
      "/ip4/0.0.0.0/udp/4002/webrtc"
    ]
  },
  "bootstrap": {
    "list": [
      "/dns4/am6.bootstrap.libp2p.io/tcp/443/wss/p2p/QmbLHAnMoJPWSCR5Zhtx6BHJX9KiKNN6tpvbUcqanj75Nb",
      "/dns4/sg1.bootstrap.libp2p.io/p2p/QmcZf59bWwK5XFi76CZX8cbJ4BhTzzA3gU1ZjYZcYW3dwt",
      "/dns4/sv15.bootstrap.libp2p.io/p2p/QmNnooDu7bfjPFoTZYxMNLWUQJyrVwtbZg5gBMjTezGAJN"
    ]
  },
  "privateKey": "generated by `auto-config.ts`",
  "connectionManager": {
    "inboundConnectionThreshold": 100,
    "maxIncomingPendingConnections": 100,
    "maxConnections": 500
  }
}

Building the Docker Image

Building should be straightforward from the root of the repository:

$ docker build . --tag amino

Running the docker image (once built):

$ docker run -v $(pwd)/bootstrapper-config.json:/config.json -it amino --config /config.json

To pass args:

$ docker run -v $(pwd)/bootstrapper-config.json:/config.json -it amino --config /config.json [--enable-kademlia] [--enable-autonat]

To expose the metrics port:

$ docker run -v $(pwd)/bootstrapper-config.json:/config.json -p 8888:8888 -it amino --config /config.json

Running the docker image with monitoring:

$ docker compose --profile dashboard up -d

License

Licensed under either of

Contribution

Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.