本文介绍了如何利用 Kurtosis 平台上的 ethereum-package 作为基础,构建更复杂的工具和 L2 开发网络。
在我们最新的系列中,该系列以深入研究 Kurtosis(deep dive into Kurtosis)开始,我们探索了创建本地化 Ethereum 开发网络 (devnet) 的效用。 今天,我们将通过演示 ethereum-package 如何作为复杂工具以及 L2 devnet 的基础来扩展这一点。
基于 Kurtosis 的 package 方法的优势在于,package 可以在其他 package 中导入和链接。 这意味着可以创建一个新的 package,该 package 导入 ethereum-package 并期望始终以最小的维护工作启动基础层 Ethereum。 对于任何创建并非严格专注于 Ethereum 基础层,但仍依赖它进行数据或状态访问的工具的人来说,此功能将特别有用。 为了扩展此功能的使用方式,我们决定构建一个运行 L2 devnet 的示例,但基础层是 Ethereum,作为 package 导入。 对于此示例,我们将使用 Optimism 堆栈并创建 optimism-package,这仅仅是因为它重用了我们已经有定义的许多基础层组件。 但是,没有理由认为该示例不适用于任何其他依赖 Ethereum 作为基础层的 L2 或工具。
Kurtosis 采用 Starlark 来满足其脚本需求,允许你将每个文件夹视为一个模块,可以方便地将其导入到其他模块中,从而增强模块化和重用性。 让我们举一个两个模块的例子,一个定义常量(在 constants.star
中定义),另一个使用这些常量(在 main.star
中定义)。
然后,main.star
文件可以按如下方式导入 constants.star
中定义的常量:
constants = import_module("../constants/constants.star")
就像我们将一个模块中的文件导入到另一个模块中一样,我们也可以将整个 github 上的 package 导入到任何任意模块中。 看起来会像这样:
ethereum_package = import_module("github.com/ethpandaops/ethereum-package/main.star")
ethereum-package
包含一个 run
函数,需要使用启动 Ethereum devnet 的参数来调用它。 响应存储在一个名为 l1
的变量中,该变量包含 Ethereum devnet 的上下文。 然后,我们可以引用存储在此上下文中的任何变量,例如,我们可以获取 Ethereum 节点的 RPC URL,以便与底层链进行交互。 执行此操作的代码如下所示:
## 运行 Ethereum devnet 并将上下文存储在一个名为 l1 的变量中
l1 = ethereum_package.run(plan, ethereum_args)
## 读取 Ethereum devnet 中第一个参与者的 RPC URL 并将其存储在一个名为 l1_rpc 的变量中
l1_rpc = l1.all_participants[0].el_context.rpc_http_url
我们还在 ethereum-package
中包含预先注资的帐户,这些帐户可用于基础链上的交易。 可以通过调用 ethereum-package
上下文中的 pre_funded_accounts
来访问这些资金。 我们确实为特定目的保留了某些帐户,例如,第 12 个帐户保留给 L2 合约部署者。 完整的预分配列表可以在此处找到。 访问第 12 个帐户的私钥的代码如下所示:
l1_priv_key = l1.pre_funded_accounts[12].private_key # 保留给 L2 合约部署者
Ethereum RPC 以及具有资金的私钥将是构建与 Ethereum 基础层交互的任何工具的组成部分,在 optimism-package
的情况下,我们将这些值传递给 optimism 合约部署者以及稍后在此过程中启动的 op-nodes。 如何与基础 ethereum-package
交互的完整示例可以在此 main.star 文件中找到。
optimism 文档包含一个页面,其中包含创建 L2 rollup 测试网的所有要求,文档可以在此处找到。 从高层次上讲,optimism-package
部署了以下内容:
一旦我们导入了 ethereum-package
并拥有 L1 上下文,我们就将所需的变量(例如预先注资的私钥、RPC、chainID 和其他一些值)传递给 contract_deployer.star
模块。 该模块包含用于部署和配置 optimism 合约的所有逻辑。 contract_deployer
模块等待 L1 完成,以避免出现问题,然后继续使用 cast
和 forge
部署合约,并使用 op-node genesis
命令创建 L2 genesis 文件。
然后,L2 链 genesis 文件在 contract_deployer
上下文中可用,可以通过 op_genesis.files_artifacts[0]
访问,供节点使用。 然后,该 package 继续启动 L2 网络参与者,此逻辑封装在模块 participant_network.star
中。 该模块启动 L2 网络中的所有参与者,包括 sequencer、batcher、proposer 和 op-nodes。 如果 L2 网络上已经设置了节点,则该模块会将新节点连接到现有节点。
一旦设置了节点、batcher 和 proposer,optimism-package
将转向设置工具。 目前,此工具仅包括 op-blockscout
,但可以扩展为包括任何其他所需的工具。 op-blockscout
是原始 blockscout 的一个分支,配置为与 L2 网络一起使用。 op-blockscout
是模块方法的可扩展性的另一个示例,它引用 ethereum-package
中的 L1 RPC 以及 optimism-package
中的 L2 RPC,以为开发人员提供无缝体验。
optimism-package
执行的结果是一个功能齐全的 L2 devnet,以及访问它们的服务和 URL 列表。
由于 optimism-package
旨在完全包含 ethereum-package,因此其配置文件无缝集成了 ethereum-package
中的所有参数以及其自身独特的设置。 为了区别于使用原始 ethereum-package
,在配置文件中引入了一个名为 optimism_package
的新字段。 此字段将包含特定于 L2 devnet 的所有新配置参数。
optimism_package: # specific to the optimism package 的参数
participants:
- el_type: op-geth
cl_type: op-node
additional_services:
- blockscout
ethereum_package: # 从 ethereum package 继承
participants:
- el_type: geth
- el_type: reth
network_params:
preset: minimal
additional_services:
- dora
- blockscout
当前创建任何 L2 devnet/工具的方法是使用现有的 L1 测试网并在其上部署 L2 package/工具,或者使用自定义 bash 脚本执行本地测试。 这是一个繁琐的过程,并且仍然需要大量的维护工作才能确保 L1 通过升级按预期工作。 Kurtosis 方法允许你在几分钟内创建一个本地 L1 devnet,维护工作相对较少,并允许你将更多时间花在 L2 devnet/工具上 - 从而实现更快、更安全的原型设计。 Kurtosis 还适用于enclaves的概念,这些 enclaves 彼此完全隔离 - 允许并行运行多个测试,而不会产生干扰或网络问题。
使用 Kurtosis 的主要缺点是 devnet 的本地性质。 这意味着向其他开发人员提供 devnet 访问权限并不像使用公共测试网那么容易,这是当前 kurtosis 工作方式中的一个根本瓶颈。 此外,Kurtosis 中缺少默认的持久存储意味着当你停止 devnet 时,你将丢失所有数据(除非提前保存)。 这对于测试目的来说不是问题,但这是需要记住的事情。
为了充分理解将 Kurtosis 与 ethereum-package
结合使用的强大功能和灵活性,我们鼓励你启动自己的项目,将其重复用于工具或定义自己的 L2。 探索详细的文档,尝试配置,并加入 discord 分享你的经验!
- 原文链接: ethpandaops.io/posts/kur...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!