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 在 神奇豆
每月110次下载
63KB
1K SLoC
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
(可选):我们的输出文件路径。默认路径是当前目录。
完成跟踪槽位后,通过SIGTERM
或SIGINT
(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
(可选):我们的输出文件路径。默认路径是当前目录。
完成跟踪槽位后,通过SIGTERM
或SIGINT
(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
(可选):我们的输出文件路径。默认路径是当前目录。
一旦完成槽位跟踪,请通过 SIGTERM
或 SIGINT
(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