83 lines
2.9 KiB
Nim
83 lines
2.9 KiB
Nim
# beacon_chain
|
|
# Copyright (c) 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
|
|
unittest2,
|
|
../beacon_chain/validators/validator_pool
|
|
|
|
func makeValidatorAndIndex(
|
|
index: ValidatorIndex, activation_epoch: Epoch): Opt[ValidatorAndIndex] =
|
|
Opt.some ValidatorAndIndex(
|
|
index: index,
|
|
validator: Validator(activation_epoch: activation_epoch)
|
|
)
|
|
|
|
suite "Validator pool":
|
|
test "Doppelganger for genesis validator":
|
|
let
|
|
v = AttachedValidator(activationEpoch: FAR_FUTURE_EPOCH)
|
|
|
|
check:
|
|
not v.triggersDoppelganger(GENESIS_EPOCH) # no check
|
|
not v.doppelgangerReady(GENESIS_EPOCH.start_slot) # no activation
|
|
|
|
v.updateValidator(makeValidatorAndIndex(ValidatorIndex(1), GENESIS_EPOCH))
|
|
|
|
check:
|
|
not v.triggersDoppelganger(GENESIS_EPOCH) # no check
|
|
v.doppelgangerReady(GENESIS_EPOCH.start_slot) # ready in activation epoch
|
|
not v.doppelgangerReady((GENESIS_EPOCH + 1).start_slot) # old check
|
|
|
|
v.doppelgangerChecked(GENESIS_EPOCH)
|
|
|
|
check:
|
|
v.triggersDoppelganger(GENESIS_EPOCH) # checked, triggered
|
|
v.doppelgangerReady((GENESIS_EPOCH + 1).start_slot) # checked
|
|
v.doppelgangerReady((GENESIS_EPOCH + 2).start_slot) # 1 slot lag allowance
|
|
not v.doppelgangerReady((GENESIS_EPOCH + 2).start_slot + 1) # old check
|
|
|
|
test "Doppelganger for validator that activates in same epoch as check":
|
|
let
|
|
v = AttachedValidator(activationEpoch: FAR_FUTURE_EPOCH)
|
|
now = Epoch(10).start_slot()
|
|
|
|
check: # We don't know when validator activates so we wouldn't trigger
|
|
not v.triggersDoppelganger(GENESIS_EPOCH)
|
|
not v.triggersDoppelganger(now.epoch())
|
|
|
|
not v.doppelgangerReady(GENESIS_EPOCH.start_slot)
|
|
not v.doppelgangerReady(now)
|
|
|
|
v.updateValidator(makeValidatorAndIndex(ValidatorIndex(5), FAR_FUTURE_EPOCH))
|
|
|
|
check: # We still don't know when validator activates so we wouldn't trigger
|
|
not v.triggersDoppelganger(GENESIS_EPOCH)
|
|
not v.triggersDoppelganger(now.epoch())
|
|
|
|
not v.doppelgangerReady(GENESIS_EPOCH.start_slot)
|
|
not v.doppelgangerReady(now)
|
|
|
|
v.updateValidator(makeValidatorAndIndex(ValidatorIndex(5), now.epoch()))
|
|
|
|
check: # No check done yet
|
|
not v.triggersDoppelganger(GENESIS_EPOCH)
|
|
not v.triggersDoppelganger(now.epoch())
|
|
|
|
not v.doppelgangerReady(GENESIS_EPOCH.start_slot)
|
|
v.doppelgangerReady(now)
|
|
|
|
v.doppelgangerChecked(GENESIS_EPOCH)
|
|
|
|
check:
|
|
v.triggersDoppelganger(GENESIS_EPOCH)
|
|
not v.triggersDoppelganger(now.epoch())
|
|
|
|
not v.doppelgangerReady(GENESIS_EPOCH.start_slot)
|
|
v.doppelgangerReady(now)
|