使用区块链技术生成随机数的三种方案解析
扫描二维码
随时随地手机看文章
众所周知,区块链技术的核心特点,就是任何数据存储到区块链网络后,这些数据,以及对数据的操作过程,都是不可篡改,不可删除,不可销毁的,同时对所有人都是透明可查阅的,所以可以信任该数据的真实性,可靠性。通过这个技术特点,区块链技术可以帮助商业社会解决问题之一,就是公平性的问题。
公平性,就是指所有人都被公平地对待,即请求都被同等概率地选中、执行;在多人竞争一个利益时,在统一的规则下,人人都有同样地机会参与竞争,并被同等对待。
在现实世界中,存在无数的核心是“公平性”的商业行为,比如车牌的摇号、买房的摇号、彩票的摇奖,卡牌游戏中的抽牌,德州扑克等牌类游戏的发牌等等。在传统的技术手段下,往往由于技术的限制,导致过程的不透明,从而让参与的各方产生非常大的争议和诟病。比如针对常见的抽卡类游戏(Gacha),游戏的机制之一就是通过花费法币抽卡牌,卡牌根据珍稀程度不同(也就是抽中的概率不同)从而能力不同,越稀有的卡牌能力越强,而玩家就会经常抱怨某种珍惜卡牌抽到的概率太低。针对这个问题,2016年中国文化部特意发布了《关于规范网络游戏运营加强事中事后监管工作的通知》,该通知中首次表示:2017年5月1日起,网络游戏运营企业应当及时在该游戏的官方网站或者随机抽取页面公示可能抽取或者合成的所有虚拟道具和增值服务的名称、性能、内容、数量及抽取或者合成概率。但这个规定是否严格执行,由于所有的程序都是运行在游戏厂商的服务器上,所以只能靠游戏厂商的自觉来保证执行,玩家只能信任或依赖厂家。
我们采用区块链技术通过实现两点改变,就可以完美的解决这个问题:
1.将游戏的抽卡业务逻辑完整的基于智能合约实现,落地到公链上;
2.将抽卡逻辑中的随机数生成逻辑基于区块链技术实现,落地到公链上;
通过这两点,抽卡的逻辑在编写完成后,将不可篡改,不可销毁,可以供网络上所有人进行检查和校验,同时所有的运行结果也将被记录,游戏厂商完全无法对运行结果进行干预和操纵。
为了实现公平性,首先,抽卡业务的智能合约应该运行在一个完全的去中心化的区块链公链之上,避免类似中心化或半中心化技术中存在的人为因素的干扰,其次,该随机数生成机制也必须是不存在漏洞和公平的。
其中保证第一点的实现,就是选择一条真正去中心化架构的公链即可,而第二点是我们今天想重点讨论的,如何在区块链上实现一个公平和无漏洞的随机数生成服务。
在区块链上实现随机数生成服务,我们可能可以有三种技术方案:
1.引入外部真随机数源:
CPU里通常会有真随机数生成器(Ture Random Number Generator,简称TRNG)。真随机数生成器通常是通过放大电路的热噪声来产生随机数。我们知道温度高于绝对零度的原子都存在热运动,在集成电路里这些原子的热运动会在电路里产生噪声,噪声会使得电路中的电压存在微小的起伏,TRNG就是通过放大这些微小的起伏来产生随机数。但是,这种随机数的生成方式是一种中心化的方式,在区块链上并不适用,因为除了随机数的生产者外,其他人无法证明该随机数的生成是否是可信的,还是被杜撰的;无法在众多节点中对该随机数的真伪达成共识;
2.通过区块链系统中的公开种子生成:
区块链输入有两个,交易和矿工引入的nonce。对于PoW,nonce是为了帮助PoW能产生符合本轮要求的hash值,矿工本身需要的计算强度很高,假如想对nonce操纵的话,相当于加上额外的约束进行挖矿,挖矿难度会极大的增加。而假如采用块头作为随机源,因为矿工每次生成块头的成本很高,所以很难多次尝试。但是在算力比较少的PoW公链上,生成块头的成本比较低,随机数的安全性就会大大下降。而且PoW有分叉的可能,所以最后生成的随机数需要足够长的确认时间,导致随机数的实时性不够。
而在pos的链上,用块头的安全性,已经不存在了,因为该nonce可以只是简单的块高,生成块头的成本几乎为0.因而节点可通过不断修改交易组合,尝试生成不同的随机数。因而类似EOS块头为基础生成的随机数,都是容易被操纵,非常危险的。
其中最常见的就是EOS在随机数方面存在的漏洞。如下是常见的链上伪随机数算法:
如何在区块链上实现随机数生成服务
以及广泛被引用的github代码:
以上案例,都有一个共同的特点,就是采用了 tapos_block_prefix, tapos_block_num 做为随机数种子。
但是这两个值,其实是依赖于过去的区块经过确定性逻辑生成随机数,因而区块生成者就可以通过不断尝试打包的交易内容,甚至伪造虚假的交易,操纵最终生成的随机数。
比如针对使用了以上这些存在随机数漏洞的胜率类的游戏,攻击者完全可以提前计算好结果,赢的时候投注,输的时候不投注,从而保证百分百胜率。
总的来说,所有以用户输入作为随机源的随机数,都是有漏洞的。因为输入是可以被修改的,输入的数量和组合是可以被节点控制的,所以节点完全有动机和能力将随机数改为适合自己的组合。
3.整合多用户的主观随机源生成:
还有一种随机数的生成方案,就是尝试整合不同用户的主观随机源作为随机数种子。典型的就是让多个用户各自提交自己的随机数,然后节点将所有提交的随机数组合生成最终的随机数。考虑到多个随机源的相互独立性,理想情况下最终结果依然是随机的。
这种方案从设计角度来说可靠性很高,但是在实现过程中依然存在如下问题:
- 多个用户可能相互观察,判断是否提交随机数,导致先提交的人有暴露风险。此问题目前通过惩罚机制解决。
- 节点可能故意打包某些对最终结果有利的随机数。这涉及到共识的公平性问题,任何基于dpos共识的区块链系统都无法保证,因为参与共识的节点数少,所以节点可能合伙作恶即串谋,而且最坏情况是,所有提交的随机数生成交易都是由坏的共识节点自身控制的客户端,导致随机数结果完全被控制,而且这种作恶情况完全无法被观察到。Tendermint或者联盟链有同样的问题。
对此,Ultrain结合自身RPOS共识算法的特点,设计了自己的随机数生成算法,避免了上述问题,下面概述Ultrain随机数生成的过程:
l建立随机数生成委员会,该委员会是一个开放的结构,其成员可随时加入和随时退出,所有想参与随机数生成的成员,都通过注册制注册为该委员会成员,同时将公钥注册到随机数生成智能合约里。
l每轮共识时间内(Ultrain为10秒),委员会成员提交本轮自己生成的随机数,该随机数要求必须通过VRF(可验证随机函数)结合该成员的私钥生成,从而避免随机数被控制。
l智能合约通过整合各成员提交的随机数形成一个随机种子,基于该种子生成随机数。
l对于注册参加的节点,不提交将受到惩罚。
该随机数生成的过程具有如下的优势:
1.足够随机:因为VRF的结果是足够随机的,用户的私钥是相互保密的,所以最终结果是随机的。
2.生成速度快:相比较基于块头的生成方式,Ultrain每轮随机数生成时间为10秒,不需要等待确认时间,只有其他公链的生成时间的十分之一。 类似Dfinity的方法,则需要组内成员相互通信和验证,通信复杂度、等待时间和防串谋的难度更高。
3.足够安全:因为委员会成员是开放的,参与人员也是完全不固定的,极大的降低了随机数结果被串谋的可能性。对于参与人员,VRF限制了可以提交的随机数的可能,防止被操纵。