diff --git a/src/zkevm_specs/evm_circuit/instruction.py b/src/zkevm_specs/evm_circuit/instruction.py index f2f0f0b63..5748dad8a 100644 --- a/src/zkevm_specs/evm_circuit/instruction.py +++ b/src/zkevm_specs/evm_circuit/instruction.py @@ -1398,6 +1398,17 @@ def exp_lookup( exp_table_row = self.tables.exp_lookup(identifier, is_last, base_limbs, exponent) return exp_table_row.exponentiation + def sig_lookup( + self, + msg_hash: Word, + sig_v: Expression, + sig_r: Word, + sig_s: Word, + recovered_addr: FQ, + is_valid: Expression, + ) -> Word: + return self.tables.sig_lookup(msg_hash, sig_v, sig_r, sig_s, recovered_addr, is_valid) + def constrain_error_state(self, rw_counter_delta: int): # Current call must fail. rw_counter_delta += 1 diff --git a/src/zkevm_specs/evm_circuit/table.py b/src/zkevm_specs/evm_circuit/table.py index 12ce69193..a53fba839 100644 --- a/src/zkevm_specs/evm_circuit/table.py +++ b/src/zkevm_specs/evm_circuit/table.py @@ -538,6 +538,16 @@ class ExpTableRow(TableRow): exponentiation: Word +@dataclass(frozen=True) +class SigTableRow(TableRow): + msg_hash: Word + sig_v: FQ + sig_r: Word + sig_s: Word + recovered_addr: FQ + is_valid: FQ + + class Tables: """ A collection of lookup tables used in EVM circuit. @@ -552,6 +562,7 @@ class Tables: copy_table: Set[CopyTableRow] keccak_table: Set[KeccakTableRow] exp_table: Set[ExpTableRow] + sig_table: Set[SigTableRow] def __init__( self, @@ -563,6 +574,7 @@ def __init__( copy_circuit: Optional[Sequence[CopyCircuitRow]] = None, keccak_table: Optional[Sequence[KeccakTableRow]] = None, exp_circuit: Optional[Sequence[ExpCircuitRow]] = None, + sig_table: Optional[Sequence[SigTableRow]] = None, ) -> None: self.block_table = block_table self.tx_table = tx_table @@ -578,6 +590,8 @@ def __init__( self.keccak_table = set(keccak_table) if exp_circuit is not None: self.exp_table = self._convert_exp_circuit_to_table(exp_circuit) + if sig_table is not None: + self.sig_table = set(sig_table) def _convert_copy_circuit_to_table(self, copy_circuit: Sequence[CopyCircuitRow]): rows: List[CopyTableRow] = [] @@ -768,6 +782,25 @@ def exp_lookup( } return lookup(ExpTableRow, self.exp_table, query) + def sig_lookup( + self, + msg_hash: Word, + sig_v: Expression, + sig_r: Word, + sig_s: Word, + recovered_addr: FQ, + is_valid: Expression, + ) -> SigTableRow: + query = { + "msg_hash": msg_hash, + "sig_v": sig_v, + "sig_r": sig_r, + "sig_s": sig_s, + "recovered_addr": recovered_addr, + "is_valid": is_valid, + } + return lookup(SigTableRow, self.sig_table, query) + T = TypeVar("T", bound=TableRow)