nimbus-eth2/tests/test_helpers.nim
Etan Kissling 7ad610f6d7
set fee recipient in empty payload fallback (#4291)
When the EL/Builder fails to produce an execution payload, we fall back
to an empty `ExecutionPayload`. Even though it contains no transactions
it should refer to the configured fee recipient. This is useful for
privacy reasons (do not reveal the reason for the empty payload) and for
compliance with additional fee recipient rules by staking pools.
2022-11-08 14:19:56 +00:00

79 lines
2.8 KiB
Nim

# beacon_chain
# Copyright (c) 2018-2022 Status Research & Development GmbH
# Licensed and distributed under either of
# * MIT license (license terms in the root directory or at https://opensource.org/licenses/MIT).
# * Apache v2 license (license terms in the root directory or at https://www.apache.org/licenses/LICENSE-2.0).
# at your option. This file may not be copied, modified, or distributed except according to those terms.
{.used.}
import
# Status libraries
stew/bitops2,
web3/ethtypes,
# Beacon chain internals
../beacon_chain/spec/[forks, helpers, state_transition],
../beacon_chain/spec/datatypes/bellatrix,
# Test utilities
./unittest2, mocking/mock_genesis
suite "Spec helpers":
test "integer_squareroot":
check:
integer_squareroot(0'u64) == 0'u64
integer_squareroot(1'u64) == 1'u64
integer_squareroot(2'u64) == 1'u64
integer_squareroot(3'u64) == 1'u64
integer_squareroot(4'u64) == 2'u64
integer_squareroot(5'u64) == 2'u64
test "build_proof - BeaconState":
var
forked = newClone(initGenesisState())
cache = StateCache()
info = ForkedEpochInfo()
process_slots(
defaultRuntimeConfig, forked[], Slot(100), cache, info,
flags = {}).expect("no failure")
let
state = forked[].phase0Data.data
root = state.hash_tree_root()
func numLeaves(obj: object): GeneralizedIndex =
nextPow2(typeof(obj).totalSerializedFields.uint64).GeneralizedIndex
proc process(anchor: object, index: GeneralizedIndex) =
var i = index
anchor.enumInstanceSerializedFields(fieldNameVar, fieldVar):
let depth = log2trunc(i)
var proof = newSeq[Eth2Digest](depth)
state.build_proof(i, proof).get
check:
hash_tree_root(fieldVar) == hash_tree_root(state, i).get
is_valid_merkle_branch(hash_tree_root(fieldVar), proof,
depth, get_subtree_index(i), root)
when fieldVar is object and not (fieldVar is Eth2Digest):
let
numChildLeaves = fieldVar.numLeaves
childDepth = log2trunc(numChildLeaves)
process(fieldVar, i shl childDepth)
i += 1
process(state, state.numLeaves)
test "build_empty_execution_payload":
var cfg = defaultRuntimeConfig
cfg.ALTAIR_FORK_EPOCH = GENESIS_EPOCH
cfg.BELLATRIX_FORK_EPOCH = GENESIS_EPOCH
let state = newClone(initGenesisState(cfg = cfg).bellatrixData)
template testCase(recipient: Eth1Address): untyped =
block:
let payload = build_empty_execution_payload(state[].data, recipient)
check payload.fee_recipient ==
bellatrix.ExecutionAddress(data: distinctBase(recipient))
testCase default(Eth1Address)
testCase Eth1Address.fromHex("0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b")