区块链/等级 III · 网络/3.1 节点/课程 2
点对点 Gossip 传播
Gossip 协议:节点如何在没有中心的情况下发现对等节点并传播数据
材料一个正在运行的 Bitcoin Core 节点可使用 'bitcoin-cli' 的终端用于记录对等节点信息的文本编辑器
好奇
- 在空网络中的新节点如何找到它的第一个对等节点?
- 在没有任何人协调的情况下,新的区块是如何在几秒钟内就传达到数千个节点的?
- 是什么阻止攻击者将某个节点与网络中的其他节点隔离开来?
探索
- 比特币是一个去中心化的点对点网络,每个全节点都独立维护自己的状态。要加入网络,新节点必须与现有对等节点建立 TCP 连接。主网使用 8333 端口进行这些连接。初始发现依赖 DNS 种子(由社区长期成员运行并列在软件中),以及硬编码的备用地址。连接建立后,节点可以通过“getaddr”请求地址,并通过“addr”消息接收这些地址,从而了解其他活跃参与者并动态扩展自己的对等节点集合。
- Bitcoin Core 采用特定的连接拓扑:8个用于传播交易和区块的出站全中继连接,外加2个仅中继区块(block-relay-only)的连接,以降低带宽占用。它总共最多允许125个入站和出站连接。这种结构保证了冗余:即使某个对等节点断开或失去响应,节点仍可通过其他节点保持连通。仅中继区块的连接不传输任何交易或地址,这使观察者更难描绘出网络的拓扑结构。
- 数据传播遵循通告机制。节点收到一笔新交易时,会用一条“inv”(inventory,清单)消息来通告它,该消息只包含哈希值而不含数据本身;如今新区块通常通过直接发送区块头或紧凑区块来通告。收到通告的对等节点发现自己缺少该对象后,会发送“getdata”请求,原持有者随后传输完整数据。这种两步流程避免了在对等节点确认需要之前就用冗余的大块数据淹没网络,从而确保整个分布式系统的带宽得到高效利用。
- 2016年推出的紧凑区块(BIP152)进一步优化了这一机制。由于区块中的大多数交易已通过内存池传播为对等节点所知,发送完整区块是一种浪费。因此,节点改为发送区块头以及区块内各笔交易的短标识符(每个6字节),并附上coinbase交易;接收方用自己的内存池重建该区块,只请求少数缺失的交易。这大大降低了区块传播的延迟,使网络即使在交易量很大时也能更快达成共识。
- 日蚀攻击揭示了对等节点多样性有多么脆弱。Heilman等人(2015年)指出,攻击者一旦接管某个节点的全部连接,就能将其与诚实网络隔离,并向它提供虚假的区块链视图。Bitcoin Core 从0.10.1版本起采纳了他们提出的防御措施,包括试探连接(feeler connection)和更谨慎的地址表淘汰机制,后来又加入了重启后仍会保留的锚定连接(anchor connection)。只通过Tor运行反而可能让节点更容易、而不是更难遭受日蚀攻击。
- 在连接到本地 Bitcoin Core 实例的终端中运行“bitcoin-cli getpeerinfo”,即可验证节点的连接状况。输出会列出每个对等节点的地址、其“connection_type”(例如 outbound-full-relay 或 block-relay-only)、软件版本以及同步进度(“synced_headers”、“synced_blocks”)。一个健康的节点大约有十个出站连接:八个全中继连接和两个仅中继区块的连接。
关键事实
- 比特币主网使用 TCP 端口 8333 进行点对点通信。
- 新节点先通过 DNS 种子和硬编码地址完成启动引导,之后再通过 Gossip 协议认识更多对等节点。
- Bitcoin Core 默认设置为:8个出站全中继连接、2个仅中继区块的连接,总连接数上限为125个。
- “inv”消息用于告知数据哈希值;“getdata”则向持有该数据的节点请求实际的数据内容。
- 紧凑区块(BIP152)允许节点从本地内存池中重新构建区块,从而减少网络传输量。
- 日蚀攻击试图控制节点的全部连接;自2015年以来,Bitcoin Core 已陆续加入多项应对措施。
练习 九、六、三、一
9收集列出比特币 P2P 启动与传播过程中的9个不同组件(例如 DNS 种子、‘inv’消息)。
6归类根据功能将这9个组件分为6类:发现、连接管理、数据发布、数据检索、优化或安全。
3提炼将这6组归纳为3项核心原则,这些原则支配着高效且安全的网络传播。
1凝结用一句话解释:为什么节点必须保持多样化的出站连接,才能抵御日蚀攻击。
事实核查
日期、数字及数据均依据下方列出的已发表资料进行核实。