在本节中,我们将描述如何使用此集体密钥对以分布式方式生成可公开验证、不可偏置且不可预测的随机数。
首先,我们解释一下已经变得相当流行的基于双线性对的密码学(PBC),它被用于许多现代共识协议或零知识证明中,例如 zk-SNARKs。然后,我们将展示 drand 如何在随机数信标生成阶段将 PBC 用于门限 Boneh-Lynn-Shacham (BLS) 签名。最后,我们将讨论 drand 如何将生成的门限 BLS 签名链接到随机数链中。
基于双线性对的密码学基于双线性群 (𝔾1,𝔾2,𝔾𝑡),其中 𝔾1、𝔾2 和 𝔾𝑡 是素数阶 𝑝 的循环群,其生成元分别为 𝑔1、𝑔2 和 𝑔𝑡,并且有一个双线性对操作 𝑒:𝔾1×𝔾2→𝔾𝑡,具有以下性质:
-
双线性 (Bilinearity):
∀𝑎,𝑏∈ℤ∗𝑝,∀𝑃∈𝔾1,∀𝑄∈𝔾2,我们有𝑒(𝑎𝑃,𝑏𝑄)=𝑒(𝑃,𝑄)𝑎𝑏 -
非退化性 (Non-degeneracy):
𝑒≠1 -
可计算性 (Computability): 存在一个高效的算法来计算
𝑒。 drand 目前使用的是 Barreto-Lynn-Scott 曲线 BLS12-381。
为了生成可公开验证、不可偏置、分布式的随机数,drand 利用了门限 Boneh-Lynn-Shacham (BLS) 签名。首先我们将介绍普通的 BLS 签名,然后介绍门限变体。
BLS 签名是较短的签名,依赖于双线性对,并且仅由 𝔾1 中的单个元素组成。它们是确定性的,即它们仅依赖于消息和签名者的密钥,而与其他签名方案(例如 ECDSA)不同,ECDSA 需要为每个签名消息使用全新的随机值才能保证安全性。换句话说,使用相同密钥在给定消息上生成的任何两个 BLS 签名都是完全相同的。在 drand 中,我们利用此性质来实现随机数生成的不可偏置性。
BLS 签名方案包含以下子过程。
为了生成密钥对,签名者首先随机选择一个私钥 𝑥∈ℤ∗𝑝,然后计算相应的公钥为 𝑋=𝑔𝑥2∈𝔾2。
令 𝐻:{0,1}∗→𝔾1 表示一个将任意位字符串映射到 𝔾1 元素的密码学哈希函数。为了计算消息 𝑚 上的 BLS 签名 𝜎,签名者计算 𝜎=𝑥𝐻(𝑚)∈𝔾1。
为了验证消息 𝑚 上的 BLS 签名 𝜎 是否有效,验证者使用签名者的公钥 𝑋 检查 𝑒(𝐻(𝑚),𝑋)=𝑒(𝜎,𝑔2) 是否成立。
请注意,对于有效签名,此等式成立,因为 𝑒(𝐻(𝑚),𝑋)=𝑒(𝐻(𝑚),𝑔𝑥2)=𝑒(𝐻(𝑚),𝑔2)𝑥=𝑒(𝑥𝐻(𝑚),𝑔2)=𝑒(𝜎,𝑔2)。
门限签名方案的目标是通过结合由参与者独立产生的各个部分签名,来集体计算一个签名。门限 BLS 签名方案具有以下子过程。
𝑛 个参与者运行 t-of-n DKG 来设置集体公钥 𝑆∈𝔾2,以及未知集体私钥 𝑠 的私钥分片 𝑠𝑖∈ℤ∗𝑝(如上文所述)。
为了对消息 𝑚 进行签名,每个 𝑖 使用其私钥分片 𝑠𝑖 来创建部分 BLS 签名 𝜎𝑖=𝑠𝑖𝐻(𝑚)。
为了验证部分签名 𝜎𝑖 在 𝑚 上的正确性,验证者使用 DKG 期间生成的公钥分片 𝑆𝑖,并验证 𝑒(𝐻(𝑚),𝑆𝑖)=𝑒(𝜎𝑖,𝑔2) 是否成立。
为了重建消息 𝑚 上的集体 BLS 签名 𝜎,验证者首先收集关于 𝑚 的 𝑡 个不同且有效的部分 BLS 签名 𝜎𝑖,然后进行 Lagrange interpolation。
为了验证集体 BLS 签名 𝜎,验证者检查 𝑒(𝐻(𝑚),𝑆)=𝑒(𝜎,𝑔2) 是否成立,其中 𝑆 是集体公钥。
得益于 Lagrange interpolation 的性质,𝜎 的值与签名重建过程中选择的 𝑡 个有效部分签名 𝜎𝑖 的子集无关。此外,Lagrange interpolation 还保证了少于 𝑡 个签名者的任何集合都无法预测或偏置 𝜎。
总之,门限 BLS 签名 𝜎 展现了可公开验证、不可偏置、不可预测且分布式随机数所需的所有性质。
在上述内容中,𝔾1 和 𝔾2 可以互换。其影响在于公钥和签名的相对大小。第一批 drand 链是按照上文所述构建的,签名在 𝔾2 上,公钥在 𝔾1 上。签名大小为 96 字节,公钥大小为 48 字节。
某些应用更喜欢较小的签名,即使这会以较大的公钥为代价。这就是为什么某些 drand 信标的签名在 𝔾1 上,公钥在 𝔾2 上。这种变化被称为 𝔾1/𝔾2 swap。
drand 随机数信标在离散的轮次 𝑟 中运行。在每一轮中,配置为使用 Chained Randomness 的 drand 信标利用链接在一起形成随机数链的门限 BLS 签名产生一个新的随机值。为了扩展这个随机数链,每个 drand 参与者 𝑖 在轮次 𝑟 中创建关于消息 𝑚=𝐻(𝑟∥𝜎𝑟−1) 的部分 BLS 签名 𝜎𝑟𝑖,其中 𝜎𝑟−1 表示轮次 𝑟−1 的(完整)BLS 门限签名,𝐻 为密码学哈希函数。
一旦至少有 𝑡 个参与者广播了他们针对 𝑚 的部分签名 𝜎𝑟𝑖,任何人都可以恢复与轮次 𝑟 的随机值相对应的完整 BLS 门限签名 𝜎𝑟。此后,drand 节点进入轮次 𝑟+1 并重复该过程。
对于轮次 𝑟=0,drand 参与者对在 drand 设置期间确定的种子进行签名。此过程确保每个新的随机值都取决于所有先前生成的签名。由于签名是确定性的,因此对手不可能分叉链并在给定的轮次 𝑟 中呈现两个不同的签名 𝜎𝑟 和 𝜎′𝑟,从而在依赖公共随机数的系统中产生不一致性。
drand 信标也可以配置为使用 Unchained Randomness。为了扩展这个随机数链,每个 drand 参与者 𝑖 在轮次 𝑟 中创建关于消息 𝑚=𝐻(𝑟) 的部分 BLS 签名 𝜎𝑟𝑖,其中 𝐻 为密码学哈希函数。
此过程允许直接对轮次 𝑟=i 的消息 𝑚 进行预计算。