内容整理自 北京大学肖臻老师《区块链技术与应用》公开课 ETH-25-美链
智能合约中又一安全漏洞的例子,于2018.04发生的事件,这个智能合约叫做美链(Beauty Chain)。
美链是在以太坊平台上发行的代币,以太坊上有很多发行各种代币的。这些发行的代币没有自己的区块链,而是以智能合约的形式运行在以太坊的平台上。发行代币的智能合约对应的是以太坊状态树中的一个节点,这个节点有它自己的账户余额,就相当于这个智能合约一共有多少个以太币,发行代币的智能合约总的以太币数量,然后在合约里每个账户上有多少个代币这个是作为存储树中的变量存储在智能合约的账户里,代币的发行转账销毁都是通过调用智能合约中的函数来实现的。这个也是和以太坊上的以太币不一样的,不像以太坊那样需要通过挖矿来维护底层的一个基础链,以太坊上每个账户有多少个以太币,是直接保存在状态树上的变量。以太坊上两个账户之间转账,是通过发布一个交易到区块链上,代币要转账的话实际上就是智能合约上两个账户之间通过调用智能合约的函数来完成的。每个代币可以制定自己的发行规则。以太坊平台的出现为代币的发行提供了很大的方便,比如EOS,用的是DPOS的权益证明机制达成共识,在上线之前也是作为以太坊上代币的形式发行的,上线之后有自己的基础链,转账交易可以用自己的基础链来完成,不用依附在以太坊上。

batchTransfer的实现:
两个参数:第一个是代币接收者的地址,是一个数组,接收者的数目最多是20个;第二个参数是转账的金额,每个人转多少。
先算出总金额,然后检查发起调用的账户确实有这么多代币,从发起账户的代币数目减去总金额,用循环给每个接收者发送value数量的代币。
问题在于红框中的函数,计算乘法的时候,如果value的值非常大,乘法有可能溢出,溢出之后算出的amount可能是一个很小的值。所以从调用者账户上减的是很小一部分代币,下面仍然是按照很大的value给每个接收者增加代币,最后造成系统中凭空发行了很多代币。

攻击时调用的函数参数:

攻击时区块的情况:
红框里面是发生攻击时两个接收的地址,每个地址都是接收了很大的一串代币。



反思:在进行数学运算时,一定要考虑溢出的可能性。

858

被折叠的 条评论
为什么被折叠?



