Home Blockchain Solidity漏洞 熵的错觉
Post
Cancel

Blockchain Solidity漏洞 熵的错觉

在以太坊区块链上的所有交易都是确定性状态的转换操作。这意味着每一笔交易都改变了全球的以太坊生态系统状态,并且是以一种可计算的方式进行,没有任何的不确定性。

这意味着,在区块链生态系统内部没有熵或随机性的来源,在Solidity中也没有rand()函数。实现去中心化熵(随机性)是一个已经确立的问题,并且已经提出了许多解决这个问题的想法(例如,RandDAO,或者使用Vitalik在自己的博文中所描述的一系列哈希)。

坑点分析

在以太坊平台上建立的第一批合约中,有一些是关于赌博的。从根本上讲,赌博的根本在于不确定性,这使得在区块链(确定性模型)上建立一个赌博系统相当困难。很明显,不确定性必须来自区块链外部的一个源。

这对于同行之间的赌注是可能的,但是,如果你想要执行一个合约来充当一个赌桌(就像在我们的赌场里玩21点一样),显然是十分困难的。一个常见的陷阱是使用未来的区块变量,例如hash、timestamps、blocknumber 或 gas limit。

问题在于,这些变量是由矿工控制的,他们在区块上挖矿,因此并不是真正随机的。例如,考虑一个具有逻辑的轮盘赌智能合约,如果下一个区块哈希以偶数结尾,则返回一个黑数。

一个矿工(或矿工池)可以押注100万美元买黑数。如果他们解决了下一个区块,发现哈希末尾是一个奇数,他们会很乐意不发布这一区块并挖掘下一个块,直到他们找到一个解决方案发现区块哈希尾数是偶数(假设悬赏和费用低于100万美元)为止。

使用过去或现在的变量可能会更具破坏性,此外,使用单个区块变量意味着在一个区块中所有交易的伪随机数都是相同的,因此攻击者可以在一个区块内进行许多交易。

避坑技巧

熵的来源必须是区块链的外部。这可以在具有诸如commit-reveal之类系统的对等体之间完成,或者通过将信任模型改变为一组参与者(例如在RandDAO中)来完成。不过区块变量不应该用做源熵,因为它们可以被矿工操纵。

真实案例:PRNG合约

关于这个案例,以下博客文章有详细分析:

https://blog.positive.com/predicting-random-numbers-in-ethereum-smart-contracts-e5358c6b8620

This post is licensed under CC BY 4.0 by the author.