forked from mirror/go-ethereum
[DOCS] add DNS discovery setup guide (#20399)
This adds setup instructions for the DHT crawler and DNS node list publishing tools.ChrisChinchilla-patch-1
parent
483c5fbc39
commit
538a283b86
@ -0,0 +1,113 @@ |
||||
--- |
||||
title: DNS Discovery Setup Guide |
||||
sort_key: C |
||||
--- |
||||
|
||||
This document explains how to set up an [EIP 1459][dns-eip] node list using the devp2p |
||||
developer tool. The focus of this guide is creating a public list for the Ethereum mainnet |
||||
and public testnets, but you may also find this helpful if you want to set up DNS-based |
||||
discovery for a private network. |
||||
|
||||
DNS-based node lists can serve as a fallback option when connectivity to the discovery DHT |
||||
is unavailable. In this guide, we'll create node lists by crawling the discovery DHT, then |
||||
publishing the resulting node sets under chosen DNS names. |
||||
|
||||
### Installing the devp2p command |
||||
|
||||
cmd/devp2p is a developer utility and is not included in the Geth distribution. You can |
||||
install this command using `go get`: |
||||
|
||||
```shell |
||||
go get -u github.com/ethereum/go-ethereum/cmd/devp2p |
||||
``` |
||||
|
||||
To create a signing key, you might also need the `ethkey` utility. |
||||
|
||||
```shell |
||||
go get -u github.com/ethereum/go-ethereum/cmd/ethkey |
||||
``` |
||||
|
||||
### Crawling the v4 DHT |
||||
|
||||
Our first step is to compile a list of all reachable nodes. The DHT crawler in cmd/devp2p |
||||
is a batch process which runs for a set amount of time. You should should schedule this command |
||||
to run at a regular interval. To create a node list, run |
||||
|
||||
```shell |
||||
devp2p discv4 crawl -timeout 30m all-nodes.json |
||||
``` |
||||
|
||||
This walks the DHT and stores the set of all found nodes in the `all-nodes.json` file. |
||||
Subsequent runs of the same command will revalidate previously discovered node records, |
||||
add newly-found nodes to the set, and remove nodes which are no longer alive. The quality |
||||
of the node set improves with each run because the number of revalidations is tracked |
||||
alongside each node in the set. |
||||
|
||||
### Creating sub-lists through filtering |
||||
|
||||
Once `all-nodes.json` has been created and the set contains a sizeable number of nodes, |
||||
useful sub-sets of nodes can be extracted using the `devp2p nodeset filter` command. This |
||||
command takes a node set file as argument and applies filters given as command-line flags. |
||||
|
||||
To create a filtered node set, first create a new directory to hold the output set. You |
||||
can use any directory name, though it's good practice to use the DNS domain name as the |
||||
name of this directory. |
||||
|
||||
```shell |
||||
mkdir mainnet.nodes.example.org |
||||
``` |
||||
|
||||
Then, to create the output set containing Ethereum mainnet nodes only, run |
||||
|
||||
```shell |
||||
devp2p nodeset filter all-nodes.json -eth-network mainnet > mainnet.nodes.example.org/nodes.json |
||||
``` |
||||
|
||||
The following filter flags are available: |
||||
|
||||
* `-eth-network ( mainnet | ropsten | rinkeby | goerli )` selects an Ethereum network. |
||||
* `-les-server` selects LES server nodes. |
||||
* `-ip <mask>` restricts nodes to the given IP range. |
||||
* `-min-age <duration>` restricts the result to nodes which have been live for the |
||||
given duration. |
||||
|
||||
### Creating DNS trees |
||||
|
||||
To turn a node list into a DNS node tree, the list needs to be signed. To do this, you |
||||
need a key pair. To create the key file in the correct format, you can use the cmd/ethkey |
||||
utility. Please choose a good password to encrypt the key on disk. |
||||
|
||||
```shell |
||||
ethkey generate dnskey.json |
||||
``` |
||||
|
||||
Now use `devp2p dns sign` to update the signature of the node list. If your list's |
||||
directory name differs from the name you want to publish it at, please specify the DNS |
||||
name the using the `-domain` flag. This command will prompt for the key file password and |
||||
update the tree signature. |
||||
|
||||
```shell |
||||
devp2p dns sign mainnet.nodes.example.org dnskey.json |
||||
``` |
||||
|
||||
The resulting DNS tree metadata is stored in the |
||||
`mainnet.nodes.example.org/enrtree-info.json` file. |
||||
|
||||
### Publishing DNS trees |
||||
|
||||
Now that the tree is signed, it can be published to a DNS provider. cmd/devp2p currently |
||||
supports publishing to CloudFlare DNS. You can also export TXT records as a JSON file and |
||||
publish them yourself. |
||||
|
||||
To publish to CloudFlare, first create an API token in the management console. cmd/devp2p |
||||
expects the API token in the `CLOUDFLARE_API_TOKEN` environment variable. Now use the |
||||
following command to upload DNS TXT records via the CloudFlare API: |
||||
|
||||
```shell |
||||
devp2p dns to-cloudflare mainnet.nodes.example.org |
||||
``` |
||||
|
||||
Note that this command uses the domain name specified during signing. Any existing records |
||||
below this name will be erased by cmd/devp2p. |
||||
|
||||
[dns-eip]: https://eips.ethereum.org/EIPS/eip-1459 |
Loading…
Reference in new issue