diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md index 5c195c239c..2f58a16939 100644 --- a/ARCHITECTURE.md +++ b/ARCHITECTURE.md @@ -760,11 +760,56 @@ func (s *SGXConsensus) VerifyNetworkConsistency(peer *Peer) error { ### 6.1 节点连接准入控制 -节点是否接受其他节点的连接和数据同步,取决于命令行配置的参数。只有满足以下条件的节点才能建立连接: +准入控制是**双向的**,同时控制入站和出站连接: + +1. **被动准入(入站控制)**:控制允许谁连接到我 - 验证入站连接的度量值 +2. **主动准入(出站控制)**:控制我只主动连接谁 - 验证出站连接的度量值 + +只有满足以下条件的节点才能建立连接: 1. **度量值匹配**:对方节点的 MRENCLAVE/MRSIGNER 必须在允许列表中 2. **Chain ID 匹配**:对方节点的 Chain ID 必须与本节点一致 +**双向准入控制示意图:** + +``` ++------------------+ +------------------+ +| 节点 A | | 节点 B | +| 白名单: [B, C] | | 白名单: [A, C] | ++------------------+ +------------------+ + | | + | 主动连接 (出站) | + | A 验证 B 的度量值是否在 A 的白名单 | + |-------------------------------------->| + | | + | 被动接受 (入站) | + | B 验证 A 的度量值是否在 B 的白名单 + | | + | 双向验证通过,连接建立 | + |<------------------------------------->| + | | + +场景 1: A 主动连接 B + - A 检查 B 的 MRENCLAVE 是否在 A 的白名单中 (主动准入) + - B 检查 A 的 MRENCLAVE 是否在 B 的白名单中 (被动准入) + - 两者都通过才能建立连接 + +场景 2: 恶意节点 X 尝试连接 A + - X 的 MRENCLAVE 不在 A 的白名单中 + - A 拒绝连接 (被动准入失败) + +场景 3: A 尝试连接未知节点 Y + - Y 的 MRENCLAVE 不在 A 的白名单中 + - A 主动放弃连接 (主动准入失败) +``` + +**双向准入的安全意义:** + +| 控制方向 | 作用 | 防护场景 | +|----------|------|----------| +| 被动准入 | 防止恶意节点连接 | 阻止未授权节点接入网络 | +| 主动准入 | 防止连接到恶意节点 | 避免同步到被篡改的数据 | + #### 6.1.0 设计目的:支持硬分叉升级 准入控制的核心目的是**支持硬分叉升级**,类似于以太坊的 EIP 实现机制。当需要发布新版代码实现新特性时,通过更新 MRENCLAVE 白名单来控制网络升级。