@@ -99,7 +99,12 @@ proc walkBlocks(
99
99
number = blk.number,
100
100
remaining = distinctBase(blk.number) - targetNum
101
101
102
- convHeader(blk)
102
+ let header = convHeader(blk)
103
+
104
+ if header.computRlpHash != nextHash:
105
+ return err(" Encountered an invalid block header while walking the chain" )
106
+
107
+ header
103
108
104
109
if nextHeader.parentHash == targetHash:
105
110
return ok()
@@ -112,18 +117,20 @@ proc verifyHeader(
112
117
vp: VerifiedRpcProxy, header: Header, hash: Hash32
113
118
): Future[Result[void , string ]] {.async.} =
114
119
# verify calculated hash with the requested hash
115
- if header.rlpHash != hash:
120
+ if header.computeRlpHash != hash:
116
121
return err(" hashed block header doesn't match with blk.hash(downloaded)" )
117
122
118
- let latestHeader = vp.headerStore.latest.valueOr:
119
- return err(" syncing" )
120
123
121
- # walk blocks backwards(time) from source to target
122
- ? (
123
- await vp.walkBlocks(
124
- latestHeader.number, header.number, latestHeader.parentHash, hash
124
+ if not vp.headerStore.contains(blockHash):
125
+ let latestHeader = vp.headerStore.latest.valueOr:
126
+ return err(" Couldn't get the latest header, syncing in progress" )
127
+
128
+ # walk blocks backwards(time) from source to target
129
+ ? (
130
+ await vp.walkBlocks(
131
+ latestHeader.number, header.number, latestHeader.parentHash, hash
132
+ )
125
133
)
126
- )
127
134
128
135
ok()
129
136
@@ -139,9 +146,12 @@ proc verifyBlock(
139
146
? verifyTransactions(header.transactionsRoot, blk.transactions)
140
147
141
148
# verify withdrawals
142
- if blk.withdrawals.isSome():
143
- if blk.withdrawalsRoot.get() != orderedTrieRoot(blk.withdrawals.get()):
144
- return err(" withdrawals within the block do not yield the same withdrawals root" )
149
+ if blk.withdrawalsRoot.isSome():
150
+ if blk.withdrawalsRoot.get() != orderedTrieRoot(blk.withdrawals.get(@ [])):
151
+ return err(" Withdrawals within the block do not yield the same withdrawals root" )
152
+ else :
153
+ if blk.withdrawals.isSome():
154
+ return err(" Block contains withdrawals but no withdrawalsRoot" )
145
155
146
156
ok()
147
157
0 commit comments