rm spec_block_processing/test_process_attestation (#3258)
This commit is contained in:
parent
bac0eaa92e
commit
18d83e0ece
|
@ -373,12 +373,6 @@ OK: 18/18 Fail: 0/18 Skip: 0/18
|
|||
+ default initialization of signatures OK
|
||||
```
|
||||
OK: 3/3 Fail: 0/3 Skip: 0/3
|
||||
## [Unit - Spec - Block processing] Attestations [Preset: mainnet]
|
||||
```diff
|
||||
+ Valid attestation OK
|
||||
+ Valid attestation from previous epoch OK
|
||||
```
|
||||
OK: 2/2 Fail: 0/2 Skip: 0/2
|
||||
## [Unit - Spec - Block processing] Deposits [Preset: mainnet]
|
||||
```diff
|
||||
+ Deposit at MAX_EFFECTIVE_BALANCE balance (32 ETH) OK
|
||||
|
@ -442,4 +436,4 @@ OK: 1/1 Fail: 0/1 Skip: 0/1
|
|||
OK: 1/1 Fail: 0/1 Skip: 0/1
|
||||
|
||||
---TOTAL---
|
||||
OK: 238/240 Fail: 0/240 Skip: 2/240
|
||||
OK: 236/238 Fail: 0/238 Skip: 2/238
|
||||
|
|
|
@ -45,7 +45,6 @@ import # Unit test
|
|||
import # Refactor state transition unit tests
|
||||
# In mainnet these take 2 minutes and are empty TODOs
|
||||
./spec_block_processing/test_process_deposits,
|
||||
./spec_block_processing/test_process_attestation,
|
||||
./spec_epoch_processing/test_process_justification_and_finalization
|
||||
|
||||
when not defined(i386):
|
||||
|
|
|
@ -1,113 +0,0 @@
|
|||
# beacon_chain
|
||||
# Copyright (c) 2018-2021 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.
|
||||
|
||||
# Mocking attestations
|
||||
# ---------------------------------------------------------------
|
||||
|
||||
import
|
||||
# Status
|
||||
chronicles,
|
||||
# Specs
|
||||
../../beacon_chain/spec/datatypes/phase0,
|
||||
../../beacon_chain/spec/[beaconstate, forks, helpers, validator, signatures],
|
||||
# Test utilities
|
||||
./mock_blocks,
|
||||
../testblockutil
|
||||
|
||||
proc mockAttestationData(
|
||||
state: phase0.BeaconState,
|
||||
slot: Slot,
|
||||
index: uint64): AttestationData =
|
||||
doAssert state.slot >= slot
|
||||
|
||||
if slot == state.slot:
|
||||
let forkedState = (ref ForkedHashedBeaconState)(kind: BeaconStateFork.Phase0,
|
||||
phase0Data: phase0.HashedBeaconState(root: hash_tree_root(state), data: state))
|
||||
result.beacon_block_root = mockBlockForNextSlot(forkedState[]).phase0Data.message.parent_root
|
||||
else:
|
||||
result.beacon_block_root = get_block_root_at_slot(state, slot)
|
||||
|
||||
let current_epoch_start_slot = state.get_current_epoch().compute_start_slot_at_epoch()
|
||||
let epoch_boundary_root = block:
|
||||
if slot < current_epoch_start_slot:
|
||||
get_block_root(state, get_previous_epoch(state))
|
||||
elif slot == current_epoch_start_slot:
|
||||
result.beacon_block_root
|
||||
else:
|
||||
get_block_root(state, get_current_epoch(state))
|
||||
|
||||
if slot < current_epoch_start_slot:
|
||||
result.source = state.previous_justified_checkpoint
|
||||
else:
|
||||
result.source = state.current_justified_checkpoint
|
||||
|
||||
let target_epoch = compute_epoch_at_slot(slot)
|
||||
|
||||
result.slot = slot
|
||||
result.index = index
|
||||
|
||||
result.target = Checkpoint(
|
||||
epoch: target_epoch, root: epoch_boundary_root
|
||||
)
|
||||
|
||||
proc signMockAttestation(state: phase0.BeaconState, attestation: var Attestation) =
|
||||
var cache = StateCache()
|
||||
|
||||
var agg {.noInit.}: AggregateSignature
|
||||
var first_iter = true # Can't do while loop on hashset
|
||||
for validator_index in get_attesting_indices(
|
||||
state,
|
||||
attestation.data,
|
||||
attestation.aggregation_bits,
|
||||
cache
|
||||
):
|
||||
let sig = get_attestation_signature(
|
||||
state.fork, state.genesis_validators_root, attestation.data,
|
||||
MockPrivKeys[validator_index]
|
||||
)
|
||||
if first_iter:
|
||||
agg.init(sig)
|
||||
first_iter = false
|
||||
else:
|
||||
agg.aggregate(sig)
|
||||
|
||||
if first_iter != true:
|
||||
attestation.signature = agg.finish().toValidatorSig()
|
||||
# Otherwise no participants so zero sig
|
||||
|
||||
proc mockAttestationImpl(
|
||||
state: phase0.BeaconState,
|
||||
slot: Slot): Attestation =
|
||||
|
||||
var cache = StateCache()
|
||||
|
||||
let
|
||||
beacon_committee = get_beacon_committee(
|
||||
state,
|
||||
result.data.slot,
|
||||
result.data.index.CommitteeIndex,
|
||||
cache
|
||||
)
|
||||
committee_size = beacon_committee.len
|
||||
|
||||
result.data = mockAttestationData(state, slot, 0)
|
||||
result.aggregation_bits = init(CommitteeValidatorsBits, committee_size)
|
||||
|
||||
# fillAggregateAttestation
|
||||
for i in 0 ..< beacon_committee.len:
|
||||
result.aggregation_bits[i] = true
|
||||
|
||||
signMockAttestation(state, result)
|
||||
|
||||
proc mockAttestation*(
|
||||
state: phase0.BeaconState): Attestation =
|
||||
mockAttestationImpl(state, state.slot)
|
||||
|
||||
proc mockAttestation*(
|
||||
state: phase0.BeaconState,
|
||||
slot: Slot): Attestation =
|
||||
mockAttestationImpl(state, slot)
|
|
@ -1,91 +0,0 @@
|
|||
# beacon_chain
|
||||
# Copyright (c) 2018-2021 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.
|
||||
|
||||
# process_attestation (beaconstate.nim)
|
||||
# https://github.com/ethereum/consensus-specs/blob/v1.1.8/specs/phase0/beacon-chain.md#attestations
|
||||
# ---------------------------------------------------------------
|
||||
|
||||
{.used.}
|
||||
|
||||
import
|
||||
stew/results,
|
||||
# Specs
|
||||
../../beacon_chain/spec/[beaconstate, forks, helpers],
|
||||
../../beacon_chain/spec/datatypes/base,
|
||||
# Mock helpers
|
||||
../mocking/[mock_genesis, mock_attestations, mock_state],
|
||||
../testutil
|
||||
|
||||
suite "[Unit - Spec - Block processing] Attestations " & preset():
|
||||
|
||||
const NumValidators = uint64(8) * SLOTS_PER_EPOCH
|
||||
let genesisState = initGenesisState(NumValidators)
|
||||
|
||||
doAssert getStateField(genesisState[], validators).lenu64 == NumValidators
|
||||
|
||||
template valid_attestation(name: string, body: untyped): untyped {.dirty.}=
|
||||
# Process a valid attestation
|
||||
#
|
||||
# The BeaconState is exposed as "state" in the calling context
|
||||
# The attestation to process must be named "attestation" in the calling context
|
||||
|
||||
test name:
|
||||
var state {.inject.} = newClone(genesisState[])
|
||||
|
||||
# Attestation setup body
|
||||
# ----------------------------------------
|
||||
body
|
||||
|
||||
# Params for sanity checks
|
||||
# ----------------------------------------
|
||||
let
|
||||
current_epoch_count =
|
||||
state.phase0Data.data.current_epoch_attestations.len
|
||||
previous_epoch_count =
|
||||
state.phase0Data.data.previous_epoch_attestations.len
|
||||
|
||||
# State transition
|
||||
# ----------------------------------------
|
||||
var cache = StateCache()
|
||||
check process_attestation(
|
||||
state.phase0Data.data, attestation, flags = {}, 0.Gwei, cache
|
||||
).isOk
|
||||
|
||||
# Check that the attestation was processed
|
||||
if attestation.data.target.epoch == get_current_epoch(state[]):
|
||||
check(state.phase0Data.data.current_epoch_attestations.len ==
|
||||
current_epoch_count + 1)
|
||||
else:
|
||||
check(state.phase0Data.data.previous_epoch_attestations.len ==
|
||||
previous_epoch_count + 1)
|
||||
|
||||
valid_attestation("Valid attestation"):
|
||||
let attestation = mockAttestation(state.phase0Data.data)
|
||||
getStateField(state[], slot) += MIN_ATTESTATION_INCLUSION_DELAY
|
||||
|
||||
valid_attestation("Valid attestation from previous epoch"):
|
||||
nextSlot(state[])
|
||||
let attestation = mockAttestation(state.phase0Data.data)
|
||||
getStateField(state[], slot) = Slot(SLOTS_PER_EPOCH - 1)
|
||||
nextEpoch(state[])
|
||||
|
||||
# TODO - invalid attestations
|
||||
# - Empty aggregation bit
|
||||
# - Wrong end epoch
|
||||
# - Invalid signature
|
||||
# - Before inclusion delay
|
||||
# - past last inclusion slot
|
||||
# - before oldest known source epoch
|
||||
# - wrong shard
|
||||
# - invalid shard
|
||||
# - target epoch too old
|
||||
# - target epoch too far in the future
|
||||
# - source epoch in the future
|
||||
# - invalid current source root
|
||||
# - bad source root
|
||||
# - inconsistent custody bits length
|
||||
# - non-empty custody bits in phase 0
|
Loading…
Reference in New Issue