-
Notifications
You must be signed in to change notification settings - Fork 199
/
metaForkDetector.go
80 lines (65 loc) · 1.83 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
package sync
import (
"github.com/ElrondNetwork/elrond-go/consensus"
"github.com/ElrondNetwork/elrond-go/data"
"github.com/ElrondNetwork/elrond-go/process"
)
// metaForkDetector implements the meta fork detector mechanism
type metaForkDetector struct {
*baseForkDetector
}
// NewMetaForkDetector method creates a new metaForkDetector object
func NewMetaForkDetector(rounder consensus.Rounder) (*metaForkDetector, error) {
if rounder == nil || rounder.IsInterfaceNil() {
return nil, process.ErrNilRounder
}
bfd := &baseForkDetector{
rounder: rounder,
}
bfd.headers = make(map[uint64][]*headerInfo)
checkpoint := &checkpointInfo{}
bfd.setFinalCheckpoint(checkpoint)
bfd.addCheckpoint(checkpoint)
mfd := metaForkDetector{
baseForkDetector: bfd,
}
return &mfd, nil
}
// AddHeader method adds a new header to headers map
func (mfd *metaForkDetector) AddHeader(
header data.HeaderHandler,
headerHash []byte,
state process.BlockHeaderState,
finalHeaders []data.HeaderHandler,
finalHeadersHashes [][]byte,
) error {
if header == nil || header.IsInterfaceNil() {
return ErrNilHeader
}
if headerHash == nil {
return ErrNilHash
}
err := mfd.checkBlockBasicValidity(header, state)
if err != nil {
return err
}
err = mfd.shouldAddBlockInForkDetector(header, state, process.MetaBlockFinality)
if err != nil {
return err
}
if state == process.BHProcessed {
mfd.setFinalCheckpoint(mfd.lastCheckpoint())
mfd.addCheckpoint(&checkpointInfo{nonce: header.GetNonce(), round: header.GetRound()})
mfd.removePastOrInvalidRecords()
}
mfd.append(&headerInfo{
nonce: header.GetNonce(),
round: header.GetRound(),
hash: headerHash,
state: state,
})
probableHighestNonce := mfd.computeProbableHighestNonce()
mfd.setLastBlockRound(uint64(mfd.rounder.Index()))
mfd.setProbableHighestNonce(probableHighestNonce)
return nil
}