Assertoor:以太坊测试网测试工具

本文介绍了Assertoor,一个用于在以太坊网络上进行测试的工具,通过评估特定条件来确定测试是否成功。它能够执行各种任务,例如验证客户端是否正常运行、处理存款和退出交易等。Assertoor还能够与Kurtosis集成,以简化测试网的部署和配置,并提供了用户界面和API集成,方便用户进行实时测试管理和监控。

Assertoor: Ethereum 测试网测试工具

Assertoor 介绍

Assertoor 是一款多功能的工具,旨在通过评估特定条件来确定其成功与否,从而促进以太坊网络上的测试。Assertoor 从其主要功能(断言条件)中得名,简化了从日常检查(例如,所有客户端是否都在提议区块以及整体网络健康状况)到更复杂的流程(例如,存款、退出和类似交易的处理)的所有事情。

对于那些熟悉协议测试的人来说,可以将 Assertoor 视为一个端到端、跨客户端的集成测试工具,它在比 Hive 更高的抽象级别上运行。

Assertoor 擅长作为测试编排器,利用 YAML 文件来管理一系列测试。每个测试都包含按特定顺序执行的一系列任务。Assertoor 不仅编排这些测试,还提供系统内置的基础任务,如 “generate_deposit”。用户可以自定义测试剧本以执行特定操作或验证特定条件,从而增强 Assertoor 在各种测试场景中的灵活性和适用性。

Assertoor 的关键组件

Assertoor 将监控和任务编排的功能结合到一个工具中,巧妙地用 Go 编写。让我们来看看 Assertoor 提供的关键组件:

网络连接和监控

Assertoor 通过其公共 HTTP RPC API 建立与多个共识和执行客户端的连接,无需客户端团队进行额外的集成工作。这种方法确保 Assertoor 保持对网络状态的强大而全面的视图。它被设计为具有弹性,可以通过切换到另一个客户端来获取所需的信息,从而适应单个客户端故障或不支持的 RPC 端点。

任务执行和测试剧本

Assertoor 擅长按照预定义的顺序执行各种任务,这些任务在测试剧本中指定。这些剧本可以编排并行和顺序步骤,结合依赖关系,很像 GitHub 工作流程,但专门为以太坊网络交互量身定制。该工具的功能范围从简单的 shell 脚本到执行各种网络交互和检查的复杂内置逻辑。有关所有可用任务及其用法的完整列表,请访问 Assertoor 项目 Wiki

灵活的测试定义

测试通过 YAML 文件定义和执行,允许用户在测试配置中指定任务或从外部 URL 侧加载它们。这种灵活性有助于组织测试管理,并在我们的测试剧本存储库 Assertoor 测试剧本 中得到说明。

用户界面和 API 集成

Assertoor 还提供了一个用户友好的界面,用于实时测试管理(启动/取消)和监控。该界面显示详细的测试状态,并为测试剧本中定义的所有任务提供日志和配置,类似于 GitHub 工作流程运行详细信息 UI。

此外,Assertoor 还通过 API 提供编程访问,以触发测试、获取测试结果和日志,使其成为与其他系统和 CI 管道集成的理想选择。

利用 Assertoor

Assertoor 被设计为一个独立的工具,可以无缝连接到外部管理的节点,以在以太坊测试网上执行测试。一个关键应用是定期在公共测试网上运行指定的测试,以确保一致的网络行为和稳定性。

例如。其中一项测试旨在彻底验证 holesky 上的整个验证器生命周期。这包括涉及存款、BLS 密钥更改、退出、提款和削减等复杂场景。该测试执行 10 次存款,并评估各种场景,如重复存款、激活或退出之前和之后的 BLS 密钥更改,以及处理削减和退出。这种全面的测试对于确保验证器生命周期的所有方面在不同条件下都能正常运行至关重要。对于那些对这种测试方法的细节感兴趣的人,可以在我们的 GitHub 存储库 验证器生命周期测试 中找到测试剧本。

与 Kurtosis 集成

为了增强灵活性并减少对大量手动配置的需求,Assertoor 集成到我们的 Ethereum Kurtosis 包 中。Kurtosis 以及 Ethereum Kurtosis 包,提供了一个强大且极其灵活的环境,用于快速启动短暂的原生以太坊网络。这些网络包含各种类型的多个以太坊客户端,并包括一些额外的工具,例如浏览器,最重要的是 Assertoor。

在 Kurtosis 环境中,Assertoor 受益于自动配置。该软件包处理大多数设置要求,包括提供所有客户端 RPC URL、验证器名称范围和一个预先注资的钱包。这种集成允许开发人员主要关注定义 Assertoor 应执行的测试剧本。

示例配置和执行

以下是 Kurtosis 参数文件 (yaml) 的一个示例,该文件配置了一个包含两对客户端的简单测试网,并将 Assertoor 设置为运行两个特定的测试剧本:

participants:
  - el_type: geth
    cl_type: lighthouse
    count: 1
  - el_type: geth
    cl_type: lodestar
    count: 1
additional_services:
  - assertoor
  - dora
assertoor_params:
  run_stability_check: false
  run_block_proposal_check: false
  tests:
    - https://raw.githubusercontent.com/ethpandaops/assertoor-test/master/assertoor-tests/block-proposal-check.yaml
    - https://raw.githubusercontent.com/ethpandaops/assertoor-test/master/assertoor-tests/all-opcodes-test.yaml

要启动测试网,请使用以下命令:

kurtosis run --enclave my-testnet github.com/kurtosis-tech/ethereum-package --args-file ./args.yaml --image-download always

一旦 Kurtosis 完成了测试网的设置,它会提供一个已启动服务的简洁摘要,包括指向 Assertoor Web UI & API 的链接:

================================= User Services =================================
UUID           Name        Ports                                         Status
f3a69b405cdb   assertoor   http: 8080/tcp -> http://127.0.0.1:32839      RUNNING

提供的 URL 可用于访问 Web UI 和 API,用户可以在其中监控实时测试进度,并根据需要启动或取消其他测试。

了解 Assertoor 中的测试剧本

Assertoor 利用以 YAML 格式编写的测试剧本在以太坊网络上运行一系列测试。这些剧本对于编排测试过程至关重要,在定义测试场景时既提供了灵活性又提供了精确性。

我们在 GitHub 存储库 中有大量这些测试剧本,可以用作示例和参考点,以便开始编写你自己的测试剧本。

让我们看看这些剧本是如何构建的以及它们是如何工作的:

测试剧本的结构

测试剧本以标头开头,标头提供有关测试的一般信息,例如其 ID、名称和任何相关的配置值。以下是一个典型的剧本标头的样子,包括配置选项:

id: block-proposal-check
name: "每个客户端对都提出了一个区块"
timeout: 20m
config:
  validatorPairNames: []

标头为测试设置了基本参数,例如其超时时间和默认配置设置。这些值可以在测试调用时被覆盖,可以通过 API 手动覆盖,也可以通过 Assertoor 配置中的全局配置覆盖。

在提供的示例中,使用了 validatorPairNames 设置,当在 Kurtosis 中作为以太坊包的一部分运行时,会自动填充所有具有验证器密钥的客户端对的名称。Kurtosis 提供的其他值包括 clientPairNames,它列出了所有客户端对名称(无论是否有验证器密钥),以及 walletPrivkey,它是预先注资的钱包的私钥。

在剧本中定义任务

在标头之后,剧本指定了一系列任务。每个任务对应于 Assertoor 中的一个内置函数,旨在执行特定的操作或检查:

tasks:
- name: check_clients_are_healthy
  title: "检查是否至少有一个客户端已准备就绪"
  timeout: 5m
  config:
    minClientCount: 1

- name: run_task_matrix
  title: "检查所有客户端对的区块提案"
  configVars:
    matrixValues: "validatorPairNames"
  config:
    runConcurrent: true
    matrixVar: "validatorPairName"
    task:
      name: check_consensus_block_proposals
      title: "等待来自 ${validatorPairName} 的区块提案"
      configVars:
        validatorNamePattern: "validatorPairName"

每个任务都使用名称、清晰的标题和任何必要的配置(例如,超时或要检查的特定条件)进行明确定义。Assertoor 目前支持 28 个不同的任务,并且可以根据需要添加更多任务。可在 Assertoor Wiki 上找到可用任务的详细列表。

嵌套任务和执行流程

剧本可以在彼此之间嵌套任务,以更精细地控制执行流程。这种嵌套允许以各种执行流程组织任务,例如在后台、并发或作为任务矩阵运行任务。

在提供的示例中,run_task_matrix 任务用于并行多次执行子任务 check_consensus_block_proposals,每个实例都由唯一的验证器对名称触发。这种方法可以同时监控来自不同验证器的区块提案,从而提高测试的效率和范围。run_task_matrix 充当父任务,协调并等待所有子任务完成,然后再继续,从而确保彻底且并发地执行所有必要的检查。

这种结构不仅使剧本具有高度适应性,而且确保全面测试复杂的网络行为,从而为网络测试提供可靠且可扩展的解决方案。

探索高级剧本

虽然上面的示例提供了剧本功能的基本概述,但为了更深入地了解更复杂的场景,我们鼓励你探索我们的测试剧本存储库中提供的高级剧本。可以从此处访问这些剧本:Assertoor 测试剧本

一些值得注意的剧本包括:

  • EOA 交易测试: 此剧本检查是否可以通过每个连接的客户端发送交易,以及它们是否可以被每个验证器包含。这对于验证不同客户端和验证器之间的交易处理的稳健性至关重要。

  • 验证器提款测试: 此测试验证验证器是否可以更改其提款凭据。它确保每个验证器都可以使用 BLS 更改来提出区块,并且这些 BLS 更改可以通过每个客户端发送。此外,它还会检查所有客户端是否都可以提出带有提款的区块,这是验证器生命周期管理的重要方面。

  • 验证器削减测试: 此剧本测试网络是否可以处理各种类型的削减。它确认每个验证器都可以提出包含这些削减的区块,并且可以通过每个客户端提交削减,从而确保网络能够正确处理惩罚。

这些高级剧本提供了一个全面的测试框架,用于评估以太坊网络中的不同功能和场景,从而确保彻底的验证和性能评估。

将 Assertoor 和 Kurtosis 集成到构建管道中

为了进一步简化 Assertoor、Kurtosis 和 Kurtosis Ethereum 包在构建管道中的使用,我们将所有必要的设置和监控步骤封装到两个可重用的 GitHub Actions 中。这些操作旨在简化部署和测试过程,使其对于持续集成工作流程更易于访问和高效。

Assertoor GitHub Action

我们提供的第一个操作是 assertoor-github-action。此操作用于持续轮询正在运行的 Assertoor 实例中的测试执行状态。它定期查询 API 并等待所有测试成功完成。该操作还提供有关测试状态和有关任何失败测试的详细输出,工作流程中的后续步骤可以使用这些输出进行进一步处理或通知。

Kurtosis Assertoor GitHub Action

我们提供的第二个操作是 kurtosis-assertoor-github-action。此综合操作处理整个过程,包括设置 Kurtosis、启动测试网和监控 Assertoor 状态。它旨在易于使用,但保留了高度的灵活性,支持各种后端,并且可以自定义以满足特定的测试需求。

示例工作流程

使用以下 GitHub Actions 工作流程可以轻松设置一个包含多个客户端对的全面以太坊测试网并执行 Assertoor 测试:

on:
  workflow_dispatch:

name: run-assertoor-test
jobs:
  assertoor:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout Repository
        uses: actions/checkout@v4
      - name: Kurtosis Assertoor GitHub Action
        uses: ethpandaops/kurtosis-assertoor-github-action@v1
        with:
          ethereum_package_args: ./kurtosis-args.yaml

此示例演示了如何将 Kurtosis Assertoor GitHub Action 集成到典型的 CI/CD 管道中,从而简化了开发人员部署和测试以太坊网络的过程。唯一需要添加的是 kurtosis-args.yaml 文件,如前几节所述。

结论

自 2023 年 11 月成立以来,Assertoor 已迅速证明自己是以太坊测试领域中不可或缺的工具。尽管它处于相对较新的状态,但它已经通过检测各种客户端实现中的许多问题产生了重大影响。在我们最近关注验证器客户端和信标节点之间的兼容性测试中,这种效率尤为明显。Assertoor 极大地简化了测试多个客户端组合的过程,否则这将是一项艰巨而耗时的任务。

通过将 Assertoor 与我们的可重用 GitHub Actions 结合使用,测试所有可能的客户端对组合变得像启动单个工作流程运行一样简单。你可以在我们 最近的工作流程执行 中看到此过程的实际效果及其结果,包括来自不兼容客户端对的预期错误。作业日志和 Assertoor 的摘要清楚地表明了哪些客户端对当前面临兼容性问题。

实际用例

  • 使用最新客户端版本安排的测试: Assertoor 用于 Assertoor 测试存储库 中安排的测试。工作流程每天运行,使用所有可能的执行层和共识层客户端组合的最新版本镜像启动各种测试网。Assertoor 测试这些网络的基本功能,包括信标链交互(BLS 更改、退出、提款、削减)和执行链交互(操作码和预编译测试)。这些测试已经发现了客户端版本中的关键错误,突出了该工具的价值。

  • 在公共以太坊测试网上安排的测试: Assertoor 用于独立实例中,用于对公共以太坊测试网进行安排和重复测试。例如,我们有一个专用于 Holesky 测试网的设置,大约每两周运行一次完整的验证器生命周期测试。此用例突出了 Assertoor 执行深入网络功能检查的能力,从而为网络稳定性和可靠性做出重大贡献。

  • 在 CI 管道中使用: Assertoor 与 Kurtosis 结合使用,已集成到一些以太坊客户端开发团队的 CI 管道中。此设置允许启动涉及各种客户端对的测试网,以便在发布之前彻底测试版本,从而确保兼容性和稳定性。 例如。rETH 工作流程集成 / Kurtosis Ethereum 包集成

随着以太坊生态系统的不断发展,像 Assertoor 这样的工具对于确保网络保持强大和安全至关重要。我们期待进一步增强其功能并扩展其用例,以满足区块链技术不断增长的需求。

  • 原文链接: ethpandaops.io/posts/ass...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
EthPandaOps
EthPandaOps
https://ethpandaops.io