请选择 进入手机版 | 继续访问电脑版
查看: 48|回复: 3

随机数漏洞问题严重制约EOS、波场、ETH发展,chain33让你更...

[复制链接]

146

主题

148

帖子

541

积分

高级会员

Rank: 4

积分
541
发表于 2019-4-21 20:53:08 | 显示全部楼层 |阅读模式
[color=rgba(0, 0, 0, 0.88)]公链安全
[color=rgba(0, 0, 0, 0.88)]目前安全形势最集中爆发于EOS上,几乎每天都会爆发安全攻击,甚至每天爆发多起安全事件,被戏称为"黑客提款机"。被攻击的大多数是“菠菜”类游戏,一大部分又与随机数有关。而Tron在近期也首次遭到攻击,漏洞也是随机数问题。
[color=rgba(0, 0, 0, 0.88)]以太坊之前也有过类似的合约漏洞和随机数问题.
[color=rgba(0, 0, 0, 0.88)]EOS和Tron遭受的随机数问题,目前很难得到有效的办法,而EOS和Tron的竞猜类游戏占了很大的比重,这可能会对未来的发展趋势造成一定的影响。
[color=rgba(0, 0, 0, 0.88)]安全问题频发 EOS的dapp成黑客提款机
[color=rgba(0, 0, 0, 0.88)]


[color=rgba(0, 0, 0, 0.88)]金色财经不完全统计EOS安全事件
[color=rgba(0, 0, 0, 0.88)]正向看,菠菜游戏背后的逻辑、规则、玩法最适合在区块链上用智能合约运行;逆向看,菠菜开发简单、周期短、回本快。比如菠菜游戏开发只需要两周,其他游戏至少需要六个月。因此先开发出来的肯定都是菠菜游戏。但随着时间演化发展,肯定会io、卡牌、策略类等其他Dapp。
[color=rgba(0, 0, 0, 0.88)]


[color=rgba(0, 0, 0, 0.88)]在复杂美开源的Chain33区块链底层架构中,有一个共识模块叫作SPOS(safe pos),它通过Ticket实现POS的挖矿逻辑。
[color=rgba(0, 0, 0, 0.88)]在这篇文章中,我将详细讲解SPOS模块的实现原理,以及其解决随机数漏洞的方式。
[color=rgba(0, 0, 0, 0.88)]在Chain33的公链案例比特元中,用户使用钱包账户中BTY余额购票(挖矿权,目前10000个BTY可购买一票),一票对应一个唯一的TicketID,同时拥有一份挖矿权;一个区块只能由一票挖出,实际的挖矿几率各票均分(如全网有N张票,则一张票挖到矿的几率为1/N)。
[color=rgba(0, 0, 0, 0.88)]Ticket挖矿流程如下所示:
  • 钱包:定期检查账户中的BTY余额来购买票, 当满足购票条件后构造一条买票交易发往区块链
  • 共识:它会一直尝试使用本地持有的票去打包区块,一旦打包成功,是表示对应的Ticket持有人挖矿成功,并获得对应的区块奖励。
  • 智能合约:智能合约会把地址对应的票信息写入到区块链数据库,每一张Ticket都对应有一个唯一的TicketID,也会有一条数据记录在数据库。
[color=rgba(0, 0, 0, 0.88)]在区块链上为了体现公平性(针对游戏等应用场景),就需要一个不能被预测的随机数。
[color=rgba(0, 0, 0, 0.88)]目前的区块链大体有如下实现方案:
[color=rgba(0, 0, 0, 0.88)]1. 合约中调用外部中心化的随机数发生器获取随机数;
[color=rgba(0, 0, 0, 0.88)]2. 使用区块hash中的某些值作为随机数。
[color=rgba(0, 0, 0, 0.88)]但是这两种方案都有非常明显的弊端,原因在于:
[color=rgba(0, 0, 0, 0.88)]1. 区块链多节点之间智能合约执行结果是要求强一致的,如果合约从外部读取数据,是很有可能获取到不同结果的(比如网络原因导致有的节点读取正常,有的返回错误)进而导致分叉。
[color=rgba(0, 0, 0, 0.88)]2. 区块的哈希可以被控制,导致随机数被控制。比如EOS,没有提供很好的随机数算法,所以很多Dapp开发者会自己封装自认为完美的随机数算法导致随机数被预知。
[color=rgba(0, 0, 0, 0.88)]例如以下两个例子:
  • Eosbet第一次随机数攻击:这个游戏在开奖时使用了EOS中一个名为ref_block_num的随机数因子,但是在游戏开奖时合约中还是读取了老区块中的值,导致随机数被预知,进而被攻击。
  • Eosbet第二次随机数攻击:在修改了上一次的问题后,开发者再引入了一个新的参数:用户余额作为随机数因子。然而攻击者利用这一点,模拟完全一样的DApp代码,然后不停修改余额去尝试开奖逻辑,直到碰撞出开奖结果,进而又遭到攻击。
[color=rgba(0, 0, 0, 0.88)]还有其它很多EOS上的游戏遭受了类似手段的攻击,造成大量的损失。
[color=rgba(0, 0, 0, 0.88)]下面,我们就来着重讲讲如何实现在随机数上的优化。
[color=rgba(0, 0, 0, 0.88)]首先,用户使用钱包账户中的BTY购买票(Ticket),10000BTY对应一票。钱包同时生成一个randNum,哈希过后再结合钱包挖矿地址的私钥,票对应的index(一次可以买多张票)等元素再做两次哈希,得到一个公开哈希参数(pubHash):
[color=rgba(0, 0, 0, 0.88)]pubHash =
[color=rgba(0, 0, 0, 0.88)]hash(hash(privateKey:index:hash(randNum)))
[color=rgba(0, 0, 0, 0.88)]然后,新购买的票中包含这个pubHash以及randNum并存入区块链,这张票有12小时的成熟期,过了12小时才可以参与挖矿。
[color=rgba(0, 0, 0, 0.88)]接着共识算法从区块链中找到已经成熟的票(Ticket)开始打包,由于共识打包区块操作只在节点本地执行,所以它可以读取本地存储的私钥,算出一个私密哈希(privHash)并将这个参数放入到挖矿交易中:
[color=rgba(0, 0, 0, 0.88)]privHash =
[color=rgba(0, 0, 0, 0.88)]hash(privateKey:index:hash(randNum))
[color=rgba(0, 0, 0, 0.88)]最后,智能合约收到挖矿交易,对比hash(privHash)pubHash的值,两者一致挖矿交易成功,对应的节点获得挖矿奖励。否则挖矿交易执行失败。
[color=rgba(0, 0, 0, 0.88)]最后总结一下,SPOS共识的实现结合了随机数,由于一般情况下是无法预测其它节点的共识信息,所以也无法获取到它的共识随机数。
[color=rgba(0, 0, 0, 0.88)]并且系统设定私密哈希(privHash)不能提前泄露,就算有恶意矿工自己提前暴露,它对应的票也会被作废,同时本金会被冻结较长时间(2天以上)。
[color=rgba(0, 0, 0, 0.88)]再加上系统设定票需要经过12小时的成熟期后才可以参与挖矿。这些条件组合起来,系统的随机数几乎是无法被操控的。这样当开发者实现的DApp中需要保证公平随机时,就可以直接使用系统提供的这个安全的随机数了。

回复

使用道具 举报

13

主题

4万

帖子

4万

积分

论坛元老

Rank: 8Rank: 8

积分
42483
发表于 2019-4-21 20:53:31 | 显示全部楼层
有竞争才有进步嘛
回复

使用道具 举报

20

主题

4万

帖子

4万

积分

论坛元老

Rank: 8Rank: 8

积分
43568
发表于 2019-4-21 21:13:49 | 显示全部楼层
沙发!沙发!
回复

使用道具 举报

7

主题

4万

帖子

4万

积分

论坛元老

Rank: 8Rank: 8

积分
45208
发表于 2019-4-21 21:34:35 | 显示全部楼层
不错,支持下楼主
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册 微信登录

本版积分规则

快速回复 返回顶部 返回列表