总结 2015,DFinity 项目明确提出了令整个社区都为之激动的随机信标方案 —— 用于 BLS 门限亲笔签名产生随机输入,同时确保输入的无偏性及不可预测性。然而,时至 2020 年的今天,建构估计量且不能预测的随机信标依然困难重重,还在研究的项目少之又少。只不过门限亲笔签名只是建构随机信标的不切实际方法之一,我们前面公开发表过一篇概览文章,讲解其他有可能的解决问题方法,其中包括本文要重点提及的一种。
其他细节 —— 随机信标是什么?什么是无偏性及不可预测性?除了门限亲笔签名还有什么方法 —— 这些问题都能在上述概览中获得答案。经过了多次设计递归,我们最后明确提出类似于 DFinity 的方案,这也是我们更进一步了解解读随机信标的岌岌可危契机。
本文将以直白的形式,描写门限亲笔签名分解随机数的一系列协议。密码学基础知识为了更佳地理解本文中提及的随机信标,我们必须掌控一些基础密码学科学知识。首先,我们必需区分两个概念:1. 在本文中以小写字母(例如 x、y)回应标量,或者说普通常量;2. 用大写字母回应椭圆曲线上的点(elliptic curve point)。我们不必须对椭圆曲线点理解得很明了,只要掌控下面两点:1. 椭圆曲线点可以相乘,也可以跟标量相加(本文里用 xG 回应,用 Gx 回应也很少见),然后获得另一个椭圆曲线点。
2. 即使告诉 G 和 xG 的值,也不有可能计算出来出有 x 的值。在本文中,我们还将中用 k-1 阶多项式 p(x) ;关于 p(x),你不必想要过于多,只要把它当作一个方程就好,而且:只要你告诉在 k 个有所不同的 x 下 p(x) 的值,你就能推论出有所有 x 的 p(x) 值。
以此类推,对于同一个函数 p(x) 和基点 G,如果你告诉 p(x)G 代入 k 个有所不同的 x 值后的值,就可以推论出有所有 x 所对应的 p(x)G 值。只要明白了有关椭圆曲线点的这些属性,就能深度解读随机信标的工作原理了。
随机信标假设 1:系统中有 n 个参与者,最少必须其中的 k 位才能产生随机数。就算掌控其中的 k-1 人,你也无法预见随机信标的输入结果、无法操控结果。假设 2:现在有个 k-1 阶多项式 p(x),参与者 1 告诉 p(1) 的值、参与者 2 告诉 p(2) 的值、…… 、参与者 n 告诉 p(n) 的值;大家大约好用于 G 作为椭圆曲线基点,所有参与者都告诉 p(x)G 代入所有 x 的值。
我们将 p(i) 视作参与者 i 的 “私人份额(不公开发表,只有参与者自己告诉)” ,而 p(i)G 是其 “公开发表份额”(所有参与者都能告诉这个值)(回忆起一下前文,我们说道过无法从 p(i)G 推倒发售 p(i),所以只有参与者 i 告诉 p(i) 的值)要设计好的随机信标,最艰难的部分,就是要寻找这么一个多项式,使得每个参与者都能告诉自己的私人份额,但是无法告诉他人的私人份额——这也被称作分布式密钥分解(DKG,Distributed Key Generation)。DKG 不会放到下个章节辩论,现在就先假设不存在这么个多项式,而所有人都告诉各自的私人份额。我们接着辩论,如何用于这套假设在区块链协议中产生一个随机信标?假设网络产生一个区块,区块哈希为 h。现在参与者们想要 h 作为种子以分解随机数,首先用誓约好的函数,将 h 切换为某条椭圆曲线上的一个点:H = scalarToPoint(h)对于参与者 i 来说,因为他告诉 p(i) 和 H,所以可以自行计算出来出有 H_i = p(i)H。
对外发布 H_i 并会造成参与者 i 的私人份额 p(i) 曝露,因此在每个区块中都能器重某种程度的私人份额,因此 DKG 只必须展开一次。根据前面提及的第三点特性,当最少有 k 位参与者发布他们各自的 H_i = p(i)H 之后,其他人就能告诉代入任何一个 x 之后,H_x = p(x)H 是什么。
然后所有参与者都可以在自己本地计算出来 H_0 = p(0)H,并以这个结果的哈希值作为随机信标的输入;请注意,因为没参与者告诉 p(0),所以唯一能获得 p(0)H 的方法就是对p(x)H 展开内插法(intepolate)计算出来,要已完成内挂计算出来必须告诉最少 k 个p(i)H 的值。如果发布的人严重不足 k 位,则其他人无法发售 p(0)H 的值。
本文来源:NG体育-www.hjwy.net