区块链上面的随机数

太一讲区块链
讲师:李太一
2018-12-05 20:00

imagepng

我们今天要讲的话提的话是区块链上面的随机数:区块链赐予我们的礼物——随机数

其实这个随机数和我们平常在编程时所用到的随机数不太一样,最关键的话是我们需要从本质上来理解随机数是个什么样的东西,首先,我们在讨论随机数之前先来看整个宇宙发展的本质是随机的不可预计的,比方说我们宇宙大爆炸到今天会有地球出现,会有生物出现,这件事情本身是随机出现的,不是必然出现的,包括我们人类会长成什么样,基因会突变成什么样,会进化出什么东西,这条路也是不是受控制,也是随机的。
因为有了随机数的存在,所以无论是集团还是个体都有无限的想象空间在不断的激励我们向前探索,向前进步。所谓的随机数它的第一个基本定义就是无法被掌控的才是随机的,目前我们看到的所有的科学的本质都是在不确定的结果中寻找在相对时间内确定的结果。从某种意义上讲,我们可以认为,随机数构成了生命的意义,因为我们其实所有的活动和行为都是在用各种各样的方式来猜测下一个随机数。回过头来讲区块链的本质也是一个随机数,它只不过是通过一个特定的算法,让我们获得了从概率上讲不可能获取的一个随机数。
imagepng
举个例子,比方说比特币和以太坊的挖矿,这种 POW 系列的公链挖矿,他们本质就是对下一个随机数的猜测和穷举,正因为它是一个真正随机的随机数而且还附带价值,所以会吸引无数的人将其奉为信仰。
讲到这里,我先说一下现在在区块链领域随机数产生的方法:
第一个,也是不管任何区块链都所具备的一个功能,就是私钥签名。那么我们拿着自己的私钥对一串数字进行签名之后,它所生成的结果就是无法预测的。但是,这种做法有个问题,拿私钥对同样的内容进行签名,签出来的内容都是同样的。所以说就牵扯到拿私钥对哪些数据进行签名,那么从另外一个角度上讲,因为私钥是掌握在我们自己手里,所以对于我们在做一些项目,或者为用户提供一些随机数的时候,我们可以通过拿自己的私钥对一些数据进行签名,那么对用户看来就是透明的,不可预计的一个随机数。不可避免的这种方法呢,如果是一些比较懂区块链的用户,他们会觉得私钥在项目方手里,项目方项目方迁出的结果是已知的,那么项目方还是可以进行一些作弊的行为。所以说我们总结一下,私钥签名来获得随机数的方法对于项目方是有有一定保障的,对于用户来说它也是一个真正随机的随机数。
第二个在区块链上产生随机数的方法,它的核心思路就是我们把区块链当成一个生物的话它是有呼吸的,是有新城代谢的,那么每一次的呼吸或新陈代谢,就是它的产块行为,当它产块产出的内容,有足够的人参与的时候,我们就可以认为它是随机的,真随机的。当然这种方法对于某些人来说,他们会觉得这个产块,它是由固定的矿工来进行产块的,矿工在产块时还是会知道这个块的相关数据,他会比别人更早知道,那么所这个数据也不是一个真正的随机数。但是我们用这种思路进行思考时,比方说我们将未来,大家都达成一个统一的共识,我们将未来产出的第 N 个块的所有签名都拼在一起,然后再进行一次刷 256,我们对像这样的状态,因为每个块的产块者都不一样,参与者未知,那么在这种情况下,我们就可以认为在产出第 N 个块之后产生的数据是随机数那么说这些随机数一旦被产生出来之后,它在具体区块链应用中能够应用到那些领域中呢?我们来分享一下观点和想法。
从比较底层的方式进行思考,有了随机数,我们就可以用更加模拟自然的方式进行一次资产的分配。比方说,最近有个图灵奖的获得者研究了一个区块链算法,较 Rgrand,那么他之所以会在短时间内让大家都比较关注这件事情,是因为他也是通过社会学的理论,发明了随机数的产生方法,他的随机数使用在确定下一个块是由谁来产生的这个反面。
那么一旦我们保证了产块的产块人是随机的,那么我就间接保证了区块链的上的所有其他数据都是随机的。那么再具体的应用上,像现在 EOS,包括之前的以太坊,BTC 上都有一些很火的应用,就是竞猜类的一些产品,这些产品通过真正的随机,让一些用户为之疯狂,就是让用户觉得,通过这种对这种数字的随机预测,可以在区块链上开启一个新的人生,因为人生本来就是随机的。
imagepng
我们作为区块链的开发者,其实需要把握住的就是,我们通过创造的随机数能够变化出那些用户更为直观的体验,比如我们做游戏,是不是地形也可以随机,以及一些即将发生的事情,一些事件是不是也可以随机,而这个随机不是针对某一款游戏,某一家公司,这种随机数据而是全球的影响范围,并且是所有用户都参与其中的。从另外一个层面上讲,它并不是一个在特定环境下产生的随机数,而是在一条大家都产生共识的一条公链上产生的随机数,它其实是在某种程度上在决定所有参与这个区块链上每一个人接下来的名义,这是和之前的区块链随机数从概念上讲不一样的地方。
区块链的随机数在具体实现上,有那些注意事项呢?其中有一点最关键的就是,我们一定要发自内心的尊重随时数,就是我们所有能想到,能都变的更随机的方法都一定要使用上去。而且这个概念是,参与的人越多,受众面越广,随机数越真实。
随机数还有一个非常重要的功能,就是对人工智能的进化,对未来的预测,可以提供一些很好的大家公认和统一的随机数的产生方式。
其实,今天分享的内容主要是让大家对随机数产生敬畏心,它不是一件很轻松很简单的事情,它是一件很严肃的事情,你一旦把它用一些非常简单粗暴的方法来实现,就一定会产生很严重的后果,就比方说现在区块链上的一些智能合约,随机数位破解,黑客攻击事件,这些事情的根源就在于我们对随机数有多严肃。在 EOS 主网上,我们平常在开发智能合约上,最靠谱的,在实际日常开发中我们要用到随机数,会有那些方案呢?我会和大家分享一下。
imagepng
第一点是非常重要的,任何在智能合约里来生成的随机数,它都是不靠谱的。因为,智能合约在区块链上被执行的时候,它为了保证结果是统一的,每个节点在执行这一段智能合约的时候,产生的随机数都是一样的,所以它就没有办法做到很好的随机,对于一些攻击者来说,这种随机数的产生方式是很容易破解的。
第二点的话就是说,我们在产生随机数的时候,尽量的要求参与的人多,参与人比较多的事情都有哪些呢?第一个就是踩块,每一个块里交易数量,因为参与的人多,一个人就很难知道这个块里的内容是什么。这一点是基于我们对出块产块的节点高度信任的情况下,我们可以简单的来用区块内的数据或是下一个区块内的数据来作为一个随机数的产生方式。
那么最保险的方案就是,我们可以用一台中心化的服务器,持续观察区块链上的数字,观察了若干个块后我们把这段数字打包起来,然后给用户下发下去,来产生一个新的随机数。
第三点的话,也是最简单的说法,能够产生比较安全的随机数,我们目前看下来,最靠谱的方法,就是要在自己有一条 offchain 和区块链配合在一起来产生随机数。关于随机数的分享今天就到这里,大家有哪些想法和问题可以聊一聊。
imagepng
快问快答
Q:有什么方法防止用户绕过 UI 直接调合约么?
A:中央服务器给合约下发种子,客户端也接收一份,然后调用合约的时候附带自己对种子的签名,这样合约就可以验证了
Q:怎么防止其他人从服务器 request 种子,或者直接截包,这样合约还是无法确定是从我 UI 发出的啊?
A:原则上讲,区块链的接口都是对外公开的,如果一定要访问,是肯定能访问的,除非是指定账号权限,然后客户端给服务器发消息由指定账号发起调用,这样做就是类似于交易所的做法了。
Q: 现在有些游戏用的用未来如一秒后产生的区块的数据,如 ref block num,作为随机数开源,这种方式安全吗?会不会黑客比如用同样频率调用合约,从而可能跟你的合约落到同一个区块里,从而取到这个随机数,产生某种攻击?
A:随机数的特点就是,参与的个体越多,结果越不可预测

  • 区块链

    区块链就是一条信息多方确认并存储于多个地方。 学习区块链,拥抱未来吧!

    63 引用 • 8 回帖 • 1 关注
  • 智能合约

    智能合约(英语:Smart contract )是一种旨在以信息化方式传播、验证或执行合同的计算机协议。

    20 引用 • 9 回帖
  • EOS

    第三代区块链到来了?赶紧学习 EOS 智能合约吧

    3 引用 • 3 回帖
  • 讲座
    1 引用
感谢    赞同    分享    收藏    关注    反对    举报    ...