Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

add a readme file #3

Merged
merged 9 commits into from
Oct 8, 2024
Merged
78 changes: 78 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
# SSV Distributed Key Generation Spec

## Introduction
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 *t* out of *n* operators agree.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

provide a formula for "t out of n"?

where t is defined by the number of faults admissible: n = 3 * f + 1


---

## Functionalities
Operations are initiated by an initiator, and executed by operators. An initiator can initiate:

### Init
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. 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.

### Re-sign
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 new key shares.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It is creating new key-shares, though. The procedure only changes the signature part of the shares...but it does change the overall sharesData.
Re-phrase to "without generating a new validator key"? 🤔

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Also, the signature part is owner-nonce, so it could be that both were wrong...for whatever reason. Might be just more "complete" to clarify that both can be changed.


### Reshare
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.

---
Copy link

@GalRogozinski GalRogozinski Sep 23, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Add the following here (or wherever you see fit)

Security Assumptions

All messages are authenticated using the initiator's and operators' public key.

Init

The initiator is fully trusted. Meaning it won't deviate from protocol. But it can have faults (go, up and down).

Re-sign

The initiator is not trusted. It may try to fool the operators into resigning with the wrong secret shares, owner and nonce. Also since in the resign operation the owner may change, and owner is used in the Proof, all $n$ operators need to participate in the ceremony.

Reshare

The initiator is not trusted. It may try to fool the operators into resharing with the wrong secret shares. Or resharing without permission.


## Validations
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.

---

## Result and Proof struct
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.
```go
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:
```go
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"`
}
```
*ValidatorPubKey*, *EncryptedShare*, and *Owner* are to identify information of the validator and the operator in SSV network, the *SharePubKey* is computed by the operator after the DKG ceremony using the obtained secret share as the private key.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

likely it's me failing to understand, but:

  • EncryptedShare is the operator's encrypted "portion" of the validator's share data, correct?
  • SharePubKey is derived from EncryptedShare? the phrasing here speaks of "using the obtained secret", but...what secret?


**Proof**s 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**. If an operator created invalid partial signatures, the network is able to identify and potentially take further action.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

How could one verify this? I have a SharePubKey produced by an operator...what do I do with it, practically?

- 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.


---

## Testing
The tests are located in the `testing/` folder. To run tests, use:
```shell
go generate ./...
```
then:
```shell
go test testing
```
Loading