关于 ton-bug-triage
ton-bug-triage 是用于在本地 TON tontester 网络复现和调查故障的技能。它为 TON 开发者提供合约触发与验证者行为测试流程,并配有脚本和证据记录规范,便于解读测试结果。
主要功能
- 01选择交易或验证者测试流程
- 02启动基础及混合验证者网络
- 03编译 Tolk 并构建 StateInit BoC
- 04部署合约并发送消息 BoC
- 05检查账户、交易和运行日志
适用场景
- 01通过内部消息复现合约故障
- 02比较基线与探测版验证者构建
- 03检查崩溃、存活状态或畸形数据包处理
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ ton-blockchain/ ton-triage-skill --skill ton-bug-triage安装后在 Claude Code 中输入/ton-bug-triage确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
.gitignoreagents/openai.yamlreferences/bug_hunt_example.mdcontract_deploy_flow.mddiagnostic_checklist.mdliteclient_fallback.mdprobing_patterns.mdwallet_and_deploy_helpers.mdscripts/account_state.pyaddress_info.pybuild_stateinit.pycompile_tolk.pydemo_wallet_flow.pydump_boc.pyget_method.pyinspect_latest_transaction.pyrun_basic_network.pyrun_fift_script.pyrun_liteclient.pyrun_mixed_network.pysend_boc.pysummarize_run.pyton_triage_lib.pywallet_send.pyscripts/fift/build_stateinit.fifdump_boc.fifnew-wallet-save-stateinit.fif详细介绍
TON Bug Triage
当任务是在本地 tontester 网络上验证某个问题,而不只是启动验证器时,使用此技能。
典型触发场景:
- 部署合约并通过内部消息触发 Bug
- 比较基线验证器构建与探测验证器构建
- 验证崩溃、活性故障、畸形数据包路径或兼容性声明
- 为本地 TON 复现收集可供维护者使用的证据
标准做法是:选择足以回答问题的最小拓扑,在运行前定义成功条件,并收集足够的证据,确保结果可解释。
工作模型
区分以下路径:
- 技能脚本:此技能目录下的文件,例如
scripts/run_basic_network.py - 源代码树:通过
--repo-root传入的真实 TON 检出目录 - 构建目录:包含
validator-engine、create-state、tonlibjson和tolk等二进制文件与库的目录 - 工作目录:每次运行的状态、日志、配置和生成的产物所在目录
不要假设技能目录和仓库是同一个目录。脚本位于技能目录中,会操作你传入的仓库和构建目录。
wallet-env.txt 是启动器与后续辅助工具之间的主要交接产物。
这些辅助工具依赖 tontester 的内部实现和私有 API。如果 tontester 发生变化,可能需要调整辅助工具行为、生成的绑定或命令假设。
工作流选择
运行任何操作前,先选择一种工作流:
-
Workflow A — trigger via transaction如果 Bug 是通过部署合约、发送内部消息,或向合约账户传送畸形/自定义载荷触发的,请使用此工作流。 -
Workflow B — trigger via validator behavior如果 Bug 需要修改过的验证器代码、混合构建、共识干扰、畸形协议数据包、乱序流量或刻意无效的区块行为,请使用此工作流。
如果复现涉及两者,先问一个问题:能否在未修改的网络上,通过正常的部署/发送路径触发问题?如果可以,从 Workflow A 开始;如果不可以,则按 Workflow B 处理。
核心规则
-
从能够回答问题的最小网络开始。 除非路径需要节点对等、共识或混合构建,否则只使用一个验证器。
-
优先使用常规部署/发送流程,而不是修改 zerostate。 如果 Bug 只有在修改 zerostate 后才能复现,请明确说明。
-
将基线构建与探测构建分开。 通常,
vanilla-build/是基线构建,而build/或build-probing/是修改后的构建。 -
运行前先确定成功条件。 示例:目标
mc_seqno、明确的崩溃标记、进程退出、活跃合约账户、已检查的交易,或诚实节点拒绝畸形数据包。 -
对于 Workflow B,确保探测节点自身不会因攻击行为而失效。 具体来说:探测节点可以发出畸形或对抗性行为,但必须保持存活,直到在诚实节点上观察到目标效果。如果探测节点先死亡,且其死亡可能解释结果,则本次运行无效。
-
记录足够的证据,以便精确重现该场景。 保留运行目录、构建目录、命令、相关地址和导出的产物。
-
在将结果称为可供维护者使用之前,从干净的检出目录或独立工作树重新运行,并且只保留预期的产物。
核心脚本
优先使用随附脚本,而非临时编写 Shell 命令序列。
-
scripts/run_basic_network.py从单个构建启动一个或多个验证器。支持--emit-wallet-env、--base-port、--validators和--keep-alive。 -
scripts/run_mixed_network.py从不同的构建目录启动基线验证器和探测验证器。用于恶意与诚实验、基于日志的崩溃检测,以及探测节点存活检查。 -
scripts/compile_tolk.py将.tolk源文件编译为.fif,并生成合约代码 BoC。如果tolk二进制文件相对于仓库HEAD已过期,则会直接失败。 -
scripts/build_stateinit.py使用代码以及可选的数据和库字典 BoC,构建可部署的StateInitBoC。 -
scripts/run_fift_script.py使用正确的包含路径运行.fif脚本。 -
scripts/wallet_send.py构建并可选择发送由钱包签名的消息。部署时使用--init-boc,任意内部负载则使用--body-boc。 -
scripts/send_boc.py通过 tonlib 发送预先构建的序列化外部消息 BoC,而不通过wallet_send.py重新构建。 -
scripts/address_info.py规范化并检查原始和友好格式的 TON 地址,以便交叉核对辅助工具的输入。 -
scripts/account_state.py获取原始账户状态,并转储代码和数据 BoC 以供检查。 -
scripts/get_method.py通过 tonlib 运行 get-method 并打印 JSON。 -
scripts/inspect_latest_transaction.py获取最新账户交易,导出原始交易数据,并在 tonlib 以msg.dataRaw返回消息时,保存消息正文和初始状态 BoC。 -
scripts/run_liteclient.py使用wallet-env.txt或显式指定的仓库、构建和配置输入,运行lite-client命令。 -
scripts/dump_boc.py通过 Fift 打印 BoC 单元树。用于检查负载、StateInit、导出的交易数据,以及转储的账户代码和数据。 -
scripts/summarize_run.py汇总已完成或正在运行的目录中的节点存活状态和崩溃标记。 -
scripts/demo_wallet_flow.py用于简单钱包流程的已验证端到端验证器。
工作流 A
当触发条件为“部署合约,然后发送消息”时,使用工作流 A。
- 使用
--emit-wallet-env启动一个小型网络。 - 使用
scripts/compile_tolk.py编译合约;如果不使用 Tolk,则提供通过 Fift 汇编手工构建的代码 BoC。 - 使用
scripts/build_stateinit.py构建可部署的StateInit。 仅当合约确实需要时,才传入--data-boc和--library-boc。 - 使用
scripts/wallet_send.py --init-boc从已注资的内置main-wallet部署。 使用--init-boc的部署消息也可能调用合约的内部消息处理器。发送单独的触发消息前,请检查部署交易本身是否已更改合约状态。 - 等待激活。
优先使用
account_state.py和合约专用的 get 方法,不要假设主链只需前进一步就足够。 - 当负载为自定义或二进制内容时,将触发消息体构建为 BoC。
run_fift_script.py是生成一次性body.boc最简单的方法。 - 使用
scripts/wallet_send.py --body-boc发送触发消息。--body-boc是权威负载路径,会覆盖--comment。 如果已有已签名的外部消息 BoC,请使用scripts/send_boc.py --boc,而不是用wallet_send.py重新构建。--wait-mc-advance可以证明网络仍在运行,但不能证明交易成功、部署已激活或合约状态已更改。务必直接检查目标账户。 - 使用
inspect_latest_transaction.py --out-dir和dump_boc.py进行观察。 导出的transaction-data.boc和in-msg-body.boc是进行单元格级调试的起点。 如果基于 tonlib 的辅助工具崩溃(常见症状:KeyError: '@extra'),请将run_liteclient.py用作所有观察步骤的回退方案。参见references/liteclient_fallback.md。
完整的操作流程请阅读 references/contract_deploy_flow.md。
仅需了解简单钱包冒烟测试流程时,请阅读 references/wallet_and_deploy_helpers.md。
工作流 B
当触发条件为“修改验证者行为,然后观察诚实节点的反应”时,使用工作流 B。
- 在探测更改前保存基线构建的快照。
- 仅修改探测构建,并确保所有行为更改都由明确的
TON_PROBING_*环境变量控制。 - 选择混合拓扑,并明确成功和失败条件。
有针对性地使用
--success-log、--failure-log、--require-node-alive和--require-node-dead。 - 使用
scripts/run_mixed_network.py运行混合网络。 - 确认论断的两个方面:探测标记已触发,且诚实节点上的影响已发生或未发生。
- 使用
scripts/summarize_run.py总结运行结果,然后仅在摘要指出需要时手动检查特定日志。
常见补丁模式请阅读 references/probing_patterns.md。
端到端示例请阅读 references/bug_hunt_example.md。
否定结果
有效的“未能复现”仍然是有用的证据。只有满足以下所有条件时,才将一次运行视为真正的否定结果:
- 所选工作流确实执行了触发路径
- 存在相关的探测标记或触发标记
- 网络保持足够健康,使未出现该问题这一结果具有意义
- 观察步骤检查了正确的账户、交易或节点日志
- 已达到超时或 seqno 目标,但目标影响仍未出现
如果一次干净的重跑得出相同结果,且剩余更改仅是细微的参数调整,请停止迭代并报告否定结果。
迭代与调试
-
如果
compile_tolk.py因旧构建产物报错,先重新构建tolk。 通常可通过ninja -C <build-dir> tolk修复。 -
如果部署看似成功,但目标位置仍为空,先检查是否观察得太早。 等待激活,而不是假定部署路径有问题。
-
如果合约已激活,但预期的 get 方法调用失败,请先验证方法 ID 和初始数据布局,再更改网络拓扑。
-
如果
inspect_latest_transaction.py显示的负载不正确,请导出原始触发 BoC 和导出的in-msg-body.boc,并比较它们的单元树。 -
如果 Workflow B 中缺少探测标记,说明环境变量未传递到节点,或者补丁代码路径从未执行。
-
如果探测到目标效果之前探测节点就已退出,则本次运行无效。
证据标准
记录足够的信息来支撑结论:
- 确切的运行目录
- 使用的构建目录
- 使用的成功条件
- 相关的启动器和辅助命令
- 目标地址或节点名称
- Workflow A 导出的交易和 BoC 工件
- Workflow B 的节点存活状态和日志标记
对于 Workflow A,请记住,--wait-mc-advance 只是存活状态提示;请从目标账户或交易中确认成功。
故障排查
- 如果缺少
python,请使用python3。 - 如果缺少
tonapi绑定,辅助脚本通常会通过test/tontester/generate_tl.py生成它们。 - 如果将辅助脚本复制到仓库之外,请继续通过
--repo-root传入真实仓库;include 和生成的工件来自仓库,而不是技能文件夹。 - 如果基于 tonlib 的脚本(
account_state.py、get_method.py、inspect_latest_transaction.py、wallet_send.py --auto-seqno)因KeyError: '@extra'或类似的 tonlib 包装器错误而崩溃,则本地 tonlib 构建存在兼容性问题。请改用lite-client进行检查,并在wallet_send.py中手动指定--seqno,不要使用--auto-seqno。 有关通用回退流程,请参阅references/liteclient_fallback.md。 - 如果
vanilla-build/CMakeCache.txt指向build/,则应将vanilla-build视为无效并重新创建。不要信任会重新配置到错误目录的构建树。 - 不要假定传入的构建目录中存在
lite-client。有些检出版本只构建了create-state、tonlibjson和tolk。 - 如果磁盘已满,请在重试前清理旧的
run-*目录。
参考资料
-
references/wallet_and_deploy_helpers.md阅读此文以了解经过验证的简单钱包冒烟测试流程。 -
references/contract_deploy_flow.md阅读此文以了解通用的 Workflow A 编译、部署、触发和检查流程。 -
references/liteclient_fallback.md当基于 tonlib 的辅助工具失败,且 Workflow A 需要使用lite-client检查或手动处理钱包 seqno 时,请阅读此文。 -
references/probing_patterns.md设计 Workflow B 代码更改时,请阅读此文。 -
references/diagnostic_checklist.md运行已完成但结果不明确时,请阅读此文。 -
references/bug_hunt_example.md阅读此文以了解一个具体的混合网络负面结果示例。