110 lines
3.3 KiB
Nim
110 lines
3.3 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
|
|
|
|
suite "Validator pool":
|
|
test "Doppelganger for genesis validator":
|
|
let
|
|
v = AttachedValidator(activationEpoch: FAR_FUTURE_EPOCH)
|
|
|
|
check:
|
|
not v.triggersDoppelganger(GENESIS_EPOCH)
|
|
|
|
v.updateValidator(ValidatorIndex(1), GENESIS_EPOCH)
|
|
|
|
check:
|
|
not v.triggersDoppelganger(GENESIS_EPOCH)
|
|
|
|
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())
|
|
|
|
v.updateValidator(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())
|
|
|
|
v.updateValidator(ValidatorIndex(5), now.epoch())
|
|
|
|
check:
|
|
# Activates in current epoch, shouldn't trigger
|
|
not v.triggersDoppelganger(now.epoch())
|
|
|
|
test "Doppelganger for validator that activates in previous epoch":
|
|
let
|
|
v = AttachedValidator(activationEpoch: FAR_FUTURE_EPOCH)
|
|
now = Epoch(10).start_slot()
|
|
|
|
v.updateValidator(ValidatorIndex(5), now.epoch() - 1)
|
|
|
|
check:
|
|
# Already activated, should trigger
|
|
v.triggersDoppelganger(now.epoch())
|
|
|
|
test "Doppelganger for validator that activates in future epoch":
|
|
let
|
|
v = AttachedValidator(activationEpoch: FAR_FUTURE_EPOCH)
|
|
now = Epoch(10).start_slot()
|
|
|
|
v.updateValidator(ValidatorIndex(5), now.epoch() + 1)
|
|
|
|
check:
|
|
# Activates in the future, should not be checked
|
|
not v.triggersDoppelganger(now.epoch())
|
|
|
|
test "Doppelganger for already active validator":
|
|
let
|
|
v = AttachedValidator(activationEpoch: FAR_FUTURE_EPOCH)
|
|
now = Epoch(10).start_slot()
|
|
|
|
v.updateValidator(ValidatorIndex(5), now.epoch() - 4)
|
|
|
|
check:
|
|
v.triggersDoppelganger(now.epoch)
|
|
|
|
v.updateDoppelganger(now.epoch())
|
|
|
|
check:
|
|
not v.triggersDoppelganger(now.epoch + 1)
|
|
|
|
test "Activation after check":
|
|
let
|
|
v = AttachedValidator(activationEpoch: FAR_FUTURE_EPOCH)
|
|
now = Epoch(10).start_slot()
|
|
|
|
v.updateDoppelganger(now.epoch())
|
|
|
|
check:
|
|
not v.triggersDoppelganger(now.epoch)
|
|
|
|
v.updateValidator(ValidatorIndex(5), now.epoch())
|
|
|
|
check: # already proven not to validate
|
|
not v.triggersDoppelganger(now.epoch)
|
|
|
|
test "Future activation after check":
|
|
let
|
|
v = AttachedValidator(activationEpoch: FAR_FUTURE_EPOCH)
|
|
now = Epoch(10).start_slot()
|
|
|
|
v.updateDoppelganger(now.epoch())
|
|
v.updateValidator(ValidatorIndex(5), now.epoch() + 1)
|
|
|
|
check: # doesn't trigger check just after activation
|
|
not v.triggersDoppelganger(now.epoch() + 1)
|