首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

开发必读! 手把手教你如何用SPOS解决EOS随机数漏洞

  • 24-03-05 03:21
  • 2334
  • 6707
blog.csdn.net

640?wx_fmt=gif

640?wx_fmt=jpeg

作者 | 复杂美区块链

出品 | 区块链大本营(blockchain_camp)

 

 

经过2018一整年的发展,区块链的应用落地普遍增加,在公链领域中备受瞩目的链上应用DAPP开发也随着EOS主网的开源而白热化。

 

根据DappReview平台统计,EOS 2019年第一季度的DAPP交易额达$1.72B,活跃用户达274.93K,交易笔数达282.99M。

 

可伴随着这漂亮数据而来的却是EOS Dapp智能合约漏洞问题,其中大部分成功攻击的原因都和随机数漏洞有关,那如何优化这个问题呢?

 

 

 

在复杂美开源的Chain33区块链底层架构中,有一个共识模块叫作SPOS(safe pos),它通过Ticket实现POS的挖矿逻辑。

 

在这篇文章中,我将详细讲解SPOS模块的实现原理,以及其解决随机数漏洞的方式。

 

在Chain33的公链案例比特元中,用户使用钱包账户中BTY余额购票(挖矿权,目前10000个BTY可购买一票),一票对应一个唯一的TicketID,同时拥有一份挖矿权;一个区块只能由一票挖出,实际的挖矿几率各票均分(如全网有N张票,则一张票挖到矿的几率为1/N)。

 

Ticket挖矿流程如下所示:

  • 钱包:定期检查账户中的BTY余额来购买票, 当满足购票条件后构造一条买票交易发往区块链。

  • 共识:它会一直尝试使用本地持有的票去打包区块,一旦打包成功,是表示对应的Ticket持有人挖矿成功,并获得对应的区块奖励。

  • 智能合约:智能合约会把地址对应的票信息写入到区块链数据库,每一张Ticket都对应有一个唯一的TicketID,也会有一条数据记录在数据库。

     

在区块链上为了体现公平性(针对游戏等应用场景),就需要一个不能被预测的随机数。

 

目前的区块链大体有如下实现方案:

1. 合约中调用外部中心化的随机数发生器获取随机数;

2. 使用区块hash中的某些值作为随机数。

 

但是这两种方案都有非常明显的弊端,原因在于:

1. 区块链多节点之间智能合约执行结果是要求强一致的,如果合约从外部读取数据,是很有可能获取到不同结果的(比如网络原因导致有的节点读取正常,有的返回错误)进而导致分叉。

2. 区块的哈希可以被控制,导致随机数被控制。比如EOS,没有提供很好的随机数算法,所以很多Dapp开发者会自己封装自认为完美的随机数算法导致随机数被预知。

 

例如以下两个例子: 

  1. Eosbet第一次随机数攻击:这个游戏在开奖时使用了EOS中一个名为ref_block_num的随机数因子,但是在游戏开奖时合约中还是读取了老区块中的值,导致随机数被预知,进而被攻击。

  2. Eosbet第二次随机数攻击:在修改了上一次的问题后,开发者再引入了一个新的参数:用户余额作为随机数因子。然而攻击者利用这一点,模拟完全一样的DApp代码,然后不停修改余额去尝试开奖逻辑,直到碰撞出开奖结果,进而又遭到攻击。

     

还有其它很多EOS上的游戏遭受了类似手段的攻击,造成大量的损失。

 

下面,我们就来着重讲讲如何实现在随机数上的优化。

 

首先,用户使用钱包账户中的BTY购买票(Ticket),10000BTY对应一票。钱包同时生成一个randNum,哈希过后再结合钱包挖矿地址的私钥,票对应的index(一次可以买多张票)等元素再做两次哈希,得到一个公开哈希参数(pubHash):

pubHash = 

hash(hash(privateKey:index:hash(randNum)))

 

然后,新购买的票中包含这个pubHash以及randNum并存入区块链,这张票有12小时的成熟期,过了12小时才可以参与挖矿。 

 

接着共识算法从区块链中找到已经成熟的票(Ticket)开始打包,由于共识打包区块操作只在节点本地执行,所以它可以读取本地存储的私钥,算出一个私密哈希(privHash)并将这个参数放入到挖矿交易中:

privHash = 

hash(privateKey:index:hash(randNum))

 

最后,智能合约收到挖矿交易,对比hash(privHash)和pubHash的值,两者一致挖矿交易成功,对应的节点获得挖矿奖励。否则挖矿交易执行失败。

 

最后总结一下,SPOS共识的实现结合了随机数,由于一般情况下是无法预测其它节点的共识信息,所以也无法获取到它的共识随机数。

 

并且系统设定私密哈希(privHash)不能提前泄露,就算有恶意矿工自己提前暴露,它对应的票也会被作废,同时本金会被冻结较长时间(2天以上)。

 

再加上系统设定票需要经过12小时的成熟期后才可以参与挖矿。这些条件组合起来,系统的随机数几乎是无法被操控的。这样当开发者实现的DApp中需要保证公平随机时,就可以直接使用系统提供的这个安全的随机数了。

 

 

*关于作者:

复杂美区块链(www.33.cn)成立于2008年,累计申请200多项区块链发明专利,全球排名前10。拥有自主研发的区块链底层架构Chain33,从2018年11月开源至今,其首创的平行链架构被百度、阿里、360等机构认可与研究,并登录微软azure市场。

 

扫码报名 | 免费技术公开课

不一样的拜占庭容错,不一样的故事,不信来听!

640?wx_fmt=jpeg

 

推荐阅读:

  • 4000万假币流入波场, 发生在凌晨的BTT假币攻击事件始末及细节披露

  • 微软加速器檀林: 5G 会催生一个新的 Web3.0时代 | 视频访谈

  • V神玩起freestyle! 5位以太坊核心大咖在悉尼的演讲精华全在这了!| 直击EDCON

  • 刘强东割袍弃兄弟,马爸爸醉心 996

  • 谁说国产操作系统没救了? | 人物志

  • 39个国外SCI抢发6万篇中国英文论文?然而,真正的问题是……

  • 终于有人把5G和边缘计算的关系说清楚了  | 技术头条

  • 曝光!月薪 5 万的程序员面试题:73% 人都做错,你敢试吗?

 

猛戳"阅读原文"有惊喜哟smiley_12.png

 

老铁在看了吗??

注:本文转载自blog.csdn.net的区块链大本营的文章"https://blog.csdn.net/Blockchain_lemon/article/details/89315091"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2025 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top