forked from kaspanet/kaspad
-
Notifications
You must be signed in to change notification settings - Fork 7
/
validate_and_insert_block_with_trusted_data.go
98 lines (83 loc) · 3.04 KB
/
validate_and_insert_block_with_trusted_data.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
package blockprocessor
import (
"github.com/Hoosat-Oy/HTND/domain/consensus/model"
"github.com/Hoosat-Oy/HTND/domain/consensus/model/externalapi"
"github.com/Hoosat-Oy/HTND/domain/consensus/utils/consensushashing"
"github.com/Hoosat-Oy/HTND/infrastructure/db/database"
)
func (bp *blockProcessor) validateAndInsertBlockWithTrustedData(stagingArea *model.StagingArea,
block *externalapi.BlockWithTrustedData, validateUTXO bool) (*externalapi.VirtualChangeSet, externalapi.BlockStatus, error) {
blockHash := consensushashing.BlockHash(block.Block)
for i, daaBlock := range block.DAAWindow {
hash := consensushashing.HeaderHash(daaBlock.Header)
bp.blocksWithTrustedDataDAAWindowStore.Stage(stagingArea, blockHash, uint64(i), &externalapi.BlockGHOSTDAGDataHashPair{
Hash: hash,
GHOSTDAGData: daaBlock.GHOSTDAGData,
})
bp.blockHeaderStore.Stage(stagingArea, hash, daaBlock.Header)
}
blockReplacedGHOSTDAGData, err := bp.ghostdagDataWithoutPrunedBlocks(stagingArea, block.GHOSTDAGData[0].GHOSTDAGData)
if err != nil {
return nil, externalapi.StatusInvalid, err
}
bp.ghostdagDataStore.Stage(stagingArea, blockHash, blockReplacedGHOSTDAGData, false)
for _, pair := range block.GHOSTDAGData {
bp.ghostdagDataStore.Stage(stagingArea, pair.Hash, pair.GHOSTDAGData, true)
}
bp.daaBlocksStore.StageDAAScore(stagingArea, blockHash, block.Block.Header.DAAScore())
return bp.validateAndInsertBlock(stagingArea, block.Block, false, validateUTXO, true)
}
func (bp *blockProcessor) ghostdagDataWithoutPrunedBlocks(stagingArea *model.StagingArea,
data *externalapi.BlockGHOSTDAGData) (*externalapi.BlockGHOSTDAGData, error) {
mergeSetBlues := make([]*externalapi.DomainHash, 0, len(data.MergeSetBlues()))
for _, blockHash := range data.MergeSetBlues() {
isPruned, err := bp.isPruned(stagingArea, blockHash)
if err != nil {
return nil, err
}
if isPruned {
if data.SelectedParent().Equal(blockHash) {
mergeSetBlues = append(mergeSetBlues, model.VirtualGenesisBlockHash)
}
continue
}
mergeSetBlues = append(mergeSetBlues, blockHash)
}
mergeSetReds := make([]*externalapi.DomainHash, 0, len(data.MergeSetReds()))
for _, blockHash := range data.MergeSetReds() {
isPruned, err := bp.isPruned(stagingArea, blockHash)
if err != nil {
return nil, err
}
if isPruned {
continue
}
mergeSetReds = append(mergeSetReds, blockHash)
}
selectedParent := data.SelectedParent()
isPruned, err := bp.isPruned(stagingArea, data.SelectedParent())
if err != nil {
return nil, err
}
if isPruned {
selectedParent = model.VirtualGenesisBlockHash
}
return externalapi.NewBlockGHOSTDAGData(
data.BlueScore(),
data.BlueWork(),
selectedParent,
mergeSetBlues,
mergeSetReds,
data.BluesAnticoneSizes(),
), nil
}
func (bp *blockProcessor) isPruned(stagingArea *model.StagingArea, blockHash *externalapi.DomainHash) (bool, error) {
_, err := bp.ghostdagDataStore.Get(bp.databaseContext, stagingArea, blockHash, false)
if database.IsNotFoundError(err) {
return true, nil
}
if err != nil {
return false, err
}
return false, nil
}