diff --git a/README.md b/README.md index e9b3b38..9f6a27c 100644 --- a/README.md +++ b/README.md @@ -15,13 +15,19 @@ To instantiate a DKG there are many possible schemes which differ by the guarant Since DKGs are difficult to implement correctly in practice, this document describes DKGs that are relatively *simple*, namely SimplPedPop and SecPedPop. However, the DKG can be swapped out for another one if desired. + + The DKG outputs the shared public key and a secret share for each signer. It is extremely important that both outputs are securely backed up because losing the share will render the signer incapable of producing signatures. In order to reduce the chance of losing the backup, it is possible to encrypt the backup and send it to every other signer. If a signer loses the local backup, as long as there's at least one other signer that cooperates and sends back the encrypted backup, the signer can restore (see also [repairable threshold signatures](https://github.com/chelseakomlo/talks/blob/master/2019-combinatorial-schemes/A_Survey_and_Refinement_of_Repairable_Threshold_Schemes.pdf). + + Once the DKG concludes successfully, it is recommended to rule out basic mistakes in the setup by having all signers create a FROST signature for some test message. + + ### SimplPedPop We specify the SimplPedPop scheme as described in [Practical Schnorr Threshold Signatures @@ -32,6 +38,8 @@ Without the Algebraic Group Model, section 4](https://eprint.iacr.org/2023/899.p - Very rudimentary ability to identify misbehaving signers in some situations. - The proof-of-knowledge in the setup does not commit to the prover's id. This is slightly simpler because it doesn't require the setup algorithm to know take the id as input. + + SimplPedPop requires SECURE point-to-point channels between the participants, i.e., channels that are ENCRYPTED and AUTHENTICATED. The messages can be relayed through a coordinator who is responsible to pass the messages to the participants as long as the coordinator does not interfere with the secure channels between the participants. @@ -83,7 +91,7 @@ def simplpedpop_finalize(ids, my_id, vss_commits, shares, eta = ()): throw BadParticipant(ids[i]) if not verify_sig(vss_commits[i].sig, vss_commits[i][0], "") throw BadParticipant(ids[i]) - eta += (sig, vss_commit[i]) + eta += (sig, vss_commit[i]) if not Eq(eta): return False # helper_compute_pk computes the individual pubkey of participant with the given id @@ -104,7 +112,7 @@ def secpedpop_round1(seckey): return individual_pk(seckey) ``` -The public keys are set to each other. +The public keys are sent to each other. Every participant stores the received public keys in the `pubkeys` array. ```python @@ -221,3 +229,23 @@ TODO Consider a variant based on MuSig2 If the participants run a BFT-style consensus protocol (e.g., as part of a federated protocol), they can use consensus to check whether they agree on `x`. TODO: Explain more here. This can also achieve termination but consensus is hard (e.g., honest majority, network assumptions...) + + + + + + + + + + + + + + + + + + + +- diff --git a/notes.md b/notes.md index a118eb1..60be5e9 100644 --- a/notes.md +++ b/notes.md @@ -10,13 +10,17 @@ - Need to document that we shouldn't throw away data until we're sure that the DKG either failed or succeeded. Otherwise, the DKG may end up succeeding after throwing away and someone sends funds to the address. - How modular do we want to design this? Do we support plugging in other DKGs? - Do we want to support some sort of share backup scheme (see also [repairable threshold sigs](https://github.com/chelseakomlo/talks/blob/master/2019-combinatorial-schemes/A_Survey_and_Refinement_of_Repairable_Threshold_Schemes.pdf))that sends share encrypted-to-self to other signers? As long as one other signer cooperates we can restore. + - Are we able to get rid of indices entirely? SimplPedPop uses indices, JessePedPop doesn't. It uses public keys instead. - use unique identifier instead of pubkey? + - Into how many functions should we split up the DKG. Jesse claims that splitting up has the advantage that "it's more flexible because with the proposed API the VSS can be generated prior to knowing the public keys of any participants" - Should it be possible to assign weights for weighted threshold sigs? + - Do we need to include the signature in the vss_hash? Probably not, but depending on how the rest is set up, it may not hurt. - Should the scheme support deterministic key derivation? - Not sure if that's actually that useful. And it only works as long as the code does not change, which we may not want to guarantee. + - Is it impossible to sign if the `Eq` check fails? If not, we may want to tweak the public key by `eta` to make sure that signing fails.