3 个不稳定版本
0.2.1 | 2023年2月20日 |
---|---|
0.2.0 | 2023年2月20日 |
0.1.0 | 2023年1月30日 |
#835 in 编码
3MB
726 行
Foundry 2 Echidna
此工具的目的是将 Foundry 广播 JSON 文件转换为类似 Etheno 的 JSON 文件,以便无缝地将 Foundry 与 Echidna 集成。
演示
安装
确保您已安装 Rust。
从 crates.io 安装:cargo install foundry2echidna
从源代码安装
git clone https://github.com/ChmielewskiKamil/foundry2echidna/foundry2echidna &&
cd foundry2echidna &&
cargo install --path .
如何使用它
一旦安装了 foundry2echidna
,您就可以转换广播文件了。
- 在您的 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
- 使用生成的
init.json
文件为 Echidna 种子。将以下内容添加到您的echidna_config.yaml
initialize: path/to/init.json
(对于您的自定义输出路径)- 或
initialize: src/crytic/init.json
(对于未提供参数时的默认输出路径)
- 更新您的
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...);
- 运行 Echidna。
将 foundry2echinda 与您的项目集成
您可以使用接受两个参数的 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 |