ethereum.forks.frontier.vm.instructions.keccakethereum.forks.homestead.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) |