Skip to content

Commit de694d9

Browse files
author
Alexander Hentschel
committed
first final draft
1 parent 8e28b80 commit de694d9

File tree

23 files changed

+497
-551
lines changed

23 files changed

+497
-551
lines changed

cmd/access/node_builder/access_node_builder.go

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -313,10 +313,8 @@ func (builder *FlowAccessNodeBuilder) buildFollowerCore() *FlowAccessNodeBuilder
313313

314314
followerCore, err := consensus.NewFollower(
315315
node.Logger,
316-
builder.Committee,
317316
node.Storage.Headers,
318317
final,
319-
verifier,
320318
builder.FinalizationDistributor,
321319
node.RootBlock.Header,
322320
node.RootQC,

cmd/collection/main.go

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -282,16 +282,11 @@ func main() {
282282
if err != nil {
283283
return nil, fmt.Errorf("could not find latest finalized block and pending blocks to recover consensus follower: %w", err)
284284
}
285-
packer := hotsignature.NewConsensusSigDataPacker(mainConsensusCommittee)
286-
// initialize the verifier for the protocol consensus
287-
verifier := verification.NewCombinedVerifier(mainConsensusCommittee, packer)
288285
// creates a consensus follower with noop consumer as the notifier
289286
followerCore, err = consensus.NewFollower(
290287
node.Logger,
291-
mainConsensusCommittee,
292288
node.Storage.Headers,
293289
finalizer,
294-
verifier,
295290
finalizationDistributor,
296291
node.RootBlock.Header,
297292
node.RootQC,

cmd/execution_builder.go

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -849,10 +849,6 @@ func (exeNode *ExecutionNode) LoadFollowerCore(
849849
// state when the follower detects newly finalized blocks
850850
final := finalizer.NewFinalizer(node.DB, node.Storage.Headers, exeNode.followerState, node.Tracer)
851851

852-
packer := signature.NewConsensusSigDataPacker(exeNode.committee)
853-
// initialize the verifier for the protocol consensus
854-
verifier := verification.NewCombinedVerifier(exeNode.committee, packer)
855-
856852
finalized, pending, err := recovery.FindLatest(node.State, node.Storage.Headers)
857853
if err != nil {
858854
return nil, fmt.Errorf("could not find latest finalized block and pending blocks to recover consensus follower: %w", err)
@@ -864,10 +860,8 @@ func (exeNode *ExecutionNode) LoadFollowerCore(
864860
// so that it gets notified upon each new finalized block
865861
exeNode.followerCore, err = consensus.NewFollower(
866862
node.Logger,
867-
exeNode.committee,
868863
node.Storage.Headers,
869864
final,
870-
verifier,
871865
exeNode.finalizationDistributor,
872866
node.RootBlock.Header,
873867
node.RootQC,

cmd/observer/node_builder/observer_builder.go

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,6 @@ type ObserverServiceBuilder struct {
176176
Finalized *flow.Header
177177
Pending []*flow.Header
178178
FollowerCore module.HotStuffFollower
179-
Validator hotstuff.Validator
180179
ExecutionDataDownloader execution_data.Downloader
181180
ExecutionDataRequester state_synchronization.ExecutionDataRequester // for the observer, the sync engine participants provider is the libp2p peer store which is not
182181
// available until after the network has started. Hence, a factory function that needs to be called just before
@@ -329,17 +328,10 @@ func (builder *ObserverServiceBuilder) buildFollowerCore() *ObserverServiceBuild
329328
// state when the follower detects newly finalized blocks
330329
final := finalizer.NewFinalizer(node.DB, node.Storage.Headers, builder.FollowerState, node.Tracer)
331330

332-
packer := hotsignature.NewConsensusSigDataPacker(builder.Committee)
333-
// initialize the verifier for the protocol consensus
334-
verifier := verification.NewCombinedVerifier(builder.Committee, packer)
335-
builder.Validator = hotstuffvalidator.New(builder.Committee, verifier)
336-
337331
followerCore, err := consensus.NewFollower(
338332
node.Logger,
339-
builder.Committee,
340333
node.Storage.Headers,
341334
final,
342-
verifier,
343335
builder.FinalizationDistributor,
344336
node.RootBlock.Header,
345337
node.RootQC,
@@ -363,14 +355,18 @@ func (builder *ObserverServiceBuilder) buildFollowerEngine() *ObserverServiceBui
363355
if node.HeroCacheMetricsEnable {
364356
heroCacheCollector = metrics.FollowerCacheMetrics(node.MetricsRegisterer)
365357
}
358+
packer := hotsignature.NewConsensusSigDataPacker(builder.Committee)
359+
verifier := verification.NewCombinedVerifier(builder.Committee, packer) // verifier for HotStuff signature constructs (QCs, TCs, votes)
360+
val := hotstuffvalidator.New(builder.Committee, verifier)
361+
366362
core, err := follower.NewComplianceCore(
367363
node.Logger,
368364
node.Metrics.Mempool,
369365
heroCacheCollector,
370366
builder.FinalizationDistributor,
371367
builder.FollowerState,
372368
builder.FollowerCore,
373-
builder.Validator,
369+
val,
374370
builder.SyncCore,
375371
node.Tracer,
376372
)

cmd/verification_builder.go

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -332,15 +332,10 @@ func (v *VerificationNodeBuilder) LoadComponentsAndModules() {
332332
return committee, err
333333
}).
334334
Component("follower core", func(node *NodeConfig) (module.ReadyDoneAware, error) {
335-
336335
// create a finalizer that handles updating the protocol
337336
// state when the follower detects newly finalized blocks
338337
final := finalizer.NewFinalizer(node.DB, node.Storage.Headers, followerState, node.Tracer)
339338

340-
packer := hotsignature.NewConsensusSigDataPacker(committee)
341-
// initialize the verifier for the protocol consensus
342-
verifier := verification.NewCombinedVerifier(committee, packer)
343-
344339
finalized, pending, err := recoveryprotocol.FindLatest(node.State, node.Storage.Headers)
345340
if err != nil {
346341
return nil, fmt.Errorf("could not find latest finalized block and pending blocks to recover consensus follower: %w", err)
@@ -352,10 +347,8 @@ func (v *VerificationNodeBuilder) LoadComponentsAndModules() {
352347
// so that it gets notified upon each new finalized block
353348
followerCore, err = flowconsensus.NewFollower(
354349
node.Logger,
355-
committee,
356350
node.Storage.Headers,
357351
final,
358-
verifier,
359352
finalizationDistributor,
360353
node.RootBlock.Header,
361354
node.RootQC,

consensus/follower.go

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import (
66
"github.com/rs/zerolog"
77

88
"github.com/onflow/flow-go/consensus/hotstuff"
9-
"github.com/onflow/flow-go/consensus/hotstuff/validator"
109
"github.com/onflow/flow-go/consensus/recovery"
1110
"github.com/onflow/flow-go/model/flow"
1211
"github.com/onflow/flow-go/module"
@@ -15,28 +14,30 @@ import (
1514

1615
// TODO: this needs to be integrated with proper configuration and bootstrapping.
1716

17+
// NewFollower instantiates the consensus follower and recovers its in-memory state of pending blocks.
18+
// It receives the list `pending` containing _all_ blocks that
19+
// - have passed the compliance layer and stored in the protocol state
20+
// - descend from the latest finalized block
21+
// - are listed in ancestor-first order (i.e. for any block B ∈ pending, B's parent must
22+
// be listed before B, unless B's parent is the latest finalized block)
23+
//
24+
// CAUTION: all pending blocks are required to be valid (guaranteed if the block passed the compliance layer)
1825
func NewFollower(log zerolog.Logger,
19-
committee hotstuff.DynamicCommittee,
2026
headers storage.Headers,
2127
updater module.Finalizer,
22-
verifier hotstuff.Verifier,
2328
notifier hotstuff.FinalizationConsumer,
2429
rootHeader *flow.Header,
2530
rootQC *flow.QuorumCertificate,
2631
finalized *flow.Header,
2732
pending []*flow.Header,
2833
) (*hotstuff.FollowerLoop, error) {
29-
3034
forks, err := NewForks(finalized, headers, updater, notifier, rootHeader, rootQC)
3135
if err != nil {
3236
return nil, fmt.Errorf("could not initialize forks: %w", err)
3337
}
3438

35-
// initialize the Validator
36-
validator := validator.New(committee, verifier)
37-
38-
// recover the HotStuff follower's internal state (inserts all pending blocks into Forks)
39-
err = recovery.Follower(log, forks, validator, pending)
39+
// recover forks internal state (inserts all pending blocks)
40+
err = recovery.Recover(log, pending, recovery.ForksState(forks))
4041
if err != nil {
4142
return nil, fmt.Errorf("could not recover hotstuff follower state: %w", err)
4243
}

0 commit comments

Comments
 (0)