forked from kaspanet/kaspad
-
Notifications
You must be signed in to change notification settings - Fork 0
/
syncmanager.go
118 lines (94 loc) · 4.16 KB
/
syncmanager.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
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
package syncmanager
import (
"github.com/pkg/errors"
"github.com/romxxxx/nexepad/domain/consensus/model"
"github.com/romxxxx/nexepad/domain/consensus/model/externalapi"
"github.com/romxxxx/nexepad/infrastructure/logger"
)
type syncManager struct {
databaseContext model.DBReader
genesisBlockHash *externalapi.DomainHash
dagTraversalManager model.DAGTraversalManager
dagTopologyManager model.DAGTopologyManager
ghostdagManager model.GHOSTDAGManager
pruningManager model.PruningManager
ghostdagDataStore model.GHOSTDAGDataStore
blockStatusStore model.BlockStatusStore
blockHeaderStore model.BlockHeaderStore
blockStore model.BlockStore
pruningStore model.PruningStore
headersSelectedChainStore model.HeadersSelectedChainStore
mergeSetSizeLimit uint64
}
// New instantiates a new SyncManager
func New(
databaseContext model.DBReader,
genesisBlockHash *externalapi.DomainHash,
mergeSetSizeLimit uint64,
dagTraversalManager model.DAGTraversalManager,
dagTopologyManager model.DAGTopologyManager,
ghostdagManager model.GHOSTDAGManager,
pruningManager model.PruningManager,
ghostdagDataStore model.GHOSTDAGDataStore,
blockStatusStore model.BlockStatusStore,
blockHeaderStore model.BlockHeaderStore,
blockStore model.BlockStore,
pruningStore model.PruningStore,
headersSelectedChainStore model.HeadersSelectedChainStore) model.SyncManager {
return &syncManager{
databaseContext: databaseContext,
genesisBlockHash: genesisBlockHash,
dagTraversalManager: dagTraversalManager,
dagTopologyManager: dagTopologyManager,
ghostdagManager: ghostdagManager,
pruningManager: pruningManager,
headersSelectedChainStore: headersSelectedChainStore,
ghostdagDataStore: ghostdagDataStore,
blockStatusStore: blockStatusStore,
blockHeaderStore: blockHeaderStore,
blockStore: blockStore,
pruningStore: pruningStore,
}
}
func (sm *syncManager) GetHashesBetween(stagingArea *model.StagingArea, lowHash, highHash *externalapi.DomainHash,
maxBlocks uint64) (hashes []*externalapi.DomainHash, actualHighHash *externalapi.DomainHash, err error) {
onEnd := logger.LogAndMeasureExecutionTime(log, "GetHashesBetween")
defer onEnd()
return sm.antiPastHashesBetween(stagingArea, lowHash, highHash, maxBlocks)
}
func (sm *syncManager) GetAnticone(stagingArea *model.StagingArea, blockHash, contextHash *externalapi.DomainHash, maxBlocks uint64) (hashes []*externalapi.DomainHash, err error) {
onEnd := logger.LogAndMeasureExecutionTime(log, "GetAnticone")
defer onEnd()
isContextAncestorOfBlock, err := sm.dagTopologyManager.IsAncestorOf(stagingArea, contextHash, blockHash)
if err != nil {
return nil, err
}
if isContextAncestorOfBlock {
return nil, errors.Errorf("expected block %s to not be in future of %s",
blockHash,
contextHash)
}
return sm.dagTraversalManager.AnticoneFromBlocks(stagingArea, []*externalapi.DomainHash{contextHash}, blockHash, maxBlocks)
}
func (sm *syncManager) GetMissingBlockBodyHashes(stagingArea *model.StagingArea, highHash *externalapi.DomainHash) ([]*externalapi.DomainHash, error) {
onEnd := logger.LogAndMeasureExecutionTime(log, "GetMissingBlockBodyHashes")
defer onEnd()
return sm.missingBlockBodyHashes(stagingArea, highHash)
}
func (sm *syncManager) CreateBlockLocator(stagingArea *model.StagingArea,
lowHash, highHash *externalapi.DomainHash, limit uint32) (externalapi.BlockLocator, error) {
onEnd := logger.LogAndMeasureExecutionTime(log, "CreateBlockLocatorFromPruningPoint")
defer onEnd()
return sm.createBlockLocator(stagingArea, lowHash, highHash, limit)
}
func (sm *syncManager) CreateHeadersSelectedChainBlockLocator(stagingArea *model.StagingArea,
lowHash, highHash *externalapi.DomainHash) (externalapi.BlockLocator, error) {
onEnd := logger.LogAndMeasureExecutionTime(log, "CreateHeadersSelectedChainBlockLocator")
defer onEnd()
return sm.createHeadersSelectedChainBlockLocator(stagingArea, lowHash, highHash)
}
func (sm *syncManager) GetSyncInfo(stagingArea *model.StagingArea) (*externalapi.SyncInfo, error) {
onEnd := logger.LogAndMeasureExecutionTime(log, "GetSyncInfo")
defer onEnd()
return sm.syncInfo(stagingArea)
}