github.com/onflow/flow-go@v0.33.17/cmd/bootstrap/dkg/dkg.go (about) 1 package dkg 2 3 import ( 4 "fmt" 5 6 "github.com/onflow/flow-go/crypto" 7 model "github.com/onflow/flow-go/model/dkg" 8 "github.com/onflow/flow-go/module/signature" 9 ) 10 11 // RandomBeaconKG is centralized BLS threshold signature key generation. 12 func RandomBeaconKG(n int, seed []byte) (model.DKGData, error) { 13 14 if n == 1 { 15 sk, pk, pkGroup, err := thresholdSignKeyGenOneNode(seed) 16 if err != nil { 17 return model.DKGData{}, fmt.Errorf("Beacon KeyGen failed: %w", err) 18 } 19 20 dkgData := model.DKGData{ 21 PrivKeyShares: sk, 22 PubGroupKey: pkGroup, 23 PubKeyShares: pk, 24 } 25 return dkgData, nil 26 } 27 28 skShares, pkShares, pkGroup, err := crypto.BLSThresholdKeyGen(int(n), 29 signature.RandomBeaconThreshold(int(n)), seed) 30 if err != nil { 31 return model.DKGData{}, fmt.Errorf("Beacon KeyGen failed: %w", err) 32 } 33 34 dkgData := model.DKGData{ 35 PrivKeyShares: skShares, 36 PubGroupKey: pkGroup, 37 PubKeyShares: pkShares, 38 } 39 40 return dkgData, nil 41 } 42 43 // Beacon KG with one node 44 func thresholdSignKeyGenOneNode(seed []byte) ([]crypto.PrivateKey, []crypto.PublicKey, crypto.PublicKey, error) { 45 sk, err := crypto.GeneratePrivateKey(crypto.BLSBLS12381, seed) 46 if err != nil { 47 return nil, nil, nil, fmt.Errorf("KeyGen with one node failed: %w", err) 48 } 49 pk := sk.PublicKey() 50 return []crypto.PrivateKey{sk}, 51 []crypto.PublicKey{pk}, 52 pk, 53 nil 54 }