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  }