Skip to content

Commit e845300

Browse files
committed
Split parent_header from validate_header
1 parent 77e91da commit e845300

File tree

17 files changed

+420
-373
lines changed

17 files changed

+420
-373
lines changed

src/ethereum/arrow_glacier/fork.py

Lines changed: 25 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,8 @@ def state_transition(chain: BlockChain, block: Block) -> None:
174174
block :
175175
Block to apply to `chain`.
176176
"""
177-
validate_header(chain, block.header)
177+
parent = parent_header(chain, block.header)
178+
validate_header(block.header, parent)
178179
validate_ommers(block.ommers, block.header, chain)
179180

180181
block_env = vm.BlockEnvironment(
@@ -281,7 +282,24 @@ def calculate_base_fee_per_gas(
281282
return Uint(expected_base_fee_per_gas)
282283

283284

284-
def validate_header(chain: BlockChain, header: AnyHeader) -> None:
285+
def parent_header(chain: BlockChain, header: AnyHeader) -> AnyHeader:
286+
"""
287+
Gets the parent of a block, given that block's `header` and `chain`.
288+
"""
289+
if header.number < Uint(1):
290+
raise InvalidBlock
291+
292+
parent_number = header.number - Uint(1)
293+
first_number = chain.blocks[0].header.number
294+
last_number = chain.blocks[-1].header.number
295+
296+
if parent_number < first_number or parent_number > last_number:
297+
raise InvalidBlock
298+
299+
return chain.blocks[parent_number - first_number].header
300+
301+
302+
def validate_header(header: AnyHeader, parent_header: AnyHeader) -> None:
285303
"""
286304
Verifies a block header.
287305
@@ -294,30 +312,14 @@ def validate_header(chain: BlockChain, header: AnyHeader) -> None:
294312
295313
Parameters
296314
----------
297-
chain :
298-
History and current state.
299315
header :
300316
Header to check for correctness.
317+
parent_header :
318+
Parent Header of the header to check for correctness
301319
"""
302-
if header.number < Uint(1):
303-
raise InvalidBlock
304-
parent_header_number = header.number - Uint(1)
305-
first_block_number = chain.blocks[0].header.number
306-
last_block_number = chain.blocks[-1].header.number
307-
308-
if (
309-
parent_header_number < first_block_number
310-
or parent_header_number > last_block_number
311-
):
312-
raise InvalidBlock
313-
314-
parent_header = chain.blocks[
315-
parent_header_number - first_block_number
316-
].header
317-
318320
if not isinstance(header, Header):
319321
assert not isinstance(parent_header, Header)
320-
return previous_fork.validate_header(chain, header)
322+
return previous_fork.validate_header(header, parent_header)
321323

322324
if header.gas_used > header.gas_limit:
323325
raise InvalidBlock
@@ -610,7 +612,8 @@ def validate_ommers(
610612
for ommer in ommers:
611613
if Uint(1) > ommer.number or ommer.number >= block_header.number:
612614
raise InvalidBlock
613-
validate_header(chain, ommer)
615+
parent = parent_header(chain, ommer)
616+
validate_header(ommer, parent)
614617
if len(ommers) > 2:
615618
raise InvalidBlock
616619

src/ethereum/berlin/fork.py

Lines changed: 25 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,8 @@ def state_transition(chain: BlockChain, block: Block) -> None:
168168
block :
169169
Block to apply to `chain`.
170170
"""
171-
validate_header(chain, block.header)
171+
parent = parent_header(chain, block.header)
172+
validate_header(block.header, parent)
172173
validate_ommers(block.ommers, block.header, chain)
173174

174175
block_env = vm.BlockEnvironment(
@@ -212,7 +213,24 @@ def state_transition(chain: BlockChain, block: Block) -> None:
212213
chain.blocks = chain.blocks[-255:]
213214

214215

215-
def validate_header(chain: BlockChain, header: AnyHeader) -> None:
216+
def parent_header(chain: BlockChain, header: AnyHeader) -> AnyHeader:
217+
"""
218+
Gets the parent of a block, given that block's `header` and `chain`.
219+
"""
220+
if header.number < Uint(1):
221+
raise InvalidBlock
222+
223+
parent_number = header.number - Uint(1)
224+
first_number = chain.blocks[0].header.number
225+
last_number = chain.blocks[-1].header.number
226+
227+
if parent_number < first_number or parent_number > last_number:
228+
raise InvalidBlock
229+
230+
return chain.blocks[parent_number - first_number].header
231+
232+
233+
def validate_header(header: AnyHeader, parent_header: AnyHeader) -> None:
216234
"""
217235
Verifies a block header.
218236
@@ -225,33 +243,17 @@ def validate_header(chain: BlockChain, header: AnyHeader) -> None:
225243
226244
Parameters
227245
----------
228-
chain :
229-
History and current state.
230246
header :
231247
Header to check for correctness.
248+
parent_header :
249+
Parent Header of the header to check for correctness
232250
"""
233-
if header.number < Uint(1):
234-
raise InvalidBlock
235-
parent_header_number = header.number - Uint(1)
236-
first_block_number = chain.blocks[0].header.number
237-
last_block_number = chain.blocks[-1].header.number
238-
239-
if (
240-
parent_header_number < first_block_number
241-
or parent_header_number > last_block_number
242-
):
243-
raise InvalidBlock
244-
245-
parent_header = chain.blocks[
246-
parent_header_number - first_block_number
247-
].header
248-
249251
if header.gas_used > header.gas_limit:
250252
raise InvalidBlock
251253

252254
if not isinstance(header, Header):
253255
assert not isinstance(parent_header, Header)
254-
return previous_fork.validate_header(chain, header)
256+
return previous_fork.validate_header(header, parent_header)
255257

256258
parent_has_ommers = parent_header.ommers_hash != EMPTY_OMMER_HASH
257259
if header.timestamp <= parent_header.timestamp:
@@ -509,7 +511,8 @@ def validate_ommers(
509511
for ommer in ommers:
510512
if Uint(1) > ommer.number or ommer.number >= block_header.number:
511513
raise InvalidBlock
512-
validate_header(chain, ommer)
514+
parent = parent_header(chain, ommer)
515+
validate_header(ommer, parent)
513516
if len(ommers) > 2:
514517
raise InvalidBlock
515518

src/ethereum/byzantium/fork.py

Lines changed: 25 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,8 @@ def state_transition(chain: BlockChain, block: Block) -> None:
155155
block :
156156
Block to apply to `chain`.
157157
"""
158-
validate_header(chain, block.header)
158+
parent = parent_header(chain, block.header)
159+
validate_header(block.header, parent)
159160
validate_ommers(block.ommers, block.header, chain)
160161

161162
block_env = vm.BlockEnvironment(
@@ -199,7 +200,24 @@ def state_transition(chain: BlockChain, block: Block) -> None:
199200
chain.blocks = chain.blocks[-255:]
200201

201202

202-
def validate_header(chain: BlockChain, header: AnyHeader) -> None:
203+
def parent_header(chain: BlockChain, header: AnyHeader) -> AnyHeader:
204+
"""
205+
Gets the parent of a block, given that block's `header` and `chain`.
206+
"""
207+
if header.number < Uint(1):
208+
raise InvalidBlock
209+
210+
parent_number = header.number - Uint(1)
211+
first_number = chain.blocks[0].header.number
212+
last_number = chain.blocks[-1].header.number
213+
214+
if parent_number < first_number or parent_number > last_number:
215+
raise InvalidBlock
216+
217+
return chain.blocks[parent_number - first_number].header
218+
219+
220+
def validate_header(header: AnyHeader, parent_header: AnyHeader) -> None:
203221
"""
204222
Verifies a block header.
205223
@@ -212,33 +230,17 @@ def validate_header(chain: BlockChain, header: AnyHeader) -> None:
212230
213231
Parameters
214232
----------
215-
chain :
216-
History and current state.
217233
header :
218234
Header to check for correctness.
235+
parent_header :
236+
Parent Header of the header to check for correctness
219237
"""
220-
if header.number < Uint(1):
221-
raise InvalidBlock
222-
parent_header_number = header.number - Uint(1)
223-
first_block_number = chain.blocks[0].header.number
224-
last_block_number = chain.blocks[-1].header.number
225-
226-
if (
227-
parent_header_number < first_block_number
228-
or parent_header_number > last_block_number
229-
):
230-
raise InvalidBlock
231-
232-
parent_header = chain.blocks[
233-
parent_header_number - first_block_number
234-
].header
235-
236238
if header.gas_used > header.gas_limit:
237239
raise InvalidBlock
238240

239241
if not isinstance(header, Header):
240242
assert not isinstance(parent_header, Header)
241-
return previous_fork.validate_header(chain, header)
243+
return previous_fork.validate_header(header, parent_header)
242244

243245
parent_has_ommers = parent_header.ommers_hash != EMPTY_OMMER_HASH
244246
if header.timestamp <= parent_header.timestamp:
@@ -493,7 +495,8 @@ def validate_ommers(
493495
for ommer in ommers:
494496
if Uint(1) > ommer.number or ommer.number >= block_header.number:
495497
raise InvalidBlock
496-
validate_header(chain, ommer)
498+
parent = parent_header(chain, ommer)
499+
validate_header(ommer, parent)
497500
if len(ommers) > 2:
498501
raise InvalidBlock
499502

src/ethereum/cancun/fork.py

Lines changed: 25 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -187,7 +187,8 @@ def state_transition(chain: BlockChain, block: Block) -> None:
187187
block :
188188
Block to apply to `chain`.
189189
"""
190-
validate_header(chain, block.header)
190+
parent = parent_header(chain, block.header)
191+
validate_header(parent, block.header)
191192
if block.ommers != ():
192193
raise InvalidBlock
193194

@@ -302,7 +303,24 @@ def calculate_base_fee_per_gas(
302303
return Uint(expected_base_fee_per_gas)
303304

304305

305-
def validate_header(chain: BlockChain, header: AnyHeader) -> None:
306+
def parent_header(chain: BlockChain, header: AnyHeader) -> AnyHeader:
307+
"""
308+
Gets the parent of a block, given that block's `header` and `chain`.
309+
"""
310+
if header.number < Uint(1):
311+
raise InvalidBlock
312+
313+
parent_number = header.number - Uint(1)
314+
first_number = chain.blocks[0].header.number
315+
last_number = chain.blocks[-1].header.number
316+
317+
if parent_number < first_number or parent_number > last_number:
318+
raise InvalidBlock
319+
320+
return chain.blocks[parent_number - first_number].header
321+
322+
323+
def validate_header(header: AnyHeader, parent_header: AnyHeader) -> None:
306324
"""
307325
Verifies a block header.
308326
@@ -315,35 +333,19 @@ def validate_header(chain: BlockChain, header: AnyHeader) -> None:
315333
316334
Parameters
317335
----------
318-
chain :
319-
History and current state.
320336
header :
321337
Header to check for correctness.
338+
parent_header :
339+
Parent Header of the header to check for correctness
322340
"""
323-
if header.number < Uint(1):
324-
raise InvalidBlock
325-
parent_header_number = header.number - Uint(1)
326-
first_block_number = chain.blocks[0].header.number
327-
last_block_number = chain.blocks[-1].header.number
328-
329-
if (
330-
parent_header_number < first_block_number
331-
or parent_header_number > last_block_number
332-
):
333-
raise InvalidBlock
334-
335-
parent_header = chain.blocks[
336-
parent_header_number - first_block_number
337-
].header
341+
if not isinstance(header, Header):
342+
assert not isinstance(parent_header, Header)
343+
return previous_fork.validate_header(header, parent_header)
338344

339345
excess_blob_gas = calculate_excess_blob_gas(parent_header)
340346
if header.excess_blob_gas != excess_blob_gas:
341347
raise InvalidBlock
342348

343-
if not isinstance(header, Header):
344-
assert not isinstance(parent_header, Header)
345-
return previous_fork.validate_header(chain, header)
346-
347349
if header.gas_used > header.gas_limit:
348350
raise InvalidBlock
349351

0 commit comments

Comments
 (0)