份额通胀攻击不是新故事,但它教给金库设计的一课一直留在今天的代币标准里:账本上份额与资产的换算,必须对最坏情况下的取整误差做预案。今天看一个金库安不安全,这套补丁有没有打上,是一个便宜有效的检查点。
先复看攻击是怎么得手的。金库刚部署时份额总数为零,攻击者抢先存入一个极小金额,比如一个最小单位,换到第一份凭证。随后他把一大笔资产直接转进金库地址——不走存款函数,只走转账——金库总资产上升而份额总数不变,每一份额对应的资产被瞬间推高。下一位真实用户按公式换算存款应得的份额数时,如果合约向下取整,一笔正常存款换算出来可能是零份额;而攻击者手里的虚增份额此刻对应着整笔 donated 资产,他随时可以赎回,把别人存进来的钱搬走。
这个链条里有两个要害,一个是取整方向,一个是转赠资产不进账的路径。封堵因此分三路。第一路是把首批份额焊死:部署时就把最小份额直接发给一个永远取不出来的地址,保证份额总数从第一天起就有下限,攻击者无法用一分钱垄断记账比例的分母。第二路是限制资产进入的口径:要求计入收益的资产只能通过规范接口进入,绕路的直接转账要么不抬升换算率,要么被显式拒绝。第三路是规定换算方向:换算给用户的份额一律向下取整、赎回时的资产向上取整,让取整误差的偏差方向永远对攻击者不利。主流金库代币标准的份额换算规则文本里,就写着这几条取整义务与最小份额要求。
作为用户,检查一个新金库可以按三问走。第一问:合约初始化时是否有预铸份额与锁死地址,翻部署交易就能看到;第二问:它的份额换算在源码里对零资产、零份额边界怎么写的,标准实现直接抄了规则文本;第三问:它接受的入账资产是不是白名单制,收益来源是否只认规范接口。三问都过了,这类攻击面基本被关掉;哪一问答案是含糊的,就要把份额密度异常列入观察——一个份额对应资产金额突然跳涨而无收益事件,本身就是红旗信号。
顺带区分两个常被混用的词:通胀攻击偷的是记账分母,发生在份额与资产的换算层;常见的外汇价格操纵偷的是分子,发生在资产估值层。同一个金库可能两种都没防,也可能只补了其一,看防御清单时不要互相顶替。
补一个边界案例帮助理解这些补丁的必要性:假设一个金库已正常运行多年,攻击者无法再用一分钱抢首存,那他还能从取整口下手吗。答案是攻击面收窄但没有归零——如果合约对赎回资产的计算采用对攻击者有利的舍入方向,一个持有海量份额的地址可以在反复存取之间制造微小差额,单次忽略不计,规模化就是磨损。因此标准文本里的取整义务不分工会区分存取两个方向,审计清单上也有对应的舍入方向检查项。用户在金库公告或源码注释里看到舍入说明,是加分信号;完全没有说明的,可以把它列入需要进一步核验的清单,而不是直接当作漏洞——毕竟多数存量金库的取整实现本身是正确的,只是欠一次文档化。
风险提示:本文仅做攻击机制与防御设计的教育性说明,不构成投资建议,也不提供任何攻击操作指导;审计与标准兼容不等于安全保证,交互前请核验合约源码与审计报告。

发表评论
还没有评论,来说两句吧。
评论区为展示样式,提交不会被处理。