-
Notifications
You must be signed in to change notification settings - Fork 202
/
validatorInfoPreProcessor.go
181 lines (150 loc) · 5.14 KB
/
validatorInfoPreProcessor.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
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
package preprocess
import (
"time"
"github.com/ElrondNetwork/elrond-go/core"
"github.com/ElrondNetwork/elrond-go/core/check"
"github.com/ElrondNetwork/elrond-go/data"
"github.com/ElrondNetwork/elrond-go/data/block"
"github.com/ElrondNetwork/elrond-go/hashing"
"github.com/ElrondNetwork/elrond-go/marshal"
"github.com/ElrondNetwork/elrond-go/process"
"github.com/ElrondNetwork/elrond-go/storage"
)
var _ process.DataMarshalizer = (*validatorInfoPreprocessor)(nil)
var _ process.PreProcessor = (*validatorInfoPreprocessor)(nil)
type validatorInfoPreprocessor struct {
hasher hashing.Hasher
marshalizer marshal.Marshalizer
blockSizeComputation BlockSizeComputationHandler
}
// NewValidatorInfoPreprocessor creates a new validatorInfo preprocessor object
func NewValidatorInfoPreprocessor(
hasher hashing.Hasher,
marshalizer marshal.Marshalizer,
blockSizeComputation BlockSizeComputationHandler,
) (*validatorInfoPreprocessor, error) {
if check.IfNil(hasher) {
return nil, process.ErrNilHasher
}
if check.IfNil(marshalizer) {
return nil, process.ErrNilMarshalizer
}
if check.IfNil(blockSizeComputation) {
return nil, process.ErrNilBlockSizeComputationHandler
}
rtp := &validatorInfoPreprocessor{
hasher: hasher,
marshalizer: marshalizer,
blockSizeComputation: blockSizeComputation,
}
return rtp, nil
}
// IsDataPrepared does nothing
func (vip *validatorInfoPreprocessor) IsDataPrepared(_ int, _ func() time.Duration) error {
return nil
}
// RemoveTxBlockFromPools removes the peerMiniBlock from pool
func (vip *validatorInfoPreprocessor) RemoveTxBlockFromPools(body *block.Body, miniBlockPool storage.Cacher) error {
if check.IfNil(body) {
return process.ErrNilBlockBody
}
if check.IfNil(miniBlockPool) {
return process.ErrNilMiniBlockPool
}
for i := 0; i < len(body.MiniBlocks); i++ {
currentMiniBlock := body.MiniBlocks[i]
if currentMiniBlock.Type != block.PeerBlock {
continue
}
miniBlockHash, err := core.CalculateHash(vip.marshalizer, vip.hasher, currentMiniBlock)
if err != nil {
return err
}
miniBlockPool.Remove(miniBlockHash)
}
return nil
}
// RestoreTxBlockIntoPools restores the peerMiniBlock to the pool
func (vip *validatorInfoPreprocessor) RestoreTxBlockIntoPools(
body *block.Body,
miniBlockPool storage.Cacher,
) (int, error) {
if check.IfNil(body) {
return 0, process.ErrNilBlockBody
}
if check.IfNil(miniBlockPool) {
return 0, process.ErrNilMiniBlockPool
}
validatorsInfoRestored := 0
for i := 0; i < len(body.MiniBlocks); i++ {
miniBlock := body.MiniBlocks[i]
if miniBlock.Type != block.PeerBlock {
continue
}
miniBlockHash, err := core.CalculateHash(vip.marshalizer, vip.hasher, miniBlock)
if err != nil {
return validatorsInfoRestored, err
}
miniBlockPool.Put(miniBlockHash, miniBlock, miniBlock.Size())
validatorsInfoRestored += len(miniBlock.TxHashes)
}
return validatorsInfoRestored, nil
}
// ProcessBlockTransactions does nothing
func (vip *validatorInfoPreprocessor) ProcessBlockTransactions(
_ *block.Body,
_ func() bool,
) error {
return nil
}
// SaveTxBlockToStorage does nothing
func (vip *validatorInfoPreprocessor) SaveTxBlockToStorage(_ *block.Body) error {
return nil
}
// CreateBlockStarted does nothing
func (vip *validatorInfoPreprocessor) CreateBlockStarted() {
}
// RequestBlockTransactions does nothing
func (vip *validatorInfoPreprocessor) RequestBlockTransactions(_ *block.Body) int {
return 0
}
// RequestTransactionsForMiniBlock does nothing
func (vip *validatorInfoPreprocessor) RequestTransactionsForMiniBlock(_ *block.MiniBlock) int {
return 0
}
// CreateAndProcessMiniBlocks does nothing
func (vip *validatorInfoPreprocessor) CreateAndProcessMiniBlocks(_ func() bool) (block.MiniBlockSlice, error) {
// validatorsInfo are created only by meta
return make(block.MiniBlockSlice, 0), nil
}
// ProcessMiniBlock does nothing
func (vip *validatorInfoPreprocessor) ProcessMiniBlock(miniBlock *block.MiniBlock, _ func() bool, _ func() (int, int)) ([][]byte, error) {
if miniBlock.Type != block.PeerBlock {
return nil, process.ErrWrongTypeInMiniBlock
}
if miniBlock.SenderShardID != core.MetachainShardId {
return nil, process.ErrValidatorInfoMiniBlockNotFromMeta
}
//TODO: We need another function in the BlockSizeComputationHandler implementation that will better handle
//the PeerBlock miniblocks as those are not hashes
if vip.blockSizeComputation.IsMaxBlockSizeWithoutThrottleReached(1, len(miniBlock.TxHashes)) {
return nil, process.ErrMaxBlockSizeReached
}
vip.blockSizeComputation.AddNumMiniBlocks(1)
vip.blockSizeComputation.AddNumTxs(len(miniBlock.TxHashes))
return nil, nil
}
// CreateMarshalizedData does nothing
func (vip *validatorInfoPreprocessor) CreateMarshalizedData(_ [][]byte) ([][]byte, error) {
marshalized := make([][]byte, 0)
return marshalized, nil
}
// GetAllCurrentUsedTxs does nothing
func (vip *validatorInfoPreprocessor) GetAllCurrentUsedTxs() map[string]data.TransactionHandler {
validatorInfoTxPool := make(map[string]data.TransactionHandler)
return validatorInfoTxPool
}
// IsInterfaceNil does nothing
func (vip *validatorInfoPreprocessor) IsInterfaceNil() bool {
return vip == nil
}