首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

SMT输给了加法,BEC输给了乘法

现在进一定要关注场景落地,能过场景落地的项目可以做公链,做公链的项目不一定能场景落地。

背景:

凌晨有人在群里说,SMT代码有bug,也有人说不是smt的bug是以太的bug。昨天还涨40%呢,多少人追高进了SMT,今天怎么突然就来这档子事,几大交易所紧急停牌。开源链的兄弟们坐不住了,爬下代码呗。下面带大家看看超过全世界资产的币是怎么发出来的。

Etherscan链接如下:

通过bug获得了

$5,781,066,242,685,680,000,000,000,000,000,000,000,000,000,000,000,000,000,000.00

+ $4,496,384,855,422,190,000,000,000,000,000,000,000,000,000,000,000,000,000,000.00

的美金,瞬间全世界都属于这个黑客的了。

下面带大家看看超过全世界资产的币是怎么发出来的!

函数整体逻辑是

A同学转SMT币给B同学,但是没有以太gas; A同学找C同学帮忙,给C SMT币,C同学出以太gas帮助A同学把SMT给B同学。这个功能好坏暂不评论,可以看出产品经理应该是处女座的。

简而言之:

A同学需要转出的钱 = B同学收到的钱+C同学帮忙付的手续费。

代码同学会判断 A同学钱包中的余额 >= B同学收到的钱 + C同学帮忙付的手续费

对应如下合约代码红框部分:

意思是如果 A同学钱包中的余额

就退出程序。逻辑是没有错的。

这里还需要了解value 和 feeSmt的 数值类型是 uint256。程序员在编代码的时候想2的256次方总够了吧(是1.157*10的77次方)。可见宇宙的原子数是10的80次方。可是欲望限制了想象力,一般程序员的欲望不够强烈。黑客输入了两个数字溢出了uint256的取值范围。

输入值分别为:

50,659,039,041,325,800,000,000,000,000,000,000,000,000,000,000,000,000,000,000.69300

两个数字的和超过了2的256次方,在计算机中会取后256位,把第257位的1给抹掉了,这个数恰巧又满足小于账余额。 同学们可能听晕了,我们简化一下,用8位字节来测试一下。

大家都知道8位的最大值是255,如果大于255回重新计算。举例,200+56 结果不为56,为0。以太测试代码和结果如下,其中 a = 200+56, 显示结果为0。

过了这道坎后面的代码就一马平川了。最终这句代码也顺利按照上面的被蒙混过关,居然又把两个大数加在一起溢出,如果程序员分两行写就好很多。

Balances[_from] = Balances[_from] – _ value;

Balances[_from] = Balances[_from] – _feeSmt;

以太编程时发现Balances小于0会报错。

两句加法毁了SMT,不过今天的SMT走势比大部分币要好,熔断停牌了。其他币遇上大回调,期待SMT团队给出解决方案。

前段时间的美链BEC出在乘法错误上,同样也是溢出。

Bug代码如下:

我们还是用 unit8 八位字节来测试。 26*10 结果 为 4。

测试代码如下

运行结果如下

预计区块链会掀起全民学习代码的高潮,加法减法的bug居然能导致几十亿上百亿的损失。开源链致力代码,电路图,电子设计方案,工业设计方案的开源,让开源资料通过社区的力量修正,演进,进化,创新,让开源者获得回报,让有才华的工程师轻松解决生存问题,做自己感兴趣的事,建立芯片生态,操作系统生态。让区块链的资金用于芯片和操作系统开发,应用,建立开源生态,打破行业垄断。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180425G1R9RI00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券