@lodestar/state-transition
Version:
Beacon Chain state transition function and utils
25 lines • 1.43 kB
JavaScript
import { DOMAIN_BEACON_PROPOSER } from "@lodestar/params";
import { ssz } from "@lodestar/types";
import { SignatureSetType, computeSigningRoot } from "../util/index.js";
/**
* Extract signatures to allow validating all block signatures at once
*/
export function getProposerSlashingSignatureSets(state, proposerSlashing) {
const { epochCtx } = state;
const pubkey = epochCtx.index2pubkey[proposerSlashing.signedHeader1.message.proposerIndex];
// In state transition, ProposerSlashing headers are only partially validated. Their slot could be higher than the
// clock and the slashing would still be valid. Must use bigint variants to hash correctly to all possible values
return [proposerSlashing.signedHeader1, proposerSlashing.signedHeader2].map((signedHeader) => {
const domain = state.config.getDomain(state.slot, DOMAIN_BEACON_PROPOSER, Number(signedHeader.message.slot));
return {
type: SignatureSetType.single,
pubkey,
signingRoot: computeSigningRoot(ssz.phase0.BeaconBlockHeaderBigint, signedHeader.message, domain),
signature: signedHeader.signature,
};
});
}
export function getProposerSlashingsSignatureSets(state, signedBlock) {
return signedBlock.message.body.proposerSlashings.flatMap((proposerSlashing) => getProposerSlashingSignatureSets(state, proposerSlashing));
}
//# sourceMappingURL=proposerSlashings.js.map