在 drand 的设置阶段中,您将创建一个在 𝑛 个参与者之间共享的集体私钥和公钥对。这是通过 𝑡-of-𝑛 分布式密钥生成 (DKG) 过程来完成的,其结果是每个参与者都收到一份集体公钥副本以及集体私钥的私钥分片 —— 没有任何一个节点知道集体私钥。然后,每个私钥分片都可以用来执行密码学门限计算(例如生成门限签名),其中至少需要 𝑡 个使用个人私钥分片产生的贡献才能成功完成集体操作。
DKG 是以完全分布式的方式执行的,从而避免了任何单点故障。这里是 drand DKG 实现的各种子组件的概述。
秘密共享是许多先进门限密码学机制所依赖的重要技术。
秘密共享允许您将一个秘密值 𝑠 分割成 𝑛 个分片 𝑠1,…,𝑠𝑛,从而只有在拥有至少 𝑡 个分片的门限时,才能重建出 𝑠。
SSS 方案是最著名且被广泛使用的秘密共享方法之一,也是 drand 的核心组件。SSS 在任意有限域上工作,但简单的方法是使用整数模 𝑝,记为 ℤ𝑝。令 𝑠∈ℤ𝑝 表示要共享的秘密。
为了共享 𝑠,分发者 (dealer) 首先创建多项式 𝑞(𝑥)=𝑎0+𝑎1𝑥+⋯+𝑎𝑡−1𝑥𝑡−1,其中 𝑎0=𝑠 且 𝑎𝑖∈ℤ𝑝 对于 𝑖=1,…,𝑡−1 为(随机的)。然后通过计算 𝑞(𝑥) 在整数 𝑖 处的值并设置 𝑠𝑖=(𝑖,𝑞(𝑖)) 来为每个参与者 𝑖 创建一个分片 𝑠𝑖。
要恢复秘密 𝑠,只需收集至少 𝑡 个分片,然后利用拉格朗日插值唯一重建出 𝑞(𝑥),从而获得 𝑠 为 𝑠=𝑎0=𝑞(0)。
请注意,您可以使用 𝑡-of-n 个分片的任何子集来进行拉格朗日插值并唯一确定 𝑠;然而,拥有少于 𝑡 个分片的子集无法得知关于 𝑠 的任何信息。
SSS 方案假设分发者是诚实的,但这在实际中并不总是成立。可验证秘密共享 (VSS) 方案通过使参与者能够验证其分片是否与其他节点分发的分片一致,来防御恶意分发者,从而确保共享的秘密在以后可以被正确重建。
drand 使用 Feldman 的 VSS 方案(SSS 的扩展)。令 𝔾 表示素数阶 𝑝 的循环群,其中计算离散对数是极其困难的。循环群 (cyclic group) 意味着存在一个生成元 𝑔,使得任何元素 𝑥∈𝔾 都可以对于某个 𝑎∈{0,…,𝑝−1} 写成 𝑥=𝑔𝑎。
除了向参与者分发秘密的分片外,分发者还会广播多项式 𝑞(𝑥) 系数的承诺,形式为 (𝐴0,𝐴1,…,𝐴𝑡−1)=(𝑔𝑠,𝑔𝑎1,…,𝑔𝑎𝑡−1)。这些承诺使得每个参与者 𝑖 能够通过检查 𝑔𝑞(𝑖)=∏𝑡−1𝑗=0(𝐴𝑗)𝑖𝑗 是否成立,来验证其分片 𝑠𝑖=(𝑖,𝑞(𝑖)) 与多项式 𝑞(𝑥) 是否一致。
秘密 𝑠 的恢复工作与普通的 SSS 相同,不同之处在于仅使用经过验证有效的片。
尽管 VSS 方案能够防御恶意的分发者,但分发者仍然知道秘密。为了创建一个集体共享的秘密 𝑠 使得任何单个节点都无法获取关于它的任何信息,参与者可以使用 DKG 协议。drand 使用 Pedersen 的 DKG 方案,该方案并行运行 Feldman 的 VSS 的 𝑛 个实例,并在此之上添加了额外的验证步骤。
每个参与者 𝑖 创建一个(随机的)秘密 𝑠𝑖∈ℤ𝑝,并使用 VSS 将其分享给所有参与者,即向每个 𝑗 发送一个分片 𝑠𝑖,𝑗,并向所有人广播承诺列表 (𝐴𝑖,0,𝐴𝑖,1,…,𝐴𝑖,𝑡−1)。
𝑗 按照 Feldman 的 VSS 方案验证接收到的分片。如果 𝑗 从 𝑖 接收到无效的分片 𝑠𝑖,𝑗,则 𝑗 会广播一个投诉(complaint)。𝑖 必须公开正确的分片 𝑠𝑖,𝑗,否则他们将被视为无效的分发者。
在协议结束时,𝑖 的最终分片为对所有有效参与者 𝑗(即在验证阶段未被排除的所有 𝑗)的 𝑠𝑖=∑𝑗𝑠𝑗,𝑖 求和。
与有效分片相关联的集体公钥可以通过对所有有效 𝑗 处的 𝑆=∑𝑗𝐴𝑗,0 求和来计算。
注: 尽管使用 Pedersen 的 DKG 创建的秘密可能会被偏置,但如 Rabin 等人所示,它对于门限签名使用是安全的。