大家下午好,今天“链客Talk”邀请到密码学大神、清华姚班的“Conflux”公链研究总监“杨光”驾临链客现场。大家掌声欢迎。
首先给大家介绍一下“Conflux”项目及密码学大神“杨光”的背景资料:
杨光“Conflux”公链研究总监,本科毕业于清华大学姚班,并于清华大学交叉信息研究院获得计算机科学博士学位。加入 Conflux 团队前曾在丹麦奥胡斯大学、中科院计算所、比特大陆等从事研究工作。他的研究方向包括密码学、博弈论和区块链等。他的博士论文获得了中国密码学会优秀博士学位论文奖。他在顶级理论计算机和密码学的会议(CRYPTO、CCC、TCC、 AAMAS、ICML 等)发表了十余篇论文。他还曾获得中国数学奥林匹克竞赛金牌。
Conflux成立于2018 年,拥有区块链行业内最顶尖的理论和
研发团队。首席科学家由世界知名计算机科学家、华人唯一图灵奖得
主、中国科学院院士、美国国家科学院外籍院士、清华大学交叉信息
研究院院长姚期智先生担任。
Conflux成立于2018 年,拥有区块链行业内最顶尖的理论和研发团队。首席科学家由世界知名计算机科学家、华人唯一图灵奖得主、中国科学院院士、美国国家科学院外籍院士、清华大学交叉信息研究院院长姚期智先生担任。
Conflux 致力于打造下一代高性能的 DApp 公链平台。截至目前Conflux 是第一个,亦是唯一一个在不牺牲任何去中心化程度及安全性的情况下实现高TPS 的公有链。
2018 年12 月Conflux 获得红杉中国、峰瑞资本、顺为资本、华创资本、融360、MetaStable、Fundamental Labs、IMO Ventures等多家中外知名投资机构的3500 万美元战略投资,投后估值超4 亿美元。Conflux 测试网于2019 年4 月4 日正式上线,预计第四季度末主网上线。
接下来进入正题,我们收集众多链客粉丝们的问题进行汇总,选取了七个有代表性的问题请杨总现场解答。
大家好,我是 Conflux 的研究总监杨光
问题1:如何在智能合约中引入不可预测的随机数;如何在共识协议中安全地进行随机抽签?
在链上引入随机数最直接的实现方式当然是使用区块链系统本身的公共随机数,特别是采用和挖矿的随机性(主要是 nonce)直接相关的随机数。
注意这里不是说把区块的 nonce 直接拿来当随机数用,因为矿工选择的 nonce 可能不是均匀随机的,例如矿工可以刻意地只选择最后一位是 0 的 nonce 进行挖矿,在不损失挖矿收益的情况下控制 nonce 的选择范围。
所以想要产生不可预测的随机数还需要对包括 nonce 在内的信息进一步处理,例如再用一次 SHA-3 哈希。
但是即使采用密码学哈希函数处理,最终得到的随机数实际上还是可以被影响和操纵的。
例如矿工在挖到一个随机数对自己不利的区块的时候,可以选择丢弃这个区块,以期待自己或别人挖到另一个区块,产生出对自己比较有利的随机数。
本质上相当于掌握算力的矿工有时候会获得一次要求重新抽签的权利,使得最终的结果会略微有些偏差(取决于矿工掌握的算力比例)。当然,如果要求重新抽签的话,矿工也必须付出相应的代价,即损失丢弃的区块中区块奖励和手续费等所有收益。
实际上,在使用挖矿的随机性产生随机数的方案中,完全杜绝矿工通过放弃区块获得重新抽签机会的问题是不可能的。因为在极端情况下,如果一个矿工掌握绝大部分算力,则他总可以任意地控制通过挖矿过程产出的随机数,并且几乎不会损失区块收益。实际上,这种情况下任何一种方案都没有办法在链上产生“完全不受操纵的随机数”。
有可能做到的是尽量减少攻击者对随机数的影响。
对于攻击者控制算力的比例不太大的情况,其实有多种手段可以降低矿工要求重新抽签对结果的影响,本质上这些手段都是增加矿工重新抽签时需要付出的机会成本。
技术上可以通过采用可验证延迟函数(VDF)的方式,使得矿工本身也无法在看到区块时马上知道相应的随机抽签的结果,如果等到计算完 VDF 的结果以后再决定是否广播区块,在效果上已经相当于直接放弃广播这个区块了(除非在计算 VDF 的这段时间内没有任何其他矿工挖到新的区块,这个概率非常小)。
因此,只要不是大多数的矿工都选择根据 VDF 的计算结果再决定是否广播区块,产生的随机数就不会受到太大的影响。
另一方面,在经济激励上可以通过智能合约直接付给挖到包含抽签所用随机数的区块的矿工高额奖励的方式激励矿工不放弃任何区块——即使区块中的随机数可能对矿工不利,但是放弃区块必然立刻遭受损失,且受到的损失更大(不仅仅是损失固定的区块奖励)。
只要放弃区块带来的损失超过重新抽签能得到的期望收益,矿工就不会放弃这个区块了。
这在经济上也是合理的,决策影响的利益越大,则需要越多的成本来保护其安全性。
其他一些随机数产生的方案包括采用“承诺-打开(Commit-Open)”方式和秘密共享(secret sharing)等技术由多个参与者(未必是矿工)生成随机数,只要参与者中有一定数量是诚实的,则最终结果就是诚实的。但是这些方案同样需要面临最后一个参与者根据结果选择是否要求重新抽签的问题,需要使用适当的惩罚机制来减少结果被操纵的风险。
用秘密分享的方式可以减轻“最后一人”的问题,因为不需要所有人坚持到最后,只要有足够的人数就可以。但是这个方案比较复杂,需要多轮通信,不如用 VDF 或者直接经济激励简单。
实际上可以把攻击者对随机数的影响控制在一个很小的限度以内也足够用了。所以我觉得直接用 VDF 结合经济激励的方案比较合理。
问题2:能否将伪随机数发生器直接用在区块链,在区块链的共识过程或者应用上面加入随机性,使得这样的随机性满足均匀性、独立性和不可预测性的特点呢?
可以用,但是只用伪随机数发生器是不够的。
伪随机数发生器并不能凭空产生随机性或者伪随机数,依然需要有一个均匀随机选取的种子才能产生伪随机数。
也就是说伪随机数发生器可以完成的是从 1 到 100 的“增加(伪)随机性”的工作,而不能从 0 到 1 产生最初的随机性。
另外需要提一下,如果有了最初的随机性种子,在区块链上可以产生高质量的 真·随机数(不是伪随机数)。只需要采用一种叫做“随机性提取器(Randomness Extractor)”的技术提取区块链打包的交易信息所含有的信息熵,把质量相对比较低的“弱随机性”提纯成质量更高的“强随机性”,即可产生统计意义上接近理想的随机数。并且,随机性提取器是不依赖于任何密码学假设的,比伪随机数发生器更可靠。
我的博士论文做的就是一个高效的随机性提取器。可以从大规模的数据里面提取高质量随机数,有兴趣的话可以去看看