8个不稳定版本 (3个破坏性更新)
0.4.0 | 2024年4月26日 |
---|---|
0.3.2 | 2024年2月26日 |
0.2.1 | 2024年2月15日 |
0.1.1 | 2024年2月12日 |
#43 in #evm
每月230次下载
在 arbiter 中使用
50KB
528 代码行
扩展EVM工具生态系统。
概述
Arbiter 是一个快速的以太坊沙盒,让开发者可以编排事件驱动的模拟。该框架允许对(Rust)以太坊虚拟机(EVM)进行细粒度控制,以提供状态化的以太坊智能合约交互和创建可以合并为复杂场景或自动化的行为。我们使用ethers-rs
中间件在revm之上,后者在reth
和foundry
等ETH客户端中使用。这为我们提供了轻量级自定义以太坊节点的速度、可配置性和模块化。
Arbiter 的主要用途是探测智能合约的机制安全性。如果您对此感兴趣,请参阅漏洞库。
Arbiter 工作区有五个 crate
arbiter
:暴露命令行界面的二进制文件,用于分叉和绑定合约。arbiter-core
:包含Arbiter框架核心逻辑的库,包括前面讨论过的ArbiterMiddleware
和我们的沙盒Environment。
arbiter-engine
:提供构建模拟、代理和行为的抽象的库。arbiter-macros
:包含用于简化Arbiter开发的宏的库crate。arbiter-bindings
:包含用于测试和开发的实用智能合约绑定的库crate。
书籍
在这里您可以找到Arbiter 文档。这是一本mdbook,提供了对如何使用整个Arbiter框架的高级理解。
动机
仲裁器(Arbiter)的设计旨在允许您在具有状态的沙箱中与智能合约一起工作,并设计可用于与合约配合使用的代理。这为您提供了许多功能。例如,智能合约工程师必须测试他们的合约,以应对各种潜在的敌对环境和参数,而不仅仅是依赖静态的无状态测试。
在去中心化金融(DeFi)中,大量复杂去中心化应用可以使用上述测试。然而,隐含的金融策略也包含了众多代理和参数化。金融工程师可能希望测试他们的策略,以应对数千种市场条件、合约设置、冲击以及自主或随机的AI代理,同时确保他们的方法不会受到字节码级别的漏洞攻击。同样,该工程师可能还希望开发搜索代理、求解代理或其他可在区块链上运行的自主代理。
使用仲裁器框架
要使用仲裁器,您必须在您的计算机上安装Rust。您可以通过以下链接安装Rust:[安装指南](https://www.rust-lang.net.cn/tools/install)。同时,获取cargo-generate
包也会很有帮助,您可以通过以下命令安装:
cargo install cargo-generate
示例
我们有一个示例,它将在模板中运行我们设置的配置。要运行此示例,您可以克隆存储库并更新子模块:
git clone https://github.com/primitivefinance/arbiter.git
cd arbiter
git submodule update --init --recursive
从现在开始,您现在可以尝试从克隆的根目录运行以下命令:
cargo run --example template
此命令将进入模板CLI并显示命令和标志。
要运行ModifiedCounter.sol
示例并查看一些日志,请尝试:
cargo run --example template simulate examples/template/configs/example.toml -vvv
这设置了日志级别为debug
,因此您可以查看内部发生了什么。
初始化
要从我们的模板[arbiter-template](https://github.com/primitivefinance/arbiter-template)创建自己的仲裁器项目,您可以运行以下命令:
cd <your/chosen/directory>
cargo generate https://github.com/primitivefinance/arbiter-template.git
您将被提示提供项目名称,其余设置将由系统自动完成!
二进制文件
要安装仲裁器二进制文件,请运行:
cargo install arbiter
这将安装仲裁器二进制文件到您的计算机上。然后,您可以通过运行arbiter --help
来查看仲裁器是否正确安装,并查看帮助菜单。
绑定
您可以在模板项目的contracts/
目录中加载或编写自己的智能合约,并开始编写自己的模拟。仲裁器将Rust智能合约绑定视为一等公民。合约绑定是通过Foundry的forge
命令生成的。arbiter bind
通过便利特性包装了forge
,这些特性会将所有绑定生成到src/bindings
作为Rust模块。Foundry的高级用户可以直接使用forge
。
分支
要分支EVM网络的状态,您必须首先创建一个分支配置文件。一个示例已提供在examples/fork
目录中。基本上,您提供数据存储位置、所需网络、所需区块号以及您想要分支的合约的元数据。
arbiter fork <fork_config.toml>
这将创建配置文件中指定的网络分支,并将其存储在指定的位置。然后,可以使用Fork::from_disk()
方法将其加载到arbiter-core
Environment
中。
分叉操作采用这种方式,以确保所有仿真不需要持续连接到RPC端点。您可能会发现Anvil的分叉接口更易于使用。然而,在线分叉机制会根据需要调用RPC调用以更新状态。仲裁器Environment
分叉是为了创建一个状态,将其存储在本地,并在需要时从该状态初始化模拟。我们计划将来允许arbiter-engine
与其他网络类型,如Anvil,集成!
可选参数 您可以运行arbiter fork <fork_config.toml> --overwrite
来覆盖已存在的分叉。
Cargo 文档
要查看Arbiter crate的Cargo文档,请访问以下链接
您可以在crates.io上找到这些。
基准测试
在arbiter-core
中,我们有一个小的基准测试套件,该套件将ArbiterMiddleware
实现与Anvil本地测试网链实现进行了比较。我们选择构建Arbiter的主要原因是为了获得更多对EVM环境的控制,并拥有更强大的模拟框架。然而,我们也想提高速度,所以我们选择在revm
上构建自己的接口,而不是使用Anvil(Anvil底层使用revm
)。以下基准测试中,Anvil被设置为为每个交易挖掘区块,而不是设置强制性的区块时间。《Environment》被配置为区块率为10.0。以下表格给出了在《revm》上对《ArbiterMiddleware》接口的初步基准测试结果。
要自己运行基准测试代码,可以运行
cargo bench --package arbiter-core
操作 | ArbiterMiddleware | Anvil | 相对差异 |
---|---|---|---|
部署 | 238.975µs | 7712.436µs | ~32.2729x |
查找 | 565.617µs | 17880.124µs | ~31.6117x |
无状态调用 | 1402.524µs | 10397.55µs | ~7.413456x |
有状态调用 | 2043.88µs | 154553.225µs | ~75.61756x |
以上可以描述为
-
部署:将合约部署到EVM中。在此方法中,我们部署了
ArbiterToken
和ArbiterMath
,因此您可以将时间除以2来估计部署单个合约所需的时间。 -
查找:查找
ArbiterToken
客户端地址的balanceOf
。在此方法中,我们调用了ArbiterToken
的balanceOf
函数100次。除以100以获取查找单个余额所需的时间。 -
无状态调用:调用不修改状态的合约。在此方法中,我们调用了
ArbiterMath
的cdf
函数100次。除以100以获取调用单个无状态函数所需的时间。 -
有状态调用:调用修改状态的合约。在此调用中,我们调用了
ArbiterToken
的mint
函数100次。除以100以获取调用单个有状态函数所需的时间。
基准测试代码位于 arbiter-core/benches/
目录中,这些特定时间是在1000次运行的平均值上实现的。上述结果是通过运行以下命令实现的:cargo bench --package arbiter-core
,这将自动以发布配置运行。测试是在配备8个性能核心和2个效率核心、32GB RAM的苹果Macbook Pro M1 Max上实现的。
当然,Anvil 和 ArbiterMiddleware
的使用场景可能不同。Anvil 代表了一个更真实的带有网络和挖矿的环境。同时,ArbiterMiddleware
是一个更简单的环境,只包含运行有状态模拟所需的最基本功能。Anvil 还为每笔交易挖掘区块,而 ArbiterMiddleware
则不这样做。
如果您需要关于这些基准测试的帮助或有改进建议,请告诉我们!
测试
如果您有贡献,请为任何新编写的代码编写测试。要运行测试,您可以运行以下命令
cargo test --all --all-features
贡献
查看我们的贡献指南
依赖项
~70–105MB
~2M SLoC