“4308144937764982866415” 这两个值其实对应的就是 vault 库合约的 harvest 函数计算出的需要提现的代币数量和从 adapter (策略池) 中取回的代币的数量。由于这个 adapter 对应的收益代币是 WETH,精度为 18 位,那么 “4308144937764982866415” 这个数值换算过来就是 “4308.144937764982866415” 个 WETH。 也就是说,本次 harvest 操作,收益了超过 4300 个 ETH 的收益,然后这个收益在下一步中通过 _distributeToTransmuter 函数给到了 transmuter 合约进行分发,我们看下分发过程中的逻辑是怎样的: _distributeToTransmuter 函数的逻辑只有简单的 3 行,我们主要关注的是最后的外部调用 —— lowerHashMinted 函数。该函数所对应的 xtoken 在这里指的是 alETH 本身。因为 alETH 本身是用户通过借贷借出来的,所以 lowerHashMinted 这里的操作其实是使用 harvest 的收益将 alETH 总的贷出数量减少了,从而减少了每个用户的贷款。总结来说就是用 harvest 4300 ETH 的收益偿还用户的 alETH 贷款。 打个小总结 这里先总结下这个流程,就是 AlchemistEth 合约通过 harvest 函数,得到了 4300 ETH 的收益,并将这个收益分发出去了,用于偿还用户的 alETH 贷款,导致了我们看到的情况 —— 已经贷出 alETH 的用户在不需要还款的情况下就可以拿回他们质押的 ETH。那究竟是为什么,会有这 4300 ETH 的收益呢?这多出来的 4300 ETH 的收益是怎么来的?针对这个问题,我们开始下一轮的分析。 核心分析——Round 2 要了解为什么会多出来 4300 ETH,就必须了解 AlchemistEth 的资金存储过程。在 AlchemistEth 合约中,合约总的充值情况是使用 Vault library 库的 Data 结构体进行记录的,然后通过 flushActiveVault 函数更新对应的充值数量(totalDeposit)。 然后 depositAll 函数会将充值的代币金额打到对应的 adapter(策略池) 中,那么在下一次 harvest 的时候,通过 adapter(策略池) 获取的 totalValue,就会是用户的本金加上策略池的收益。为了计算收益过程中的本金部分,我们对官方给出的交易进行 debug,发现本金仅为 9000 ETH,从 adapter 获取的收益加上本金共有 13000 ETH,也就是说 9000 ETH 的本金产生了 4300 ETH 的收益。 但是,按照上面分析的逻辑,用户的本金是不会产生那么大的收益的,问题肯定是出在了 adapter 获取的 totalValue。也就是说 adapter 不止只有 AlchemistEth 充值代币,还存在其他的收益渠道。为了验证我们的想法,慢雾安全团队分析了 adapter 的所有代币收入,果然发现了一笔异常的转入行为,并且金额也能刚好对上多出的 4300 ETH 的收益。也就是说,问题就在这里了。 (责任编辑:admin) |