网络地址
以太坊节点必须使用一些基本信息来标识自己,以便连接到对等节点。为了确保任何潜在的对等节点都能解释这些信息,它会以任何以太坊节点都能理解的三种标准化格式之一进行中继:multiaddr、enode 或以太坊节点记录 (ENR)。ENR 是目前以太坊网络地址的标准。
前提条件
需要对以太坊的网络层有所了解才能理解本页内容。
Multiaddr
最初的以太坊节点地址格式是“multiaddr”(“multi-addresses”的缩写)。Multiaddr 是一种专为点对点网络设计的通用格式。地址表示为键值对,键和值之间用正斜杠分隔。例如,IPv4 地址为 192.168.22.27 且监听 TCP 端口 33000 的节点的 multiaddr 如下所示:
/ip4/192.168.22.27/tcp/33000
对于以太坊节点,multiaddr 包含节点 ID(其公钥的哈希):
/ip4/192.168.22.27/tcp/33000/p2p/5t7Nv7dG2d6ffbvAiewVsEwWweU3LdebSqX2y1bPrW8br
Enode
enode 是一种使用 URL 地址格式来标识以太坊节点的方法。十六进制的节点 ID 编码在 URL 的用户名部分,并使用 @ 符号与主机分隔。主机名只能指定为 IP 地址;不允许使用 DNS 名称。主机名部分中的端口是 TCP 监听端口。如果 TCP 和 UDP(发现)端口不同,则将 UDP 端口指定为查询参数“discport”。
在以下示例中,节点 URL 描述了一个 IP 地址为 10.3.58.6、TCP 端口为 30303 且 UDP 发现端口为 30301 的节点。
enode://6f8a80d14311c39f35f516fa664deaaaa13e85b2f7493f37f6144d86991ec012937307647bd3b9a82abe2974e1407241d54947bbb39763a4cac9f77166ad92a0@10.3.58.6:30303?discport=30301
以太坊节点记录 (ENR)
以太坊节点记录 (ENR) 是以太坊上网络地址的标准化格式。它们取代了 multiaddr 和 enode。它们特别有用,因为它们允许节点之间进行更多的信息交换。ENR 包含签名、序列号以及详细说明用于生成和验证签名的身份方案的字段。ENR 还可以填充组织为键值对的任意数据。这些键值对包含节点的 IP 地址以及有关节点能够使用的子协议的信息。共识客户端使用特定的 ENR 结构 (opens in a new tab)来识别引导节点,并且还包含一个 eth2 字段,其中包含有关当前以太坊分叉和证明 gossip 子网的信息(这会将节点连接到一组特定的对等节点,这些对等节点的证明会被聚合在一起)。