This repository contains spec of distributed key generation (DKG) used in SSV. Based on verifiable secret sharing, DKG allows a set of n operators to generate a BLS key share for each operator, such that a BLS private key can only be used when threshold
Operations are initiated by an initiator, and executed by operators. An initiator can initiate:
When a init message is sent to the operators, all operators participate and run a DKG ceremony to create key shares. A DKG ceremony asks each operator to verifiably share locally generated secrets with other operators, and combine secret shares from all operators to derive its own BLS key share. An init message specifies an owner ethAddress. The owner is the entity that owns the Ethereum validator which the generated secret shares control. After the ceremony, each operator generates a Result with a SignedProof (see below) for verification. Proofs are referred to when an initiator asks for re-sign or reshare.
In the case where the nonces of a DKG ceremony is not correct, to prevent replay attack, the initiator sends re-sign messages for operators to create new signatures with correct nonces without generating a new validator key. For operators to perform re-sign, owner's secret key must be used to sign a re-sign message, convincing the operators that the request is regarding a completed ceremony and it is indeed the owner of this ceremony that requested to re-sign.
When the set of operators changed (including change of size and change of operators), a reshare is initiated to generate new key shares among the new operators. This process requires participation from t old operators and all new operators. For operators to perform reshare, owner's secret key must be used to sign a reshare message, convincing the operators that the request is regarding a completed ceremony and it is indeed the owner of this ceremony that requested to reshare.
All messages are authenticated using the initiator's and operators' public keys. Initiators and operators are assumed to keep their secret keys secure. An initiator has no motivation to deviate from the protocol or trick operators to create unexpected results, because wrong DKG outputs only damage the initator itself, e.g. operators will not be able to perform duties for the initiator if DKG key shares are incorrect.
In a DKG ceremony, each message sent between the initiator and the operators are validated by the operators such that:
- The message is signed by the sender, preventing spoofing attacks.
- Where replay attacks are possible, a valid nonce is included to ensure the message is fresh (otherwise Re-sign).
- The message is in the same scope, i.e., the message is regarding the same ceremony, the same set of operators and it is in the correct stage as the receiver expects.
After execution of init, re-sign and reshare, a result is returned by the operators as an important validation for the completion of the ceremony.
type Result struct {
// Operator ID
OperatorID uint64
// RequestID for the DKG instance (not used for signing)
RequestID [24]byte `ssz-size:"24"`
// Partial Operator Signature of Deposit data
DepositPartialSignature []byte `ssz-size:"96"`
// SSV owner + nonce signature
OwnerNoncePartialSignature []byte `ssz-size:"96"`
// Signed proof for the ceremony
SignedProof SignedProof
}
In a result, the SignedProof is a Proof with a signature. A Proof contains:
type Proof struct {
// the resulting public key corresponding to the shared private key
ValidatorPubKey []byte `ssz-size:"48"`
// standard SSV encrypted share
EncryptedShare []byte `ssz-max:"512"`
// the share's BLS pubkey
SharePubKey []byte `ssz-size:"48"`
// owner address
Owner [20]byte `ssz-size:"20"`
}
As a 4-operator example, after the ceremony, each operator
Proofs are published by the initiator after the DKG ceremony. All Proof from a ceremony together validates the completion of this ceremony. they can make sure:
- Partial signatures of operators are publically verifiable using the SharePubKey in the proof with BLS signature verification (given the message, SharePubKey, and the signature, returns whether the signature is valid or not). If an operator created invalid partial signatures, the network is able to identify and potentially take further action.
- An operator knows its peers have completed the protocol locally and has a secret share ready to use. It prevents the case where some operators failed to derive their secret shares while others are unaware.
- The initiator refers to a completed valid DKG ceremony when initiating Re-sign and Reshare. Operators are able to identify and verify the corresponding ceremony when receiving requests from the initiator.
The tests are located in the testing/
folder. To run tests, use:
go generate ./...
then:
go test testing