rm spec_block_processing/test_process_attestation (#3258)

This commit is contained in:
tersec 2022-01-08 09:07:44 +00:00 committed by GitHub
parent bac0eaa92e
commit 18d83e0ece
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 1 additions and 212 deletions

View File

@ -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

View File

@ -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):

View File

@ -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)

View File

@ -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