Feldman DKG 核心 刷新私钥份额 code
在分布式密钥生成(DKG)和刷新(Reshare)过程中,虽然代码逻辑看起来非常相似,但它们在处理秘密份额和公钥方面有一些关键的区别和细节。下面是对如何刷新秘密份额并保持公钥不变的解释:
DKG 过程
在 DKG(分布式密钥生成)过程中,每个参与者生成一个新的秘密份额,并通过 Feldman VSS 协议进行分享。具体步骤如下:
- 生成随机数
ui:每个参与者生成一个随机数ui,这个ui将作为他们的秘密份额的一部分。 - 使用
ui生成验证者和份额:通过 Feldman VSS 协议,每个参与者生成验证者(verifiers)和份额(shares)。 - 生成链码
chaincode:每个参与者生成一个随机的链码chaincode,用于计算承诺。 - 计算承诺:使用验证者和链码计算承诺。
- 存储信息:存储
ui、shares、verifiers和chaincode。 - 发送承诺消息:将承诺消息发送给其他参与者。
刷新过程
在刷新(Reshare)过程中,目标是更新秘密份额,但保持公钥不变。具体步骤如下:
- 使用现有的
ui:与 DKG 不同,刷新过程使用现有的ui,而不是生成新的随机数。 - 使用
ui生成新的验证者和份额:通过 Feldman VSS 协议,每个参与者使用现有的ui生成新的验证者(verifiers)和份额(shares)。 - 计算承诺:与 DKG 类似,计算新的验证者的承诺,但不包括链码。
- 存储信息:存储新的
shares和verifiers,但ui和chaincode保持不变。 - 发送承诺消息:将新的承诺消息发送给其他参与者。
保持公钥不变的逻辑
- 公钥计算:公钥是通过所有参与者的
ui之和计算得到的。在 DKG 过程中,公钥是sum(ui)*G(其中 G 是生成元)。 - 刷新过程中的公钥不变性:在刷新过程中,
ui保持不变,因此每个参与者的贡献值ui也保持不变。尽管每个参与者生成了新的份额和验证者,但这些新的份额和验证者都是基于相同的ui生成的。 - 链码的作用:链码在 DKG 过程中用于计算承诺,但在刷新过程中不变。因此,不影响公钥的计算。
代码对比
-
DKG 代码:
ui := crypto.RandomNum(info.curve.Params().N)
chaincode := crypto.RandomNum(info.curve.Params().N)
// 生成verifiers和shares
verifiers, shares, err := feldman.Evaluate(ui)
// 计算承诺
var input []*big.Int
input = append(input, chaincode)
for i := 0; i < len(verifiers); i++ {
input = append(input, verifiers[i].X, verifiers[i].Y)
}
hashCommitment := commitment.NewCommitment(input...) -
刷新代码:
// 使用现有的ui
verifiers, shares, err := feldman.Evaluate(info.ui)
// 计算承诺
var input []*big.Int
for i := 0; i < len(verifiers); i++ {
input = append(input, verifiers[i].X, verifiers[i].Y)
}
hashCommitment := commitment.NewCommitment(input...)
总结:
- 在 DKG 过程中,
ui和chaincode是随机生成的。 - 在刷新过程中,
ui保持不变,chaincode也保持不变,但生成新的份额和验证者。 - 由于
ui保持不变,公钥sum(ui)*G也保持不变,从而实现了刷新秘密份额但公钥不变的目标。