#ethereum #foundry #revm #cli #reth

app sothis

重放历史EVM状态的工具

10个版本 (4个破坏性)

0.5.0 2023年8月3日
0.4.0 2023年7月13日
0.3.2 2023年7月2日
0.3.1 2023年6月26日
0.1.1 2023年5月30日

#166神奇豆

Download history 2/week @ 2024-04-03

每月110次下载

MPL-2.0 许可证

63KB
1K SLoC

f3f86624-a5b0-4c60-a44b-4dc1a2ce25a0

sothis

Sothis是一个用于在本地anvil/hardhat测试节点上重放历史状态的工具。

有关详细说明,请阅读wiki。

支持和讨论

加入Rainshower Labs discord服务器来讨论sothis并获得帮助。

将sothis作为crate使用

Sothis可以用作其他Rust项目中的crate。所有跟踪模式以及围绕JSON-RPC调用的轻量级包装都可以使用。有关如何将sothis用作crate的更多信息,请参阅wiki。

我们针对的MSRV(最低支持的Rust版本)为1.68.2

用法

Sothis具有可选参数,这些参数在其各自的模式部分中没有列出,可能非常有用。请参阅以下帮助部分。您可以通过运行sothis --help在任何时候查看。

Usage: sothis [OPTIONS] --source_rpc <source_rpc>...

Options:
  -s, --source_rpc <source_rpc>...
          HTTP JSON-RPC of the node we're querying data from
  -r, --replay_rpc <replay_rpc>...
          HTTP JSON-RPC of the node we're replaying data to
  -m, --mode <mode>...
          Choose between live, historic, track, fast_track, or call_track [default: historic]
  -b, --terminal_block <terminal_block>...
          Block we're replaying until
      --exit_on_tx_fail [<exit_on_tx_fail>...]
          Exit the program if a transaction fails
  -t, --block_listen_time <block_listen_time>...
          Time in ms to check for new blocks. [default: 500]
      --entropy_threshold <entropy_threshold>...
          Set the percentage of failed transactions to trigger a warning [default: 0.07]
  -d, --replay_delay <replay_delay>...
          Default delay for block replay in ms [default: 0]
      --send_as_unsigned [<send_as_unsigned>...]
          Exit the program if a transaction fails
      --no_setup [<no_setup>...]
          Start replaying immediately.
      --decimal [<decimal>...]
          Start replaying immediately.
  -c, --contract_address <contract_address>...
          Address of the contract we're tracking storage.
  -l, --storage_slot <storage_slot>...
          Storage slot for the variable we're tracking
  -a, --calldata <calldata>...
          Storage slot for the variable we're tracking
  -o, --origin_block <origin_block>...
          First block sothis will look at.
  -q, --query_interval <query_interval>...
          First block sothis will look at.
  -p, --path <path>...
          Path to file we're writing to [default: .]
  -f, --filename <filename>...
          Name of the file. [default: ]
  -h, --help
          Print help
  -V, --version
          Print version

Sothis目前有5种模式。实时、历史、跟踪、快速跟踪和调用跟踪。

历史

历史模式是Sothis的默认使用方式。它用于将状态重放到分支到深历史块的本地节点。

用法

  • -m historic(可选): 用于表示我们在实时模式下重放。
  • --source_rpc: 我们获取块所在节点的RPC。
  • --replay_rpc: 我们发送块所在节点的RPC。
  • --terminal_block: Sothis将重放的最后一块。

要停止重放,通过Ctrl+C或其他您偏好的方式终止进程。

sothis --source_rpc {ARCHIVE_NODE} --replay_rpc http://localhost:8545 -m historic --terminal_block 9000022

实时

实时模式旨在与分支到接近头块的本地节点一起使用。它将最新块重放到您的分支节点。

用法

  • -m live: 用于表示我们在实时模式下重放。
  • --source_rpc: 我们获取块所在节点的RPC。
  • --replay_rpc: 我们发送块所在节点的RPC。

要停止重放,通过Ctrl+C或其他您偏好的方式终止进程。

sothis --source_rpc {ARCHIVE_NODE} --replay_rpc http://localhost:8545 -m live

跟踪

跟踪模式用于跟踪合约存储槽值的变化,需要实时更新。它可以用于实时生产网络,也可以与sothis(请注意,您可以使用--block_listen_time以防止跟踪落后!)结合使用。如果您在本地网络中进行测试,可以启动另一个sothis实例以跟踪重放节点上的槽位变化。

结果保存到一个类似于以下的JSON文件中

{
  "address":"0x1c479675ad559DC151F6Ec7ed3FbF8ceE79582B6",
	"storage_slot":"0x0",
	"state_changes":[
		{"block_number":"0x10b7bbc","value":"0x00000000000000000000000000000000000000000000000000000000000e2b18"}
	]
}

用法

  • --mode track:用于表示我们正在使用跟踪模式。
  • --source_rpc:我们获取数据的节点的RPC。
  • --contract_address:我们从其读取存储的合约地址。
  • --storage_slot:合约的存储槽。
  • --terminal_block(可选):sothis将跟踪的最终区块。如果未指定,sothis将跟踪直到终止。
  • --filename(可选):我们的输出文件名。默认文件名格式如下:address-{}-slot-{}-timestamp-{}.json
  • --path(可选):我们的输出文件路径。默认路径是当前目录。

完成跟踪槽位后,通过SIGTERMSIGINT(Ctrl-c)终止进程,这将终止执行并写入文件。请注意,sothis会检查一次新块,看您是否尝试终止它。如果在source_rpc上没有产生新块,sothis将不会终止,如果您强制关闭它,则不会写入任何内容。

sothis--mode track--source_rpc http://localhost:8545 --contract_address 0x1c479675ad559DC151F6Ec7ed3FbF8ceE79582B6 --storage_slot 0 --filename siuuu.json --path ~/Desktop

快速跟踪

快速跟踪模式用于跟踪历史存储槽的变化。它不能用来获取其实时视图。对于此模式要表现最佳,source_rpc必须是归档节点。这比常规跟踪模式快10000%左右。如果您没有本地节点,这是推荐的模式。

用法

  • --mode fast_track:用于表示我们正在使用跟踪模式。
  • --source_rpc:我们获取数据的节点的RPC。
  • --contract_address:我们从其读取存储的合约地址。
  • --storage_slot:合约的存储槽。
  • --origin_block:我们开始跟踪的区块。
  • --terminal_block(可选):sothis将跟踪的最终区块。如果未指定,sothis将跟踪直到终止。
  • --filename(可选):我们的输出文件名。默认文件名格式如下:address-{}-slot-{}-timestamp-{}.json
  • --path(可选):我们的输出文件路径。默认路径是当前目录。

完成跟踪槽位后,通过SIGTERMSIGINT(Ctrl-c)终止进程,这将终止执行并写入文件。请注意,sothis会检查一次新块,看您是否尝试终止它。如果在source_rpc上没有产生新块,sothis将不会终止,如果您强制关闭它,则不会写入任何内容。

sothis--mode track--source_rpc http://localhost:8545 --contract_address 0x910cbd523d972eb0a6f4cae4618ad62622b39dbf --storage_slot 3 --filename siuuu.json --path ~/Desktop

调用跟踪

快速调用模式用于跟踪历史eth_call的变化。它不能用来获取其实时视图。对于此模式要表现最佳,source_rpc必须是归档节点。这可以用来获取历史链链价格、查看去中心化交易所随时间的变化输出等等。

用法

  • --mode call_track:用于表示我们正在使用跟踪模式。
  • --source_rpc:我们获取数据的节点的RPC。
  • --contract_address:我们将要调用的合约地址。
  • --calldata:我们使用的calldata。
  • --origin_block:我们开始跟踪的区块。
  • --terminal_block(可选):sothis将跟踪的最终区块。如果未指定,sothis将跟踪直到终止。
  • --filename(可选):我们的输出文件名。默认文件名格式如下:address-{}-slot-{}-timestamp-{}.json
  • --path(可选):我们的输出文件路径。默认路径是当前目录。

一旦完成槽位跟踪,请通过 SIGTERMSIGINT(ctrl-c)来终止进程,这将终止执行并写入文件。请注意,Sothis 将在新块中检查一次,如果你尝试终止它。如果源_rpc 上没有产生新块,Sothis 将不会终止,也不会写入任何内容,如果你强制关闭它。以下示例演示了在主网上跟踪 ETH/USD 的历史链链接价格。

sothis--mode call_track--source_rpc http://localhost:8545 --contract_address 0x1c479675ad559DC151F6Ec7ed3FbF8ceE79582B6 --origin_block 17799350 --calldata 0x06f13056

安装

Sothis 是一个 Rust crate。你可以使用 cargo 安装它:cargo install sothis

常见问题解答

为什么 Sothis 这样慢?

Sothis 使用了大量的 JSON-RPC 调用。这可能会导致你的 RPC 提供商限制你的带宽。建议使用你自己的本地节点。
如果你使用 anvil,请确保添加 --cups {REALL_HIGH_VALUE} 参数,这样 anvil 不会限制自己。

我在 Sothis 上遇到问题。开发者能做些什么吗?

是的!请创建一个 GitHub 问题,详细说明你的问题。

为什么这个名字?

Sothis 是《火焰纹章:风花雪月》中 Fódlan 的创造者和神。她有能力随意倒流时间。

依赖关系

~29–45MB
~838K SLoC