capella validator withdrawal credentials aren't immutable (#4455)
This commit is contained in:
parent
9e699fd2fc
commit
45654984a9
|
@ -509,8 +509,8 @@ proc new*(T: type BeaconChainDB,
|
|||
kvStore db.openKvStore("state_no_validators2").expectDb(),
|
||||
kvStore db.openKvStore("altair_state_no_validators").expectDb(),
|
||||
kvStore db.openKvStore("bellatrix_state_no_validators").expectDb(),
|
||||
kvStore db.openKvStore("capella_state_no_validators").expectDb(),
|
||||
kvStore db.openKvStore("eip4844_state_no_validators").expectDb()]
|
||||
kvStore db.openKvStore("capella_state_no_validator_pubkeys").expectDb(),
|
||||
kvStore db.openKvStore("eip4844_state_no_validator_pubkeys").expectDb()]
|
||||
|
||||
stateDiffs = kvStore db.openKvStore("state_diffs").expectDb()
|
||||
summaries = kvStore db.openKvStore("beacon_block_summaries", true).expectDb()
|
||||
|
@ -1114,8 +1114,45 @@ proc getStateOnlyMutableValidators(
|
|||
proc getStateOnlyMutableValidators(
|
||||
immutableValidators: openArray[ImmutableValidatorData2],
|
||||
store: KvStoreRef, key: openArray[byte],
|
||||
output: var (bellatrix.BeaconState | capella.BeaconState |
|
||||
eip4844.BeaconState),
|
||||
output: var bellatrix.BeaconState, rollback: RollbackProc): bool =
|
||||
## Load state into `output` - BeaconState is large so we want to avoid
|
||||
## re-allocating it if possible
|
||||
## Return `true` iff the entry was found in the database and `output` was
|
||||
## overwritten.
|
||||
## Rollback will be called only if output was partially written - if it was
|
||||
## not found at all, rollback will not be called
|
||||
# TODO rollback is needed to deal with bug - use `noRollback` to ignore:
|
||||
# https://github.com/nim-lang/Nim/issues/14126
|
||||
# TODO RVO is inefficient for large objects:
|
||||
# https://github.com/nim-lang/Nim/issues/13879
|
||||
|
||||
case store.getSZSSZ(key, toBeaconStateNoImmutableValidators(output))
|
||||
of GetResult.found:
|
||||
let numValidators = output.validators.len
|
||||
doAssert immutableValidators.len >= numValidators
|
||||
|
||||
for i in 0 ..< numValidators:
|
||||
# Bypass hash cache invalidation
|
||||
let dstValidator = addr output.validators.data[i]
|
||||
|
||||
assign(dstValidator.pubkey, immutableValidators[i].pubkey.toPubKey())
|
||||
assign(
|
||||
dstValidator.withdrawal_credentials,
|
||||
immutableValidators[i].withdrawal_credentials)
|
||||
|
||||
output.validators.resetCache()
|
||||
|
||||
true
|
||||
of GetResult.notFound:
|
||||
false
|
||||
of GetResult.corrupted:
|
||||
rollback()
|
||||
false
|
||||
|
||||
proc getStateOnlyMutableValidators(
|
||||
immutableValidators: openArray[ImmutableValidatorData2],
|
||||
store: KvStoreRef, key: openArray[byte],
|
||||
output: var (capella.BeaconState | eip4844.BeaconState),
|
||||
rollback: RollbackProc): bool =
|
||||
## Load state into `output` - BeaconState is large so we want to avoid
|
||||
## re-allocating it if possible
|
||||
|
@ -1134,16 +1171,9 @@ proc getStateOnlyMutableValidators(
|
|||
doAssert immutableValidators.len >= numValidators
|
||||
|
||||
for i in 0 ..< numValidators:
|
||||
let
|
||||
# Bypass hash cache invalidation
|
||||
dstValidator = addr output.validators.data[i]
|
||||
|
||||
assign(
|
||||
dstValidator.pubkey,
|
||||
immutableValidators[i].pubkey.toPubKey())
|
||||
assign(
|
||||
dstValidator.withdrawal_credentials,
|
||||
immutableValidators[i].withdrawal_credentials)
|
||||
let dstValidator = addr output.validators.data[i]
|
||||
assign(dstValidator.pubkey, immutableValidators[i].pubkey.toPubKey())
|
||||
|
||||
output.validators.resetCache()
|
||||
|
||||
|
|
|
@ -214,7 +214,8 @@ type
|
|||
eth1_deposit_index*: uint64
|
||||
|
||||
# Registry
|
||||
validators*: HashList[ValidatorStatus, Limit VALIDATOR_REGISTRY_LIMIT]
|
||||
validators*:
|
||||
HashList[ValidatorStatusCapella, Limit VALIDATOR_REGISTRY_LIMIT]
|
||||
balances*: HashList[Gwei, Limit VALIDATOR_REGISTRY_LIMIT]
|
||||
|
||||
# Randomness
|
||||
|
@ -279,7 +280,8 @@ type
|
|||
eth1_deposit_index*: uint64
|
||||
|
||||
# Registry
|
||||
validators*: HashList[ValidatorStatus, Limit VALIDATOR_REGISTRY_LIMIT]
|
||||
validators*:
|
||||
HashList[ValidatorStatusCapella, Limit VALIDATOR_REGISTRY_LIMIT]
|
||||
balances*: HashList[Gwei, Limit VALIDATOR_REGISTRY_LIMIT]
|
||||
|
||||
# Randomness
|
||||
|
|
|
@ -443,6 +443,32 @@ type
|
|||
withdrawable_epoch*: Epoch
|
||||
## When validator can withdraw or transfer funds
|
||||
|
||||
# https://github.com/ethereum/consensus-specs/blob/v1.3.0-alpha.2/specs/phase0/beacon-chain.md#validator
|
||||
ValidatorStatusCapella* = object
|
||||
# This is a validator without the expensive, immutable, append-only parts
|
||||
# serialized. They're represented in memory to allow in-place SSZ reading
|
||||
# and writing compatibly with the full Validator object.
|
||||
|
||||
pubkey* {.dontSerialize.}: ValidatorPubKey
|
||||
|
||||
withdrawal_credentials*: Eth2Digest
|
||||
## Commitment to pubkey for withdrawals and transfers
|
||||
|
||||
effective_balance*: Gwei
|
||||
## Balance at stake
|
||||
|
||||
slashed*: bool
|
||||
|
||||
# Status epochs
|
||||
activation_eligibility_epoch*: Epoch
|
||||
## When criteria for activation were met
|
||||
|
||||
activation_epoch*: Epoch
|
||||
exit_epoch*: Epoch
|
||||
|
||||
withdrawable_epoch*: Epoch
|
||||
## When validator can withdraw or transfer funds
|
||||
|
||||
# https://github.com/ethereum/consensus-specs/blob/v1.3.0-alpha.2/specs/phase0/p2p-interface.md#eth2-field
|
||||
ENRForkID* = object
|
||||
fork_digest*: ForkDigest
|
||||
|
|
Loading…
Reference in New Issue