2021-04-14 10:40:55 +00:00
|
|
|
|
# Nimbus
|
|
|
|
|
# Copyright (c) 2018 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: Block Data
|
|
|
|
|
## ===============================
|
|
|
|
|
##
|
|
|
|
|
|
|
|
|
|
import
|
2021-04-21 17:04:54 +00:00
|
|
|
|
../../compu_helper,
|
|
|
|
|
../../stack,
|
|
|
|
|
../../v2state,
|
|
|
|
|
../op_codes,
|
2021-04-14 10:40:55 +00:00
|
|
|
|
./oph_defs,
|
2021-04-21 17:04:54 +00:00
|
|
|
|
eth/common,
|
|
|
|
|
stint,
|
|
|
|
|
times
|
2021-04-14 10:40:55 +00:00
|
|
|
|
|
|
|
|
|
# ------------------------------------------------------------------------------
|
|
|
|
|
# Private, op handlers implementation
|
|
|
|
|
# ------------------------------------------------------------------------------
|
|
|
|
|
|
|
|
|
|
const
|
2021-04-20 12:07:01 +00:00
|
|
|
|
blockhashOp: Vm2OpFn = proc (k: var Vm2Ctx) =
|
2021-04-14 10:40:55 +00:00
|
|
|
|
## 0x40, Get the hash of one of the 256 most recent complete blocks.
|
|
|
|
|
let (blockNumber) = k.cpt.stack.popInt(1)
|
|
|
|
|
k.cpt.stack.push:
|
|
|
|
|
k.cpt.getBlockHash(blockNumber)
|
|
|
|
|
|
2021-04-20 12:07:01 +00:00
|
|
|
|
coinBaseOp: Vm2OpFn = proc (k: var Vm2Ctx) =
|
2021-04-14 10:40:55 +00:00
|
|
|
|
## 0x41, Get the block's beneficiary address.
|
|
|
|
|
k.cpt.stack.push:
|
|
|
|
|
k.cpt.getCoinbase
|
|
|
|
|
|
2021-04-20 12:07:01 +00:00
|
|
|
|
timestampOp: Vm2OpFn = proc (k: var Vm2Ctx) =
|
2021-04-14 10:40:55 +00:00
|
|
|
|
## 0x42, Get the block's timestamp.
|
|
|
|
|
k.cpt.stack.push:
|
|
|
|
|
k.cpt.getTimestamp
|
|
|
|
|
|
2021-04-20 12:07:01 +00:00
|
|
|
|
blocknumberOp: Vm2OpFn = proc (k: var Vm2Ctx) =
|
2021-04-14 10:40:55 +00:00
|
|
|
|
## 0x43, Get the block's number.
|
|
|
|
|
k.cpt.stack.push:
|
|
|
|
|
k.cpt.getBlockNumber
|
|
|
|
|
|
2021-04-20 12:07:01 +00:00
|
|
|
|
difficultyOp: Vm2OpFn = proc (k: var Vm2Ctx) =
|
2021-04-14 10:40:55 +00:00
|
|
|
|
## 0x44, Get the block's difficulty
|
|
|
|
|
k.cpt.stack.push:
|
|
|
|
|
k.cpt.getDifficulty
|
|
|
|
|
|
2021-04-20 12:07:01 +00:00
|
|
|
|
gasLimitOp: Vm2OpFn = proc (k: var Vm2Ctx) =
|
2021-04-14 10:40:55 +00:00
|
|
|
|
## 0x45, Get the block's gas limit
|
|
|
|
|
k.cpt.stack.push:
|
|
|
|
|
k.cpt.getGasLimit
|
|
|
|
|
|
2021-04-20 12:07:01 +00:00
|
|
|
|
chainIdOp: Vm2OpFn = proc (k: var Vm2Ctx) =
|
2021-04-14 10:40:55 +00:00
|
|
|
|
## 0x46, Get current chain’s EIP-155 unique identifier.
|
|
|
|
|
k.cpt.stack.push:
|
|
|
|
|
k.cpt.getChainId
|
|
|
|
|
|
2021-04-20 12:07:01 +00:00
|
|
|
|
selfBalanceOp: Vm2OpFn = proc (k: var Vm2Ctx) =
|
2021-04-14 10:40:55 +00:00
|
|
|
|
## 0x47, Get current contract's balance.
|
|
|
|
|
k.cpt.stack.push:
|
|
|
|
|
k.cpt.getBalance(k.cpt.msg.contractAddress)
|
|
|
|
|
|
|
|
|
|
# ------------------------------------------------------------------------------
|
|
|
|
|
# Public, op exec table entries
|
|
|
|
|
# ------------------------------------------------------------------------------
|
|
|
|
|
|
|
|
|
|
const
|
|
|
|
|
vm2OpExecBlockData*: seq[Vm2OpExec] = @[
|
|
|
|
|
|
|
|
|
|
(opCode: Blockhash, ## 0x40, Hash of some most recent complete block
|
|
|
|
|
forks: Vm2OpAllForks,
|
2021-04-19 09:15:35 +00:00
|
|
|
|
name: "blockhash",
|
2021-04-14 10:40:55 +00:00
|
|
|
|
info: "Get the hash of one of the 256 most recent complete blocks",
|
|
|
|
|
exec: (prep: vm2OpIgnore,
|
|
|
|
|
run: blockhashOp,
|
|
|
|
|
post: vm2OpIgnore)),
|
|
|
|
|
|
|
|
|
|
(opCode: Coinbase, ## 0x41, Beneficiary address
|
|
|
|
|
forks: Vm2OpAllForks,
|
2021-04-19 09:15:35 +00:00
|
|
|
|
name: "coinbase",
|
2021-04-14 10:40:55 +00:00
|
|
|
|
info: "Get the block's beneficiary address",
|
|
|
|
|
exec: (prep: vm2OpIgnore,
|
|
|
|
|
run: coinBaseOp,
|
|
|
|
|
post: vm2OpIgnore)),
|
|
|
|
|
|
|
|
|
|
(opCode: Timestamp, ## 0x42, Block timestamp.
|
|
|
|
|
forks: Vm2OpAllForks,
|
2021-04-19 09:15:35 +00:00
|
|
|
|
name: "timestamp",
|
2021-04-14 10:40:55 +00:00
|
|
|
|
info: "Get the block's timestamp",
|
|
|
|
|
exec: (prep: vm2OpIgnore,
|
|
|
|
|
run: timestampOp,
|
|
|
|
|
post: vm2OpIgnore)),
|
|
|
|
|
|
|
|
|
|
(opCode: Number, ## 0x43, Block number
|
|
|
|
|
forks: Vm2OpAllForks,
|
2021-04-19 09:15:35 +00:00
|
|
|
|
name: "blockNumber",
|
2021-04-14 10:40:55 +00:00
|
|
|
|
info: "Get the block's number",
|
|
|
|
|
exec: (prep: vm2OpIgnore,
|
|
|
|
|
run: blocknumberOp,
|
|
|
|
|
post: vm2OpIgnore)),
|
|
|
|
|
|
|
|
|
|
(opCode: Difficulty, ## 0x44, Block difficulty
|
|
|
|
|
forks: Vm2OpAllForks,
|
2021-04-19 09:15:35 +00:00
|
|
|
|
name: "difficulty",
|
2021-04-14 10:40:55 +00:00
|
|
|
|
info: "Get the block's difficulty",
|
|
|
|
|
exec: (prep: vm2OpIgnore,
|
|
|
|
|
run: difficultyOp,
|
|
|
|
|
post: vm2OpIgnore)),
|
|
|
|
|
|
|
|
|
|
(opCode: GasLimit, ## 0x45, Block gas limit
|
|
|
|
|
forks: Vm2OpAllForks,
|
2021-04-19 09:15:35 +00:00
|
|
|
|
name: "gasLimit",
|
2021-04-14 10:40:55 +00:00
|
|
|
|
info: "Get the block's gas limit",
|
|
|
|
|
exec: (prep: vm2OpIgnore,
|
|
|
|
|
run: gasLimitOp,
|
|
|
|
|
post: vm2OpIgnore)),
|
|
|
|
|
|
|
|
|
|
(opCode: ChainId, ## 0x46, EIP-155 chain identifier
|
2021-04-19 09:15:35 +00:00
|
|
|
|
forks: Vm2OpIstanbulAndLater,
|
|
|
|
|
name: "chainId",
|
2021-04-14 10:40:55 +00:00
|
|
|
|
info: "Get current chain’s EIP-155 unique identifier",
|
|
|
|
|
exec: (prep: vm2OpIgnore,
|
|
|
|
|
run: chainIdOp,
|
|
|
|
|
post: vm2OpIgnore)),
|
|
|
|
|
|
|
|
|
|
(opCode: SelfBalance, ## 0x47, Contract balance.
|
2021-04-19 09:15:35 +00:00
|
|
|
|
forks: Vm2OpIstanbulAndLater,
|
|
|
|
|
name: "selfBalance",
|
2021-04-14 10:40:55 +00:00
|
|
|
|
info: "Get current contract's balance",
|
|
|
|
|
exec: (prep: vm2OpIgnore,
|
|
|
|
|
run: selfBalanceOp,
|
|
|
|
|
post: vm2OpIgnore))]
|
|
|
|
|
|
|
|
|
|
# ------------------------------------------------------------------------------
|
|
|
|
|
# End
|
|
|
|
|
# ------------------------------------------------------------------------------
|