ethereum.forks.cancun.vm.precompiled_contracts.point_evaluationethereum.forks.prague.vm.precompiled_contracts.point_evaluation
            
            
            Ethereum Virtual Machine (EVM) POINT EVALUATION PRECOMPILED CONTRACT.
.. contents:: Table of Contents :backlinks: none :local:
Introduction
Implementation of the POINT EVALUATION precompiled contract.
FIELD_ELEMENTS_PER_BLOB
| 27 | FIELD_ELEMENTS_PER_BLOB = 4096 | 
|---|
BLS_MODULUS
| 28 | BLS_MODULUS = 52435875175126190479447740508185965837690552500527637822603658699938581184513 | 
|---|
VERSIONED_HASH_VERSION_KZG
| 29 | VERSIONED_HASH_VERSION_KZG = b"\x01" | 
|---|
point_evaluation
A pre-compile that verifies a KZG proof which claims that a blob (represented by a commitment) evaluates to a given value at a given point.
Parameters
evm : The current EVM frame.
                def point_evaluation(evm: Evm) -> None:
            
| 33 |     """ | 
|---|---|
| 34 |     A pre-compile that verifies a KZG proof which claims that a blob | 
| 35 |     (represented by a commitment) evaluates to a given value at a given point. | 
| 36 |  | 
| 37 |     Parameters | 
| 38 |     ---------- | 
| 39 |     evm : | 
| 40 |         The current EVM frame. | 
| 41 |  | 
| 42 |     """ | 
| 43 |     data = evm.message.data | 
| 44 |     if len(data) != 192: | 
| 45 |         raise KZGProofError | 
| 46 | |
| 47 |     versioned_hash = data[:32] | 
| 48 |     z = Bytes32(data[32:64]) | 
| 49 |     y = Bytes32(data[64:96]) | 
| 50 |     commitment = KZGCommitment(data[96:144]) | 
| 51 |     proof = Bytes48(data[144:192]) | 
| 52 | |
| 53 |     # GAS | 
| 54 |     charge_gas(evm, GAS_POINT_EVALUATION) | 
| 55 |     if kzg_commitment_to_versioned_hash(commitment) != versioned_hash: | 
| 56 |         raise KZGProofError | 
| 57 | |
| 58 |     # Verify KZG proof with z and y in big endian format | 
| 59 |     try: | 
| 60 |         kzg_proof_verification = verify_kzg_proof(commitment, z, y, proof) | 
| 61 |     except Exception as e: | 
| 62 |         raise KZGProofError from e | 
| 63 | |
| 64 |     if not kzg_proof_verification: | 
| 65 |         raise KZGProofError | 
| 66 | |
| 67 |     # Return FIELD_ELEMENTS_PER_BLOB and BLS_MODULUS as padded | 
| 68 |     # 32 byte big endian values | 
| 69 |     evm.output = Bytes( | 
| 70 |         U256(FIELD_ELEMENTS_PER_BLOB).to_be_bytes32() | 
| 71 |         + U256(BLS_MODULUS).to_be_bytes32() | 
| 72 |     ) |