@@ -2,16 +2,16 @@ package core
2
2
3
3
import (
4
4
"fmt"
5
- "github.com/ethereum/go-ethereum/event"
6
- "github.com/ethereum/go-ethereum/metrics"
7
5
"math/rand"
8
6
"time"
9
7
10
8
lru "github.com/hashicorp/golang-lru"
11
9
12
10
"github.com/ethereum/go-ethereum/common"
13
11
"github.com/ethereum/go-ethereum/core/types"
12
+ "github.com/ethereum/go-ethereum/event"
14
13
"github.com/ethereum/go-ethereum/log"
14
+ "github.com/ethereum/go-ethereum/metrics"
15
15
)
16
16
17
17
const (
@@ -30,11 +30,11 @@ const (
30
30
)
31
31
32
32
var (
33
- remoteVerifyTaskCounter = metrics .NewRegisteredCounter ("remote/state/verify /task/total" , nil )
34
- succeedRemoteVerifyTaskMeter = metrics .NewRegisteredMeter ("succeed/remote/verify/task " , nil )
35
- failedRemoteVerifyTaskMeter = metrics .NewRegisteredMeter ("failed/remote/verify/task " , nil )
33
+ verifyTaskCounter = metrics .NewRegisteredCounter ("verifymanager /task/total" , nil )
34
+ verifyTaskSucceedMeter = metrics .NewRegisteredMeter ("verifymanager/task/result/succeed " , nil )
35
+ verifyTaskFailedMeter = metrics .NewRegisteredMeter ("verifymanager/task/result/failed " , nil )
36
36
37
- succeedTaskExecutionTimer = metrics .NewRegisteredTimer ("succeed /task/execution" , nil )
37
+ verifyTaskExecutionTimer = metrics .NewRegisteredTimer ("verifymanager /task/execution" , nil )
38
38
)
39
39
40
40
type remoteVerifyManager struct {
@@ -53,14 +53,14 @@ type remoteVerifyManager struct {
53
53
messageCh chan verifyMessage
54
54
}
55
55
56
- func NewVerifyManager (blockchain * BlockChain , peers verifyPeers , allowUntrusted bool ) * remoteVerifyManager {
56
+ func NewVerifyManager (blockchain * BlockChain , peers verifyPeers , allowInsecure bool ) * remoteVerifyManager {
57
57
verifiedCache , _ := lru .New (verifiedCacheSize )
58
58
vm := & remoteVerifyManager {
59
59
bc : blockchain ,
60
60
tasks : make (map [common.Hash ]* verifyTask ),
61
61
peers : peers ,
62
62
verifiedCache : verifiedCache ,
63
- allowInsecure : allowUntrusted ,
63
+ allowInsecure : allowInsecure ,
64
64
65
65
chainHeadCh : make (chan ChainHeadEvent , chainHeadChanSize ),
66
66
verifyCh : make (chan common.Hash , maxForkHeight ),
@@ -87,18 +87,18 @@ func (vm *remoteVerifyManager) mainLoop() {
87
87
vm .cacheBlockVerified (hash )
88
88
if task , ok := vm .tasks [hash ]; ok {
89
89
delete (vm .tasks , hash )
90
- remoteVerifyTaskCounter .Dec (1 )
91
- succeedRemoteVerifyTaskMeter .Mark (1 )
92
- succeedTaskExecutionTimer .Update (time .Since (task .startAt ))
90
+ verifyTaskCounter .Dec (1 )
91
+ verifyTaskSucceedMeter .Mark (1 )
92
+ verifyTaskExecutionTimer .Update (time .Since (task .startAt ))
93
93
close (task .terminalCh )
94
94
}
95
95
case <- pruneTicker .C :
96
96
for hash , task := range vm .tasks {
97
97
if vm .bc .CurrentHeader ().Number .Cmp (task .blockHeader .Number ) == 1 &&
98
98
vm .bc .CurrentHeader ().Number .Uint64 ()- task .blockHeader .Number .Uint64 () > pruneHeightDiff {
99
99
delete (vm .tasks , hash )
100
- remoteVerifyTaskCounter .Dec (1 )
101
- failedRemoteVerifyTaskMeter .Mark (1 )
100
+ verifyTaskCounter .Dec (1 )
101
+ verifyTaskFailedMeter .Mark (1 )
102
102
close (task .terminalCh )
103
103
}
104
104
}
@@ -137,7 +137,7 @@ func (vm *remoteVerifyManager) NewBlockVerifyTask(header *types.Header) {
137
137
if diffLayer , err = vm .bc .GenerateDiffLayer (hash ); err != nil {
138
138
log .Error ("failed to get diff layer" , "block" , hash , "number" , header .Number , "error" , err )
139
139
return
140
- } else {
140
+ } else if diffLayer == nil {
141
141
log .Info ("this is an empty block:" , "block" , hash , "number" , header .Number )
142
142
return
143
143
}
@@ -149,7 +149,7 @@ func (vm *remoteVerifyManager) NewBlockVerifyTask(header *types.Header) {
149
149
}
150
150
verifyTask := NewVerifyTask (diffHash , header , vm .peers , vm .verifyCh , vm .allowInsecure )
151
151
vm .tasks [hash ] = verifyTask
152
- remoteVerifyTaskCounter .Inc (1 )
152
+ verifyTaskCounter .Inc (1 )
153
153
}(header .Hash ())
154
154
header = vm .bc .GetHeaderByHash (header .ParentHash )
155
155
}
@@ -173,7 +173,7 @@ func (vm *remoteVerifyManager) AncestorVerified(header *types.Header) bool {
173
173
// check whether H-11 block is a empty block.
174
174
if header .TxHash == types .EmptyRootHash {
175
175
parent := vm .bc .GetHeaderByHash (header .ParentHash )
176
- return header .Root == parent .Root
176
+ return parent == nil || header .Root == parent .Root
177
177
}
178
178
hash := header .Hash ()
179
179
_ , exist := vm .verifiedCache .Get (hash )
@@ -201,21 +201,21 @@ type verifyTask struct {
201
201
diffhash common.Hash
202
202
blockHeader * types.Header
203
203
candidatePeers verifyPeers
204
- BadPeers map [string ]struct {}
204
+ badPeers map [string ]struct {}
205
205
startAt time.Time
206
- allowUntrusted bool
206
+ allowInsecure bool
207
207
208
208
messageCh chan verifyMessage
209
209
terminalCh chan struct {}
210
210
}
211
211
212
- func NewVerifyTask (diffhash common.Hash , header * types.Header , peers verifyPeers , verifyCh chan common.Hash , allowUntrusted bool ) * verifyTask {
212
+ func NewVerifyTask (diffhash common.Hash , header * types.Header , peers verifyPeers , verifyCh chan common.Hash , allowInsecure bool ) * verifyTask {
213
213
vt := & verifyTask {
214
214
diffhash : diffhash ,
215
215
blockHeader : header ,
216
216
candidatePeers : peers ,
217
- BadPeers : make (map [string ]struct {}),
218
- allowUntrusted : allowUntrusted ,
217
+ badPeers : make (map [string ]struct {}),
218
+ allowInsecure : allowInsecure ,
219
219
messageCh : make (chan verifyMessage ),
220
220
terminalCh : make (chan struct {}),
221
221
}
@@ -232,42 +232,21 @@ func (vt *verifyTask) Start(verifyCh chan common.Hash) {
232
232
for {
233
233
select {
234
234
case msg := <- vt .messageCh :
235
- switch msg .verifyResult .Status .Code / 100 {
236
- case 1 :
237
- switch msg .verifyResult .Status {
238
- case types .StatusFullVerified :
239
- vt .compareRootHashAndWrite (msg , verifyCh )
240
- newRecievedMsgTypeGauge ("fullVerified" , msg .peerId ).Inc (1 )
241
- case types .StatusPartiallyVerified :
242
- log .Warn ("block %s , num= %s is untrusted verified" , msg .verifyResult .BlockHash , msg .verifyResult .BlockNumber )
243
- if vt .allowUntrusted {
244
- vt .compareRootHashAndWrite (msg , verifyCh )
245
- }
246
- newRecievedMsgTypeGauge ("partialVerified" , msg .peerId ).Inc (1 )
235
+ switch msg .verifyResult .Status {
236
+ case types .StatusFullVerified :
237
+ vt .compareRootHashAndMark (msg , verifyCh )
238
+ case types .StatusPartiallyVerified :
239
+ log .Warn ("block %s , num= %s is insecure verified" , msg .verifyResult .BlockHash , msg .verifyResult .BlockNumber )
240
+ if vt .allowInsecure {
241
+ vt .compareRootHashAndMark (msg , verifyCh )
247
242
}
248
-
249
- case 2 , 4 :
250
- vt .BadPeers [msg .peerId ] = struct {}{}
243
+ case types .StatusDiffHashMismatch , types .StatusImpossibleFork , types .StatusUnexpectedError :
244
+ vt .badPeers [msg .peerId ] = struct {}{}
251
245
log .Info ("peer %s is not available: code %d, msg %s," , msg .peerId , msg .verifyResult .Status .Code , msg .verifyResult .Status .Msg )
252
- switch msg .verifyResult .Status {
253
- case types .StatusDiffHashMismatch :
254
- newRecievedMsgTypeGauge ("diffHashMismatch" , msg .peerId ).Inc (1 )
255
- case types .StatusImpossibleFork :
256
- newRecievedMsgTypeGauge ("impossibleFork" , msg .peerId ).Inc (1 )
257
- case types .StatusUnexpectedError :
258
- newRecievedMsgTypeGauge ("unexpectedError" , msg .peerId ).Inc (1 )
259
- }
260
- case 3 :
246
+ case types .StatusBlockTooNew , types .StatusBlockNewer , types .StatusPossibleFork :
261
247
log .Info ("return msg from peer %s for block %s is %s" , msg .peerId , msg .verifyResult .BlockHash , msg .verifyResult .Status .Msg )
262
- switch msg .verifyResult .Status {
263
- case types .StatusBlockTooNew :
264
- newRecievedMsgTypeGauge ("blockTooNew" , msg .peerId ).Inc (1 )
265
- case types .StatusBlockNewer :
266
- newRecievedMsgTypeGauge ("blockNewer" , msg .peerId ).Inc (1 )
267
- case types .StatusPossibleFork :
268
- newRecievedMsgTypeGauge ("possibleFork" , msg .peerId ).Inc (1 )
269
- }
270
248
}
249
+ newVerifyMsgTypeGauge (msg .verifyResult .Status .Code , msg .peerId ).Inc (1 )
271
250
case <- resend .C :
272
251
// if a task has run over 15s, try all the vaild peers to verify.
273
252
if time .Since (vt .startAt ) < tryAllPeersTime {
@@ -287,37 +266,35 @@ func (vt *verifyTask) sendVerifyRequest(n int) {
287
266
var validPeers []VerifyPeer
288
267
candidatePeers := vt .candidatePeers .GetVerifyPeers ()
289
268
for _ , p := range candidatePeers {
290
- if _ , ok := vt .BadPeers [p .ID ()]; ! ok {
269
+ if _ , ok := vt .badPeers [p .ID ()]; ! ok {
291
270
validPeers = append (validPeers , p )
292
271
}
293
272
}
294
273
// if has not valid peer, log warning.
295
274
if len (validPeers ) == 0 {
296
275
log .Warn ("there is no valid peer for block" , vt .blockHeader .Number )
297
- }
298
- if n < 0 || n >= len (validPeers ) {
299
- for _ , p := range validPeers {
300
- p .RequestRoot (vt .blockHeader .Number .Uint64 (), vt .blockHeader .Hash (), vt .diffhash )
301
- }
302
276
return
303
277
}
304
278
305
- // if n < len(validPeers), select n peers from validPeers randomly.
306
- rand .Seed (time .Now ().UnixNano ())
307
- rand .Shuffle (len (validPeers ), func (i , j int ) { validPeers [i ], validPeers [j ] = validPeers [j ], validPeers [i ] })
279
+ if n < len (validPeers ) && n > 0 {
280
+ rand .Seed (time .Now ().UnixNano ())
281
+ rand .Shuffle (len (validPeers ), func (i , j int ) { validPeers [i ], validPeers [j ] = validPeers [j ], validPeers [i ] })
282
+ } else {
283
+ n = len (validPeers )
284
+ }
308
285
for i := 0 ; i < n ; i ++ {
309
286
p := validPeers [i ]
310
287
p .RequestRoot (vt .blockHeader .Number .Uint64 (), vt .blockHeader .Hash (), vt .diffhash )
311
288
}
312
289
}
313
290
314
- func (vt * verifyTask ) compareRootHashAndWrite (msg verifyMessage , verifyCh chan common.Hash ) {
291
+ func (vt * verifyTask ) compareRootHashAndMark (msg verifyMessage , verifyCh chan common.Hash ) {
315
292
if msg .verifyResult .Root == vt .blockHeader .Root {
316
293
blockhash := msg .verifyResult .BlockHash
317
294
// write back to manager so that manager can cache the result and delete this task.
318
295
verifyCh <- blockhash
319
296
} else {
320
- vt .BadPeers [msg .peerId ] = struct {}{}
297
+ vt .badPeers [msg .peerId ] = struct {}{}
321
298
}
322
299
}
323
300
@@ -393,7 +370,7 @@ func (mode VerifyMode) NeedRemoteVerify() bool {
393
370
return mode == FullVerify || mode == InsecureVerify
394
371
}
395
372
396
- func newRecievedMsgTypeGauge (msgType , peerId string ) metrics.Gauge {
397
- m := fmt .Sprintf ("recieved/%s/ message/from /%s" , msgType , peerId )
373
+ func newVerifyMsgTypeGauge (msgType uint16 , peerId string ) metrics.Gauge {
374
+ m := fmt .Sprintf ("verifymanager/ message/%d/peer /%s" , msgType , peerId )
398
375
return metrics .GetOrRegisterGauge (m , nil )
399
376
}
0 commit comments