给合约装一道可换的安检门:ERC-7746 安全中间件钩子的前后两次校验 图 1
给合约装一道可换的安检门:ERC-7746 安全中间件钩子的前后两次校验 · 图 1

给合约装一道可换的安检门:ERC-7746 安全中间件钩子的前后两次校验

协议被攻击后的复盘里常见一句话:“如果当时有一层拦截就好了。“把这种假设系统化,就是 ERC-7746 想做的事:定义一套标准接口 ILayer,让安全校验像机场安检一样装在合约的入口与出口,而不用把检测代码焊死在业务合约里。标准文档记录的状态为 Last Call,创建于 2024 年 7 月 17 日,文档中带有的最后征询截止期为 2025 年 7 月 29 日,当前状态以标准仓库为准。

两个函数钉住一次调用的首尾

一个安全层合约只需提供两个函数。beforeCall 在受保护合约真正执行任何逻辑之前被调用,拿到的信息是一次调用的全部外部特征:函数选择器(要调用哪个函数的四字节标识)、发起者地址、随调用附带的 ETH 金额、完整的调用数据,以及层自身的配置参数;如果判定这笔调用不该发生——地址在黑名单里、金额超限、函数组合可疑——它必须直接抛错回滚,交易到此为止。若通过,它返回一段任意数据,传给调用结束后的 afterCall。第二个函数在主体逻辑执行完后复查状态:有些攻击的特征要执行后才显现,比如余额被意外抽走、某个内部变量被越权改写,afterCall 校验不通过时同样以回滚收场,整笔调用仿佛从未发生。规范同时规定,受保护合约若挂多层,任何一层抛错都必须整体回滚。前后两道闸合成的效果,是把”执行前拦截明显的恶意”和”执行后验证结果正常”都变成合约的默认反射。

给合约装一道可换的安检门:ERC-7746 安全中间件钩子的前后两次校验 图 2
给合约装一道可换的安检门:ERC-7746 安全中间件钩子的前后两次校验 · 图 2

组合、升级与独立的分工

标准把这种层叫可组合的安全中间件:一个合约可以同时挂多层,各层来自不同供应商,分别负责访问控制、输入净化、输出验证等检查,叠加出贴合自身业务的安全画像。因为层与业务合约解耦,安全公司升级检测规则时不需要协议方重新部署合约,这在攻击模式飞快的市场里是实打实的响应速度。设计文档也坦承灵感来自软件业成熟的中间件模式——用统一的调用签名把一层包进另一层,形成可重复的通用模式。

这道门自身的三块短板

诚实的评估要包含反面。其一,信任迁移:每加一层就引入一个新依赖,安检门自己被人买通或出 bug,整条链路跟着失效;读合约时应当确认层的地址、查看其提供方与开源程度。其二,失败语义:层在校验过程中若因 gas 不足或依赖预言机超时而意外抛错,会把合法调用一起挡在门外——用户体验是”功能突然坏了”,排障时要把层从假设里逐一剥离。其三,范围边界:层只能看见经过合约入口的调用,绕开入口的路径(比如某些直接操作状态的管理接口)不在它的视野里,所以它是业务逻辑之外的补丁,不是万能保险。

对普通用户意味着什么

这套机制主要是协议方的工程选择,但它对用户有三点实际意义。第一,看到项目宣称”接入运行时安全层”时,可以追问是哪家的哪一层、合约是否公开验证、层的地址由谁管理——这些答案决定这句话的含金量。第二,当某协议忽然大面积报”校验失败”,除了网络拥堵,也可能是安全层正在拦截攻击或自身升级出错,官方公告与链上层的更换事件能帮你区分两类情况。第三,安全层的存在不改变基本操作纪律:授权前看字段、陌生合约先小额试探、钓鱼站不签名,任何中间件都不能替你完成这几步。

本文只讲机制与安全实践,不构成投资建议,也不构成对具体安全产品的评价。