-
Notifications
You must be signed in to change notification settings - Fork 199
/
metaForkDetector.go
90 lines (76 loc) · 2.12 KB
/
metaForkDetector.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
package sync
import (
"math"
"github.com/ElrondNetwork/elrond-go/consensus"
"github.com/ElrondNetwork/elrond-go/core/check"
"github.com/ElrondNetwork/elrond-go/data"
"github.com/ElrondNetwork/elrond-go/process"
)
var _ process.ForkDetector = (*metaForkDetector)(nil)
// metaForkDetector implements the meta fork detector mechanism
type metaForkDetector struct {
*baseForkDetector
}
// NewMetaForkDetector method creates a new metaForkDetector object
func NewMetaForkDetector(
rounder consensus.Rounder,
blackListHandler process.BlackListHandler,
blockTracker process.BlockTracker,
genesisTime int64,
) (*metaForkDetector, error) {
if check.IfNil(rounder) {
return nil, process.ErrNilRounder
}
if check.IfNil(blackListHandler) {
return nil, process.ErrNilBlackListHandler
}
if check.IfNil(blockTracker) {
return nil, process.ErrNilBlockTracker
}
bfd := &baseForkDetector{
rounder: rounder,
blackListHandler: blackListHandler,
genesisTime: genesisTime,
blockTracker: blockTracker,
}
bfd.headers = make(map[uint64][]*headerInfo)
bfd.fork.checkpoint = make([]*checkpointInfo, 0)
checkpoint := &checkpointInfo{}
bfd.setFinalCheckpoint(checkpoint)
bfd.addCheckpoint(checkpoint)
bfd.fork.rollBackNonce = math.MaxUint64
mfd := metaForkDetector{
baseForkDetector: bfd,
}
bfd.forkDetector = &mfd
return &mfd, nil
}
// AddHeader method adds a new header to headers map
func (mfd *metaForkDetector) AddHeader(
header data.HeaderHandler,
headerHash []byte,
state process.BlockHeaderState,
selfNotarizedHeaders []data.HeaderHandler,
selfNotarizedHeadersHashes [][]byte,
) error {
return mfd.addHeader(
header,
headerHash,
state,
selfNotarizedHeaders,
selfNotarizedHeadersHashes,
mfd.doJobOnBHProcessed,
)
}
func (mfd *metaForkDetector) doJobOnBHProcessed(
header data.HeaderHandler,
headerHash []byte,
_ []data.HeaderHandler,
_ [][]byte,
) {
mfd.setFinalCheckpoint(mfd.lastCheckpoint())
mfd.addCheckpoint(&checkpointInfo{nonce: header.GetNonce(), round: header.GetRound(), hash: headerHash})
mfd.removePastOrInvalidRecords()
}
func (mfd *metaForkDetector) computeFinalCheckpoint() {
}