宇宙链 宇宙链
Ctrl+D收藏宇宙链

首发 | 回天乏术 一开始就注定失败的YAM投票拯救行动

作者:

时间:1900/1/1 0:00:00

36小时内,眼看他起高楼,几分钟内,眼看他楼塌了。

北京时间08月13日上午03时整,备受瞩目的DeFi项目YAMFinance宣布启动流动性挖矿,仅仅一天时间锁仓资产价值就超过了6亿美元,其锁定资产增量和增速都达到了近乎癫狂状态。且照此发展,一些早期给池子注入流动性的羊毛党年利率甚至可逼近200倍,其疯狂程度可见一斑。

不过,正当大家都陷入挖矿狂欢的时候,意外发生了。

北京时间08月13日凌晨,YAMFinance发现其智能合约的弹性供应机制存在漏洞,导致合约第二次rebase触发时会铸造大量额外代币,这意味着未来社区将无法获得足够的代币来执行任何治理操作,YAM将成为一个失控的机器,最终将彻底失去社区用户的信任。

该如何拯救我们的YAM小红薯呢?

在发现漏洞后,YAM团队发起了“拯救行动”,称他们需要16万委托投票才能提交治理提案,于是向社区发起呼吁投票。很快,这场轰轰烈烈的社区投票行动就完成了。

然而,就在大家以为只是虚惊一场的时候,北京时间08月13日下午16时01分,YAM创始人BrockElmore却发推特称,对不起大家,我失败了。这究竟是怎么回事呢?

PeckShield安全人员介入分析后,迅速定位到问题的本质在于:弹性供应机制存在一个代码公式的错误,致使第二次rebase触发时系统会自动增发10^18个新代币,如果行情一直保持高位的话,那么以后的每次rebase触发时都会进行指数级的增发,这将使小红薯YAM的数量变成一个可怕的天文级数字。这意味着,无论后期社区怎样委托投票,都无法获得足够的投票量对系统进行控制,整个系统将陷入失控无主状态。

LBank蓝贝壳于4月10日01:00首发 BOSON,开放USDT交易:据官方公告,4月10日01:00,LBank蓝贝壳首发BOSON(Boson Protocol),开放USDT交易,4月9日23:00开放充值,4月12日16:00开放提现。上线同一时间开启充值交易BOSON瓜分10,000 USDT。

LBank蓝贝壳于4月10日01:00开启充值交易BOSON瓜分10,000 USDT。用户净充值数量不少于1枚BOSON ,可按净充值量获得等值1%的BOSON的USDT奖励;交易赛将根据用户的BOSON交易量进行排名,前30名可按个人交易量占比瓜分USDT。详情请点击官方公告。[2021/4/7 19:54:33]

本来YAM官方号召广大YAM持有人通过代理投票的方式,一起完成此次投票“拯救行动”,以修复这个存在的漏洞。然而,PeckShield安全人员进一步分析发现,当YAM官方开始发出呼吁的时候,这次拯救行动其实就已经注定失败了。

原因有二:

1)时间来不及:?YAM官方或许忽略了一点,在其提案投票拯救行动准备工作完成后,也需要至少12.5个小时才能被执行生效,而按照现在的时间节奏,当其执行生效时,第二次rebase早已触发。

2)新部署治理合约无法被有效执行:由于第二次rebase触发,因此官方原先预期要执行的新治理合约到了执行时间后,却发现由于投票总量远远无法达到合约约定的总量的4%,故而无法被有效执行。

首发 | imKey正式支持Filecoin,成为首批Filecoin硬件钱包:12月1日,随着imToken2.7.2版本上线,imKey同步支持Filecoin,成为业内首批正式支持FIL的硬件钱包。Filecoin作为imKey多链支持的优先级项目之一,成为继BTC、ETH、EOS和COSMOS四条公链后的第五条公链。

据悉,imKey团队已在Q4全面启动多链支持计划,计划实现imToken已经支持的所有公链项目,本次imKey升级更新,无需更换硬件,不涉及固件升级,通过应用(Applet)自动升级,即可实现imKey对Filecoin的支持及FIL的代币管理。[2020/12/2 22:52:32]

究竟是为何呢?接下来上技术干货:

技术概要

首先介绍下YAM智能合约的弹性供应机制:

1)系统会根据市场价格浮动来动态调整代币的供应量,当市价上涨时则按比例增发代币,以降低单位代币的价值,直至降至1美元。

2)每天分别执行两次rebase,每次rebase会改变代币供应量,根据市场现价增发或销毁一定量的代币。

再说一个实施提案的关键因素:持有者进行委托投票,投票数超过总量的1%,则提案才可以进行执行排列,且按合约约定执行排列时长需要等待12.5小时,而提案执行时,则投票需要超过总量的4%。如此新治理合约才能执行生效,项目才能继续正常运转。

首发 | 欧科云链推出“天眼方案”推动链上安全系统再升级:8月28日,区块链产业集团欧科云链宣布推出区块链“天眼方案”,主要通过链上数据追踪系统研发、对外技术支持、凝聚企业众力等途径,全面助力区块链安全提升和产业平稳健康发展。

据了解,在“天眼方案”下,欧科云链集团将打造链上数据追踪系统,通过溯源数字资产、监控非法交易等手段,全力遏制等非法行为;协助执法机关办案,并为打造法务等区块链系统提供技术支持;为联盟链和基于各类业务的链上数据提供区块链+大数据的解决方案。[2020/8/28]

有了以上几个技术要点的铺垫,我们再来看一下,YAM官方的跟进时间表,就能明白此次拯救行动为什么注定会失败。

如下图时间线所示:

②是第一次rebase触发的时间,由于合约的bug导致totalsupply资产发生异常暴涨,官方发现BUG存在并进行了披露。

③是官方宣布提议部署新治理合约的时间,在此之后社区开始启动投票。

④是投票目标初步完成,新治理合约进入执行排列的时间,自此等待执行12.5小时合约正式执行。

⑤是第二次rebase的触发时间。

⑦是其新治理合约投票通过后正式执行的时间。

⑥在第二次rebase触发后的第31分钟时,或许是项目方发现了已经无力回天了,提案取消成功,项目方正式宣布YAM失败。

《精灵达人3D》正式首发 Cocos-BCX 主网:据官方消息,近日,由生态合伙人 DAPPX 参与开发的《精灵达人3D》正式首发于游戏公链 Cocos-BCX 主网。《精灵达人3D》是一款以精灵宝可梦为题材的抓宠游戏,游戏美术采用全3D 制作。用户可通过 CocosWallet , DAPPX 或 IMCOCOS 登录 COCOS 主网账号即可体验。截至目前,Cocos-BCX 主网已上线《加密骑士团》《恶龙必须死》《XPEX怪兽世界》《Go Block》《可可夺币》《熊猫运动会》等多款玩法多样的趣味性链游,游戏公链生态在逐步壮大和完善。[2020/8/20]

①之后的绿色区域是投票和提案拯救行动可以成功的“黄金急救期”,需要整个拯救行动准备工作在第一次rebase触发之前半小时内完成。。

这意味着,YAM官方应在第一次rebase(北京时间08月13日凌晨04:08)之前就应该发现这个漏洞,并且留有足够的时间完成新治理合约部署和投票。

可是事与愿违,官方发现漏洞并披露呼吁投票的时间还是太晚了,错过了唯一能够成功的黄金急救期。而更糟糕的是,按照官方的时间节奏,当新治理合约到了⑦执行的时间后,投票数要超过总量的4%才行,而此刻的总量已经扩大了10^18*10^18,此前累积的投票数已然杯水车薪,根本无济于事。

所以,这次拯救行动一开始就注定了会失败。

公告 | 火币全球站6月29日16:00全球首发 Project PAI:火币全球站定于新加坡时间6月29日16:00 Project PAI (PAI) 充值业务。7月2日16:00在创新区开放PAI/BTC, PAI/ETH交易。7月6日16:00开放 PAI提现业务。[2018/6/29]

下面我们会对此次事件做下详细分析:

详细过程分析

首先我们看下当第一次rebase发生了什么:

图1.第一次rebase资产变化

如上面链上信息所示,当第一次rebase?之后,totalSupply从3,500,000*10^18暴涨到一个极大值。

我们进一步分析代码,看下在代码中发生了什么:首先从链上信息我们能看到rebase操作调用的是YAMRebaser合约的YAMRebaser::rebase()?函数,我们最终发现它通过调用YAM合约的rebase()?函数重新计算totalSupply,在第340行的totalSupply赋值操作可以看到,这一行代码有个明显的错误——没有除BASE,从而导致totalSupply的值暴增了10^18倍。

YAM官方在第一次rebase以后发现了这个问题,于是披露rebasebug事件启动了投票拯救行动。

图2.YAMToken::rebase()得到一个异常大的totalSupply值

而在12小时之后,YAM又触发了第二次rebase,这个数据又是以基于错误的totalSupply来计算的,从而导致initSupply的数值同样出现了异常。

图3.第二次rebase资产变化

我们继续分析造成initSupply异常的成因,关键在上面提到过YAMRebaser::rebase()?函数,这个函数实现的主要逻辑:先基于yam.totalSupply()计算出本次rebase需要增发的YAM数额mintAmount,在afterRebase()?函数经过数层调用后进入YAM的?_mint()?函数,基于异常的mintAmount给initSupply进行赋值。由于在第一次rebase中,totalySupply已经变成一个极大值,所以基于此异常值的后续一列操作最终导致initSupply也计算错误,变成了一个天文级的数值。

图4.YAMRebaser::rebase()?用错误的totalSupply计算initSupply

当第一次rebase出现异常时,项目方已经发现问题并决定提出一个修复系统的提案,希望通过投票的方式将此提案排入执行队列并且执行。当此题案收到足够多的投票,治理合约允许任何人通过调用GovernorAlpha::queue()函数将此题案排入执行队列。但由于此治理合约代码逻辑的实现,导致无论是在第二次rebase之?前或是之后进行修复,都无法正确执行这个拯救行动。

为什么说项目方准备工作完成的太晚了?

我们看下图中的GovernorAlpha::queue()代码,我们注意到了在调用_queueOrRevert函数之前的第224行中设置变量eta=currenttimestamptimelock.delay,这就使得生效时间必然在加入队列的12.5小时以后,而第二个rebase时间是与第一次间隔12小时,这就意味着要执行成功需要将拯救行动提前到第一次rebase之前至少半小时以上,否则将永远无法执行。

图5.GovernorAlpha::queue()?函数设置eta

又为什么说已经做出的拯救行动,根本无济于事呢?

当触发合约GovernorAlpha::execute()?时首先会先执行state函数来获得当前提案状态。

图6.GovernorAlpha::execute()?检测提案状态

在下面的state()?函数第330行,如果proposal.forVotes<=againstVotes(),提案状态被设置为失败。

图7.GovernorAlpha::state()?执行返回Defeated错误

从代码中能看出来,项目方在设计系统时,投票数被设计为必须大于initSupply总量的4%,此提案才能是合法的状态,如下图所示。然而,当第二次执行rebase以后,initSupply已经被搞成一个极大值。这就导致了,投票票数永远不可能>=quorumVotes(),从而总是返回Defeated。

图8.GovernorAlpha::quorumVotes()?返回一个错误的异常值

除了提案状态异常的问题之外,如图9、图10所示,当第二次rebase发生以后,由于GovernorAlpha::propose()检查投票数必然小于proposalThreshold(1%的initSupply),因此新的提案也再也无法被提出,更遑论要投票执行了。

图9.GovernorAlpha::propose()?检测投票数是否大于1%initSupply?

图10.GovernorAlpha::proposalThreshold()?返回1%initSupply

总结

此次?YAM漏洞事件,最终造成治理合约中75万枚?yCRV?被永久锁定,而且短时间内的急速暴跌和无力回天的局面,不知道有多少人被埋在了价格高点,其疯狂程度成了如今DeFi流动性挖矿的最真实写照,其残酷魔幻程度何尝又不是?倘若项目方在部署合约之前但凡测试过一次rebase流程,必定能捕捉到漏洞的存在。足以见得,DeFi项目做安全审计的重要性。

综上分析,PeckShield?想借此劝诫诸君,在区块链世界里,务必要对每一行合约代码保持敬畏,因为任何细微的疏漏都可能造成无法挽回的局面。毕竟,代码是人写的,漏洞也很难被彻底避免,因此需要项目方在合约部署上线前就做好充分的测试和第三方安全审计工作,这会帮助其更早发现并排查合约代码潜在的安全漏洞,不至于等到,漏洞发生后,亡羊补牢,为时已晚。

标签:BASEBASEBASEREBASEmilestoneBasedswftc币上线coinbaseCubeBaseREBASEAPY

火必交易所热门资讯
OKEx关于永续合约系统升级的公告

尊敬的OKEx用户: 为提升永续合约系统性能,我们将在以下时间进行系统升级: 合约 升级时间 升级时长 MetaBox将联合Pokemon推出限量版NFT:据官方消息,MetaBox已成立MetaDAO基金用于DAO管理和慈善事业.

1900/1/1 0:00:00
以太坊2.0时代,再次引爆代币质押?

最近有区块链企业推出了一款名为“KlayStation”的KakaoKlaytn加密货币KLAY质押服务,质押期最短一周,可获得18%的超高年化收益率.

1900/1/1 0:00:00
慧子:8.15比特币突破震荡,牛市是否开启?

慧子:8.15比特币突破震荡,牛市是否开启? 消息面: 据中国经营报8月15日消息,阿里云MVP马超向表示,央行数字货币确实给金融设备商带来机会,由于其将支持离线交易而且可控匿名,这意味着DCEP的受理,将需要专门的硬件设备支持.

1900/1/1 0:00:00
关于ZT暂停TRB提币的公告

尊敬的ZT用户: 因TRB短期内区块拥堵严重,ZT现已暂停其提币业务,维护完成后将恢复正常。具体恢复时间请关注官网公告,由此给您带来的不便敬请谅解.

1900/1/1 0:00:00
库币合约-合约乱斗生存指南

看K线,买涨跌,全球用户在线Battle。库币合约首创入门级合约交易——合约乱斗,如何成为乱斗明星,赢得乱斗奖金,合约乱斗生存指南解答你的所有问题.

1900/1/1 0:00:00
8月15日比特币行情:比特币等待突破12000美元

早间资讯 永续合约数据:多空持仓比为2.43多头呈压倒态势据交易大数据显示,截至8月15日9:00,BTC永续合约报价11935.1美元,较现货价格高17.7美元,合约价格保持升水状态,较昨日升水大幅下降;多空持仓比为2.43.

1900/1/1 0:00:00