@lodestar/beacon-node
Version:
A Typescript implementation of the beacon chain
51 lines • 2.34 kB
JavaScript
import { Signature } from "@chainsafe/blst";
import { BLS_WITHDRAWAL_PREFIX } from "@lodestar/params";
/**
* Prune a Map indexed by slot to keep the most recent slots, up to `slotsRetained`
*/
export function pruneBySlot(map, slot, slotsRetained) {
const lowestPermissibleSlot = Math.max(slot - slotsRetained, 0);
// No need to prune if the lowest permissible slot has not changed and the queue length is less than the maximum
if (map.size <= slotsRetained) {
return lowestPermissibleSlot;
}
// Remove the oldest slots to keep a max of `slotsRetained` slots
const slots = Array.from(map.keys());
const slotsToDelete = slots.sort((a, b) => b - a).slice(slotsRetained);
for (const slot of slotsToDelete) {
map.delete(slot);
}
return lowestPermissibleSlot;
}
/**
* De-serialize bytes into Signature.
* No need to verify Signature is valid, already run sig-verify = false
*/
export function signatureFromBytesNoCheck(signature) {
return Signature.fromBytes(signature);
}
/**
* Ensures that a SignedBLSToExecutionChange object is _still_ valid for block inclusion. An object valid for the pool,
* can become invalid for certain forks.
*/
export function isValidBlsToExecutionChangeForBlockInclusion(state, signedBLSToExecutionChange) {
// For each condition from https://github.com/ethereum/consensus-specs/blob/dev/specs/capella/beacon-chain.md#new-process_bls_to_execution_change
//
// 1. assert address_change.validator_index < len(state.validators):
// If valid before will always be valid in the future, no need to check
//
// 2. assert validator.withdrawal_credentials[:1] == BLS_WITHDRAWAL_PREFIX:
// Must be checked again, since it can already be changed by now.
const validator = state.validators.getReadonly(signedBLSToExecutionChange.message.validatorIndex);
const { withdrawalCredentials } = validator;
if (withdrawalCredentials[0] !== BLS_WITHDRAWAL_PREFIX) {
return false;
}
// 3. assert validator.withdrawal_credentials[1:] == hash(address_change.from_bls_pubkey)[1:]:
// If valid before will always be valid in the future, no need to check
return true;
}
export function isElectraAggregate(aggregate) {
return aggregate.committeeBits !== undefined;
}
//# sourceMappingURL=utils.js.map