ethereum.forks.tangerine_whistle.vm.instructions.keccakethereum.forks.spurious_dragon.vm.instructions.keccak
            
            
            Ethereum Virtual Machine (EVM) Keccak Instructions.
.. contents:: Table of Contents :backlinks: none :local:
Introduction
Implementations of the EVM keccak instructions.
keccak
Pushes to the stack the Keccak-256 hash of a region of memory.
This also expands the memory, in case the memory is insufficient to access the data's memory location.
Parameters
evm : The current EVM frame.
                def keccak(evm: Evm) -> None:
            
| 31 |     """ | 
|---|---|
| 32 |     Pushes to the stack the Keccak-256 hash of a region of memory. | 
| 33 |  | 
| 34 |     This also expands the memory, in case the memory is insufficient to | 
| 35 |     access the data's memory location. | 
| 36 |  | 
| 37 |     Parameters | 
| 38 |     ---------- | 
| 39 |     evm : | 
| 40 |         The current EVM frame. | 
| 41 |  | 
| 42 |     """ | 
| 43 |     # STACK | 
| 44 |     memory_start_index = pop(evm.stack) | 
| 45 |     size = pop(evm.stack) | 
| 46 | |
| 47 |     # GAS | 
| 48 |     words = ceil32(Uint(size)) // Uint(32) | 
| 49 |     word_gas_cost = GAS_KECCAK256_WORD * words | 
| 50 |     extend_memory = calculate_gas_extend_memory( | 
| 51 |         evm.memory, [(memory_start_index, size)] | 
| 52 |     ) | 
| 53 |     charge_gas(evm, GAS_KECCAK256 + word_gas_cost + extend_memory.cost) | 
| 54 | |
| 55 |     # OPERATION | 
| 56 |     evm.memory += b"\x00" * extend_memory.expand_by | 
| 57 |     data = memory_read_bytes(evm.memory, memory_start_index, size) | 
| 58 |     hashed = keccak256(data) | 
| 59 | |
| 60 |     push(evm.stack, U256.from_be_bytes(hashed)) | 
| 61 | |
| 62 |     # PROGRAM COUNTER | 
| 63 |     evm.pc += Uint(1) |