本EIP定义了以太坊节点记录(ENR),这是一种灵活的开放格式,用于承载P2P连接信息。它旨在升级和取代现有的节点发现协议v4,允许更丰富的节点数据交换、加密方案多样性和协议升级,并提供了详细的记录结构、编码方式及签名机制。
本 EIP 定义了以太坊节点记录(Ethereum Node Records),这是一种用于 P2P 连接信息的开放格式。
以太坊节点通过节点发现协议相互发现。该协议的目的是中继节点身份的公钥(在 secp256k1 曲线上的)、它们的 IP 地址和两个端口号。不能中继其他信息。
本规范旨在通过定义一种灵活的格式,即节点记录,来解除发现 v4 协议的限制,用于与连接相关的信息。节点记录可以通过未来版本的节点发现协议中继。它们也可以通过任意其他机制中继,例如 DNS、ENS、devp2p 子协议等。
节点记录提高了加密的灵活性(cryptographic agility)和协议升级的处理能力。一条记录可以包含有关任意传输协议及其关联公钥材料的信息。
新格式的另一个目标是提供连接信息的权威更新(authoritative updates)。如果一个节点更改其端点并发布新记录,其他节点应该能够确定哪条记录是更新的。
节点记录的组成部分是:
signature:记录内容的加密签名seq:序列号,一个 64 位无符号整数。当记录发生更改时,节点应增加此数字并重新发布记录。记录的签名根据身份方案(identity scheme)进行生成和验证。身份方案还负责派生节点在 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,请对 content 应用 keccak256 哈希函数(如 EVM 所用),然后创建哈希的签名。生成的 64 字节签名编码为 r 和 s 签名值的串联(省略恢复 ID v)。该格式旨在以两种方式适应未来的需求:
记录的大小是有限制的,因为记录中继频繁,并且可能包含在大小受限的协议(如 DNS)中。包含 IPv4 地址的记录,当使用 "v4" 方案签名时,大约占用 120 字节,为额外的元数据留下了足够的空间。
你可能想知道为什么需要这么多与 IP 地址和端口相关的预定义键。这种需求产生的原因是,住宅和移动网络设置通常将 IPv4 置于 NAT 之后,而 IPv6 流量(如果支持)则直接路由到同一主机。声明两种地址类型可确保节点可以从仅支持 IPv4 的位置以及同时支持两种协议的位置访问。
这是一个包含 IPv4 地址 127.0.0.1 和 UDP 端口 30303 的示例记录。节点 ID 是 a448f24c6d18e575453db13171562b71999873db5b286df957af199ec94617f7。
enr:-IS4QHCYrYZbAKWCBRlAy5zzaDZXJBGkcnh4MHcBFZntXNFrdvJjX04jRzjzCBOonrkTfj499SZuOh8R33Ls8RRcy5wBgmlkgnY0gmlwhH8AAAGJc2VjcDI1NmsxoQPKY0yuDUmstAHYpMa2_oxVtw0RW_QAdpzBQA8yWM0xOIN1ZHCCdl8
该记录使用 "v4" 身份方案签名,序列号为 1,私钥如下:
b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291
该记录的 RLP 结构是:
[
7098ad865b00a582051940cb9cf36836572411a47278783077011599ed5cd16b76f2635f4e234738f30813a89eb9137e3e3df5266e3a1f11df72ecf1145ccb9c,
01,
"id",
"v4",
"ip",
7f000001,
"secp256k1",
03ca634cae0d49acb401d8a4c6b6fe8c55b70d115bf400769cc1400f3258cd3138,
"udp",
765f,
]
版权和相关权利通过 CC0 放弃。
- 原文链接: github.com/nerolation/EI...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!