Skip to content

Commit 8707c28

Browse files
Carsons-EelsSamWilsn
authored andcommitted
Refactored AccessListTransaction by hoisting complex class member
- New Access class abstracts complex tuple of terms used by ALT - All forks which use ALT now use Access - All changes propogated to FeeMarketTransaction, BlobTransaction - Updated corresponding RLP tests - Updated docstrings - Updated t8n to comply with changes
1 parent 5108203 commit 8707c28

File tree

24 files changed

+234
-78
lines changed

24 files changed

+234
-78
lines changed

src/ethereum/arrow_glacier/fork.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -733,10 +733,10 @@ def process_transaction(
733733
access_list_addresses = set()
734734
access_list_storage_keys = set()
735735
if isinstance(tx, (AccessListTransaction, FeeMarketTransaction)):
736-
for address, keys in tx.access_list:
737-
access_list_addresses.add(address)
738-
for key in keys:
739-
access_list_storage_keys.add((address, key))
736+
for access in tx.access_list:
737+
access_list_addresses.add(access.account)
738+
for slot in access.slots:
739+
access_list_storage_keys.add((access.account, slot))
740740

741741
tx_env = vm.TransactionEnvironment(
742742
origin=sender,

src/ethereum/arrow_glacier/transactions.py

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,18 @@ class LegacyTransaction:
4444
s: U256
4545

4646

47+
@slotted_freezable
48+
@dataclass
49+
class Access:
50+
"""
51+
A mapping from account address to storage slots that are pre-warmed as part
52+
of a transaction.
53+
"""
54+
55+
account: Address
56+
slots: Tuple[Bytes32, ...]
57+
58+
4759
@slotted_freezable
4860
@dataclass
4961
class AccessListTransaction:
@@ -58,7 +70,7 @@ class AccessListTransaction:
5870
to: Union[Bytes0, Address]
5971
value: U256
6072
data: Bytes
61-
access_list: Tuple[Tuple[Address, Tuple[Bytes32, ...]], ...]
73+
access_list: Tuple[Access, ...]
6274
y_parity: U256
6375
r: U256
6476
s: U256
@@ -79,7 +91,7 @@ class FeeMarketTransaction:
7991
to: Union[Bytes0, Address]
8092
value: U256
8193
data: Bytes
82-
access_list: Tuple[Tuple[Address, Tuple[Bytes32, ...]], ...]
94+
access_list: Tuple[Access, ...]
8395
y_parity: U256
8496
r: U256
8597
s: U256
@@ -195,9 +207,11 @@ def calculate_intrinsic_cost(tx: Transaction) -> Uint:
195207

196208
access_list_cost = Uint(0)
197209
if isinstance(tx, (AccessListTransaction, FeeMarketTransaction)):
198-
for _address, keys in tx.access_list:
210+
for access in tx.access_list:
199211
access_list_cost += TX_ACCESS_LIST_ADDRESS_COST
200-
access_list_cost += ulen(keys) * TX_ACCESS_LIST_STORAGE_KEY_COST
212+
access_list_cost += (
213+
ulen(access.slots) * TX_ACCESS_LIST_STORAGE_KEY_COST
214+
)
201215

202216
return TX_BASE_COST + data_cost + create_cost + access_list_cost
203217

src/ethereum/berlin/fork.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -634,10 +634,10 @@ def process_transaction(
634634
access_list_addresses = set()
635635
access_list_storage_keys = set()
636636
if isinstance(tx, AccessListTransaction):
637-
for address, keys in tx.access_list:
638-
access_list_addresses.add(address)
639-
for key in keys:
640-
access_list_storage_keys.add((address, key))
637+
for access in tx.access_list:
638+
access_list_addresses.add(access.account)
639+
for slot in access.slots:
640+
access_list_storage_keys.add((access.account, slot))
641641

642642
tx_env = vm.TransactionEnvironment(
643643
origin=sender,

src/ethereum/berlin/transactions.py

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,18 @@ class LegacyTransaction:
4444
s: U256
4545

4646

47+
@slotted_freezable
48+
@dataclass
49+
class Access:
50+
"""
51+
A mapping from account address to storage slots that are pre-warmed as part
52+
of a transaction.
53+
"""
54+
55+
account: Address
56+
slots: Tuple[Bytes32, ...]
57+
58+
4759
@slotted_freezable
4860
@dataclass
4961
class AccessListTransaction:
@@ -58,7 +70,7 @@ class AccessListTransaction:
5870
to: Union[Bytes0, Address]
5971
value: U256
6072
data: Bytes
61-
access_list: Tuple[Tuple[Address, Tuple[Bytes32, ...]], ...]
73+
access_list: Tuple[Access, ...]
6274
y_parity: U256
6375
r: U256
6476
s: U256
@@ -167,9 +179,11 @@ def calculate_intrinsic_cost(tx: Transaction) -> Uint:
167179

168180
access_list_cost = Uint(0)
169181
if isinstance(tx, AccessListTransaction):
170-
for _address, keys in tx.access_list:
182+
for access in tx.access_list:
171183
access_list_cost += TX_ACCESS_LIST_ADDRESS_COST
172-
access_list_cost += ulen(keys) * TX_ACCESS_LIST_STORAGE_KEY_COST
184+
access_list_cost += (
185+
ulen(access.slots) * TX_ACCESS_LIST_STORAGE_KEY_COST
186+
)
173187

174188
return TX_BASE_COST + data_cost + create_cost + access_list_cost
175189

src/ethereum/cancun/fork.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -668,10 +668,10 @@ def process_transaction(
668668
if isinstance(
669669
tx, (AccessListTransaction, FeeMarketTransaction, BlobTransaction)
670670
):
671-
for address, keys in tx.access_list:
672-
access_list_addresses.add(address)
673-
for key in keys:
674-
access_list_storage_keys.add((address, key))
671+
for access in tx.access_list:
672+
access_list_addresses.add(access.account)
673+
for slot in access.slots:
674+
access_list_storage_keys.add((access.account, slot))
675675

676676
tx_env = vm.TransactionEnvironment(
677677
origin=sender,

src/ethereum/cancun/transactions.py

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,18 @@ class LegacyTransaction:
4444
s: U256
4545

4646

47+
@slotted_freezable
48+
@dataclass
49+
class Access:
50+
"""
51+
A mapping from account address to storage slots that are pre-warmed as part
52+
of a transaction.
53+
"""
54+
55+
account: Address
56+
slots: Tuple[Bytes32, ...]
57+
58+
4759
@slotted_freezable
4860
@dataclass
4961
class AccessListTransaction:
@@ -58,7 +70,7 @@ class AccessListTransaction:
5870
to: Union[Bytes0, Address]
5971
value: U256
6072
data: Bytes
61-
access_list: Tuple[Tuple[Address, Tuple[Bytes32, ...]], ...]
73+
access_list: Tuple[Access, ...]
6274
y_parity: U256
6375
r: U256
6476
s: U256
@@ -79,7 +91,7 @@ class FeeMarketTransaction:
7991
to: Union[Bytes0, Address]
8092
value: U256
8193
data: Bytes
82-
access_list: Tuple[Tuple[Address, Tuple[Bytes32, ...]], ...]
94+
access_list: Tuple[Access, ...]
8395
y_parity: U256
8496
r: U256
8597
s: U256
@@ -100,7 +112,7 @@ class BlobTransaction:
100112
to: Address
101113
value: U256
102114
data: Bytes
103-
access_list: Tuple[Tuple[Address, Tuple[Bytes32, ...]], ...]
115+
access_list: Tuple[Access, ...]
104116
max_fee_per_blob_gas: U256
105117
blob_versioned_hashes: Tuple[VersionedHash, ...]
106118
y_parity: U256
@@ -234,9 +246,11 @@ def calculate_intrinsic_cost(tx: Transaction) -> Uint:
234246
if isinstance(
235247
tx, (AccessListTransaction, FeeMarketTransaction, BlobTransaction)
236248
):
237-
for _address, keys in tx.access_list:
249+
for access in tx.access_list:
238250
access_list_cost += TX_ACCESS_LIST_ADDRESS_COST
239-
access_list_cost += ulen(keys) * TX_ACCESS_LIST_STORAGE_KEY_COST
251+
access_list_cost += (
252+
ulen(access.slots) * TX_ACCESS_LIST_STORAGE_KEY_COST
253+
)
240254

241255
return TX_BASE_COST + data_cost + create_cost + access_list_cost
242256

src/ethereum/gray_glacier/fork.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -733,10 +733,10 @@ def process_transaction(
733733
access_list_addresses = set()
734734
access_list_storage_keys = set()
735735
if isinstance(tx, (AccessListTransaction, FeeMarketTransaction)):
736-
for address, keys in tx.access_list:
737-
access_list_addresses.add(address)
738-
for key in keys:
739-
access_list_storage_keys.add((address, key))
736+
for access in tx.access_list:
737+
access_list_addresses.add(access.account)
738+
for slot in access.slots:
739+
access_list_storage_keys.add((access.account, slot))
740740

741741
tx_env = vm.TransactionEnvironment(
742742
origin=sender,

src/ethereum/gray_glacier/transactions.py

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,18 @@ class LegacyTransaction:
4444
s: U256
4545

4646

47+
@slotted_freezable
48+
@dataclass
49+
class Access:
50+
"""
51+
A mapping from account address to storage slots that are pre-warmed as part
52+
of a transaction.
53+
"""
54+
55+
account: Address
56+
slots: Tuple[Bytes32, ...]
57+
58+
4759
@slotted_freezable
4860
@dataclass
4961
class AccessListTransaction:
@@ -58,7 +70,7 @@ class AccessListTransaction:
5870
to: Union[Bytes0, Address]
5971
value: U256
6072
data: Bytes
61-
access_list: Tuple[Tuple[Address, Tuple[Bytes32, ...]], ...]
73+
access_list: Tuple[Access, ...]
6274
y_parity: U256
6375
r: U256
6476
s: U256
@@ -79,7 +91,7 @@ class FeeMarketTransaction:
7991
to: Union[Bytes0, Address]
8092
value: U256
8193
data: Bytes
82-
access_list: Tuple[Tuple[Address, Tuple[Bytes32, ...]], ...]
94+
access_list: Tuple[Access, ...]
8395
y_parity: U256
8496
r: U256
8597
s: U256
@@ -195,9 +207,11 @@ def calculate_intrinsic_cost(tx: Transaction) -> Uint:
195207

196208
access_list_cost = Uint(0)
197209
if isinstance(tx, (AccessListTransaction, FeeMarketTransaction)):
198-
for _address, keys in tx.access_list:
210+
for access in tx.access_list:
199211
access_list_cost += TX_ACCESS_LIST_ADDRESS_COST
200-
access_list_cost += ulen(keys) * TX_ACCESS_LIST_STORAGE_KEY_COST
212+
access_list_cost += (
213+
ulen(access.slots) * TX_ACCESS_LIST_STORAGE_KEY_COST
214+
)
201215

202216
return TX_BASE_COST + data_cost + create_cost + access_list_cost
203217

src/ethereum/london/fork.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -739,10 +739,10 @@ def process_transaction(
739739
access_list_addresses = set()
740740
access_list_storage_keys = set()
741741
if isinstance(tx, (AccessListTransaction, FeeMarketTransaction)):
742-
for address, keys in tx.access_list:
743-
access_list_addresses.add(address)
744-
for key in keys:
745-
access_list_storage_keys.add((address, key))
742+
for access in tx.access_list:
743+
access_list_addresses.add(access.account)
744+
for slot in access.slots:
745+
access_list_storage_keys.add((access.account, slot))
746746

747747
tx_env = vm.TransactionEnvironment(
748748
origin=sender,

src/ethereum/london/transactions.py

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,18 @@ class LegacyTransaction:
4444
s: U256
4545

4646

47+
@slotted_freezable
48+
@dataclass
49+
class Access:
50+
"""
51+
A mapping from account address to storage slots that are pre-warmed as part
52+
of a transaction.
53+
"""
54+
55+
account: Address
56+
slots: Tuple[Bytes32, ...]
57+
58+
4759
@slotted_freezable
4860
@dataclass
4961
class AccessListTransaction:
@@ -58,7 +70,7 @@ class AccessListTransaction:
5870
to: Union[Bytes0, Address]
5971
value: U256
6072
data: Bytes
61-
access_list: Tuple[Tuple[Address, Tuple[Bytes32, ...]], ...]
73+
access_list: Tuple[Access, ...]
6274
y_parity: U256
6375
r: U256
6476
s: U256
@@ -79,7 +91,7 @@ class FeeMarketTransaction:
7991
to: Union[Bytes0, Address]
8092
value: U256
8193
data: Bytes
82-
access_list: Tuple[Tuple[Address, Tuple[Bytes32, ...]], ...]
94+
access_list: Tuple[Access, ...]
8395
y_parity: U256
8496
r: U256
8597
s: U256
@@ -195,9 +207,11 @@ def calculate_intrinsic_cost(tx: Transaction) -> Uint:
195207

196208
access_list_cost = Uint(0)
197209
if isinstance(tx, (AccessListTransaction, FeeMarketTransaction)):
198-
for _address, keys in tx.access_list:
210+
for access in tx.access_list:
199211
access_list_cost += TX_ACCESS_LIST_ADDRESS_COST
200-
access_list_cost += ulen(keys) * TX_ACCESS_LIST_STORAGE_KEY_COST
212+
access_list_cost += (
213+
ulen(access.slots) * TX_ACCESS_LIST_STORAGE_KEY_COST
214+
)
201215

202216
return TX_BASE_COST + data_cost + create_cost + access_list_cost
203217

src/ethereum/paris/fork.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -512,10 +512,10 @@ def process_transaction(
512512
access_list_addresses = set()
513513
access_list_storage_keys = set()
514514
if isinstance(tx, (AccessListTransaction, FeeMarketTransaction)):
515-
for address, keys in tx.access_list:
516-
access_list_addresses.add(address)
517-
for key in keys:
518-
access_list_storage_keys.add((address, key))
515+
for access in tx.access_list:
516+
access_list_addresses.add(access.account)
517+
for slot in access.slots:
518+
access_list_storage_keys.add((access.account, slot))
519519

520520
tx_env = vm.TransactionEnvironment(
521521
origin=sender,

src/ethereum/paris/transactions.py

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,18 @@ class LegacyTransaction:
4444
s: U256
4545

4646

47+
@slotted_freezable
48+
@dataclass
49+
class Access:
50+
"""
51+
A mapping from account address to storage slots that are pre-warmed as part
52+
of a transaction.
53+
"""
54+
55+
account: Address
56+
slots: Tuple[Bytes32, ...]
57+
58+
4759
@slotted_freezable
4860
@dataclass
4961
class AccessListTransaction:
@@ -58,7 +70,7 @@ class AccessListTransaction:
5870
to: Union[Bytes0, Address]
5971
value: U256
6072
data: Bytes
61-
access_list: Tuple[Tuple[Address, Tuple[Bytes32, ...]], ...]
73+
access_list: Tuple[Access, ...]
6274
y_parity: U256
6375
r: U256
6476
s: U256
@@ -79,7 +91,7 @@ class FeeMarketTransaction:
7991
to: Union[Bytes0, Address]
8092
value: U256
8193
data: Bytes
82-
access_list: Tuple[Tuple[Address, Tuple[Bytes32, ...]], ...]
94+
access_list: Tuple[Access, ...]
8395
y_parity: U256
8496
r: U256
8597
s: U256
@@ -195,9 +207,11 @@ def calculate_intrinsic_cost(tx: Transaction) -> Uint:
195207

196208
access_list_cost = Uint(0)
197209
if isinstance(tx, (AccessListTransaction, FeeMarketTransaction)):
198-
for _address, keys in tx.access_list:
210+
for access in tx.access_list:
199211
access_list_cost += TX_ACCESS_LIST_ADDRESS_COST
200-
access_list_cost += ulen(keys) * TX_ACCESS_LIST_STORAGE_KEY_COST
212+
access_list_cost += (
213+
ulen(access.slots) * TX_ACCESS_LIST_STORAGE_KEY_COST
214+
)
201215

202216
return TX_BASE_COST + data_cost + create_cost + access_list_cost
203217

0 commit comments

Comments
 (0)