TOKE:安?实验室发布「YFII流动性挖矿合约安全性研究」,所涉四项合约未包含致命安全漏洞_YFIIG币

YFII是一个新型去中心化DeFi矿池,应社区小伙伴邀请,安比实验室于2020年7月27日至8月2日对YFII智能合约进行了安全性研究。分析对象为下列合约:YFIIPool1:0xb81D3cB2708530ea990a287142b82D058725C092YFIIPool2:0xAFfcD3D45cEF58B1DfA773463824c6F6bB0Dc13aYFIIToken:0xa1d0E215a23d7030842FC67cE582a6aFa3CCaB83BPTToken:0x16cAC1403377978644e78769Daa49d8f6B6CF565初步分析结果表明,以上四个合约并未包含致命安全漏洞。安比实验室希望通过本文对研究过程做一个记录和总结,Token价格、经济模型、其他外部合约模块、以及未来新的合约不在本文讨论内。YFII和YFI是什么

YearnFinance是一个DeFi收益聚合器,于7月17日推出治理TokenYFI后因其新颖的分发机制和治理方案迅速引爆了流动性挖矿市场。而YFII是对YFI项目的分叉,遵循YIP-8,实施了类似比特币的减半机制。YFII相对YFI做了哪些改动

目前,YFII合约代码均直接Fork自YearnFinance,做了较小的改动以支持YFIIToken的定期减半分发。下表为YFII涉及的合约与YFI合约对应关系及地址。

YFI/YFIIToken为项目治理Token合约,二者实现一致,具体为一个带mint和简单governance功能的标准ERC-20Token。BPTToken为BalancerPoolToken合约,是做市商的流动性证明Token,实际由自动做市协议Balancer的BFactory入口合约创建,因此二者实现完全一致。该合约代码此前由TrailofBits和ConsensysDiligence进行过审计。Pool1和Pool2是用于分发治理Token的流动性挖矿合约,Pool1和Pool2的代码实现一致,均被称为YearnRewards合约,而YFII相对于YFI的改动即在这该合约中。YFIIPool1和Pool2合约相对于原始代码新增了checkStart()和checkhalve()两个修饰符函数,分别用于控制挖矿开始时间,和治理Token周期性地产量减半。YFII&YFI核心合约简析

YFII和YFI流动性挖矿的核心合约代码YearnRewards实际源自于Synthetix项目的Unipool,原本用于奖励在Uniswap上为ETH/sETH交易对提供流动性的做市商SNXToken,该代码之前经过SigmaPrime审计。基于YearnRewards的流动性挖矿整个流程可以分为以下几步:具有RewardDistribution权限的地址,预先通过调用YearnRewards合约的notifyRewardAmount()函数,设置奖励数额,而对应金额的YFIToken应由YFIminter转入YearnRewards合约中。矿工向YearnRewards合约指定的目标DeFi合约提供流动性,拿到对应的流动性证明Token,该Token可以用于换回资产以及赚取利息或手续费收益。矿工将得到的PoolToken通过调用stake()函数存入YearnRewards合约中,合约自动根据Stake时长和矿工存入资金规模占资金池总规模的大小来计算矿工应得的奖励。矿工可随时提走自己的应有奖励以及之前存入的PoolToken。通常一个YearnRewards合约专门用于单个特定DeFi项目的流动性挖矿,如Pool1对接Curve项目的y池,Pool2对接Balancer上的YFI-DAIPool。一些发现

前面提到YFII相对于YFI的改动,代码改动整体较小。新增两个修饰器函数用于约束stake()withdraw()getReward()三个主要功能函数。

notifyRewardAmount()函数中新增了一行代码,用于在notify的同时直接控制YFIToken合约mint指定数量的Token到当前YearnRewards合约,将其作为奖励用于分发。因此,Pool1和Pool2合约必须是YFIIToken合约的minter。这让YFII与YFI在Token分发细节逻辑上稍有不同。YFI每期奖励的分发都需要由特定地址负责设置金额并转入Token。而YFII除了第一期开始前执行了notifyRewardAmount()操作,之后会随着用户的调用,产量自动定期减半。

另外,在与社区开发者Madao和gaojin讨论代码细节的过程中,Madao提到Token产量自动减半的执行需要依赖checkhalve()函数的执行,实际则依赖用户与合约交互,执行时间无法精准控制到上一个周期的结尾,减半发生时间会与预期时间存在一定的时间差,并且合约减半实际发生时间很大概率晚于预期时间。特别地,合约计算奖励时会将两个周期间多出来的时间差计算在内,导致给每个用户计算的奖励值会略高于预期值,产生了一定误差。进而我们发现,只要误差存在,理论上最后一个从Pool中提取reward的人可能无法正常提现。这是因为合约在减半的同时MintYFIIToken至Pool合约。由于前面误差的存在,导致合约中用户账面收益高于实际Mint出来的Token数量。误差的大小计算方法为每个周期结束时间与下次减半发生实际发生时间之间的时间差Delta乘以减半后的rewardRate。根据上图测算,平均延时60秒减半,累计误差在1个YFII以内。只要能控制时间误差足够小,再加上持续有下一周期的Token作为补充,因此该误差问题影响较小。YFII管理员权限处理

YFI类Token都存在铸币接口,具有mint权限的地址可以增发Token。YFI类Token还存在Governance管理员,具有权限添加和删除Minter。通常理想情况下这些地址特殊权限地址应该为多签合约或其他专门合约。另外YearnRewards合约有rewardDistribution权限地址,用于调用notifyRewardAmount()函数设置奖励金额。YearnRewards合约还存在owner权限地址,用于设置rewardDistribution地址。目前,YFII项目的做法是将YFIIToken的Governance管理员、Pool1和Pool2的rewardDistribution均设为了0地址。管理员权限销毁记录可参见https://burn.yfii.finance/。经查验,管理员权限销毁属实。目前只有Pool1和Pool2两个合约地址具有YFIIToken的mint权限,属于为了实现周期性减半的必要权限,且未来无法被滥用。特别值得一提地是,原版YFIToken代码实现中,并未给addMinter()该特权函数添加Event,导致普通用户无法方便地查看究竟合约有多少minter。当心,这让各种类YFI项目非常容易藏入后门。经查验,YFIIToken合约总共只有两条addMinter()记录,分别为Pool1和Pool2合约添加mint权限,未引入多余的minter。总结

YFI整体是一次非常有意义的DeFi创新实验,通过YearnFinance我们看到去中心化的治理代币分发,充分激发了DeFi社区的挖矿和治理热情。YFII在YFI的基础上实现了YIP-8提案,探索了一种可能更公平的治理代币分发方案,并且短时间在社区内产生了较大影响,发展势头惊人。安全建议

随着流动性挖矿和DeFi产品的火热,市面上涌现出来各种新型DeFi智能合约,组合性风险剧增。安比实验室提醒用户与任何DeFi项目交互时一定要注意安全第一,认清域名、合约地址,仔细审查所有与资金相关的操作,尽量不要与来源不明的智能合约交互。另外,我们应更多关注DeFi产品本身和智能合约安全,分析价值基础和风险来源,不盲信APR,只投入能够承受损失的金额。特别提醒,记得用本文中提供的线索自行检查参与的类YFI项目管理员权限。

郑重声明: 本文版权归原作者所有, 转载文章仅为传播更多信息之目的, 如作者信息标记有误, 请第一时间联系我们修改或删除, 多谢。

大币网

[0:0ms0-3:470ms