首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

每个区块人都应该知道的“随机数”技术揭秘

随着区块链的蓬勃发展,各种功能的合约也层出不穷,有很多博彩合约吸引了大家的眼球。

在区块链上的博彩大家认为是公平、公开、公正的,现实世界中的博彩是不可能做到这一点的。

很多博彩合约中涉及到了随机数,依靠随机数来完成合约的最终开奖,可以说随机数的安全与否左右了博彩合约是否安全。

想必大家也看到或者听说了一些随机数不安全的案例,一些投机分子利用随机数的一些漏洞非法的获取了大量的财富,这是所有热爱区块链的人士不愿意看到的。那么到底有没有一种真正安全且公平、公开、公正的随机说方案呢?那我们就来看看合约随机数的前世今生,剖析问题背后的真相。

01 张局解析「随机数」

在计算机中存在的随机数基本上都是伪随机,就是利用种子通过一定的算法得到一个随机数,只要种子相同,算法相同,那么最终得到的随机数也是相同的。

其实也存在一种真随机数,就是利用一些电子元件的噪音等产生的随机数就是真随机数

个人认为在区块链的博彩合约中,随机数随不随机其实不是那么重要,只要是大家都不知道,无法预测且不被人操纵的数字就是好的随机数。

案例一:EOS.WIN竞猜游戏的案例

EOS.WIN 的猜数字游戏玩法,用户可以任意选取一个数字,系统会根据用户所选大小给出相应赔率,然后系统会随机给出一个数字,如果结果和用户的大小选择匹配则视为中奖,获得金额为投入金额乘以赔率。

▲猜数字类游戏的运作流程示意图

该合约的随机数是通过 get_random 函数获得,影响该随机数生成的因素有:txid 为交易哈希 ID, tapos_block_num成交块高度, tapos_block_prefix 区块 ID 前缀, bet_id 全局开奖序号等,bet_id是每开一次奖加1。

攻击者部署了6个攻击合约,让这些账号同时发送交易请求,确保这些交易在一个块中,这样就获得了tapos_block_num和tapos_block_prefix,那么再获取到bet_id变量就可以确定随机数了。

攻击者的前5攻击合约在收到通知时可以获得bet_id,并判断该bet_id能否能让最后一个账号中奖。如果计算结果是最后一个账号不能中奖,则开奖通知正常执行,后面的账号用新的bet_id开奖。如果计算结果是最后一个账号中奖了,则使该账号开奖通知失败,最后一个账号来开奖就中奖了。因为最后一个账号的投注是比较大的,所以这样攻击者获得的收益就多。

这个方法虽让不能百分之百中奖,但是其中奖概率已经达到了60%以上,已经是很高了。

正是因为攻击者获取到了生成随机数的种子,才会预测到开奖结果的。

案例二:EOSDice的案例

EOSDice用到的随机数种子有,tapos_block_prefix,tapos_block_num,name(user账户名),game_id(自增),current_time(当前时间),pool_ol_eos.amount (合约当前的余额)。和上一个案例一样,tapos_block_prefix和tapos_block_num是比较容易获得的,开奖时间是可以根据delay时间推算得到,开奖时间是可以根据delay时间推算得到,这样就可以计算出最终的随机数。

通过上面两个案例,不难看出是随机数的种子被攻击者千方百计的得到了,最终得到了随机数。所以由合约提供随机数是永远逃脱不了被攻击的厄运,其实有区块链提供随机数才是一种比较好的方案。

02 「随机数」的坑怎么填

目前BOSCore 技术白皮书中就提供了一种随机数的方案,如下截图:

目前看这个方案总体来讲还是比较好的,但是存在BP操控随机数的巨大风险。比如BP想做恶,那么它提前一轮便可以预测到自己打包的时间,通过调整global_action_sequence来获取到自己想要的随机数,然后自己在某一个投注合约中投注,这样BP就会获取巨大的利益。所以BOSCore的随机数方案并不是一个很好的,能让人信服的随机数方案。

有人说公链上提供不了随机数,理由是这样的。假设合约里可以生成随机数,那么该合约执行结果就是完全具备随机可能了,其他节点完全无法直接验证该执行结果是否合法。不诚实的节点直接可以自行随便指定一个数字,或者不停重新计算,直到该节点得到一个对自己有利的数字,再打包到区块中。因为字节码在不同的节点的虚拟机验证执行过程上,得到的随机数都是不同的,虚拟机完全无法的确定该结果是否合法。

这种结果很显然在设计上是不被接受的。

公链节点通过打包区块来实现数据存储,数据需要非常高的确定性,因此在公链上是没办法得到一个随机数的。

其实前面我们说过,在区块链中随机数并不是一定要随机,只要不可预测,不可操纵就可以了。

那么是否会存在一个真正安全且公平、公开、公正的随机说方案呢?我想在不久的将来一定会有一条公链上出现更好的随机数方案,大家拭目以待吧。

Website

https://www.celeschain.io/

Telegram Group

https://t.me/celeschain

Twitter

https://twitter.com/CelesChain

Reddit

https://www.reddit.com/user/CelesChain

Medium

https://medium.com/@CelesChain

Facebook

https://www.facebook.com/celeschain

Youtube

https://www.youtube.com/channel/UC1Xsd8wU957D-R8RQVZPfGA

商业白皮书下载

https://dn-release.qbox.me/pdf/Celes-Chain-Business-Plan_en.pdf?v=1531279736435

技术白皮书下载

https://dn-release.qbox.me/pdf/Celes-Chain-WhitePaper_en.pdf?v=1531278564014

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20190107G11K7100?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券