5 个版本
0.1.4 | 2024年4月26日 |
---|---|
0.1.3 | 2024年2月21日 |
0.1.2 | 2024年2月15日 |
0.1.1 | 2024年2月14日 |
0.1.0 | 2024年2月9日 |
#117 在 #evm
每月 155 次下载
用于 2 crates
23KB
143 行
扩展 EVM 工具生态系统。
概览
Arbiter 是一个闪电般的以太坊沙盒,允许开发者编排事件驱动的模拟。该框架允许对(Rust)以太坊虚拟机(EVM)进行细粒度控制,以提供具有状态的以太坊智能合约交互和创建可以合并成复杂场景或自动化的行为。我们在 ethers-rs
中间件之上使用 revm,它在如 reth
以及 foundry
的 ETH 客户端中使用。这为我们提供了类似轻量级自定义以太坊节点的速度、可配置性和模块化。
Arbiter 的主要用途是探测智能合约的机制安全性。如果您对此感兴趣,请参阅 漏洞语料库。
Arbiter 工作空间有五个 crate
arbiter
:一个二进制文件,提供了一个命令行界面用于分叉和绑定合约。arbiter-core
:一个库,包含 Arbiter 框架的核心逻辑,包括之前讨论过的ArbiterMiddleware
和我们的沙盒Environment。
arbiter-engine
:一个库,提供构建模拟、代理和行为的抽象。arbiter-macros
:一个库 crate,包含用于简化 Arbiter 开发的宏。arbiter-bindings
:一个库 crate,包含用于测试和开发的实用智能合约绑定。
书籍
在这里您可以找到 Arbiter 文档。这是一个 mdbook,提供了对如何使用整个 Arbiter 框架的高级理解。
动机
仲裁器旨在允许您在状态沙盒中处理智能合约,并设计可以与合约一起使用的代理。这为您提供了许多功能。例如,智能合约工程师必须测试他们的合约以对抗各种潜在的敌对环境和参数,而不仅仅是依赖于静态无状态测试。
在去中心化金融(DeFi)中,大量复杂的去中心化应用程序可以使用上述测试。然而,隐含的金融策略也涉及许多代理和参数化。金融工程师可能希望测试他们的策略以应对数千种市场条件、合约设置、冲击以及自主或随机的AI代理,同时确保他们的方法不会被字节码级别的漏洞所利用。同样,该工程师可能还希望开发搜索代理、求解代理或其他可以在区块链上运行的自主代理。
使用仲裁器框架
要使用仲裁器,您必须在您的计算机上安装Rust。您可以通过以下说明安装Rust:这里。获取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创建自己的仲裁器项目,您可以运行以下命令
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 Crates的Cargo文档,请访问以下链接
您可以在crates.io上找到这些。
基准测试
在arbiter-core
中,我们有一个小的基准测试套件,它比较了ArbiterMiddleware
在Environment
上的实现与Anvil本地测试网链实现。我们选择构建Arbiter的主要原因是为了更好地控制EVM环境,并拥有一个更健壮的模拟框架。尽管如此,我们还想提高速度,因此我们选择在revm
上构建自己的接口,而不是使用Anvil(Anvil在底层使用revm
)。对于以下内容,Anvil被设置为为每笔交易挖矿而不是强制设置块时间。将Environment
配置为10.0的块速率。以下表格给出了ArbiterMiddleware
接口在revm
上对Anvil的初步基准测试结果。
要自行运行基准测试代码,您可以运行
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
,因此您可以将时间除以二来估计部署单个合约所需的时间。 -
查找:查找
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的Apple Macbook Pro M1 Max上实现了这些时间。
当然,Anvil 和 ArbiterMiddleware
的用例可以不同。Anvil 代表了一个带有网络和挖矿的更真实的环境。同时,ArbiterMiddleware
是一个更简单的环境,只包含运行状态模拟所需的基本要素。Anvil 还为每笔交易挖掘区块,而 ArbiterMiddleware
则不这么做。
如果您在基准测试中需要任何帮助或有改进建议,请告知我们!
测试
如果您有所贡献,请为任何新编写的代码编写测试。要运行测试,您可以执行以下命令
cargo test --all --all-features
贡献
请参阅我们的 贡献指南
依赖项
~290–740KB
~18K SLoC