Skip to main content

Feldman DKG 核心 刷新私钥份额 code

在分布式密钥生成(DKG)和刷新(Reshare)过程中,虽然代码逻辑看起来非常相似,但它们在处理秘密份额和公钥方面有一些关键的区别和细节。下面是对如何刷新秘密份额并保持公钥不变的解释:

DKG 过程

在 DKG(分布式密钥生成)过程中,每个参与者生成一个新的秘密份额,并通过 Feldman VSS 协议进行分享。具体步骤如下:

  1. 生成随机数ui:每个参与者生成一个随机数ui,这个ui将作为他们的秘密份额的一部分。
  2. 使用ui生成验证者和份额:通过 Feldman VSS 协议,每个参与者生成验证者(verifiers)和份额(shares)。
  3. 生成链码chaincode:每个参与者生成一个随机的链码chaincode,用于计算承诺。
  4. 计算承诺:使用验证者和链码计算承诺。
  5. 存储信息:存储uisharesverifierschaincode
  6. 发送承诺消息:将承诺消息发送给其他参与者。

刷新过程

在刷新(Reshare)过程中,目标是更新秘密份额,但保持公钥不变。具体步骤如下:

  1. 使用现有的ui:与 DKG 不同,刷新过程使用现有的ui,而不是生成新的随机数。
  2. 使用ui生成新的验证者和份额:通过 Feldman VSS 协议,每个参与者使用现有的ui生成新的验证者(verifiers)和份额(shares)。
  3. 计算承诺:与 DKG 类似,计算新的验证者的承诺,但不包括链码。
  4. 存储信息:存储新的sharesverifiers,但uichaincode保持不变。
  5. 发送承诺消息:将新的承诺消息发送给其他参与者。

保持公钥不变的逻辑

  1. 公钥计算:公钥是通过所有参与者的ui之和计算得到的。在 DKG 过程中,公钥是sum(ui)*G(其中 G 是生成元)。
  2. 刷新过程中的公钥不变性:在刷新过程中,ui保持不变,因此每个参与者的贡献值ui也保持不变。尽管每个参与者生成了新的份额和验证者,但这些新的份额和验证者都是基于相同的ui生成的。
  3. 链码的作用:链码在 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 过程中,uichaincode是随机生成的。
  • 在刷新过程中,ui保持不变,chaincode也保持不变,但生成新的份额和验证者。
  • 由于ui保持不变,公钥sum(ui)*G也保持不变,从而实现了刷新秘密份额但公钥不变的目标。