|
24 | 24 | MutableMapping,
|
25 | 25 | Optional,
|
26 | 26 | Sequence,
|
| 27 | + Tuple, |
27 | 28 | TypeVar,
|
28 | 29 | Union,
|
| 30 | + cast, |
29 | 31 | )
|
30 | 32 |
|
31 | 33 | from ethereum_rlp import rlp
|
32 | 34 | from ethereum_types.bytes import Bytes
|
33 | 35 | from ethereum_types.frozen import slotted_freezable
|
34 | 36 | from ethereum_types.numeric import U256, Uint
|
| 37 | +from typing_extensions import assert_type |
35 | 38 |
|
36 | 39 | from ethereum.cancun import trie as previous_trie
|
37 | 40 | from ethereum.crypto.hash import keccak256
|
@@ -95,12 +98,32 @@ class ExtensionNode:
|
95 | 98 | subnode: rlp.Extended
|
96 | 99 |
|
97 | 100 |
|
| 101 | +BranchSubnodes = Tuple[ |
| 102 | + rlp.Extended, |
| 103 | + rlp.Extended, |
| 104 | + rlp.Extended, |
| 105 | + rlp.Extended, |
| 106 | + rlp.Extended, |
| 107 | + rlp.Extended, |
| 108 | + rlp.Extended, |
| 109 | + rlp.Extended, |
| 110 | + rlp.Extended, |
| 111 | + rlp.Extended, |
| 112 | + rlp.Extended, |
| 113 | + rlp.Extended, |
| 114 | + rlp.Extended, |
| 115 | + rlp.Extended, |
| 116 | + rlp.Extended, |
| 117 | + rlp.Extended, |
| 118 | +] |
| 119 | + |
| 120 | + |
98 | 121 | @slotted_freezable
|
99 | 122 | @dataclass
|
100 | 123 | class BranchNode:
|
101 | 124 | """Branch node in the Merkle Trie"""
|
102 | 125 |
|
103 |
| - subnodes: List[rlp.Extended] |
| 126 | + subnodes: BranchSubnodes |
104 | 127 | value: rlp.Extended
|
105 | 128 |
|
106 | 129 |
|
@@ -140,7 +163,7 @@ def encode_internal_node(node: Optional[InternalNode]) -> rlp.Extended:
|
140 | 163 | node.subnode,
|
141 | 164 | )
|
142 | 165 | elif isinstance(node, BranchNode):
|
143 |
| - unencoded = node.subnodes + [node.value] |
| 166 | + unencoded = list(node.subnodes) + [node.value] |
144 | 167 | else:
|
145 | 168 | raise AssertionError(f"Invalid internal node type {type(node)}!")
|
146 | 169 |
|
@@ -461,10 +484,11 @@ def patricialize(
|
461 | 484 | else:
|
462 | 485 | branches[key[level]][key] = obj[key]
|
463 | 486 |
|
| 487 | + subnodes = tuple( |
| 488 | + encode_internal_node(patricialize(branches[k], level + Uint(1))) |
| 489 | + for k in range(16) |
| 490 | + ) |
464 | 491 | return BranchNode(
|
465 |
| - [ |
466 |
| - encode_internal_node(patricialize(branches[k], level + Uint(1))) |
467 |
| - for k in range(16) |
468 |
| - ], |
| 492 | + cast(BranchSubnodes, assert_type(subnodes, Tuple[rlp.Extended, ...])), |
469 | 493 | value,
|
470 | 494 | )
|
0 commit comments