现在进一定要关注场景落地,能过场景落地的项目可以做公链,做公链的项目不一定能场景落地。
背景:
凌晨有人在群里说,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居然能导致几十亿上百亿的损失。开源链致力代码,电路图,电子设计方案,工业设计方案的开源,让开源资料通过社区的力量修正,演进,进化,创新,让开源者获得回报,让有才华的工程师轻松解决生存问题,做自己感兴趣的事,建立芯片生态,操作系统生态。让区块链的资金用于芯片和操作系统开发,应用,建立开源生态,打破行业垄断。
领取专属 10元无门槛券
私享最新 技术干货