以太坊节点记录 (ENR)

本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 地址。应避免在 tcptcp6udpudp6 中声明相同的端口号,但这不会使记录无效。

RLP 编码

节点记录的规范编码是 [signature, seq, k, v, ...] 的 RLP 列表。节点记录的最大编码大小为 300 字节。实现应拒绝大于此大小的记录。

记录签名和编码如下:

content   = [seq, k, v, ...]
signature = sign(content)
record    = [signature, seq, k, v, ...]

文本编码

节点记录的文本形式是其 RLP 表示的 base64 编码,前缀为 enr:。实现应使用 URL 安全的 base64 字母表并省略填充字符。

"v4" 身份方案

本规范定义了一个身份方案,作为默认方案使用,直到其他方案由后续 EIP 定义。 "v4" 方案与节点发现 v4 使用的加密系统向后兼容。

  • 要使用此方案签署记录 content,请对 content 应用 keccak256 哈希函数(如 EVM 所用),然后创建哈希的签名。生成的 64 字节签名编码为 rs 签名值的串联(省略恢复 ID v)。
  • 要验证记录,请检查签名是否由记录中 "secp256k1" 键/值对中的公钥生成。
  • 要派生节点地址,请获取未压缩公钥的 keccak256 哈希值。

基本原理

该格式旨在以两种方式适应未来的需求:

  • 添加新的键/值对:这始终是可能的,并且不需要实现共识。现有客户端将接受任何键/值对,无论它们是否能解释其内容。
  • 添加身份方案:这需要实现共识,因为否则网络将不接受签名。要引入新的身份方案,请提出 EIP 并使其得到实施。一旦大多数客户端接受该方案,即可使用。

记录的大小是有限制的,因为记录中继频繁,并且可能包含在大小受限的协议(如 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 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
Nerolation
Nerolation
江湖只有他的大名,没有他的介绍。