nimbus-eth1/nimbus/evm/interpreter/op_handlers/oph_hash.nim

72 lines
2.0 KiB
Nim

# Nimbus
# Copyright (c) 2018-2024 Status Research & Development GmbH
# Licensed under either of
# * Apache License, version 2.0, ([LICENSE-APACHE](LICENSE-APACHE) or
# http://www.apache.org/licenses/LICENSE-2.0)
# * MIT license ([LICENSE-MIT](LICENSE-MIT) or
# http://opensource.org/licenses/MIT)
# at your option. This file may not be copied, modified, or distributed except
# according to those terms.
## EVM Opcode Handlers: Hashes
## ===========================
##
{.push raises: [].}
import
../../../constants,
../../evm_errors,
../../computation,
../../memory,
../../stack,
../gas_costs,
../op_codes,
./oph_defs,
eth/common
# ------------------------------------------------------------------------------
# Private, op handlers implementation
# ------------------------------------------------------------------------------
proc sha3Op(cpt: VmCpt): EvmResultVoid =
## 0x20, Compute Keccak-256 hash.
? cpt.stack.lsCheck(2)
let
pos = cpt.stack.lsPeekSafeInt(^1)
len = cpt.stack.lsPeekSafeInt(^2)
cpt.stack.lsShrink(1)
if pos < 0 or len < 0 or pos > 2147483648'i64:
return err(opErr(OutOfBounds))
? cpt.opcodeGasCost(Op.Sha3,
cpt.gasCosts[Op.Sha3].m_handler(cpt.memory.len, pos, len),
reason = "SHA3: word gas cost")
cpt.memory.extend(pos, len)
let endRange = min(pos + len, cpt.memory.len) - 1
if endRange == -1 or pos >= cpt.memory.len:
cpt.stack.lsTop(EMPTY_SHA3)
else:
cpt.stack.lsTop keccakHash cpt.memory.bytes.toOpenArray(pos, endRange)
ok()
# ------------------------------------------------------------------------------
# Public, op exec table entries
# ------------------------------------------------------------------------------
const
VmOpExecHash*: seq[VmOpExec] = @[
(opCode: Op.Sha3, ## 0x20, Keccak-256
forks: VmOpAllForks,
name: "sha3",
info: "Compute Keccak-256 hash",
exec: sha3Op)]
# ------------------------------------------------------------------------------
# End
# ------------------------------------------------------------------------------