mirror of
https://github.com/status-im/nimbus-eth2.git
synced 2025-01-24 13:33:14 +00:00
7ad610f6d7
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.
79 lines
2.8 KiB
Nim
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")
|