diff --git a/setup.cfg b/setup.cfg index 730939c928..53b30f6759 100644 --- a/setup.cfg +++ b/setup.cfg @@ -113,7 +113,7 @@ python_requires = >=3.10 install_requires = pycryptodome>=3,<4 coincurve>=20,<21 - typing_extensions>=4 + typing_extensions>=4.2 py_ecc @ git+https://github.com/petertdavies/py_ecc.git@127184f4c57b1812da959586d0fe8f43bb1a2389 ethereum-types>=0.2.1,<0.3 diff --git a/src/ethereum/arrow_glacier/trie.py b/src/ethereum/arrow_glacier/trie.py index 069b8127e2..8672584f5b 100644 --- a/src/ethereum/arrow_glacier/trie.py +++ b/src/ethereum/arrow_glacier/trie.py @@ -24,13 +24,16 @@ MutableMapping, Optional, Sequence, + Tuple, TypeVar, Union, + cast, ) from ethereum_types.bytes import Bytes from ethereum_types.frozen import slotted_freezable from ethereum_types.numeric import U256, Uint +from typing_extensions import assert_type from ethereum.crypto.hash import keccak256 from ethereum.london import trie as previous_trie @@ -92,12 +95,32 @@ class ExtensionNode: subnode: rlp.Extended +BranchSubnodes = Tuple[ + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, +] + + @slotted_freezable @dataclass class BranchNode: """Branch node in the Merkle Trie""" - subnodes: List[rlp.Extended] + subnodes: BranchSubnodes value: rlp.Extended @@ -137,7 +160,7 @@ def encode_internal_node(node: Optional[InternalNode]) -> rlp.Extended: node.subnode, ) elif isinstance(node, BranchNode): - unencoded = node.subnodes + [node.value] + unencoded = list(node.subnodes) + [node.value] else: raise AssertionError(f"Invalid internal node type {type(node)}!") @@ -458,10 +481,11 @@ def patricialize( else: branches[key[level]][key] = obj[key] + subnodes = tuple( + encode_internal_node(patricialize(branches[k], level + Uint(1))) + for k in range(16) + ) return BranchNode( - [ - encode_internal_node(patricialize(branches[k], level + Uint(1))) - for k in range(16) - ], + cast(BranchSubnodes, assert_type(subnodes, Tuple[rlp.Extended, ...])), value, ) diff --git a/src/ethereum/berlin/trie.py b/src/ethereum/berlin/trie.py index 5ab348f521..a8c5345919 100644 --- a/src/ethereum/berlin/trie.py +++ b/src/ethereum/berlin/trie.py @@ -24,13 +24,16 @@ MutableMapping, Optional, Sequence, + Tuple, TypeVar, Union, + cast, ) from ethereum_types.bytes import Bytes from ethereum_types.frozen import slotted_freezable from ethereum_types.numeric import U256, Uint +from typing_extensions import assert_type from ethereum.crypto.hash import keccak256 from ethereum.muir_glacier import trie as previous_trie @@ -92,12 +95,32 @@ class ExtensionNode: subnode: rlp.Extended +BranchSubnodes = Tuple[ + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, +] + + @slotted_freezable @dataclass class BranchNode: """Branch node in the Merkle Trie""" - subnodes: List[rlp.Extended] + subnodes: BranchSubnodes value: rlp.Extended @@ -137,7 +160,7 @@ def encode_internal_node(node: Optional[InternalNode]) -> rlp.Extended: node.subnode, ) elif isinstance(node, BranchNode): - unencoded = node.subnodes + [node.value] + unencoded = list(node.subnodes) + [node.value] else: raise AssertionError(f"Invalid internal node type {type(node)}!") @@ -458,10 +481,11 @@ def patricialize( else: branches[key[level]][key] = obj[key] + subnodes = tuple( + encode_internal_node(patricialize(branches[k], level + Uint(1))) + for k in range(16) + ) return BranchNode( - [ - encode_internal_node(patricialize(branches[k], level + Uint(1))) - for k in range(16) - ], + cast(BranchSubnodes, assert_type(subnodes, Tuple[rlp.Extended, ...])), value, ) diff --git a/src/ethereum/byzantium/trie.py b/src/ethereum/byzantium/trie.py index 9d2a8f256e..bd67de821f 100644 --- a/src/ethereum/byzantium/trie.py +++ b/src/ethereum/byzantium/trie.py @@ -24,13 +24,16 @@ MutableMapping, Optional, Sequence, + Tuple, TypeVar, Union, + cast, ) from ethereum_types.bytes import Bytes from ethereum_types.frozen import slotted_freezable from ethereum_types.numeric import U256, Uint +from typing_extensions import assert_type from ethereum.crypto.hash import keccak256 from ethereum.spurious_dragon import trie as previous_trie @@ -92,12 +95,32 @@ class ExtensionNode: subnode: rlp.Extended +BranchSubnodes = Tuple[ + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, +] + + @slotted_freezable @dataclass class BranchNode: """Branch node in the Merkle Trie""" - subnodes: List[rlp.Extended] + subnodes: BranchSubnodes value: rlp.Extended @@ -137,7 +160,7 @@ def encode_internal_node(node: Optional[InternalNode]) -> rlp.Extended: node.subnode, ) elif isinstance(node, BranchNode): - unencoded = node.subnodes + [node.value] + unencoded = list(node.subnodes) + [node.value] else: raise AssertionError(f"Invalid internal node type {type(node)}!") @@ -458,10 +481,11 @@ def patricialize( else: branches[key[level]][key] = obj[key] + subnodes = tuple( + encode_internal_node(patricialize(branches[k], level + Uint(1))) + for k in range(16) + ) return BranchNode( - [ - encode_internal_node(patricialize(branches[k], level + Uint(1))) - for k in range(16) - ], + cast(BranchSubnodes, assert_type(subnodes, Tuple[rlp.Extended, ...])), value, ) diff --git a/src/ethereum/cancun/trie.py b/src/ethereum/cancun/trie.py index db0394cdb2..17d9ce4ec7 100644 --- a/src/ethereum/cancun/trie.py +++ b/src/ethereum/cancun/trie.py @@ -24,13 +24,16 @@ MutableMapping, Optional, Sequence, + Tuple, TypeVar, Union, + cast, ) from ethereum_types.bytes import Bytes from ethereum_types.frozen import slotted_freezable from ethereum_types.numeric import U256, Uint +from typing_extensions import assert_type from ethereum.crypto.hash import keccak256 from ethereum.shanghai import trie as previous_trie @@ -95,12 +98,32 @@ class ExtensionNode: subnode: rlp.Extended +BranchSubnodes = Tuple[ + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, +] + + @slotted_freezable @dataclass class BranchNode: """Branch node in the Merkle Trie""" - subnodes: List[rlp.Extended] + subnodes: BranchSubnodes value: rlp.Extended @@ -140,7 +163,7 @@ def encode_internal_node(node: Optional[InternalNode]) -> rlp.Extended: node.subnode, ) elif isinstance(node, BranchNode): - unencoded = node.subnodes + [node.value] + unencoded = list(node.subnodes) + [node.value] else: raise AssertionError(f"Invalid internal node type {type(node)}!") @@ -461,10 +484,11 @@ def patricialize( else: branches[key[level]][key] = obj[key] + subnodes = tuple( + encode_internal_node(patricialize(branches[k], level + Uint(1))) + for k in range(16) + ) return BranchNode( - [ - encode_internal_node(patricialize(branches[k], level + Uint(1))) - for k in range(16) - ], + cast(BranchSubnodes, assert_type(subnodes, Tuple[rlp.Extended, ...])), value, ) diff --git a/src/ethereum/constantinople/trie.py b/src/ethereum/constantinople/trie.py index 6d61f3aaa9..ca3a619288 100644 --- a/src/ethereum/constantinople/trie.py +++ b/src/ethereum/constantinople/trie.py @@ -24,13 +24,16 @@ MutableMapping, Optional, Sequence, + Tuple, TypeVar, Union, + cast, ) from ethereum_types.bytes import Bytes from ethereum_types.frozen import slotted_freezable from ethereum_types.numeric import U256, Uint +from typing_extensions import assert_type from ethereum.byzantium import trie as previous_trie from ethereum.crypto.hash import keccak256 @@ -92,12 +95,32 @@ class ExtensionNode: subnode: rlp.Extended +BranchSubnodes = Tuple[ + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, +] + + @slotted_freezable @dataclass class BranchNode: """Branch node in the Merkle Trie""" - subnodes: List[rlp.Extended] + subnodes: BranchSubnodes value: rlp.Extended @@ -137,7 +160,7 @@ def encode_internal_node(node: Optional[InternalNode]) -> rlp.Extended: node.subnode, ) elif isinstance(node, BranchNode): - unencoded = node.subnodes + [node.value] + unencoded = list(node.subnodes) + [node.value] else: raise AssertionError(f"Invalid internal node type {type(node)}!") @@ -458,10 +481,11 @@ def patricialize( else: branches[key[level]][key] = obj[key] + subnodes = tuple( + encode_internal_node(patricialize(branches[k], level + Uint(1))) + for k in range(16) + ) return BranchNode( - [ - encode_internal_node(patricialize(branches[k], level + Uint(1))) - for k in range(16) - ], + cast(BranchSubnodes, assert_type(subnodes, Tuple[rlp.Extended, ...])), value, ) diff --git a/src/ethereum/dao_fork/trie.py b/src/ethereum/dao_fork/trie.py index 0b1bd95d96..10185b0c4b 100644 --- a/src/ethereum/dao_fork/trie.py +++ b/src/ethereum/dao_fork/trie.py @@ -24,13 +24,16 @@ MutableMapping, Optional, Sequence, + Tuple, TypeVar, Union, + cast, ) from ethereum_types.bytes import Bytes from ethereum_types.frozen import slotted_freezable from ethereum_types.numeric import U256, Uint +from typing_extensions import assert_type from ethereum.crypto.hash import keccak256 from ethereum.homestead import trie as previous_trie @@ -92,12 +95,32 @@ class ExtensionNode: subnode: rlp.Extended +BranchSubnodes = Tuple[ + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, +] + + @slotted_freezable @dataclass class BranchNode: """Branch node in the Merkle Trie""" - subnodes: List[rlp.Extended] + subnodes: BranchSubnodes value: rlp.Extended @@ -137,7 +160,7 @@ def encode_internal_node(node: Optional[InternalNode]) -> rlp.Extended: node.subnode, ) elif isinstance(node, BranchNode): - unencoded = node.subnodes + [node.value] + unencoded = list(node.subnodes) + [node.value] else: raise AssertionError(f"Invalid internal node type {type(node)}!") @@ -458,10 +481,11 @@ def patricialize( else: branches[key[level]][key] = obj[key] + subnodes = tuple( + encode_internal_node(patricialize(branches[k], level + Uint(1))) + for k in range(16) + ) return BranchNode( - [ - encode_internal_node(patricialize(branches[k], level + Uint(1))) - for k in range(16) - ], + cast(BranchSubnodes, assert_type(subnodes, Tuple[rlp.Extended, ...])), value, ) diff --git a/src/ethereum/frontier/trie.py b/src/ethereum/frontier/trie.py index 587e811172..e06e78226e 100644 --- a/src/ethereum/frontier/trie.py +++ b/src/ethereum/frontier/trie.py @@ -24,13 +24,16 @@ MutableMapping, Optional, Sequence, + Tuple, TypeVar, Union, + cast, ) from ethereum_types.bytes import Bytes from ethereum_types.frozen import slotted_freezable from ethereum_types.numeric import U256, Uint +from typing_extensions import assert_type from ethereum.crypto.hash import keccak256 from ethereum.utils.hexadecimal import hex_to_bytes @@ -91,12 +94,32 @@ class ExtensionNode: subnode: rlp.Extended +BranchSubnodes = Tuple[ + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, +] + + @slotted_freezable @dataclass class BranchNode: """Branch node in the Merkle Trie""" - subnodes: List[rlp.Extended] + subnodes: BranchSubnodes value: rlp.Extended @@ -136,7 +159,7 @@ def encode_internal_node(node: Optional[InternalNode]) -> rlp.Extended: node.subnode, ) elif isinstance(node, BranchNode): - unencoded = node.subnodes + [node.value] + unencoded = list(node.subnodes) + [node.value] else: raise AssertionError(f"Invalid internal node type {type(node)}!") @@ -459,10 +482,11 @@ def patricialize( else: branches[key[level]][key] = obj[key] + subnodes = tuple( + encode_internal_node(patricialize(branches[k], level + Uint(1))) + for k in range(16) + ) return BranchNode( - [ - encode_internal_node(patricialize(branches[k], level + Uint(1))) - for k in range(16) - ], + cast(BranchSubnodes, assert_type(subnodes, Tuple[rlp.Extended, ...])), value, ) diff --git a/src/ethereum/gray_glacier/trie.py b/src/ethereum/gray_glacier/trie.py index e6ee3e9bef..e874e4937e 100644 --- a/src/ethereum/gray_glacier/trie.py +++ b/src/ethereum/gray_glacier/trie.py @@ -24,13 +24,16 @@ MutableMapping, Optional, Sequence, + Tuple, TypeVar, Union, + cast, ) from ethereum_types.bytes import Bytes from ethereum_types.frozen import slotted_freezable from ethereum_types.numeric import U256, Uint +from typing_extensions import assert_type from ethereum.arrow_glacier import trie as previous_trie from ethereum.crypto.hash import keccak256 @@ -92,12 +95,32 @@ class ExtensionNode: subnode: rlp.Extended +BranchSubnodes = Tuple[ + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, +] + + @slotted_freezable @dataclass class BranchNode: """Branch node in the Merkle Trie""" - subnodes: List[rlp.Extended] + subnodes: BranchSubnodes value: rlp.Extended @@ -137,7 +160,7 @@ def encode_internal_node(node: Optional[InternalNode]) -> rlp.Extended: node.subnode, ) elif isinstance(node, BranchNode): - unencoded = node.subnodes + [node.value] + unencoded = list(node.subnodes) + [node.value] else: raise AssertionError(f"Invalid internal node type {type(node)}!") @@ -458,10 +481,11 @@ def patricialize( else: branches[key[level]][key] = obj[key] + subnodes = tuple( + encode_internal_node(patricialize(branches[k], level + Uint(1))) + for k in range(16) + ) return BranchNode( - [ - encode_internal_node(patricialize(branches[k], level + Uint(1))) - for k in range(16) - ], + cast(BranchSubnodes, assert_type(subnodes, Tuple[rlp.Extended, ...])), value, ) diff --git a/src/ethereum/homestead/trie.py b/src/ethereum/homestead/trie.py index 5294a2ba0d..629afadb29 100644 --- a/src/ethereum/homestead/trie.py +++ b/src/ethereum/homestead/trie.py @@ -24,13 +24,16 @@ MutableMapping, Optional, Sequence, + Tuple, TypeVar, Union, + cast, ) from ethereum_types.bytes import Bytes from ethereum_types.frozen import slotted_freezable from ethereum_types.numeric import U256, Uint +from typing_extensions import assert_type from ethereum.crypto.hash import keccak256 from ethereum.frontier import trie as previous_trie @@ -92,12 +95,32 @@ class ExtensionNode: subnode: rlp.Extended +BranchSubnodes = Tuple[ + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, +] + + @slotted_freezable @dataclass class BranchNode: """Branch node in the Merkle Trie""" - subnodes: List[rlp.Extended] + subnodes: BranchSubnodes value: rlp.Extended @@ -137,7 +160,7 @@ def encode_internal_node(node: Optional[InternalNode]) -> rlp.Extended: node.subnode, ) elif isinstance(node, BranchNode): - unencoded = node.subnodes + [node.value] + unencoded = list(node.subnodes) + [node.value] else: raise AssertionError(f"Invalid internal node type {type(node)}!") @@ -458,10 +481,11 @@ def patricialize( else: branches[key[level]][key] = obj[key] + subnodes = tuple( + encode_internal_node(patricialize(branches[k], level + Uint(1))) + for k in range(16) + ) return BranchNode( - [ - encode_internal_node(patricialize(branches[k], level + Uint(1))) - for k in range(16) - ], + cast(BranchSubnodes, assert_type(subnodes, Tuple[rlp.Extended, ...])), value, ) diff --git a/src/ethereum/istanbul/trie.py b/src/ethereum/istanbul/trie.py index a1a4cfbf98..c2d2115038 100644 --- a/src/ethereum/istanbul/trie.py +++ b/src/ethereum/istanbul/trie.py @@ -24,13 +24,16 @@ MutableMapping, Optional, Sequence, + Tuple, TypeVar, Union, + cast, ) from ethereum_types.bytes import Bytes from ethereum_types.frozen import slotted_freezable from ethereum_types.numeric import U256, Uint +from typing_extensions import assert_type from ethereum.constantinople import trie as previous_trie from ethereum.crypto.hash import keccak256 @@ -92,12 +95,32 @@ class ExtensionNode: subnode: rlp.Extended +BranchSubnodes = Tuple[ + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, +] + + @slotted_freezable @dataclass class BranchNode: """Branch node in the Merkle Trie""" - subnodes: List[rlp.Extended] + subnodes: BranchSubnodes value: rlp.Extended @@ -137,7 +160,7 @@ def encode_internal_node(node: Optional[InternalNode]) -> rlp.Extended: node.subnode, ) elif isinstance(node, BranchNode): - unencoded = node.subnodes + [node.value] + unencoded = list(node.subnodes) + [node.value] else: raise AssertionError(f"Invalid internal node type {type(node)}!") @@ -458,10 +481,11 @@ def patricialize( else: branches[key[level]][key] = obj[key] + subnodes = tuple( + encode_internal_node(patricialize(branches[k], level + Uint(1))) + for k in range(16) + ) return BranchNode( - [ - encode_internal_node(patricialize(branches[k], level + Uint(1))) - for k in range(16) - ], + cast(BranchSubnodes, assert_type(subnodes, Tuple[rlp.Extended, ...])), value, ) diff --git a/src/ethereum/london/trie.py b/src/ethereum/london/trie.py index 03e230531c..398af1a8c6 100644 --- a/src/ethereum/london/trie.py +++ b/src/ethereum/london/trie.py @@ -24,13 +24,16 @@ MutableMapping, Optional, Sequence, + Tuple, TypeVar, Union, + cast, ) from ethereum_types.bytes import Bytes from ethereum_types.frozen import slotted_freezable from ethereum_types.numeric import U256, Uint +from typing_extensions import assert_type from ethereum.berlin import trie as previous_trie from ethereum.crypto.hash import keccak256 @@ -92,12 +95,32 @@ class ExtensionNode: subnode: rlp.Extended +BranchSubnodes = Tuple[ + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, +] + + @slotted_freezable @dataclass class BranchNode: """Branch node in the Merkle Trie""" - subnodes: List[rlp.Extended] + subnodes: BranchSubnodes value: rlp.Extended @@ -137,7 +160,7 @@ def encode_internal_node(node: Optional[InternalNode]) -> rlp.Extended: node.subnode, ) elif isinstance(node, BranchNode): - unencoded = node.subnodes + [node.value] + unencoded = list(node.subnodes) + [node.value] else: raise AssertionError(f"Invalid internal node type {type(node)}!") @@ -458,10 +481,11 @@ def patricialize( else: branches[key[level]][key] = obj[key] + subnodes = tuple( + encode_internal_node(patricialize(branches[k], level + Uint(1))) + for k in range(16) + ) return BranchNode( - [ - encode_internal_node(patricialize(branches[k], level + Uint(1))) - for k in range(16) - ], + cast(BranchSubnodes, assert_type(subnodes, Tuple[rlp.Extended, ...])), value, ) diff --git a/src/ethereum/muir_glacier/trie.py b/src/ethereum/muir_glacier/trie.py index f2e4f29460..f3172811f9 100644 --- a/src/ethereum/muir_glacier/trie.py +++ b/src/ethereum/muir_glacier/trie.py @@ -24,13 +24,16 @@ MutableMapping, Optional, Sequence, + Tuple, TypeVar, Union, + cast, ) from ethereum_types.bytes import Bytes from ethereum_types.frozen import slotted_freezable from ethereum_types.numeric import U256, Uint +from typing_extensions import assert_type from ethereum.crypto.hash import keccak256 from ethereum.istanbul import trie as previous_trie @@ -92,12 +95,32 @@ class ExtensionNode: subnode: rlp.Extended +BranchSubnodes = Tuple[ + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, +] + + @slotted_freezable @dataclass class BranchNode: """Branch node in the Merkle Trie""" - subnodes: List[rlp.Extended] + subnodes: BranchSubnodes value: rlp.Extended @@ -137,7 +160,7 @@ def encode_internal_node(node: Optional[InternalNode]) -> rlp.Extended: node.subnode, ) elif isinstance(node, BranchNode): - unencoded = node.subnodes + [node.value] + unencoded = list(node.subnodes) + [node.value] else: raise AssertionError(f"Invalid internal node type {type(node)}!") @@ -458,10 +481,11 @@ def patricialize( else: branches[key[level]][key] = obj[key] + subnodes = tuple( + encode_internal_node(patricialize(branches[k], level + Uint(1))) + for k in range(16) + ) return BranchNode( - [ - encode_internal_node(patricialize(branches[k], level + Uint(1))) - for k in range(16) - ], + cast(BranchSubnodes, assert_type(subnodes, Tuple[rlp.Extended, ...])), value, ) diff --git a/src/ethereum/paris/trie.py b/src/ethereum/paris/trie.py index ccd99a17af..c723f3b23e 100644 --- a/src/ethereum/paris/trie.py +++ b/src/ethereum/paris/trie.py @@ -24,13 +24,16 @@ MutableMapping, Optional, Sequence, + Tuple, TypeVar, Union, + cast, ) from ethereum_types.bytes import Bytes from ethereum_types.frozen import slotted_freezable from ethereum_types.numeric import U256, Uint +from typing_extensions import assert_type from ethereum.crypto.hash import keccak256 from ethereum.gray_glacier import trie as previous_trie @@ -92,12 +95,32 @@ class ExtensionNode: subnode: rlp.Extended +BranchSubnodes = Tuple[ + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, +] + + @slotted_freezable @dataclass class BranchNode: """Branch node in the Merkle Trie""" - subnodes: List[rlp.Extended] + subnodes: BranchSubnodes value: rlp.Extended @@ -137,7 +160,7 @@ def encode_internal_node(node: Optional[InternalNode]) -> rlp.Extended: node.subnode, ) elif isinstance(node, BranchNode): - unencoded = node.subnodes + [node.value] + unencoded = list(node.subnodes) + [node.value] else: raise AssertionError(f"Invalid internal node type {type(node)}!") @@ -458,10 +481,11 @@ def patricialize( else: branches[key[level]][key] = obj[key] + subnodes = tuple( + encode_internal_node(patricialize(branches[k], level + Uint(1))) + for k in range(16) + ) return BranchNode( - [ - encode_internal_node(patricialize(branches[k], level + Uint(1))) - for k in range(16) - ], + cast(BranchSubnodes, assert_type(subnodes, Tuple[rlp.Extended, ...])), value, ) diff --git a/src/ethereum/shanghai/trie.py b/src/ethereum/shanghai/trie.py index 020e9900c4..d4b6c61db7 100644 --- a/src/ethereum/shanghai/trie.py +++ b/src/ethereum/shanghai/trie.py @@ -24,13 +24,16 @@ MutableMapping, Optional, Sequence, + Tuple, TypeVar, Union, + cast, ) from ethereum_types.bytes import Bytes from ethereum_types.frozen import slotted_freezable from ethereum_types.numeric import U256, Uint +from typing_extensions import assert_type from ethereum.crypto.hash import keccak256 from ethereum.paris import trie as previous_trie @@ -95,12 +98,32 @@ class ExtensionNode: subnode: rlp.Extended +BranchSubnodes = Tuple[ + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, +] + + @slotted_freezable @dataclass class BranchNode: """Branch node in the Merkle Trie""" - subnodes: List[rlp.Extended] + subnodes: BranchSubnodes value: rlp.Extended @@ -140,7 +163,7 @@ def encode_internal_node(node: Optional[InternalNode]) -> rlp.Extended: node.subnode, ) elif isinstance(node, BranchNode): - unencoded = node.subnodes + [node.value] + unencoded = list(node.subnodes) + [node.value] else: raise AssertionError(f"Invalid internal node type {type(node)}!") @@ -461,10 +484,11 @@ def patricialize( else: branches[key[level]][key] = obj[key] + subnodes = tuple( + encode_internal_node(patricialize(branches[k], level + Uint(1))) + for k in range(16) + ) return BranchNode( - [ - encode_internal_node(patricialize(branches[k], level + Uint(1))) - for k in range(16) - ], + cast(BranchSubnodes, assert_type(subnodes, Tuple[rlp.Extended, ...])), value, ) diff --git a/src/ethereum/spurious_dragon/trie.py b/src/ethereum/spurious_dragon/trie.py index 1b13975d22..2a02fe1a62 100644 --- a/src/ethereum/spurious_dragon/trie.py +++ b/src/ethereum/spurious_dragon/trie.py @@ -24,13 +24,16 @@ MutableMapping, Optional, Sequence, + Tuple, TypeVar, Union, + cast, ) from ethereum_types.bytes import Bytes from ethereum_types.frozen import slotted_freezable from ethereum_types.numeric import U256, Uint +from typing_extensions import assert_type from ethereum.crypto.hash import keccak256 from ethereum.tangerine_whistle import trie as previous_trie @@ -92,12 +95,32 @@ class ExtensionNode: subnode: rlp.Extended +BranchSubnodes = Tuple[ + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, +] + + @slotted_freezable @dataclass class BranchNode: """Branch node in the Merkle Trie""" - subnodes: List[rlp.Extended] + subnodes: BranchSubnodes value: rlp.Extended @@ -137,7 +160,7 @@ def encode_internal_node(node: Optional[InternalNode]) -> rlp.Extended: node.subnode, ) elif isinstance(node, BranchNode): - unencoded = node.subnodes + [node.value] + unencoded = list(node.subnodes) + [node.value] else: raise AssertionError(f"Invalid internal node type {type(node)}!") @@ -458,10 +481,11 @@ def patricialize( else: branches[key[level]][key] = obj[key] + subnodes = tuple( + encode_internal_node(patricialize(branches[k], level + Uint(1))) + for k in range(16) + ) return BranchNode( - [ - encode_internal_node(patricialize(branches[k], level + Uint(1))) - for k in range(16) - ], + cast(BranchSubnodes, assert_type(subnodes, Tuple[rlp.Extended, ...])), value, ) diff --git a/src/ethereum/tangerine_whistle/trie.py b/src/ethereum/tangerine_whistle/trie.py index 884faff508..4bdb803009 100644 --- a/src/ethereum/tangerine_whistle/trie.py +++ b/src/ethereum/tangerine_whistle/trie.py @@ -24,13 +24,16 @@ MutableMapping, Optional, Sequence, + Tuple, TypeVar, Union, + cast, ) from ethereum_types.bytes import Bytes from ethereum_types.frozen import slotted_freezable from ethereum_types.numeric import U256, Uint +from typing_extensions import assert_type from ethereum.crypto.hash import keccak256 from ethereum.dao_fork import trie as previous_trie @@ -92,12 +95,32 @@ class ExtensionNode: subnode: rlp.Extended +BranchSubnodes = Tuple[ + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, + rlp.Extended, +] + + @slotted_freezable @dataclass class BranchNode: """Branch node in the Merkle Trie""" - subnodes: List[rlp.Extended] + subnodes: BranchSubnodes value: rlp.Extended @@ -137,7 +160,7 @@ def encode_internal_node(node: Optional[InternalNode]) -> rlp.Extended: node.subnode, ) elif isinstance(node, BranchNode): - unencoded = node.subnodes + [node.value] + unencoded = list(node.subnodes) + [node.value] else: raise AssertionError(f"Invalid internal node type {type(node)}!") @@ -458,10 +481,11 @@ def patricialize( else: branches[key[level]][key] = obj[key] + subnodes = tuple( + encode_internal_node(patricialize(branches[k], level + Uint(1))) + for k in range(16) + ) return BranchNode( - [ - encode_internal_node(patricialize(branches[k], level + Uint(1))) - for k in range(16) - ], + cast(BranchSubnodes, assert_type(subnodes, Tuple[rlp.Extended, ...])), value, )