本文档定义了以太坊节点记录(ENR),这是一种用于p2p连接信息的开放格式。节点记录通常包含节点的网络端点(即节点的IP地址和端口),还包含关于节点在网络上的用途的信息,以便其他节点可以决定是否连接到该节点。ENR包含签名、序列号以及键值对,使用RLP进行编码,并定义了“v4”身份方案。
本规范定义了以太坊节点记录(ENR),这是一种用于 p2p 连接信息的开放格式。节点记录通常包含节点的网络端点,即节点的 IP 地址和端口。它还包含有关节点在网络上的用途的信息,以便其他人可以决定是否连接到该节点。
以太坊节点记录最初在 EIP-778 中提出。
节点记录的组成部分是:
signature
:记录内容的加密签名seq
:序列号,一个 64 位无符号整数。节点应在每次记录更改时增加该数字并重新发布记录。记录的签名是根据身份方案创建和验证的。身份方案还负责在 DHT 中导出节点的地址。
键/值对必须按键排序且必须是唯一的,即任何键只能出现一次。 键在技术上可以是任何字节序列,但首选 ASCII 文本。 下表中的键名具有预定义的含义。
键 | 值 |
---|---|
id |
身份方案的名称,例如 "v4" |
secp256k1 |
压缩的 secp256k1 公钥,33 字节 |
ip |
IPv4 地址,4 字节 |
tcp |
TCP 端口,大端整数 |
udp |
UDP 端口,大端整数 |
ip6 |
IPv6 地址,16 字节 |
tcp6 |
IPv6 特定的 TCP 端口,大端整数 |
udp6 |
IPv6 特定的 UDP 端口,大端整数 |
除了 id
之外的所有键都是可选的,包括 IP 地址和端口。 没有端点信息的记录只要其签名有效仍然有效。 如果未提供 tcp6
/ udp6
端口,则 tcp
/ udp
端口同时适用于两个 IP 地址。 应该避免在 tcp
,tcp6
或 udp
,udp6
中声明相同的端口号,但不会使记录无效。
节点记录的规范编码是 [signature, seq, k, v, ...]
的 RLP 列表。 节点记录的最大编码大小为 300 字节。 实现应拒绝大于此大小的记录。
记录签名和编码方式如下:
content = [seq, k, v, ...]
signature = sign(content)
record = [signature, seq, k, v, ...]
节点记录的文本形式是其 RLP 表示形式的 base64 编码,前缀为 enr:
。 实现应使用 [URL 安全的 base64 字母表] 并省略填充字符。
本规范定义了一个单一的身份方案,在其他方案通过进一步的 EIP 定义之前,将其用作默认方案。“v4”方案与节点发现 v4 使用的密码系统向后兼容。
要使用此方案对记录 content
进行签名,请将 keccak256 哈希函数(由 EVM 使用)应用于 content
,然后创建哈希的签名。 生成的 64 字节签名编码为 r
和 s
签名值的串联(省略恢复 ID v
)。
要验证记录,请检查签名是否由记录的 "secp256k1" 键/值对中的公钥生成。
要导出节点地址,请获取未压缩公钥的 keccak256 哈希,即 keccak256(x || y)
。 请注意,x
和 y
必须用零填充到长度 32。
该格式旨在通过两种方式满足未来的需求:
记录的大小受到限制,因为记录经常被中继,并且可能包含在大小受限的协议(例如 DNS)中。 使用 "v4" 方案签名包含 IPv4 地址的记录时,大约占用 120 字节,为其他元数据留有足够的空间。
你可能想知道为什么需要这么多与 IP 地址和端口相关的预定义键。 出现这种需求的原因是,住宅和移动网络设置通常将 IPv4 放在 NAT 之后,而 IPv6 流量(如果支持)则直接路由到同一主机。 声明两种地址类型可确保节点可以从仅 IPv4 的位置以及支持这两种协议的位置访问。
这是一个包含 IPv4 地址 127.0.0.1
和 UDP 端口 30303
的示例记录。 节点 ID 为 a448f24c6d18e575453db13171562b71999873db5b286df957af199ec94617f7
。
enr:-IS4QHCYrYZbAKWCBRlAy5zzaDZXJBGkcnh4MHcBFZntXNFrdvJjX04jRzjzCBOonrkTfj499SZuOh8R33Ls8RRcy5wBgmlkgnY0gmlwhH8AAAGJc2VjcDI1NmsxoQPKY0yuDUmstAHYpMa2_oxVtw0RW_QAdpzBQA8yWM0xOIN1ZHCCdl8
该记录使用序列号 1
和以下私钥,使用 "v4" 身份方案进行签名:
b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291
记录的 RLP 结构是:
[
7098ad865b00a582051940cb9cf36836572411a47278783077011599ed5cd16b76f2635f4e234738f30813a89eb9137e3e3df5266e3a1f11df72ecf1145ccb9c,
01,
"id",
"v4",
"ip",
7f000001,
"secp256k1",
03ca634cae0d49acb401d8a4c6b6fe8c55b70d115bf400769cc1400f3258cd3138,
"udp",
765f,
]
- 原文链接: github.com/ethereum/devp...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!