Skip to content

Commit d49876b

Browse files
committed
Merge branch 'master' into leo/db-ops-save-execution-results
2 parents a323c20 + f7250f3 commit d49876b

File tree

298 files changed

+10298
-2745
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

298 files changed

+10298
-2745
lines changed

Diff for: admin/commands/storage/backfill_tx_error_messages.go

+1-2
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import (
77
"github.com/onflow/flow-go/admin"
88
"github.com/onflow/flow-go/admin/commands"
99
"github.com/onflow/flow-go/engine/access/ingestion/tx_error_messages"
10-
commonrpc "github.com/onflow/flow-go/engine/common/rpc"
1110
"github.com/onflow/flow-go/model/flow"
1211
"github.com/onflow/flow-go/model/flow/filter"
1312
"github.com/onflow/flow-go/state/protocol"
@@ -177,7 +176,7 @@ func (b *BackfillTxErrorMessagesCommand) parseExecutionNodeIds(executionNodeIdsI
177176
if len(executionNodeIds) == 0 {
178177
return nil, admin.NewInvalidAdminReqParameterError("execution-node-ids", "must be a non empty list of strings", executionNodeIdsIn)
179178
}
180-
requestedENIdentifiers, err := commonrpc.IdentifierList(executionNodeIds)
179+
requestedENIdentifiers, err := flow.IdentifierListFromHex(executionNodeIds)
181180
if err != nil {
182181
return nil, admin.NewInvalidAdminReqParameterError("execution-node-ids", err.Error(), executionNodeIdsIn)
183182
}

Diff for: cmd/access/node_builder/access_node_builder.go

+13-5
Original file line numberDiff line numberDiff line change
@@ -232,9 +232,10 @@ func DefaultAccessNodeConfig() *AccessNodeConfig {
232232
IdleTimeout: rest.DefaultIdleTimeout,
233233
MaxRequestSize: commonrest.DefaultMaxRequestSize,
234234
},
235-
MaxMsgSize: grpcutils.DefaultMaxMsgSize,
236-
CompressorName: grpcutils.NoCompressor,
237-
WebSocketConfig: websockets.NewDefaultWebsocketConfig(),
235+
MaxMsgSize: grpcutils.DefaultMaxMsgSize,
236+
CompressorName: grpcutils.NoCompressor,
237+
WebSocketConfig: websockets.NewDefaultWebsocketConfig(),
238+
EnableWebSocketsStreamAPI: false,
238239
},
239240
stateStreamConf: statestreambackend.Config{
240241
MaxExecutionDataMsgSize: grpcutils.DefaultMaxMsgSize,
@@ -1475,6 +1476,13 @@ func (builder *FlowAccessNodeBuilder) extraFlags() {
14751476
"websocket-inactivity-timeout",
14761477
defaultConfig.rpcConf.WebSocketConfig.InactivityTimeout,
14771478
"specifies the duration a WebSocket connection can remain open without any active subscriptions before being automatically closed")
1479+
1480+
flags.BoolVar(
1481+
&builder.rpcConf.EnableWebSocketsStreamAPI,
1482+
"experimental-enable-websockets-stream-api",
1483+
defaultConfig.rpcConf.EnableWebSocketsStreamAPI,
1484+
"[experimental] enables WebSockets Stream API that operates under /ws endpoint. this flag may change in a future release.",
1485+
)
14781486
}).ValidateFlags(func() error {
14791487
if builder.supportsObserver && (builder.PublicNetworkConfig.BindAddress == cmd.NotSet || builder.PublicNetworkConfig.BindAddress == "") {
14801488
return errors.New("public-network-address must be set if supports-observer is true")
@@ -2007,12 +2015,12 @@ func (builder *FlowAccessNodeBuilder) Build() (cmd.Node, error) {
20072015

20082016
}
20092017

2010-
preferredENIdentifiers, err := commonrpc.IdentifierList(backendConfig.PreferredExecutionNodeIDs)
2018+
preferredENIdentifiers, err := flow.IdentifierListFromHex(backendConfig.PreferredExecutionNodeIDs)
20112019
if err != nil {
20122020
return nil, fmt.Errorf("failed to convert node id string to Flow Identifier for preferred EN map: %w", err)
20132021
}
20142022

2015-
fixedENIdentifiers, err := commonrpc.IdentifierList(backendConfig.FixedExecutionNodeIDs)
2023+
fixedENIdentifiers, err := flow.IdentifierListFromHex(backendConfig.FixedExecutionNodeIDs)
20162024
if err != nil {
20172025
return nil, fmt.Errorf("failed to convert node id string to Flow Identifier for fixed EN map: %w", err)
20182026
}

Diff for: cmd/bootstrap/cmd/block.go

+5-1
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,10 @@ func constructRootEpochEvents(
4242
participants flow.IdentityList,
4343
assignments flow.AssignmentList,
4444
clusterQCs []*flow.QuorumCertificate,
45-
dkgData dkg.DKGData) (*flow.EpochSetup, *flow.EpochCommit) {
45+
dkgData dkg.ThresholdKeySet,
46+
dkgIndexMap flow.DKGIndexMap,
47+
) (*flow.EpochSetup, *flow.EpochCommit) {
48+
4649
epochSetup := &flow.EpochSetup{
4750
Counter: flagEpochCounter,
4851
FirstView: firstView,
@@ -77,6 +80,7 @@ func constructRootEpochEvents(
7780
ClusterQCs: flow.ClusterQCVoteDatasFromQCs(qcsWithSignerIDs),
7881
DKGGroupKey: dkgData.PubGroupKey,
7982
DKGParticipantKeys: dkgData.PubKeyShares,
83+
DKGIndexMap: dkgIndexMap,
8084
}
8185
return epochSetup, epochCommit
8286
}

Diff for: cmd/bootstrap/cmd/dkg.go

+19-18
Original file line numberDiff line numberDiff line change
@@ -10,34 +10,31 @@ import (
1010
model "github.com/onflow/flow-go/model/bootstrap"
1111
"github.com/onflow/flow-go/model/dkg"
1212
"github.com/onflow/flow-go/model/encodable"
13+
"github.com/onflow/flow-go/model/flow"
1314
"github.com/onflow/flow-go/state/protocol/inmem"
1415
)
1516

16-
func runBeaconKG(nodes []model.NodeInfo) dkg.DKGData {
17+
func runBeaconKG(nodes []model.NodeInfo) (dkg.ThresholdKeySet, flow.DKGIndexMap) {
1718
n := len(nodes)
18-
1919
log.Info().Msgf("read %v node infos for DKG", n)
2020

2121
log.Debug().Msgf("will run DKG")
22-
var dkgData dkg.DKGData
23-
var err error
24-
dkgData, err = bootstrapDKG.RandomBeaconKG(n, GenerateRandomSeed(crypto.KeyGenSeedMinLen))
22+
randomBeaconData, err := bootstrapDKG.RandomBeaconKG(n, GenerateRandomSeed(crypto.KeyGenSeedMinLen))
2523
if err != nil {
2624
log.Fatal().Err(err).Msg("error running DKG")
2725
}
2826
log.Info().Msgf("finished running DKG")
2927

30-
pubKeyShares := make([]encodable.RandomBeaconPubKey, 0, len(dkgData.PubKeyShares))
31-
for _, pubKey := range dkgData.PubKeyShares {
32-
pubKeyShares = append(pubKeyShares, encodable.RandomBeaconPubKey{PublicKey: pubKey})
33-
}
34-
35-
privKeyShares := make([]encodable.RandomBeaconPrivKey, 0, len(dkgData.PrivKeyShares))
36-
for i, privKey := range dkgData.PrivKeyShares {
28+
encodableParticipants := make([]inmem.ThresholdParticipant, 0, len(nodes))
29+
for i, privKey := range randomBeaconData.PrivKeyShares {
3730
nodeID := nodes[i].NodeID
3831

3932
encKey := encodable.RandomBeaconPrivKey{PrivateKey: privKey}
40-
privKeyShares = append(privKeyShares, encKey)
33+
encodableParticipants = append(encodableParticipants, inmem.ThresholdParticipant{
34+
PrivKeyShare: encKey,
35+
PubKeyShare: encodable.RandomBeaconPubKey{PublicKey: randomBeaconData.PubKeyShares[i]},
36+
NodeID: nodeID,
37+
})
4138

4239
err = common.WriteJSON(fmt.Sprintf(model.PathRandomBeaconPriv, nodeID), flagOutdir, encKey)
4340
if err != nil {
@@ -46,18 +43,22 @@ func runBeaconKG(nodes []model.NodeInfo) dkg.DKGData {
4643
log.Info().Msgf("wrote file %s/%s", flagOutdir, fmt.Sprintf(model.PathRandomBeaconPriv, nodeID))
4744
}
4845

46+
indexMap := make(flow.DKGIndexMap, len(nodes))
47+
for i, node := range nodes {
48+
indexMap[node.NodeID] = i
49+
}
50+
4951
// write full DKG info that will be used to construct QC
50-
err = common.WriteJSON(model.PathRootDKGData, flagOutdir, inmem.EncodableFullDKG{
52+
err = common.WriteJSON(model.PathRootDKGData, flagOutdir, inmem.ThresholdKeySet{
5153
GroupKey: encodable.RandomBeaconPubKey{
52-
PublicKey: dkgData.PubGroupKey,
54+
PublicKey: randomBeaconData.PubGroupKey,
5355
},
54-
PubKeyShares: pubKeyShares,
55-
PrivKeyShares: privKeyShares,
56+
Participants: encodableParticipants,
5657
})
5758
if err != nil {
5859
log.Fatal().Err(err).Msg("failed to write json")
5960
}
6061
log.Info().Msgf("wrote file %s/%s", flagOutdir, model.PathRootDKGData)
6162

62-
return dkgData
63+
return randomBeaconData, indexMap
6364
}

Diff for: cmd/bootstrap/cmd/finalize.go

+14-15
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,7 @@ func finalize(cmd *cobra.Command, args []string) {
152152
log.Info().Msgf("received votes total: %v", len(votes))
153153

154154
log.Info().Msg("reading dkg data")
155-
dkgData := readDKGData()
155+
dkgData, _ := readRandomBeaconKeys()
156156
log.Info().Msg("")
157157

158158
log.Info().Msg("reading intermediary bootstrapping data")
@@ -192,7 +192,7 @@ func finalize(cmd *cobra.Command, args []string) {
192192
intermediaryData.ProtocolVersion,
193193
func(epochStateID flow.Identifier) (protocol_state.KVStoreAPI, error) {
194194
return kvstore.NewDefaultKVStore(
195-
intermediaryData.EpochCommitSafetyThreshold,
195+
intermediaryData.FinalizationSafetyThreshold,
196196
intermediaryData.EpochExtensionViewCount,
197197
epochStateID)
198198
},
@@ -352,29 +352,28 @@ func readRootBlock() *flow.Block {
352352
return rootBlock
353353
}
354354

355-
// readDKGData reads DKG data from disc, this file needs to be prepared with
356-
// rootblock command
357-
func readDKGData() dkg.DKGData {
358-
encodableDKG, err := utils.ReadData[inmem.EncodableFullDKG](flagDKGDataPath)
355+
// readRandomBeaconKeys reads the threshold key data from disc.
356+
// This file needs to be prepared with rootblock command
357+
func readRandomBeaconKeys() (dkg.ThresholdKeySet, flow.DKGIndexMap) {
358+
encodableDKG, err := utils.ReadData[inmem.ThresholdKeySet](flagDKGDataPath)
359359
if err != nil {
360-
log.Fatal().Err(err).Msg("could not read DKG data")
360+
log.Fatal().Err(err).Msg("loading threshold key data for Random Beacon failed")
361361
}
362362

363-
dkgData := dkg.DKGData{
363+
dkgData := dkg.ThresholdKeySet{
364364
PrivKeyShares: nil,
365365
PubGroupKey: encodableDKG.GroupKey.PublicKey,
366366
PubKeyShares: nil,
367367
}
368368

369-
for _, pubKey := range encodableDKG.PubKeyShares {
370-
dkgData.PubKeyShares = append(dkgData.PubKeyShares, pubKey.PublicKey)
371-
}
372-
373-
for _, privKey := range encodableDKG.PrivKeyShares {
374-
dkgData.PrivKeyShares = append(dkgData.PrivKeyShares, privKey.PrivateKey)
369+
indexMap := make(flow.DKGIndexMap, len(encodableDKG.Participants))
370+
for i, participant := range encodableDKG.Participants {
371+
dkgData.PubKeyShares = append(dkgData.PubKeyShares, participant.PubKeyShare.PublicKey)
372+
dkgData.PrivKeyShares = append(dkgData.PrivKeyShares, participant.PrivKeyShare.PrivateKey)
373+
indexMap[participant.NodeID] = i
375374
}
376375

377-
return dkgData
376+
return dkgData, indexMap
378377
}
379378

380379
// Validation utility methods ------------------------------------------------

Diff for: cmd/bootstrap/cmd/finalize_test.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ func TestFinalize_HappyPath(t *testing.T) {
7474
flagNumViewsInEpoch = 100_000
7575
flagNumViewsInStakingAuction = 50_000
7676
flagNumViewsInDKGPhase = 2_000
77-
flagEpochCommitSafetyThreshold = 1_000
77+
flagFinalizationSafetyThreshold = 1_000
7878
flagEpochExtensionViewCount = 100_000
7979
flagUseDefaultEpochTargetEndTime = true
8080
flagEpochTimingRefCounter = 0

Diff for: cmd/bootstrap/cmd/intermediary.go

+3-3
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,9 @@ type IntermediaryBootstrappingData struct {
1818
// like the root block).
1919
// This is used to pass data between the rootblock command and the finalize command.
2020
type IntermediaryParamsData struct {
21-
ProtocolVersion uint
22-
EpochCommitSafetyThreshold uint64
23-
EpochExtensionViewCount uint64
21+
ProtocolVersion uint
22+
FinalizationSafetyThreshold uint64
23+
EpochExtensionViewCount uint64
2424
}
2525

2626
// IntermediaryEpochData stores the root epoch and the epoch config for the execution state

Diff for: cmd/bootstrap/cmd/qc.go

+4-4
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,10 @@ import (
1313
)
1414

1515
// constructRootQC constructs root QC based on root block, votes and dkg info
16-
func constructRootQC(block *flow.Block, votes []*model.Vote, allNodes, internalNodes []bootstrap.NodeInfo, dkgData dkg.DKGData) *flow.QuorumCertificate {
16+
func constructRootQC(block *flow.Block, votes []*model.Vote, allNodes, internalNodes []bootstrap.NodeInfo, randomBeaconData dkg.ThresholdKeySet) *flow.QuorumCertificate {
1717

1818
identities := bootstrap.ToIdentityList(allNodes)
19-
participantData, err := run.GenerateQCParticipantData(allNodes, internalNodes, dkgData)
19+
participantData, err := run.GenerateQCParticipantData(allNodes, internalNodes, randomBeaconData)
2020
if err != nil {
2121
log.Fatal().Err(err).Msg("failed to generate QC participant data")
2222
}
@@ -36,8 +36,8 @@ func constructRootQC(block *flow.Block, votes []*model.Vote, allNodes, internalN
3636
}
3737

3838
// NOTE: allNodes must be in the same order as when generating the DKG
39-
func constructRootVotes(block *flow.Block, allNodes, internalNodes []bootstrap.NodeInfo, dkgData dkg.DKGData) {
40-
participantData, err := run.GenerateQCParticipantData(allNodes, internalNodes, dkgData)
39+
func constructRootVotes(block *flow.Block, allNodes, internalNodes []bootstrap.NodeInfo, randomBeaconData dkg.ThresholdKeySet) {
40+
participantData, err := run.GenerateQCParticipantData(allNodes, internalNodes, randomBeaconData)
4141
if err != nil {
4242
log.Fatal().Err(err).Msg("failed to generate QC participant data")
4343
}

Diff for: cmd/bootstrap/cmd/rootblock.go

+27-27
Original file line numberDiff line numberDiff line change
@@ -23,18 +23,18 @@ import (
2323
)
2424

2525
var (
26-
flagRootChain string
27-
flagRootParent string
28-
flagRootHeight uint64
29-
flagRootTimestamp string
30-
flagProtocolVersion uint
31-
flagEpochCommitSafetyThreshold uint64
32-
flagEpochExtensionViewCount uint64
33-
flagCollectionClusters uint
34-
flagEpochCounter uint64
35-
flagNumViewsInEpoch uint64
36-
flagNumViewsInStakingAuction uint64
37-
flagNumViewsInDKGPhase uint64
26+
flagRootChain string
27+
flagRootParent string
28+
flagRootHeight uint64
29+
flagRootTimestamp string
30+
flagProtocolVersion uint
31+
flagFinalizationSafetyThreshold uint64
32+
flagEpochExtensionViewCount uint64
33+
flagCollectionClusters uint
34+
flagEpochCounter uint64
35+
flagNumViewsInEpoch uint64
36+
flagNumViewsInStakingAuction uint64
37+
flagNumViewsInDKGPhase uint64
3838
// Epoch target end time config
3939
flagUseDefaultEpochTargetEndTime bool
4040
flagEpochTimingRefCounter uint64
@@ -93,14 +93,14 @@ func addRootBlockCmdFlags() {
9393
rootBlockCmd.Flags().Uint64Var(&flagRootHeight, "root-height", 0, "height of the root block")
9494
rootBlockCmd.Flags().StringVar(&flagRootTimestamp, "root-timestamp", time.Now().UTC().Format(time.RFC3339), "timestamp of the root block (RFC3339)")
9595
rootBlockCmd.Flags().UintVar(&flagProtocolVersion, "protocol-version", flow.DefaultProtocolVersion, "major software version used for the duration of this spork")
96-
rootBlockCmd.Flags().Uint64Var(&flagEpochCommitSafetyThreshold, "epoch-commit-safety-threshold", 500, "defines epoch commitment deadline")
96+
rootBlockCmd.Flags().Uint64Var(&flagFinalizationSafetyThreshold, "finalization-safety-threshold", 500, "defines finalization safety threshold")
9797
rootBlockCmd.Flags().Uint64Var(&flagEpochExtensionViewCount, "epoch-extension-view-count", 100_000, "length of epoch extension in views, default is 100_000 which is approximately 1 day")
9898

9999
cmd.MarkFlagRequired(rootBlockCmd, "root-chain")
100100
cmd.MarkFlagRequired(rootBlockCmd, "root-parent")
101101
cmd.MarkFlagRequired(rootBlockCmd, "root-height")
102102
cmd.MarkFlagRequired(rootBlockCmd, "protocol-version")
103-
cmd.MarkFlagRequired(rootBlockCmd, "epoch-commit-safety-threshold")
103+
cmd.MarkFlagRequired(rootBlockCmd, "finalization-safety-threshold")
104104
cmd.MarkFlagRequired(rootBlockCmd, "epoch-extension-view-count")
105105

106106
// Epoch timing config - these values must be set identically to `EpochTimingConfig` in the FlowEpoch smart contract.
@@ -138,7 +138,7 @@ func rootBlock(cmd *cobra.Command, args []string) {
138138
// validate epoch configs
139139
err := validateEpochConfig()
140140
if err != nil {
141-
log.Fatal().Err(err).Msg("invalid or unsafe epoch commit threshold config")
141+
log.Fatal().Err(err).Msg("invalid or unsafe config for finalization safety threshold")
142142
}
143143
err = validateOrPopulateEpochTimingConfig()
144144
if err != nil {
@@ -190,7 +190,7 @@ func rootBlock(cmd *cobra.Command, args []string) {
190190
log.Info().Msg("")
191191

192192
log.Info().Msg("running DKG for consensus nodes")
193-
dkgData := runBeaconKG(model.FilterByRole(stakingNodes, flow.RoleConsensus))
193+
randomBeaconData, dkgIndexMap := runBeaconKG(model.FilterByRole(stakingNodes, flow.RoleConsensus))
194194
log.Info().Msg("")
195195

196196
// create flow.IdentityList representation of the participant set
@@ -216,17 +216,17 @@ func rootBlock(cmd *cobra.Command, args []string) {
216216
log.Info().Msg("")
217217

218218
log.Info().Msg("constructing intermediary bootstrapping data")
219-
epochSetup, epochCommit := constructRootEpochEvents(header.View, participants, assignments, clusterQCs, dkgData)
220-
epochConfig := generateExecutionStateEpochConfig(epochSetup, clusterQCs, dkgData)
219+
epochSetup, epochCommit := constructRootEpochEvents(header.View, participants, assignments, clusterQCs, randomBeaconData, dkgIndexMap)
220+
epochConfig := generateExecutionStateEpochConfig(epochSetup, clusterQCs, randomBeaconData)
221221
intermediaryEpochData := IntermediaryEpochData{
222222
RootEpochSetup: epochSetup,
223223
RootEpochCommit: epochCommit,
224224
ExecutionStateConfig: epochConfig,
225225
}
226226
intermediaryParamsData := IntermediaryParamsData{
227-
EpochCommitSafetyThreshold: flagEpochCommitSafetyThreshold,
228-
EpochExtensionViewCount: flagEpochExtensionViewCount,
229-
ProtocolVersion: flagProtocolVersion,
227+
FinalizationSafetyThreshold: flagFinalizationSafetyThreshold,
228+
EpochExtensionViewCount: flagEpochExtensionViewCount,
229+
ProtocolVersion: flagProtocolVersion,
230230
}
231231
intermediaryData := IntermediaryBootstrappingData{
232232
IntermediaryEpochData: intermediaryEpochData,
@@ -241,7 +241,7 @@ func rootBlock(cmd *cobra.Command, args []string) {
241241

242242
log.Info().Msg("constructing root block")
243243
rootProtocolState, err := kvstore.NewDefaultKVStore(
244-
flagEpochCommitSafetyThreshold,
244+
flagFinalizationSafetyThreshold,
245245
flagEpochExtensionViewCount,
246246
inmem.EpochProtocolStateFromServiceEvents(epochSetup, epochCommit).ID(),
247247
)
@@ -261,7 +261,7 @@ func rootBlock(cmd *cobra.Command, args []string) {
261261
block,
262262
model.FilterByRole(stakingNodes, flow.RoleConsensus),
263263
model.FilterByRole(internalNodes, flow.RoleConsensus),
264-
dkgData,
264+
randomBeaconData,
265265
)
266266
log.Info().Msg("")
267267
}
@@ -270,16 +270,16 @@ func rootBlock(cmd *cobra.Command, args []string) {
270270
func validateEpochConfig() error {
271271
chainID := parseChainID(flagRootChain)
272272
dkgFinalView := flagNumViewsInStakingAuction + flagNumViewsInDKGPhase*3 // 3 DKG phases
273-
epochCommitDeadline := flagNumViewsInEpoch - flagEpochCommitSafetyThreshold
273+
epochCommitDeadline := flagNumViewsInEpoch - flagFinalizationSafetyThreshold
274274

275275
defaultEpochSafetyParams, err := protocol.DefaultEpochSafetyParams(chainID)
276276
if err != nil {
277277
return fmt.Errorf("could not get default epoch commit safety threshold: %w", err)
278278
}
279279

280280
// sanity check: the safety threshold is >= the default for the chain
281-
if flagEpochCommitSafetyThreshold < defaultEpochSafetyParams.FinalizationSafetyThreshold {
282-
return fmt.Errorf("potentially unsafe epoch config: epoch commit safety threshold smaller than expected (%d < %d)", flagEpochCommitSafetyThreshold, defaultEpochSafetyParams.FinalizationSafetyThreshold)
281+
if flagFinalizationSafetyThreshold < defaultEpochSafetyParams.FinalizationSafetyThreshold {
282+
return fmt.Errorf("potentially unsafe epoch config: epoch commit safety threshold smaller than expected (%d < %d)", flagFinalizationSafetyThreshold, defaultEpochSafetyParams.FinalizationSafetyThreshold)
283283
}
284284
if flagEpochExtensionViewCount < defaultEpochSafetyParams.EpochExtensionViewCount {
285285
return fmt.Errorf("potentially unsafe epoch config: epoch extension view count smaller than expected (%d < %d)", flagEpochExtensionViewCount, defaultEpochSafetyParams.EpochExtensionViewCount)
@@ -302,7 +302,7 @@ func validateEpochConfig() error {
302302
func generateExecutionStateEpochConfig(
303303
epochSetup *flow.EpochSetup,
304304
clusterQCs []*flow.QuorumCertificate,
305-
dkgData dkg.DKGData,
305+
dkgData dkg.ThresholdKeySet,
306306
) epochs.EpochConfig {
307307

308308
randomSource := make([]byte, flow.EpochSetupRandomSourceLength)

0 commit comments

Comments
 (0)