以太坊节点记录

  • ethereum
  • 发布于 2023-04-25 11:19
  • 阅读 37

本文档定义了以太坊节点记录(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 地址。 应该避免在 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 进行签名,请将 keccak256 哈希函数(由 EVM 使用)应用于 content,然后创建哈希的签名。 生成的 64 字节签名编码为 rs 签名值的串联(省略恢复 ID v)。

  • 要验证记录,请检查签名是否由记录的 "secp256k1" 键/值对中的公钥生成。

  • 要导出节点地址,请获取未压缩公钥的 keccak256 哈希,即 keccak256(x || y)。 请注意,xy 必须用零填充到长度 32。

理由

该格式旨在通过两种方式满足未来的需求:

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

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

0 条评论

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