监控程序发现资产余额下降就立刻调用暂停函数听起来很直接。可下降可能来自合法提款、同一批结算的中间状态或者两个 RPC 返回了不同区块的数据。没有负债、区块身份和权限上下文余额差分只是一个变化量不能自动解释成攻击。10 月 5 日以太坊基金会讨论交易结果断言时特别区分了签名动作和最终状态。对风控系统这意味着事前模拟、执行中的约束与事后核对各有位置不能用一次本地模拟替代全部环节。官方讨论先得到同一条历史上的两份快照快照至少包含链标识、区块哈希、父哈希、资产和负债并注明数值单位。跨多个合约读取时需要固定区块只保存“latest”和采集时间无法证明数据来自同一状态。遇到重组时要撤销旧分支产生的告警再基于规范链重新评估。一个简单的金库教学模型可以检查资产是否覆盖负债但这也依赖估值、清算和会计定义。资产少于负债是需要处理的状态并不独立证明黑客入侵资产仍覆盖负债也不保证所有安全属性正常。from dataclasses import dataclass dataclass(frozenTrue) class Snapshot: block_hash: str parent_hash: str assets: int liabilities: int def inspect(before, after, canonical_hash): if after.parent_hash ! before.block_hash: return RECHECK_HISTORY if after.block_hash ! canonical_hash: return RECHECK_HISTORY if min(before.assets, after.assets, before.liabilities, after.liabilities) 0: return INVALID_DATA return ALERT_COVERAGE if after.assets after.liabilities else NO_COVERAGE_ALERT before Snapshot(h0, old, 100, 90) assert inspect(before, Snapshot(h1, h0, 70, 90), h1) ALERT_COVERAGE assert inspect(before, Snapshot(h1, h0, 95, 90), h1) NO_COVERAGE_ALERT assert inspect(before, Snapshot(fork, h0, 70, 90), h1) RECHECK_HISTORY assert inspect(before, Snapshot(h2, other, 70, 90), h2) RECHECK_HISTORY print(4 snapshot cases checked; no pause transaction sent)保存为snapshots.py运行python3 snapshots.py。资产与负债数值是教学输入canonical_hash由调用者提供程序没有验证共识或最终性。四个用例只验证覆盖告警和分支核对不是主网风险检测效果测试。告警之后还有两次独立判断第一判断是动作是否获准。哪个角色能暂停哪个功能额度是多少是否需要多个独立确认者都应由合约和签名系统约束。OpenZeppelin 的访问控制文档提供了角色分工的实现基础它不能替协议决定正确的应急权限。文档第二判断是动作是否生效。发送暂停交易后要检查回执及目标状态不能在函数调用发出时打印“攻击已阻断”。若交易未入块、权限已撤销或合约状态改变系统应保留未完成状态和人工处置入口。这个最小例子没有接入节点、预言机、签名器或熔断合约。检测代码的执行耗时、RPC 获取快照的延迟和交易确认时间是三个不同指标本地例子通过不能支持“毫秒级链上防御”的结论。风控要快但更要说清楚自己看到了什么、依据什么动作以及动作是否真的发生。
阅读完成 · 觉得有帮助?