在去中心化应用(DApps)和智能合约的世界里,随机数扮演着至关重要的角色,从游戏中的道具掉落、卡牌抽签,到彩票抽奖、密码学证明,乃至于共识机制中的某些环节,都需要一个“公平、不可预测、可验证”的随机数源,在一个由无数节点共同维护、所有代码和数据公开透明的区块链网络上,生成这样的随机数远比在中心化服务器中复杂,以太坊,作为全球最大的智能合约平台,其随机数发生器(Random Number Generator, RNG)的设计与实现,一直是开发者社区关注的焦点和挑战。
为什么以太坊上的随机数如此难搞?
在中心化系统中,随机数可以很容易地从硬件噪声或安全的伪随机数生成器中获得,并且结果可以暂时保密,但在以太坊这样的公开、去中心化环境中,随机数面临几个核心难题:
- 可预测性:如果随机数是由智能合约在特定区块的特定时间(如
blockhash或block.timestamp)生成的,那么恶意参与者(如矿工/验证者)在知道即将发生的计算结果前,可能会利用信息优势进行“前置运行”(Front-running)或“自私挖掘”,从而影响随机结果的公平性,在一个基于区块哈希的抽奖中,矿工可以在计算出该区块哈希后,决定是否将自己的交易包含在区块中,或调整交易顺序以使自己中奖。 - 可操纵性:由于区块链的透明性,如果随机数生成算法依赖于未来尚未发生的信息(如下一个区块的哈希),那么任何能影响该信息生成的实体(如矿工池)都可能对结果进行操纵。
- 可验证性:随机数不仅要公平,还需要让所有参与者能够验证其生成过程是公正的,且结果没有被篡改,这要求随机数的生成过程和结果都应记录在区块链上,并易于验证。
- 延迟性与成本:一些复杂的随机数方案可能需要多个确认区块,这会增加延迟和交易成本。
以太坊上常见的随机数发生器方案
为了应对上述挑战,社区发展出了多种随机数生成方案,各有优劣:
-
基于区块哈希(Blockhash)的方案:
- 原理:使用当前区块的哈希值(
blockhash(block.number - 1))作为随机数源,由于区块哈希在生成前是不可预测的,理论上提供了随机性。 - 优点:简单、直接、无需额外成本。
- 缺点:仅在区块被“最终确认”(如以太坊的12个区块确认后)后才安全,在此之前存在矿工操纵风险,且每区块只生成一个哈希,无法满足高频随机需求。
- 原理:使用当前区块的哈希值(
-
基于未来区块哈希的承诺方案(Commit-Reveal Scheme):
- 原理:
- 承诺阶段:参与者生成一个随机数,计算其哈希值(或使用加密承诺如KZG承诺),并将该哈希值提交到智能合约。
- 揭示阶段:在未来的某个区块,参与者揭示其原始随机数,智能合约验证该随机数的哈希值与提交的哈希值一致,然后将所有揭示的随机数进行某种组合(如异或、求和)作为最终随机数。

- 原理: