71
71
BlockBuilderFactory interface {
72
72
Mint (ctx context.Context , pk crypto.PrivateKey ) (* block.Block , error )
73
73
ReceiveBlock (* block.Block ) error
74
- Init (hash.Hash256 )
75
- AddProposal (* block.Block ) error
76
- Block (hash.Hash256 ) * block.Block
77
74
}
78
75
79
76
chainManager struct {
@@ -87,14 +84,15 @@ type (
87
84
sr protocol.StateReader
88
85
timerFactory * prometheustimer.TimerFactory
89
86
bbf BlockBuilderFactory
87
+ pool * proposalPool
90
88
}
91
89
)
92
90
93
91
func init () {
94
92
prometheus .MustRegister (blockMtc )
95
93
}
96
94
97
- func newForkChain (bc blockchain.Blockchain , head * block.Header , sr protocol.StateReader , bbf BlockBuilderFactory ) * forkChain {
95
+ func newForkChain (bc blockchain.Blockchain , head * block.Header , sr protocol.StateReader , bbf BlockBuilderFactory , pool * proposalPool ) * forkChain {
98
96
timerFactory , err := prometheustimer .New (
99
97
"iotex_blockchain_perf" ,
100
98
"Performance of blockchain module" ,
@@ -110,13 +108,14 @@ func newForkChain(bc blockchain.Blockchain, head *block.Header, sr protocol.Stat
110
108
sr : sr ,
111
109
bbf : bbf ,
112
110
timerFactory : timerFactory ,
111
+ pool : pool ,
113
112
}
114
113
}
115
114
116
115
// NewChainManager creates a chain manager
117
116
func NewChainManager (bc blockchain.Blockchain , srf StateReaderFactory , bbf BlockBuilderFactory ) ChainManager {
118
117
return & chainManager {
119
- forkChain : newForkChain (bc , nil , nil , bbf ),
118
+ forkChain : newForkChain (bc , nil , nil , bbf , newProposalPool () ),
120
119
srf : srf ,
121
120
}
122
121
}
@@ -169,7 +168,7 @@ func (fc *forkChain) MintNewBlock(timestamp time.Time, pk crypto.PrivateKey, pre
169
168
if err != nil {
170
169
return nil , errors .Wrapf (err , "failed to create block" )
171
170
}
172
- if err = fc .bbf . AddProposal (blk ); err != nil {
171
+ if err = fc .pool . AddBlock (blk ); err != nil {
173
172
blkHash := blk .HashBlock ()
174
173
log .L ().Error ("failed to add proposal" , zap .Error (err ), zap .Uint64 ("height" , blk .Height ()), log .Hex ("hash" , blkHash [:]))
175
174
}
@@ -204,7 +203,7 @@ func (cm *forkChain) ValidateBlock(blk *block.Block) error {
204
203
if err != nil {
205
204
return err
206
205
}
207
- if err = cm .bbf . AddProposal (blk ); err != nil {
206
+ if err = cm .pool . AddBlock (blk ); err != nil {
208
207
blkHash := blk .HashBlock ()
209
208
log .L ().Error ("failed to add proposal" , zap .Error (err ), zap .Uint64 ("height" , blk .Height ()), log .Hex ("hash" , blkHash [:]))
210
209
}
@@ -220,6 +219,10 @@ func (cm *forkChain) CommitBlock(blk *block.Block) error {
220
219
blkHash := blk .HashBlock ()
221
220
log .L ().Error ("failed to receive block" , zap .Error (err ), zap .Uint64 ("height" , blk .Height ()), log .Hex ("hash" , blkHash [:]))
222
221
}
222
+ if err := cm .pool .ReceiveBlock (blk ); err != nil {
223
+ blkHash := blk .HashBlock ()
224
+ log .L ().Error ("failed to receive block" , zap .Error (err ), zap .Uint64 ("height" , blk .Height ()), log .Hex ("hash" , blkHash [:]))
225
+ }
223
226
return nil
224
227
}
225
228
@@ -232,8 +235,9 @@ func (cm *chainManager) Start(ctx context.Context) error {
232
235
if err != nil {
233
236
return errors .Wrapf (err , "failed to create state reader at %d, hash %x" , head .Height (), head .HashBlock ())
234
237
}
235
- cm .forkChain = newForkChain (cm .bc , head , sr , cm .bbf )
236
- cm .bbf .Init (cm .forkChain .TipHash ())
238
+ cm .forkChain .head = head
239
+ cm .forkChain .sr = sr
240
+ cm .pool .Init (cm .forkChain .TipHash ())
237
241
return nil
238
242
}
239
243
@@ -245,7 +249,7 @@ func (cm *chainManager) Final() ForkChain {
245
249
func (cm * chainManager ) Fork (hash hash.Hash256 ) (ForkChain , error ) {
246
250
head := cm .head
247
251
if hash != cm .tipHash () {
248
- blk := cm .bbf . Block (hash )
252
+ blk := cm .pool . BlockByHash (hash )
249
253
if blk == nil {
250
254
return nil , errors .Errorf ("block %x not found when fork" , hash )
251
255
}
@@ -255,11 +259,11 @@ func (cm *chainManager) Fork(hash hash.Hash256) (ForkChain, error) {
255
259
if err != nil {
256
260
return nil , errors .Wrapf (err , "failed to create state reader at %d, hash %x" , head .Height (), head .HashBlock ())
257
261
}
258
- return newForkChain (cm .bc , head , sr , cm .bbf ), nil
262
+ return newForkChain (cm .bc , head , sr , cm .bbf , cm . pool ), nil
259
263
}
260
264
261
265
func (fc * forkChain ) draftBlockByHeight (height uint64 ) * block.Block {
262
- for blk := fc .bbf . Block (fc .tipHash ()); blk != nil && blk .Height () >= height ; blk = fc .bbf . Block (blk .PrevHash ()) {
266
+ for blk := fc .pool . BlockByHash (fc .tipHash ()); blk != nil && blk .Height () >= height ; blk = fc .pool . BlockByHash (blk .PrevHash ()) {
263
267
if blk .Height () == height {
264
268
return blk
265
269
}
0 commit comments