#foundry #broadcast #seed #tool #integration #file #echidna

bin+lib foundry2echidna

轻松将 Foundry 广播文件种子到 Echidna

3 个不稳定版本

0.2.1 2023年2月20日
0.2.0 2023年2月20日
0.1.0 2023年1月30日

#835 in 编码

AGPL-3.0

3MB
726

Foundry 2 Echidna

此工具的目的是将 Foundry 广播 JSON 文件转换为类似 Etheno 的 JSON 文件,以便无缝地将 Foundry 与 Echidna 集成。

演示

Demo GIF

安装

确保您已安装 Rust

从 crates.io 安装:cargo install foundry2echidna

从源代码安装

git clone https://github.com/ChmielewskiKamil/foundry2echidna/foundry2echidna &&
cd foundry2echidna &&
cargo install --path .

如何使用它

一旦安装了 foundry2echidna,您就可以转换广播文件了。

  1. 在您的 Foundry 项目根目录下,运行命令 foundry2echidna。默认情况下,如果没有传递任何参数,该工具将查找以下内容
  • 您的广播在 broadcast/*.s.sol/31337/run-latest.json
  • 并将输出到 src/crytic/init.json

您可以通过以下方式传递自定义输入和输出路径

foundry2echidna--输入-路径 path//广播.json--输出-路径 path//init.json

或者,简短: foundry2echidna -i path/to/broadcast.json -o path/to/init.json

  1. 使用生成的 init.json 文件为 Echidna 种子。将以下内容添加到您的 echidna_config.yaml
  • initialize: path/to/init.json(对于您的自定义输出路径)
  • initialize: src/crytic/init.json(对于未提供参数时的默认输出路径)
  1. 更新您的 EchidnaTest 合约,就像您与区块链上部署的合约进行交互一样。
  • 从 Foundry 生成的广播文件中获取适当的合约地址(run-latest.json)。
// Get address of the Counter contract from the broadcast file
counter = Counter(0x1234...);

// This works for contracts deployed by Factories and function calls as well
counterFactory = CounterFactory(0x456...);
anotherCounterDeployedByFactory = AnotherCounter(0x678...);
  1. 运行 Echidna。

将 foundry2echinda 与您的项目集成

您可以在 docs.rs 上找到开发文档.

您可以使用接受两个参数的 transform_broadcast 函数

  • input_path
  • output_path

来反序列化和序列化广播文件。


数据模型(内部工作原理)

Etheno 通过 EventSummaryPlugin 处理两组主要事件

  • 合约创建
  • 函数调用

ContractCreated 事件有以下字段

  • event - 这只是事件的类型名称 -> ContractCreated
  • from - 合约创建者的地址
  • contract_address - 已部署的合约地址
  • gas_used - 交易中使用的气体量
  • gas_price - 交易中使用的气体价格
  • data - 交易数据
  • value - 交易中发送的以太币

FunctionCall 事件有以下字段

  • event - 这只是事件的类型名称 -> FunctionCall
  • from - 发起调用的账户地址
  • to - 被调用账户的地址
  • gas_used - 交易中使用的气体量
  • gas_price - 交易中使用的气体价格
  • data - 交易数据
  • value - 交易中发送的以太币

*还有一个区块挖掘事件,但对于 Echidna 设置来说不是至关重要的(?)

Foundry 广播结构比这更复杂,但我们只关心几个字段。由于我们希望将广播转换为类似于 Etheno 的结构,因此必须将这些适当的字段映射在一起。

Etheno 字段 Foundry 字段
event transactions[i].transaction_type
from transactions[i].transaction.from
transactions[i].transaction.
contract_address transactions[i].contract_address
gas_used receipts[i].gas_used
gas_price receipts[i].effective_gas_price
data transactions[i].transaction.data
value transactions[i].transaction.value

依赖项