Skip to content

Commit 7b070c0

Browse files
committed
resolve comments
Signed-off-by: kyrie-yl <[email protected]>
1 parent 2ed75ab commit 7b070c0

File tree

2 files changed

+44
-67
lines changed

2 files changed

+44
-67
lines changed

core/block_validator.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ func (v *BlockValidator) ValidateBody(block *types.Block) error {
9494
},
9595
// for fast node which verify trie from remote verify peers, a block's H-11 ancestor should have been verify.
9696
func() error {
97-
if v.remoteValidator != nil && !v.remoteValidator.AncestorVerified(v.bc.GetHeaderByNumber(header.Number.Uint64())) {
97+
if v.remoteValidator != nil && !v.remoteValidator.AncestorVerified(header) {
9898
return fmt.Errorf("block's ancessor %x has not been verified", block.Hash())
9999
}
100100
return nil

core/remote_state_verifier.go

+43-66
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,16 @@ package core
22

33
import (
44
"fmt"
5-
"github.com/ethereum/go-ethereum/event"
6-
"github.com/ethereum/go-ethereum/metrics"
75
"math/rand"
86
"time"
97

108
lru "github.com/hashicorp/golang-lru"
119

1210
"github.com/ethereum/go-ethereum/common"
1311
"github.com/ethereum/go-ethereum/core/types"
12+
"github.com/ethereum/go-ethereum/event"
1413
"github.com/ethereum/go-ethereum/log"
14+
"github.com/ethereum/go-ethereum/metrics"
1515
)
1616

1717
const (
@@ -30,11 +30,11 @@ const (
3030
)
3131

3232
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)
3636

37-
succeedTaskExecutionTimer = metrics.NewRegisteredTimer("succeed/task/execution", nil)
37+
verifyTaskExecutionTimer = metrics.NewRegisteredTimer("verifymanager/task/execution", nil)
3838
)
3939

4040
type remoteVerifyManager struct {
@@ -53,14 +53,14 @@ type remoteVerifyManager struct {
5353
messageCh chan verifyMessage
5454
}
5555

56-
func NewVerifyManager(blockchain *BlockChain, peers verifyPeers, allowUntrusted bool) *remoteVerifyManager {
56+
func NewVerifyManager(blockchain *BlockChain, peers verifyPeers, allowInsecure bool) *remoteVerifyManager {
5757
verifiedCache, _ := lru.New(verifiedCacheSize)
5858
vm := &remoteVerifyManager{
5959
bc: blockchain,
6060
tasks: make(map[common.Hash]*verifyTask),
6161
peers: peers,
6262
verifiedCache: verifiedCache,
63-
allowInsecure: allowUntrusted,
63+
allowInsecure: allowInsecure,
6464

6565
chainHeadCh: make(chan ChainHeadEvent, chainHeadChanSize),
6666
verifyCh: make(chan common.Hash, maxForkHeight),
@@ -87,18 +87,18 @@ func (vm *remoteVerifyManager) mainLoop() {
8787
vm.cacheBlockVerified(hash)
8888
if task, ok := vm.tasks[hash]; ok {
8989
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))
9393
close(task.terminalCh)
9494
}
9595
case <-pruneTicker.C:
9696
for hash, task := range vm.tasks {
9797
if vm.bc.CurrentHeader().Number.Cmp(task.blockHeader.Number) == 1 &&
9898
vm.bc.CurrentHeader().Number.Uint64()-task.blockHeader.Number.Uint64() > pruneHeightDiff {
9999
delete(vm.tasks, hash)
100-
remoteVerifyTaskCounter.Dec(1)
101-
failedRemoteVerifyTaskMeter.Mark(1)
100+
verifyTaskCounter.Dec(1)
101+
verifyTaskFailedMeter.Mark(1)
102102
close(task.terminalCh)
103103
}
104104
}
@@ -137,7 +137,7 @@ func (vm *remoteVerifyManager) NewBlockVerifyTask(header *types.Header) {
137137
if diffLayer, err = vm.bc.GenerateDiffLayer(hash); err != nil {
138138
log.Error("failed to get diff layer", "block", hash, "number", header.Number, "error", err)
139139
return
140-
} else {
140+
} else if diffLayer == nil {
141141
log.Info("this is an empty block:", "block", hash, "number", header.Number)
142142
return
143143
}
@@ -149,7 +149,7 @@ func (vm *remoteVerifyManager) NewBlockVerifyTask(header *types.Header) {
149149
}
150150
verifyTask := NewVerifyTask(diffHash, header, vm.peers, vm.verifyCh, vm.allowInsecure)
151151
vm.tasks[hash] = verifyTask
152-
remoteVerifyTaskCounter.Inc(1)
152+
verifyTaskCounter.Inc(1)
153153
}(header.Hash())
154154
header = vm.bc.GetHeaderByHash(header.ParentHash)
155155
}
@@ -173,7 +173,7 @@ func (vm *remoteVerifyManager) AncestorVerified(header *types.Header) bool {
173173
// check whether H-11 block is a empty block.
174174
if header.TxHash == types.EmptyRootHash {
175175
parent := vm.bc.GetHeaderByHash(header.ParentHash)
176-
return header.Root == parent.Root
176+
return parent == nil || header.Root == parent.Root
177177
}
178178
hash := header.Hash()
179179
_, exist := vm.verifiedCache.Get(hash)
@@ -201,21 +201,21 @@ type verifyTask struct {
201201
diffhash common.Hash
202202
blockHeader *types.Header
203203
candidatePeers verifyPeers
204-
BadPeers map[string]struct{}
204+
badPeers map[string]struct{}
205205
startAt time.Time
206-
allowUntrusted bool
206+
allowInsecure bool
207207

208208
messageCh chan verifyMessage
209209
terminalCh chan struct{}
210210
}
211211

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 {
213213
vt := &verifyTask{
214214
diffhash: diffhash,
215215
blockHeader: header,
216216
candidatePeers: peers,
217-
BadPeers: make(map[string]struct{}),
218-
allowUntrusted: allowUntrusted,
217+
badPeers: make(map[string]struct{}),
218+
allowInsecure: allowInsecure,
219219
messageCh: make(chan verifyMessage),
220220
terminalCh: make(chan struct{}),
221221
}
@@ -232,42 +232,21 @@ func (vt *verifyTask) Start(verifyCh chan common.Hash) {
232232
for {
233233
select {
234234
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)
247242
}
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{}{}
251245
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:
261247
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-
}
270248
}
249+
newVerifyMsgTypeGauge(msg.verifyResult.Status.Code, msg.peerId).Inc(1)
271250
case <-resend.C:
272251
// if a task has run over 15s, try all the vaild peers to verify.
273252
if time.Since(vt.startAt) < tryAllPeersTime {
@@ -287,37 +266,35 @@ func (vt *verifyTask) sendVerifyRequest(n int) {
287266
var validPeers []VerifyPeer
288267
candidatePeers := vt.candidatePeers.GetVerifyPeers()
289268
for _, p := range candidatePeers {
290-
if _, ok := vt.BadPeers[p.ID()]; !ok {
269+
if _, ok := vt.badPeers[p.ID()]; !ok {
291270
validPeers = append(validPeers, p)
292271
}
293272
}
294273
// if has not valid peer, log warning.
295274
if len(validPeers) == 0 {
296275
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-
}
302276
return
303277
}
304278

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+
}
308285
for i := 0; i < n; i++ {
309286
p := validPeers[i]
310287
p.RequestRoot(vt.blockHeader.Number.Uint64(), vt.blockHeader.Hash(), vt.diffhash)
311288
}
312289
}
313290

314-
func (vt *verifyTask) compareRootHashAndWrite(msg verifyMessage, verifyCh chan common.Hash) {
291+
func (vt *verifyTask) compareRootHashAndMark(msg verifyMessage, verifyCh chan common.Hash) {
315292
if msg.verifyResult.Root == vt.blockHeader.Root {
316293
blockhash := msg.verifyResult.BlockHash
317294
// write back to manager so that manager can cache the result and delete this task.
318295
verifyCh <- blockhash
319296
} else {
320-
vt.BadPeers[msg.peerId] = struct{}{}
297+
vt.badPeers[msg.peerId] = struct{}{}
321298
}
322299
}
323300

@@ -393,7 +370,7 @@ func (mode VerifyMode) NeedRemoteVerify() bool {
393370
return mode == FullVerify || mode == InsecureVerify
394371
}
395372

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)
398375
return metrics.GetOrRegisterGauge(m, nil)
399376
}

0 commit comments

Comments
 (0)