From 480fe99951c999fa5ffff948f0fd30bb86c17584 Mon Sep 17 00:00:00 2001 From: Sam Wilson Date: Tue, 5 May 2026 11:31:55 -0400 Subject: [PATCH] chore(spec-tool): check bpo forks in linter --- .../bls12_381/bls12_381_g1.py | 4 +- .../bls12_381/bls12_381_g2.py | 4 +- .../bls12_381/bls12_381_g1.py | 4 +- .../bls12_381/bls12_381_g2.py | 4 +- .../bls12_381/bls12_381_g1.py | 4 +- .../bls12_381/bls12_381_g2.py | 4 +- .../bls12_381/bls12_381_g1.py | 4 +- .../bls12_381/bls12_381_g2.py | 4 +- .../bls12_381/bls12_381_g1.py | 4 +- .../bls12_381/bls12_381_g2.py | 4 +- .../bls12_381/bls12_381_g1.py | 4 +- .../bls12_381/bls12_381_g2.py | 4 +- .../bls12_381/bls12_381_g1.py | 4 +- .../bls12_381/bls12_381_g2.py | 4 +- .../lint/lints/glacier_forks_hygiene.py | 57 ++++++++++++++++++- vulture_whitelist.py | 1 + 16 files changed, 83 insertions(+), 31 deletions(-) diff --git a/src/ethereum/forks/amsterdam/vm/precompiled_contracts/bls12_381/bls12_381_g1.py b/src/ethereum/forks/amsterdam/vm/precompiled_contracts/bls12_381/bls12_381_g1.py index fa0d3ec4c2d..d1f63224a0c 100644 --- a/src/ethereum/forks/amsterdam/vm/precompiled_contracts/bls12_381/bls12_381_g1.py +++ b/src/ethereum/forks/amsterdam/vm/precompiled_contracts/bls12_381/bls12_381_g1.py @@ -58,7 +58,7 @@ def bls12_g1_add(evm: Evm) -> None: raise InvalidParameter("Invalid Input Length") # GAS - charge_gas(evm, Uint(GasCosts.PRECOMPILE_BLS_G1ADD)) + charge_gas(evm, GasCosts.PRECOMPILE_BLS_G1ADD) # OPERATION p1 = bytes_to_g1(buffer_read(data, U256(0), U256(128))) @@ -138,7 +138,7 @@ def bls12_map_fp_to_g1(evm: Evm) -> None: raise InvalidParameter("Invalid Input Length") # GAS - charge_gas(evm, Uint(GasCosts.PRECOMPILE_BLS_G1MAP)) + charge_gas(evm, GasCosts.PRECOMPILE_BLS_G1MAP) # OPERATION fp = int.from_bytes(data, "big") diff --git a/src/ethereum/forks/amsterdam/vm/precompiled_contracts/bls12_381/bls12_381_g2.py b/src/ethereum/forks/amsterdam/vm/precompiled_contracts/bls12_381/bls12_381_g2.py index a5b2be04018..2fd32313f89 100644 --- a/src/ethereum/forks/amsterdam/vm/precompiled_contracts/bls12_381/bls12_381_g2.py +++ b/src/ethereum/forks/amsterdam/vm/precompiled_contracts/bls12_381/bls12_381_g2.py @@ -59,7 +59,7 @@ def bls12_g2_add(evm: Evm) -> None: raise InvalidParameter("Invalid Input Length") # GAS - charge_gas(evm, Uint(GasCosts.PRECOMPILE_BLS_G2ADD)) + charge_gas(evm, GasCosts.PRECOMPILE_BLS_G2ADD) # OPERATION p1 = bytes_to_g2(buffer_read(data, U256(0), U256(256))) @@ -139,7 +139,7 @@ def bls12_map_fp2_to_g2(evm: Evm) -> None: raise InvalidParameter("Invalid Input Length") # GAS - charge_gas(evm, Uint(GasCosts.PRECOMPILE_BLS_G2MAP)) + charge_gas(evm, GasCosts.PRECOMPILE_BLS_G2MAP) # OPERATION field_element = bytes_to_fq2(data) diff --git a/src/ethereum/forks/bpo2/vm/precompiled_contracts/bls12_381/bls12_381_g1.py b/src/ethereum/forks/bpo2/vm/precompiled_contracts/bls12_381/bls12_381_g1.py index f77ff60a32c..d5681ee503b 100644 --- a/src/ethereum/forks/bpo2/vm/precompiled_contracts/bls12_381/bls12_381_g1.py +++ b/src/ethereum/forks/bpo2/vm/precompiled_contracts/bls12_381/bls12_381_g1.py @@ -55,7 +55,7 @@ def bls12_g1_add(evm: Evm) -> None: raise InvalidParameter("Invalid Input Length") # GAS - charge_gas(evm, Uint(GasCosts.PRECOMPILE_BLS_G1ADD)) + charge_gas(evm, GasCosts.PRECOMPILE_BLS_G1ADD) # OPERATION p1 = bytes_to_g1(buffer_read(data, U256(0), U256(128))) @@ -135,7 +135,7 @@ def bls12_map_fp_to_g1(evm: Evm) -> None: raise InvalidParameter("Invalid Input Length") # GAS - charge_gas(evm, Uint(GasCosts.PRECOMPILE_BLS_G1MAP)) + charge_gas(evm, GasCosts.PRECOMPILE_BLS_G1MAP) # OPERATION fp = int.from_bytes(data, "big") diff --git a/src/ethereum/forks/bpo2/vm/precompiled_contracts/bls12_381/bls12_381_g2.py b/src/ethereum/forks/bpo2/vm/precompiled_contracts/bls12_381/bls12_381_g2.py index b49ec065e7c..cc2d969dd86 100644 --- a/src/ethereum/forks/bpo2/vm/precompiled_contracts/bls12_381/bls12_381_g2.py +++ b/src/ethereum/forks/bpo2/vm/precompiled_contracts/bls12_381/bls12_381_g2.py @@ -56,7 +56,7 @@ def bls12_g2_add(evm: Evm) -> None: raise InvalidParameter("Invalid Input Length") # GAS - charge_gas(evm, Uint(GasCosts.PRECOMPILE_BLS_G2ADD)) + charge_gas(evm, GasCosts.PRECOMPILE_BLS_G2ADD) # OPERATION p1 = bytes_to_g2(buffer_read(data, U256(0), U256(256))) @@ -136,7 +136,7 @@ def bls12_map_fp2_to_g2(evm: Evm) -> None: raise InvalidParameter("Invalid Input Length") # GAS - charge_gas(evm, Uint(GasCosts.PRECOMPILE_BLS_G2MAP)) + charge_gas(evm, GasCosts.PRECOMPILE_BLS_G2MAP) # OPERATION field_element = bytes_to_fq2(data) diff --git a/src/ethereum/forks/bpo3/vm/precompiled_contracts/bls12_381/bls12_381_g1.py b/src/ethereum/forks/bpo3/vm/precompiled_contracts/bls12_381/bls12_381_g1.py index fa0d3ec4c2d..d1f63224a0c 100644 --- a/src/ethereum/forks/bpo3/vm/precompiled_contracts/bls12_381/bls12_381_g1.py +++ b/src/ethereum/forks/bpo3/vm/precompiled_contracts/bls12_381/bls12_381_g1.py @@ -58,7 +58,7 @@ def bls12_g1_add(evm: Evm) -> None: raise InvalidParameter("Invalid Input Length") # GAS - charge_gas(evm, Uint(GasCosts.PRECOMPILE_BLS_G1ADD)) + charge_gas(evm, GasCosts.PRECOMPILE_BLS_G1ADD) # OPERATION p1 = bytes_to_g1(buffer_read(data, U256(0), U256(128))) @@ -138,7 +138,7 @@ def bls12_map_fp_to_g1(evm: Evm) -> None: raise InvalidParameter("Invalid Input Length") # GAS - charge_gas(evm, Uint(GasCosts.PRECOMPILE_BLS_G1MAP)) + charge_gas(evm, GasCosts.PRECOMPILE_BLS_G1MAP) # OPERATION fp = int.from_bytes(data, "big") diff --git a/src/ethereum/forks/bpo3/vm/precompiled_contracts/bls12_381/bls12_381_g2.py b/src/ethereum/forks/bpo3/vm/precompiled_contracts/bls12_381/bls12_381_g2.py index a5b2be04018..2fd32313f89 100644 --- a/src/ethereum/forks/bpo3/vm/precompiled_contracts/bls12_381/bls12_381_g2.py +++ b/src/ethereum/forks/bpo3/vm/precompiled_contracts/bls12_381/bls12_381_g2.py @@ -59,7 +59,7 @@ def bls12_g2_add(evm: Evm) -> None: raise InvalidParameter("Invalid Input Length") # GAS - charge_gas(evm, Uint(GasCosts.PRECOMPILE_BLS_G2ADD)) + charge_gas(evm, GasCosts.PRECOMPILE_BLS_G2ADD) # OPERATION p1 = bytes_to_g2(buffer_read(data, U256(0), U256(256))) @@ -139,7 +139,7 @@ def bls12_map_fp2_to_g2(evm: Evm) -> None: raise InvalidParameter("Invalid Input Length") # GAS - charge_gas(evm, Uint(GasCosts.PRECOMPILE_BLS_G2MAP)) + charge_gas(evm, GasCosts.PRECOMPILE_BLS_G2MAP) # OPERATION field_element = bytes_to_fq2(data) diff --git a/src/ethereum/forks/bpo4/vm/precompiled_contracts/bls12_381/bls12_381_g1.py b/src/ethereum/forks/bpo4/vm/precompiled_contracts/bls12_381/bls12_381_g1.py index fa0d3ec4c2d..d1f63224a0c 100644 --- a/src/ethereum/forks/bpo4/vm/precompiled_contracts/bls12_381/bls12_381_g1.py +++ b/src/ethereum/forks/bpo4/vm/precompiled_contracts/bls12_381/bls12_381_g1.py @@ -58,7 +58,7 @@ def bls12_g1_add(evm: Evm) -> None: raise InvalidParameter("Invalid Input Length") # GAS - charge_gas(evm, Uint(GasCosts.PRECOMPILE_BLS_G1ADD)) + charge_gas(evm, GasCosts.PRECOMPILE_BLS_G1ADD) # OPERATION p1 = bytes_to_g1(buffer_read(data, U256(0), U256(128))) @@ -138,7 +138,7 @@ def bls12_map_fp_to_g1(evm: Evm) -> None: raise InvalidParameter("Invalid Input Length") # GAS - charge_gas(evm, Uint(GasCosts.PRECOMPILE_BLS_G1MAP)) + charge_gas(evm, GasCosts.PRECOMPILE_BLS_G1MAP) # OPERATION fp = int.from_bytes(data, "big") diff --git a/src/ethereum/forks/bpo4/vm/precompiled_contracts/bls12_381/bls12_381_g2.py b/src/ethereum/forks/bpo4/vm/precompiled_contracts/bls12_381/bls12_381_g2.py index a5b2be04018..2fd32313f89 100644 --- a/src/ethereum/forks/bpo4/vm/precompiled_contracts/bls12_381/bls12_381_g2.py +++ b/src/ethereum/forks/bpo4/vm/precompiled_contracts/bls12_381/bls12_381_g2.py @@ -59,7 +59,7 @@ def bls12_g2_add(evm: Evm) -> None: raise InvalidParameter("Invalid Input Length") # GAS - charge_gas(evm, Uint(GasCosts.PRECOMPILE_BLS_G2ADD)) + charge_gas(evm, GasCosts.PRECOMPILE_BLS_G2ADD) # OPERATION p1 = bytes_to_g2(buffer_read(data, U256(0), U256(256))) @@ -139,7 +139,7 @@ def bls12_map_fp2_to_g2(evm: Evm) -> None: raise InvalidParameter("Invalid Input Length") # GAS - charge_gas(evm, Uint(GasCosts.PRECOMPILE_BLS_G2MAP)) + charge_gas(evm, GasCosts.PRECOMPILE_BLS_G2MAP) # OPERATION field_element = bytes_to_fq2(data) diff --git a/src/ethereum/forks/bpo5/vm/precompiled_contracts/bls12_381/bls12_381_g1.py b/src/ethereum/forks/bpo5/vm/precompiled_contracts/bls12_381/bls12_381_g1.py index fa0d3ec4c2d..d1f63224a0c 100644 --- a/src/ethereum/forks/bpo5/vm/precompiled_contracts/bls12_381/bls12_381_g1.py +++ b/src/ethereum/forks/bpo5/vm/precompiled_contracts/bls12_381/bls12_381_g1.py @@ -58,7 +58,7 @@ def bls12_g1_add(evm: Evm) -> None: raise InvalidParameter("Invalid Input Length") # GAS - charge_gas(evm, Uint(GasCosts.PRECOMPILE_BLS_G1ADD)) + charge_gas(evm, GasCosts.PRECOMPILE_BLS_G1ADD) # OPERATION p1 = bytes_to_g1(buffer_read(data, U256(0), U256(128))) @@ -138,7 +138,7 @@ def bls12_map_fp_to_g1(evm: Evm) -> None: raise InvalidParameter("Invalid Input Length") # GAS - charge_gas(evm, Uint(GasCosts.PRECOMPILE_BLS_G1MAP)) + charge_gas(evm, GasCosts.PRECOMPILE_BLS_G1MAP) # OPERATION fp = int.from_bytes(data, "big") diff --git a/src/ethereum/forks/bpo5/vm/precompiled_contracts/bls12_381/bls12_381_g2.py b/src/ethereum/forks/bpo5/vm/precompiled_contracts/bls12_381/bls12_381_g2.py index a5b2be04018..2fd32313f89 100644 --- a/src/ethereum/forks/bpo5/vm/precompiled_contracts/bls12_381/bls12_381_g2.py +++ b/src/ethereum/forks/bpo5/vm/precompiled_contracts/bls12_381/bls12_381_g2.py @@ -59,7 +59,7 @@ def bls12_g2_add(evm: Evm) -> None: raise InvalidParameter("Invalid Input Length") # GAS - charge_gas(evm, Uint(GasCosts.PRECOMPILE_BLS_G2ADD)) + charge_gas(evm, GasCosts.PRECOMPILE_BLS_G2ADD) # OPERATION p1 = bytes_to_g2(buffer_read(data, U256(0), U256(256))) @@ -139,7 +139,7 @@ def bls12_map_fp2_to_g2(evm: Evm) -> None: raise InvalidParameter("Invalid Input Length") # GAS - charge_gas(evm, Uint(GasCosts.PRECOMPILE_BLS_G2MAP)) + charge_gas(evm, GasCosts.PRECOMPILE_BLS_G2MAP) # OPERATION field_element = bytes_to_fq2(data) diff --git a/src/ethereum/forks/osaka/vm/precompiled_contracts/bls12_381/bls12_381_g1.py b/src/ethereum/forks/osaka/vm/precompiled_contracts/bls12_381/bls12_381_g1.py index fa0d3ec4c2d..d1f63224a0c 100644 --- a/src/ethereum/forks/osaka/vm/precompiled_contracts/bls12_381/bls12_381_g1.py +++ b/src/ethereum/forks/osaka/vm/precompiled_contracts/bls12_381/bls12_381_g1.py @@ -58,7 +58,7 @@ def bls12_g1_add(evm: Evm) -> None: raise InvalidParameter("Invalid Input Length") # GAS - charge_gas(evm, Uint(GasCosts.PRECOMPILE_BLS_G1ADD)) + charge_gas(evm, GasCosts.PRECOMPILE_BLS_G1ADD) # OPERATION p1 = bytes_to_g1(buffer_read(data, U256(0), U256(128))) @@ -138,7 +138,7 @@ def bls12_map_fp_to_g1(evm: Evm) -> None: raise InvalidParameter("Invalid Input Length") # GAS - charge_gas(evm, Uint(GasCosts.PRECOMPILE_BLS_G1MAP)) + charge_gas(evm, GasCosts.PRECOMPILE_BLS_G1MAP) # OPERATION fp = int.from_bytes(data, "big") diff --git a/src/ethereum/forks/osaka/vm/precompiled_contracts/bls12_381/bls12_381_g2.py b/src/ethereum/forks/osaka/vm/precompiled_contracts/bls12_381/bls12_381_g2.py index a5b2be04018..2fd32313f89 100644 --- a/src/ethereum/forks/osaka/vm/precompiled_contracts/bls12_381/bls12_381_g2.py +++ b/src/ethereum/forks/osaka/vm/precompiled_contracts/bls12_381/bls12_381_g2.py @@ -59,7 +59,7 @@ def bls12_g2_add(evm: Evm) -> None: raise InvalidParameter("Invalid Input Length") # GAS - charge_gas(evm, Uint(GasCosts.PRECOMPILE_BLS_G2ADD)) + charge_gas(evm, GasCosts.PRECOMPILE_BLS_G2ADD) # OPERATION p1 = bytes_to_g2(buffer_read(data, U256(0), U256(256))) @@ -139,7 +139,7 @@ def bls12_map_fp2_to_g2(evm: Evm) -> None: raise InvalidParameter("Invalid Input Length") # GAS - charge_gas(evm, Uint(GasCosts.PRECOMPILE_BLS_G2MAP)) + charge_gas(evm, GasCosts.PRECOMPILE_BLS_G2MAP) # OPERATION field_element = bytes_to_fq2(data) diff --git a/src/ethereum/forks/prague/vm/precompiled_contracts/bls12_381/bls12_381_g1.py b/src/ethereum/forks/prague/vm/precompiled_contracts/bls12_381/bls12_381_g1.py index fa0d3ec4c2d..d1f63224a0c 100644 --- a/src/ethereum/forks/prague/vm/precompiled_contracts/bls12_381/bls12_381_g1.py +++ b/src/ethereum/forks/prague/vm/precompiled_contracts/bls12_381/bls12_381_g1.py @@ -58,7 +58,7 @@ def bls12_g1_add(evm: Evm) -> None: raise InvalidParameter("Invalid Input Length") # GAS - charge_gas(evm, Uint(GasCosts.PRECOMPILE_BLS_G1ADD)) + charge_gas(evm, GasCosts.PRECOMPILE_BLS_G1ADD) # OPERATION p1 = bytes_to_g1(buffer_read(data, U256(0), U256(128))) @@ -138,7 +138,7 @@ def bls12_map_fp_to_g1(evm: Evm) -> None: raise InvalidParameter("Invalid Input Length") # GAS - charge_gas(evm, Uint(GasCosts.PRECOMPILE_BLS_G1MAP)) + charge_gas(evm, GasCosts.PRECOMPILE_BLS_G1MAP) # OPERATION fp = int.from_bytes(data, "big") diff --git a/src/ethereum/forks/prague/vm/precompiled_contracts/bls12_381/bls12_381_g2.py b/src/ethereum/forks/prague/vm/precompiled_contracts/bls12_381/bls12_381_g2.py index a5b2be04018..2fd32313f89 100644 --- a/src/ethereum/forks/prague/vm/precompiled_contracts/bls12_381/bls12_381_g2.py +++ b/src/ethereum/forks/prague/vm/precompiled_contracts/bls12_381/bls12_381_g2.py @@ -59,7 +59,7 @@ def bls12_g2_add(evm: Evm) -> None: raise InvalidParameter("Invalid Input Length") # GAS - charge_gas(evm, Uint(GasCosts.PRECOMPILE_BLS_G2ADD)) + charge_gas(evm, GasCosts.PRECOMPILE_BLS_G2ADD) # OPERATION p1 = bytes_to_g2(buffer_read(data, U256(0), U256(256))) @@ -139,7 +139,7 @@ def bls12_map_fp2_to_g2(evm: Evm) -> None: raise InvalidParameter("Invalid Input Length") # GAS - charge_gas(evm, Uint(GasCosts.PRECOMPILE_BLS_G2MAP)) + charge_gas(evm, GasCosts.PRECOMPILE_BLS_G2MAP) # OPERATION field_element = bytes_to_fq2(data) diff --git a/src/ethereum_spec_tools/lint/lints/glacier_forks_hygiene.py b/src/ethereum_spec_tools/lint/lints/glacier_forks_hygiene.py index f3d82b3943e..55d58c6a264 100644 --- a/src/ethereum_spec_tools/lint/lints/glacier_forks_hygiene.py +++ b/src/ethereum_spec_tools/lint/lints/glacier_forks_hygiene.py @@ -55,6 +55,14 @@ def __init__(self) -> None: "gray_glacier": 11400000, } + @staticmethod + def _needs_lint(fork_name: str) -> bool: + return ( + fork_name == "dao_fork" + or fork_name.endswith("_glacier") + or fork_name.startswith("bpo") + ) + def lint( self, forks: List[Hardfork], position: int ) -> Sequence[Diagnostic]: @@ -66,7 +74,7 @@ def lint( # Nothing to compare against! return [] - if fork_name != "dao_fork" and not fork_name.endswith("_glacier"): + if not self._needs_lint(fork_name): # Nothing to compare against or non-glacier fork! return [] @@ -139,9 +147,13 @@ def compare( ) continue - if item == "BOMB_DELAY_BLOCKS": + if fork_name.endswith("_glacier") and item == "BOMB_DELAY_BLOCKS": previous_item.value.value = self.delay_blocks[fork_name] + if fork_name.startswith("bpo"): + if item.startswith("GasCosts.BLOB_"): + continue + if not compare_ast(previous_item, current_item): add_diagnostic( diagnostics, @@ -237,7 +249,46 @@ def visit_ClassDef(self, klass: ast.ClassDef) -> None: """ Visit a class. """ - self._insert(klass.name, klass) + self.path.append(klass.name) + super().generic_visit(klass) + popped = self.path.pop() + assert popped == klass.name + + def visit_Name(self, node: ast.Name) -> None: + """ + Visit a name. + """ + self._insert(node.id, node) + + def visit_Attribute(self, node: ast.Attribute) -> None: + """ + Visit an attribute. + """ + self._insert(node.attr, node) + + def visit_Subscript(self, node: ast.Subscript) -> None: + """ + Visit a subscript. + """ + self.visit(node.value) + self.visit(node.slice) + + def visit_Pass(self, node: ast.Pass) -> None: + """ + Visit a pass. + """ + pass + + def visit_Tuple(self, node: ast.Tuple) -> None: + """ + Visit a tuple. + """ + for idx, child in enumerate(node.elts): + name = f"[{idx}]" + self.path.append(name) + self.visit(child) + popped = self.path.pop() + assert name == popped def visit_Assign(self, assign: ast.Assign) -> None: """ diff --git a/vulture_whitelist.py b/vulture_whitelist.py index f550b98e4df..1c023f55b98 100644 --- a/vulture_whitelist.py +++ b/vulture_whitelist.py @@ -122,6 +122,7 @@ # src/ethereum_spec_tools/lint/lints/glacier_forks_hygiene.py GlacierForksHygiene GlacierForksHygiene.visit_AnnAssign +GlacierForksHygiene.visit_Pass # src/ethereum_spec_tools/lint/lints/glacier_forks_hygiene.py ImportHygiene