Mina的测试框架
目录
- 介绍
- 我们在测试什么
- 1. 网络连接和节点管理
- 网络连接
- 单节点
- 节点发现测试
- Rust接受OCaml的入站连接
- OCaml连接到广告的Rust节点
- 通过OCaml种子节点发现Rust和OCaml节点
- OCaml节点发现测试
- OCaml到Rust
- Rust到OCaml
- 通过种子节点从Rust到OCaml
- Rust作为种子节点
- 测试条件
- 多节点
- 自适应节点管理
- 2. 网络抗性
- 抗DDoS攻击
- 抗Eclipse攻击
- 抗Sybil攻击
- 抗审查
- 3. 节点引导和数据可用性
- 节点引导
- 数据可用性
- 4. 账本一致性和传播
- 账本一致视图
- 区块传播
- 交易/零知识证明传播
- 5. 区块链进展和公平性
- 链进展
- 交易处理的公平性
- 6. 可扩展性和可升级性
- 网络可扩展性
- 可升级性
- 7. 如何运行测试
介绍
处理重要信息的复杂系统,如区块链网络,必须经过彻底和持续的测试,以确保最高程度的安全性、稳定性和性能。
为此,我们需要开发一个能够部署各种测试的综合测试框架。
这样的框架在评估区块链对各种恶意攻击的抵抗力方面起着关键作用。通过模拟这些攻击场景和漏洞,该框架有助于识别区块链安全措施中的弱点,使开发人员能够加强系统的防御。这种主动的方法对于维护区块链生态系统内的信任和完整性至关重要,因为它最大限度地减少了漏洞的风险,并增强了用户和利益相关者的信心。
其次,一个强大的测试框架对于评估区块链的可扩展性、速度和稳定性同样重要。随着区块链网络的规模和采用率的增长,它们必须在保持高性能和稳定性的同时,能够处理越来越多的交易和用户。可扩展性测试确保系统能够在不降低速度或可靠性的情况下处理更大的工作负载,有助于避免可能阻碍交易和整体网络性能的瓶颈和拥堵。
此外,稳定性测试评估区块链在各种条件下(即使在协议升级期间)的一致运行能力。我们希望在潜在问题或崩溃有机会在主网上发生之前识别它们。
我们在测试什么
以下是测试类别的有限概述。目前的测试主要集中在网络和P2P层,下一步将是共识、账本和其他部分。
我们需要假设系统中超过三分之一的节点可能是拜占庭节点。
1. 网络连接和节点管理
网络连接
断开连接的节点应最终能够重新连接并与网络同步。
此测试评估区块链节点保持一致网络连接的能力。它评估节点是否能够优雅地处理与网络的临时断开连接,并随后重新建立连接。
我们希望确保新节点能够加入网络并处理被连接或数据请求淹没的情况,包括各种弹性和稳定性条件(例如,处理重新连接、延迟、间歇性连接和动态IP处理)。
这对于确保没有节点被永久隔离并且始终可以参与区块链的共识过程至关重要。
我们正在测试两个版本的节点:
单节点
我们希望测试Rust节点是否与OCaml节点兼容。我们通过尝试将Openmina节点连接到现有的OCaml测试网来实现这一点。
为此,我们使用了一个单节点,这是一个连接到OCaml节点网络的单个Open Mina节点。目前,我们使用的是公共测试网,但以后我们希望使用我们自己集群上的OCaml节点网络。
此测试通过启动一个Openmina节点并将其连接到公共(或私有)OCaml测试网的种子节点来执行。
此测试的源代码可以在此仓库中找到:
https://github.com/openmina/openmina/blob/develop/node/testing/src/scenarios/solo_node/basic_connectivity_initial_joining.rs
我们正在测试以下场景:
节点发现测试
Rust节点接受OCaml的入站连接
Openmina(Rust)节点是否可以接受来自本地Mina(OCaml)节点的入站连接。此测试将证明我们的Rust节点正在监听入站连接并可以接受它们。
测试
- p2p_basic_incoming(accept_connection)
- p2p_basic_incoming(accept_multiple_connections)
- solo_node_accept_incoming
OCaml连接到广告的Rust节点
OCaml节点是否可以发现并连接到一个广告的Rust节点。这是通过广告Rust节点,使OCaml节点可以发现它并连接到该节点来完成的。
在此测试中,我们不会明确告知OCaml节点连接到它,它应该自动找到并通过对等发现(通过Kademlia执行)连接到节点。此测试将确保Rust节点以与OCaml节点兼容的方式使用Kademlia。
测试
- solo_node_accept_incoming
通过OCaml种子节点发现Rust和OCaml节点
此测试的主要目标是确保Rust节点可以在网络中发现对等节点,并且也可以被其他对等节点发现。
- 在此测试中,启动三个节点:
- 具有已知地址和对等ID的OCaml种子节点
- 设置种子节点为初始对等节点的OCaml节点
- 设置种子节点为初始对等节点的Rust节点
最初,OCaml种子节点在其对等列表中有其他两个节点,而OCaml节点和Rust节点只有种子节点。
- 两个(OCaml和Rust)非种子节点连接到OCaml种子节点
- 一旦连接,它们从种子节点获取彼此的信息。
然后它们之间建立连接。如果测试成功,那么在此过程结束时,每个节点在其对等列表中都有彼此。
实现细节
用于部署网络的Helm图表还包含执行检查的脚本。
OCaml节点发现测试
我们必须确保Rust节点可以利用Kademlia协议(KAD)发现并连接到OCaml节点,反之亦然。
为此,我们开发了一系列基本测试,以检查当Rust节点连接到OCaml对等节点时,通过KAD进行的正确对等发现。
OCaml到Rust
此测试确保在OCaml节点连接到Rust节点后,其地址变为Rust节点Kademlia状态的一部分。它还检查OCaml节点是否具有正确的peer_id
和对应于Rust节点的端口的对等节点。
步骤
- 配置并启动Rust节点
- 启动一个OCaml节点,并将Rust节点作为唯一对等节点
- 运行Rust节点,直到它收到一个事件,表明OCaml节点已连接
- 等待一个用于识别远程对等节点地址和端口的Identify事件
- 检查Rust节点在其Kademlia状态部分中是否有OCaml节点的地址
Rust到OCaml
此测试确保在Rust节点连接到具有已知地址的OCaml节点后,它将其地址添加到其Kademlia状态中。它还检查OCaml节点是否具有正确的peer_id
和对应于Rust节点的端口的对等节点。
步骤
- 启动一个OCaml节点,并等待其p2p准备就绪
- 启动一个Rust节点,并启动其与OCaml节点的连接
- 运行Rust节点,直到它收到一个事件,表明连接已建立
- 运行Rust节点,直到它收到一个Kademlia事件,表明OCaml节点的地址已添加
- 检查Rust节点在其Kademlia状态部分中是否有OCaml节点的地址
通过种子节点从OCaml到Rust
此测试确保OCaml节点可以连接到Rust节点,其地址只能从OCaml种子节点发现,并且其地址变为Rust节点Kademlia状态的一部分。它还检查OCaml节点是否具有正确的peer_id
和对应于Rust节点的端口的对等节点。
步骤
- 启动一个作为种子节点的OCaml节点,并等待其P2P准备就绪
- 启动一个Rust节点,并启动其与种子节点的连接
- 运行Rust节点,直到它收到一个事件,表明连接已建立
- 启动一个OCaml节点,并将种子节点作为其对等节点
- 运行Rust节点,直到它收到一个事件,表明与OCaml节点的连接已建立
- 检查Rust节点在其Kademlia状态部分中是否有OCaml节点的地址
通过种子节点从Rust到OCaml
此测试确保Rust节点可以连接到OCaml对等节点,其地址只能从OCaml种子节点发现,并且Rust节点将其地址添加到其Kademlia状态中。它还检查OCaml节点是否具有正确的peer_id
和对应于Rust节点的端口的对等节点。
步骤
- 启动一个作为种子节点的OCaml节点
- 启动一个OCaml节点,并将种子节点作为其对等节点,并等待其p2p准备就绪
- 启动一个Rust节点,并启动其与种子节点的连接
- 运行Rust节点,直到它收到一个事件,表明与种子节点的连接已建立
- 运行Rust节点,直到它收到一个事件,表明与非种子OCaml节点的连接已建立
- 检查Rust节点在其Kademlia状态部分中是否有OCaml节点的地址
Rust作为种子节点
此测试确保Rust节点可以作为种子节点运行,通过运行两个仅知道Rust节点地址的OCaml节点。在这些节点连接到Rust节点后,测试确保它们也有彼此的地址作为对等节点。
步骤
- 启动一个Rust节点
- 启动两个OCaml节点,指定Rust节点地址作为其对等节点
- 等待事件,表明与两个OCaml节点的连接已建立
- 检查两个OCaml节点是否有彼此的地址作为对等节点
- 检查Rust节点在其Kademlia状态中是否有两个OCaml节点的地址
测试条件
我们运行这些测试,直到:
- 已知对等节点的数量大于或等于最大对等节点数量。
- 连接的对等节点数量大于或等于某个阈值。
- 如果指定的步骤数量发生但条件未满足,则测试失败。
多节点
我们还希望测试一个仅由Openmina节点组成的网络场景。如果Openmina节点使用的功能仅在OCaml节点中实现,并且它未正确执行,那么我们将无法通过单节点测试看到它。
为此,我们使用多节点测试,该测试涉及我们的节点网络,没有任何第三方,因此测试完全是本地的并且在我们的控制之下。
Rust连接到所有初始可用节点
此测试检查Rust节点是否连接到其初始对等列表中的所有对等节点。
测试
- multi_node_initial_joining(部分?)
Rust节点连接到广告的Rust节点
此测试检查Rust节点是否连接到广告的Rust节点。在此测试中,我们不会明确告知OCaml节点连接到它,它应该自动找到并通过对等发现(通过Kademlia执行)连接到节点。
测试
- multi_node_connection_discovery/OCamlToRustViaSeed
此测试的源代码可以在此仓库中找到:
https://github.com/openmina/openmina/blob/develop/node/testing/src/scenarios/multi_node/basic_connectivity_initial_joining.rs#L9
自适应节点管理
节点应能够发现并连接到新的对等节点,如果其当前的对等节点变得无响应或恶意。
此测试评估区块链节点适应变化的网络条件的能力。它检查节点是否可以自主识别无响应或恶意的对等节点并将其替换为可信的对等节点。自适应节点管理增强了网络对潜在攻击或不可靠参与者的弹性。
2. 网络抗性
抗DDoS攻击
即使在特定节点或基础设施上受到有针对性的拒绝服务攻击,网络也应保持运行。
此测试重点评估节点抵御分布式拒绝服务(DDoS)攻击的能力,这些攻击可能会压倒节点的资源并使其无法访问。它评估节点在遭受故意和持续攻击时是否能够继续运行并为网络服务,以及在保持运行的情况下可以承受多少攻击。
抗Eclipse攻击
诚实节点不应被恶意节点隔离,以至于它们只能从这些恶意实体接收信息。
此测试检查区块链节点抵御Eclipse攻击的能力,在这种攻击中,恶意节点包围并隔离诚实节点,限制其获取准确信息的能力。它确保诚实节点始终可以访问多样化的对等节点,不会被恶意行为者主导。
抗Sybil攻击
即使对手创建大量假名身份,网络也应正常运行。诚实节点仍应能够连接到其他诚实节点。
此测试评估网络减轻Sybil攻击的能力,在这种攻击中,对手创建大量假身份以控制网络的很大一部分。它验证网络在存在这些假名攻击者的情况下能否保持完整性并继续有效运行。
抗审查
网络应抵御任何子集节点持续审查或阻止某些交易或区块的尝试。
此测试评估节点抵御子集节点审查尝试的能力。它验证网络的设计是否防止任何小团体审查特定交易或区块,维护区块链的开放性和去中心化。
3. 节点引导和数据可用性
节点引导
新加入网络的节点应最终发现并连接到诚实的对等节点,并同步最新的区块链状态。
此测试评估节点成功引导到网络的能力。它确保新加入的节点可以找到可信的对等节点,启动同步,并赶上区块链的当前状态,增强网络的可扩展性。
此测试的重点是确保最新的Openmina构建能够对Berkeleynet进行引导。它每天执行一次。
节点的HTTP端口可访问为http://1.k8.openmina.com:31001。
这些是主要步骤和检查。
首先,它对先前部署的实例执行一些检查:
- 节点处于同步状态
- 节点的最佳提示是Berkeleynet的提示
然后它部署新的Openmina实例,并等待其引导完成(超时时间为10分钟)。之后,它执行以下检查:
- 节点的最佳提示是Berkeleynet的提示
- openmina容器没有重启
有关详细信息,请参阅Openmina Daily工作流文件。
数据可用性
区块链中的任何数据(如区块或交易)应对任何请求它的节点可用。
此测试确认区块链节点能够始终如一地向网络中的其他节点提供请求的数据。它保证数据可用性得到维护,促进区块链历史的透明性和信任。
4. 账本一致性和传播
账本一致视图
网络中的所有诚实节点最终应对账本有一致的视图,达成对区块顺序和内容的共识。
此测试确保所有诚实节点在账本视图上达成一致。它验证节点是否在区块顺序和内容上达成共识,防止分叉并确保区块链的单一、一致版本。
区块传播
每个新挖掘或创建的区块最终应被网络中的每个诚实节点接收。
此测试检查区块链节点在网络中传播新创建区块的效率。它验证没有节点被排除在接收关键区块更新之外,维护区块链的完整性。
交易/零知识证明传播
用户广播的每笔交易/零知识证明最终应被网络中的矿工或验证者接收和处理。
此测试检查节点及时向网络传播用户生成的交易和零知识证明的能力。它确保这些交易被矿工或验证者可靠地处理,促进高效的交易处理。
5. 区块链进展和公平性
链进展
新区块应定期添加到区块链中,确保系统继续处理交易。
此测试评估区块链节点是否能够定期向链中添加新区块。它保证区块链保持运行并能够容纳持续涌入的交易。
交易处理的公平性
网络不应永久忽略或降低某些交易的优先级。诚实交易最终应得到处理。
此测试评估节点在处理交易方面的公平性。我们希望确保没有有效交易被不公正地忽略或延迟,维护公平和高效的交易处理系统。
6. 可扩展性和可升级性
网络可扩展性
随着参与者数量或交易速率的增加,网络仍应保持其活性属性。
此测试检查区块链网络在不影响其活性属性的情况下处理增加的流量和参与的能力,确保其在扩展时保持强大和响应。
可升级性
网络应能够在不停止或分裂的情况下升级或更改协议,确保连续运行。
此测试确保区块链网络能够无缝地进行协议升级或更改,而不会导致中断或分裂网络。它支持网络的适应性和长期性。
这些扩展描述提供了评估区块链节点功能和安全性的关键测试的全面理解。每个测试都为区块链网络的整体稳健性和可靠性做出了贡献。
7. 如何运行测试
cargo test --release --features scenario-generators
版权声明
本文仅代表作者观点,不代表区块链技术网立场。
本文系作者授权本站发表,未经许可,不得转载。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。