|慢雾:DeFi 当红项目 YAM 闪电折戟,一行代码如何蒸发数亿美元?( 四 )


*function mint(address to, uint256 amount) external onlyMinter returns (bool) { _mint(to, amount); return true; } function_mint(address to, uint256 amount) internal { // increase totalSupply totalSupply = totalSupply.add(amount); // get underlying value uint256 yamValue = http://news.hoteastday.com/a/amount.mul(internalDecimals).div(yamsScalingFactor); // increase initSupply initSupply = initSupply.add(yamValue); // make sure the mint didnt push maxScalingFactor too low require(yamsScalingFactor从代码可知 , mint 函数在每次铸币时都会更新 initSupply 的值 , 而这个值是根据 amount 的值来计算的 , 也就是铸币的数量 。
现在 , 我们已经分析完所有的流程了 , 剩下的就是把所有的分析串起来 , 看看这次的漏洞对 YAM 产生了什么影响 , 对上文的流程图做拓展 , 变成下面这样:
|慢雾:DeFi 当红项目 YAM 闪电折戟,一行代码如何蒸发数亿美元?
本文插图

整个事件的分析如上图 , 由于rebase的时候取的是上一次的 totalSupply 的值 , 所以计算错误的 totalSupply 的值并不会立即通过 mint 作用到 initSupply 上 , 所以在下一次rebase前 , 社区仍有机会挽回这个错误 , 减少损失 。 但是一旦下一次rebase执行 , 整个失误将会变得无法挽回 。
通过查询 Etherscan 上 YAM 代币合约的相关信息 , 可以看到 totalSupply 已经到了一个非常大的值 , 而 initSupply 还未受到影响 。
前车之鉴
这次事件中官方已经给出了具体的修复方案 , 这里不再赘述 。 这次的事件充分暴露了未经审计 DeFi 合约中隐藏的巨大风险 , 虽然 YAM 开发者已经在 Github 中表明 YAM 合约的很多代码是参考了经过充分审计的 DeFi 项目如 Compound、Ampleforth、Synthetix 及 YEarn/YFI , 但是仍无可避免地发生了意料之外的风险 。
DeFi 项目 Yam Finance (YAM) 核心开发者 belmore 在推特上表示:「对不起 , 大家 。 我失败了 。 谢谢你们今天的大力支持 。 我太难过了 。 」但是覆水已经难收 , 在此 , 慢雾安全团队给出如下建议:
1、由于 DeFi 合约的高度复杂性 , 任何 DeFi 项目都需在经过专业的安全团队充分审计后再进行上线 , 降低合约发生意外的风险。 审计可联系慢雾安全团队(team@slowmist.com)
2、项目中去中心化治理应循序渐进 , 在项目开始阶段 , 需要设置适当的权限以防发生黑天鹅事件 。
【|慢雾:DeFi 当红项目 YAM 闪电折戟,一行代码如何蒸发数亿美元?】来源链接:mp.weixin.qq.com


推荐阅读