#discovery #dht #ethereum #command-line-tool #p2p #search #discv5

bin+lib discv5-cli

简单 CLI 工具,用于创建和调试 discovery v5 服务器

10 个不稳定版本 (3 个破坏性更新)

0.5.0 2023年6月6日
0.3.0 2022年12月12日
0.2.4 2021年5月28日
0.2.0 2021年2月3日
0.1.1 2020年5月20日

#52#dht

每月 33 次下载

MIT 许可证

49KB
785

discv5-cli

Build Status Doc Status Crates Status

在 docs.rs 上查看文档

概述

这是一个简单的 CLI 工具,用于创建和调试 discovery v5 服务器。

安装

可以通过 cargo 安装

$ cargo install discv5-cli

用法

运行 discv5-cli --help 可查看以下内容

Simple CLI utility for creating and debugging discovery v5 servers

Usage: discv5-cli [OPTIONS] [COMMAND]

Commands:
  packet
          Performs packet operations
  request-enr
          Requests an ENR from a node
  server
          Runs a discv5 test server
  help
          Print this message or the help of the given subcommand(s)

Options:
  -v, --log-level <LOG_LEVEL>
          Sets the logging verbosity level.

          [default: info]

          Possible values:
          - trace: Trace level
          - debug: Debug level
          - info:  Info level
          - warn:  Warn level
          - error: Error level

  -h, --help
          Print help information (use `-h` for a summary)

  -V, --version
          Print version information

服务器

discv5-cli 服务器提供了以下选项,可以通过运行 discv5-cli server --help 查看

Runs a discv5 test server

Usage: discv5-cli server [OPTIONS]

Options:
  -l, --listen-address <LISTEN_ADDRESS>
          Specifies the listening address of the server. [default: 0.0.0.0]
  -p, --listen-port <LISTEN_PORT>
          Specifies the listening UDP port of the server. [default: 9000]
  -i, --enr-address <ENR_ADDRESS>
          Specifies the IP address of the ENR record. Not specifying this results in an ENR with no IP field, unless the -w switch is used.
  -u, --enr-port <ENR_PORT>
          Specifies the UDP port of the ENR record. Not specifying this results in an ENR with no UDP field, unless the -w switch is used.
  -q, --enr-seq-no <ENR_SEQ_NO>
          Specifies the ENR sequence number when creating the ENR.
  -d, --enr-eth2 <ENR_ETH2>
          Specifies the Eth2 field as ssz encoded hex bytes.
  -w, --enr-default
          The Enr IP address and port will be the same as the specified listening address and port.
  -k, --static-key
          Use a fixed static key (hard-coded). This is primarily for debugging.
  -t, --secp256k1-key <SECP256K1_KEY>
          Specify a secp256k1 private key (hex encoded) to use for the nodes identity.
  -e, --enr <ENR>
          A base64 ENR that this node will initially connect to.
  -n, --peer-update-min <PEER_UPDATE_MIN>
          The minimum number of peers required to update the IP address. Cannot be less than 2. [default: 2]
  -b, --break-time <BREAK_TIME>
          The time to wait between successive searches. Default is 10 seconds. [default: 10]
  -s, --stats <STATS>
          Displays statistics on the local routing table. [default: 10]
  -x, --no-search
          Prevents the server from doing any peer searches.
  -o, --bootstrap <BOOTSTRAP>
          Bootstraps the server peers from a specified file.
  -h, --help
          Print help information

为了创建一个最新的 bootstrap.json 文件,你可以使用 beacon-chain api 中指定的 /eth/v1/node/peers 端点查询 beacon-chain rpc。例如,在你的 beacon-chain 客户端所在的同一台机器上运行 curl http://0.0.0.0:3500/eth/v1/node/peers | jq,以获得与示例 example.bootstrap.json 相同格式的输出。

注意

应保持节点列表私密,以防止信息泄露和节点 doxxing。因此,bootstrap.json.gitignore 文件中被忽略。

数据包

discv5-cli 数据包提供了以下选项,可以通过运行 discv5-cli packet --help 查看

Performs packet operations

Usage: discv5-cli packet <COMMAND>

Commands:
  decode  Decodes a packet
  help    Print this message or the help of the given subcommand(s)

Options:
  -h, --help  Print help information

请求-ENR

discv5-cli 请求-enr 提供以下选项,可以通过运行 discv5-cli request-enr --help 查看

Requests an ENR from a node

Usage: discv5-cli request-enr --multiaddr <MULTIADDR>

Options:
  -m, --multiaddr <MULTIADDR>  The multiaddr of the node to request their ENR from
  -h, --help                   Print help information

示例

运行服务器

$ discv5-cli server -e -KO4QMMX2IadOccPtAC29ueqrRzNEO5omCNRRTctz-QR20eyMwVR9yl6IDsoxmkg4naImuve8u2H6FO9fsmlXxso-suCAsKEZXRoMpBKJsWLAgAAAP__________gmlkgnY0gmlwhC0ftqSJc2VjcDI1NmsxoQI3vMd58jjnDZQm0KGQpbuWGSW9Bnon1GsF07XnlHna6YN0Y3CCekqDdWRwgsau --enr-port 50862 --enr-address 45.31.182.164 --break-time 5 --bootstrap bootstrap.json

2022-12-07T23:07:04.808Z INFO  [discv5_cli::server::node] Node Id: 0x773e..b498
2022-12-07T23:07:04.808Z INFO  [discv5_cli::server::node] Base64 ENR: enr:-IS4QArehERF1NJQn3zuGT5dAYBHNMjPCJCfGvs00AsMqyY6M80hoHZThbfveHbd-0GYqMy8mQiAAql5SlwpBRofc9IBgmlkgnY0gmlwhC0ftqSJc2VjcDI1NmsxoQL89kiZJgAhIf3hS6kAlou02R7IjayJWbULmBGTh52YUYN1ZHCCxq4
2022-12-07T23:07:04.808Z INFO  [discv5_cli::server::node] ip: 45.31.182.164, udp port:50862
2022-12-07T23:07:04.811Z INFO  [discv5_cli::server] Connecting to ENR. ip: Some(45.31.182.164), udp_port: Some(50862),  tcp_port: Some(31306)
2022-12-07T23:07:05.504Z INFO  [discv5_cli::server] Server listening on 0.0.0.0:9000
2022-12-07T23:07:05.505Z INFO  [discv5_cli::server] Query service running...
2022-12-07T23:07:05.505Z INFO  [discv5_cli::server::query] Searching for peers...
2022-12-07T23:07:05.505Z INFO  [discv5::service] Discv5 Service started
2022-12-07T23:07:05.505Z INFO  [discv5::service] Ip4
2022-12-07T23:07:11.152Z WARN  [discv5::service] NODES Response failed, but was partially processed from: Node: 0xb48c..4c2e, addr: 157.90.179.107:12000
2022-12-07T23:07:14.976Z INFO  [discv5_cli::server::query] Query Completed. Nodes found: 16
2022-12-07T23:07:14.976Z INFO  [discv5_cli::server::query] Node: 0xb48c..4c2e
2022-12-07T23:07:14.976Z INFO  [discv5_cli::server::query] Node: 0xb498..1ac2
2022-12-07T23:07:14.976Z INFO  [discv5_cli::server::query] Node: 0xb49a..f73c
2022-12-07T23:07:14.976Z INFO  [discv5_cli::server::query] Node: 0xb4a7..b1f0
2022-12-07T23:07:14.976Z INFO  [discv5_cli::server::query] Node: 0xb4b8..6f72
2022-12-07T23:07:14.977Z INFO  [discv5_cli::server::query] Node: 0xb4d1..e58e
2022-12-07T23:07:14.977Z INFO  [discv5_cli::server::query] Node: 0xb4e1..b19b
2022-12-07T23:07:14.977Z INFO  [discv5_cli::server::query] Node: 0xb4e2..921e
2022-12-07T23:07:14.977Z INFO  [discv5_cli::server::query] Node: 0xb4f5..566a
2022-12-07T23:07:14.977Z INFO  [discv5_cli::server::query] Node: 0xb4f3..6657
2022-12-07T23:07:14.977Z INFO  [discv5_cli::server::query] Node: 0xb4fe..49a9
2022-12-07T23:07:14.977Z INFO  [discv5_cli::server::query] Node: 0xb4fa..ad8e
2022-12-07T23:07:14.977Z INFO  [discv5_cli::server::query] Node: 0xb402..11d6
2022-12-07T23:07:14.977Z INFO  [discv5_cli::server::query] Node: 0xb402..cc3c
2022-12-07T23:07:14.977Z INFO  [discv5_cli::server::query] Node: 0xb402..6648
2022-12-07T23:07:14.977Z INFO  [discv5_cli::server::query] Node: 0xb403..b511
2022-12-07T23:07:14.978Z INFO  [discv5_cli::server::query] Bucket 251 statistics: Connected peers: 0 (Incoming: 0, Outgoing: 0), Disconnected Peers: 2
2022-12-07T23:07:14.978Z INFO  [discv5_cli::server::query] Bucket 252 statistics: Connected peers: 0 (Incoming: 0, Outgoing: 0), Disconnected Peers: 10
2022-12-07T23:07:14.978Z INFO  [discv5_cli::server::query] Bucket 253 statistics: Connected peers: 0 (Incoming: 0, Outgoing: 0), Disconnected Peers: 16
2022-12-07T23:07:14.979Z INFO  [discv5_cli::server::query] Bucket 255 statistics: Connected peers: 0 (Incoming: 0, Outgoing: 0), Disconnected Peers: 16
2022-12-07T23:07:14.979Z INFO  [discv5_cli::server::query] Bucket 256 statistics: Connected peers: 1 (Incoming: 0, Outgoing: 1), Disconnected Peers: 15
2022-12-07T23:07:14.979Z INFO  [discv5_cli::server::query] Bucket 247 statistics: Connected peers: 0 (Incoming: 0, Outgoing: 0), Disconnected Peers: 1
2022-12-07T23:07:14.979Z INFO  [discv5_cli::server::query] Bucket 254 statistics: Connected peers: 0 (Incoming: 0, Outgoing: 0), Disconnected Peers: 16
2022-12-07T23:07:14.979Z INFO  [discv5_cli::server::query] Bucket 248 statistics: Connected peers: 0 (Incoming: 0, Outgoing: 0), Disconnected Peers: 1
2022-12-07T23:07:15.668Z WARN  [discv5::service] NODES Response failed, but was partially processed from: Node: 0xb7c6..0a8c, addr: 185.49.111.250:30303

请求 ENR

$ discv5-cli request-enr /ip4/45.31.182.164/udp/31306/p2p/16Uiu2HAkyBFMsXS4Rpc3SfpaasFtLR6uKTnWqsUB8U8EMy24A5YU

2022-12-07 20:54:20,658 INFO [discv5::service] Discv5 Service started
2022-12-07 20:54:20,658 INFO [discv5::service] Ip4
2022-12-07 20:54:20,658 INFO [discv5_cli::request_enr] Requesting ENR for: /ip4/45.31.182.164/udp/31306/p2p/16Uiu2HAkyBFMsXS4Rpc3SfpaasFtLR6uKTnWqsUB8U8EMy24A5YU
2022-12-07 20:54:20,908 INFO [discv5_cli::request_enr] ENR Found:
2022-12-07 20:54:20,908 INFO [discv5_cli::request_enr] Sequence No:1545
2022-12-07 20:54:20,908 INFO [discv5_cli::request_enr] NodeId:0x9f89..e7b4
2022-12-07 20:54:20,910 INFO [discv5_cli::request_enr] Libp2p PeerId:16Uiu2HAkyBFMsXS4Rpc3SfpaasFtLR6uKTnWqsUB8U8EMy24A5YU
2022-12-07 20:54:20,910 INFO [discv5_cli::request_enr] IP:45.31.182.164
2022-12-07 20:54:20,910 INFO [discv5_cli::request_enr] TCP Port:31306
2022-12-07 20:54:20,910 INFO [discv5_cli::request_enr] UDP Port:25674
2022-12-07 20:54:20,910 INFO [discv5_cli::request_enr] Known multiaddrs:
2022-12-07 20:54:20,910 INFO [discv5_cli::request_enr] /ip4/45.31.182.164/udp/25674/p2p/16Uiu2HAkyBFMsXS4Rpc3SfpaasFtLR6uKTnWqsUB8U8EMy24A5YU
2022-12-07 20:54:20,910 INFO [discv5_cli::request_enr] /ip4/45.31.182.164/tcp/31306/p2p/16Uiu2HAkyBFMsXS4Rpc3SfpaasFtLR6uKTnWqsUB8U8EMy24A5YU
2022-12-07 20:54:20,911 INFO [discv5::service] Discv5 Service shutdown

解码数据包

$ discv5-cli -- packet decode --packet 9fd3c9ced567380bd7f0b25b4e8cb250401f9654bb92990b36f0220b65e8c96b029c629d897d25ed861b6b80c002c0c910ce86ccdea0de1f5721efc3c2e01a2a7288d986074592d40e4b8eee5c44e8ae56ff8f8bda79fd8d3e899e36fdc07b24d74edc8ab189775f9aedd8918fd03f7f52d98b --nodeid d94f5e91dbd9c22221fc9d778347fca7b9f49745071199c2a8960073a98169d9

2022-12-07T20:08:20.265Z INFO  [discv5_cli::packet] Using decoding node id: 0xd94f..69d9
2022-12-07T20:08:20.265Z INFO  [discv5_cli::packet] Packet decoded: (Packet { iv: 212446919118329375467898179749707297360, header: PacketHeader { message_nonce: [86, 230, 107, 84, 45, 19, 246, 151, 176, 105, 149, 81], kind: Message { src_id: NodeId { raw: [238, 233, 154, 181, 126, 7, 103, 153, 11, 0, 123, 98, 184, 185, 96, 132, 106, 88, 170, 186, 22, 234, 9, 223, 97, 84, 167, 121, 21, 83, 116, 203] } } }, message: [212, 14, 75, 142, 238, 92, 68, 232, 174, 86, 255, 143, 139, 218, 121, 253, 141, 62, 137, 158, 54, 253, 192, 123, 36, 215, 78, 220, 138, 177, 137, 119, 95, 154, 237, 216, 145, 143, 208, 63, 127, 82, 217, 139] }, [159, 211, 201, 206, 213, 103, 56, 11, 215, 240, 178, 91, 78, 140, 178, 80, 100, 105, 115, 99, 118, 53, 0, 1, 0, 86, 230, 107, 84, 45, 19, 246, 151, 176, 105, 149, 81, 0, 32, 238, 233, 154, 181, 126, 7, 103, 153, 11, 0, 123, 98, 184, 185, 96, 132, 106, 88, 170, 186, 22, 234, 9, 223, 97, 84, 167, 121, 21, 83, 116, 203])

依赖

~20–33MB
~510K SLoC