Skip to content

Commit 3e10feb

Browse files
committed
Allow London blocks to contain pre-London uncles
In a combined rlp object for a block body.
1 parent 00d4b59 commit 3e10feb

File tree

3 files changed

+32
-32
lines changed

3 files changed

+32
-32
lines changed

eth/vm/forks/london/blocks.py

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import time
22
from typing import (
3+
List,
34
Type,
45
cast,
56
)
@@ -25,6 +26,7 @@
2526

2627
from eth.abc import (
2728
BlockHeaderAPI,
29+
BlockHeaderSedesAPI,
2830
MiningHeaderAPI,
2931
ReceiptBuilderAPI,
3032
TransactionBuilderAPI,
@@ -37,6 +39,9 @@
3739
GENESIS_PARENT_HASH,
3840
BLANK_ROOT_HASH,
3941
)
42+
from eth.rlp.headers import (
43+
BlockHeader,
44+
)
4045
from eth.rlp.sedes import (
4146
address,
4247
hash32,
@@ -160,11 +165,36 @@ def is_genesis(self) -> bool:
160165
return self.parent_hash == GENESIS_PARENT_HASH and self.block_number == 0
161166

162167

168+
class LondonBackwardsHeader(BlockHeaderSedesAPI):
169+
"""
170+
An rlp sedes class for block headers.
171+
172+
It can serialize and deserialize *both* London and pre-London headers.
173+
"""
174+
175+
@classmethod
176+
def serialize(cls, obj: BlockHeaderAPI) -> List[bytes]:
177+
return obj.serialize(obj)
178+
179+
@classmethod
180+
def deserialize(cls, encoded: List[bytes]) -> BlockHeaderAPI:
181+
num_fields = len(encoded)
182+
if num_fields == 16:
183+
return LondonBlockHeader.deserialize(encoded)
184+
elif num_fields == 15:
185+
return BlockHeader.deserialize(encoded)
186+
else:
187+
raise ValueError(
188+
"London & earlier can only handle headers of 15 or 16 fields. "
189+
f"Got {num_fields} in {encoded!r}"
190+
)
191+
192+
163193
class LondonBlock(BerlinBlock):
164194
transaction_builder: Type[TransactionBuilderAPI] = LondonTransactionBuilder
165195
receipt_builder: Type[ReceiptBuilderAPI] = LondonReceiptBuilder
166196
fields = [
167197
('header', LondonBlockHeader),
168198
('transactions', CountableList(transaction_builder)),
169-
('uncles', CountableList(LondonBlockHeader))
199+
('uncles', CountableList(LondonBackwardsHeader))
170200
]

eth/vm/forks/london/headers.py

Lines changed: 0 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
from typing import (
22
Any,
33
Callable,
4-
List,
54
Optional,
65
)
76

@@ -17,12 +16,8 @@
1716
)
1817
from eth.abc import (
1918
BlockHeaderAPI,
20-
BlockHeaderSedesAPI,
2119
)
2220
from eth.constants import GENESIS_GAS_LIMIT
23-
from eth.rlp.headers import (
24-
BlockHeader,
25-
)
2621
from eth.vm.forks.berlin.headers import (
2722
compute_berlin_difficulty,
2823
configure_header,
@@ -127,28 +122,3 @@ def create_header_from_parent(difficulty_fn: Callable[[BlockHeaderAPI, int], int
127122
)
128123

129124
configure_london_header = configure_header(compute_london_difficulty)
130-
131-
132-
class LondonBackwardsHeader(BlockHeaderSedesAPI):
133-
"""
134-
An rlp sedes class for block headers.
135-
136-
It can serialize and deserialize *both* London and pre-London headers.
137-
"""
138-
139-
@classmethod
140-
def serialize(cls, obj: BlockHeaderAPI) -> List[bytes]:
141-
return obj.serialize(obj)
142-
143-
@classmethod
144-
def deserialize(cls, encoded: List[bytes]) -> BlockHeaderAPI:
145-
num_fields = len(encoded)
146-
if num_fields == 16:
147-
return LondonBlockHeader.deserialize(encoded)
148-
elif num_fields == 15:
149-
return BlockHeader.deserialize(encoded)
150-
else:
151-
raise ValueError(
152-
"London & earlier can only handle headers of 15 or 16 fields. "
153-
f"Got {num_fields} in {encoded!r}"
154-
)

eth/vm/header.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from eth.vm.forks.london.headers import LondonBackwardsHeader
1+
from eth.vm.forks.london.blocks import LondonBackwardsHeader
22

33
HeaderSedes = LondonBackwardsHeader
44
"""

0 commit comments

Comments
 (0)