public static void AddAttestationsToState(IServiceProvider testServiceProvider, BeaconState state, IEnumerable <Attestation> attestations, Slot slot) { var beaconStateTransition = testServiceProvider.GetService <BeaconStateTransition>(); var block = TestBlock.BuildEmptyBlockForNextSlot(testServiceProvider, state, false); block.SetSlot(slot); foreach (var attestation in attestations) { block.Body.AddAttestations(attestation); } beaconStateTransition.ProcessSlots(state, block.Slot); TestBlock.SignBlock(testServiceProvider, state, block, ValidatorIndex.None); beaconStateTransition.StateTransition(state, block, validateStateRoot: false); }
/// <summary> /// State transition via the provided ``block`` /// then package the block with the state root and signature. /// </summary> public static void StateTransitionAndSignBlock(IServiceProvider testServiceProvider, BeaconState state, BeaconBlock block) { var miscellaneousParameters = testServiceProvider.GetService <IOptions <MiscellaneousParameters> >().Value; var timeParameters = testServiceProvider.GetService <IOptions <TimeParameters> >().Value; var stateListLengths = testServiceProvider.GetService <IOptions <StateListLengths> >().Value; var maxOperationsPerBlock = testServiceProvider.GetService <IOptions <MaxOperationsPerBlock> >().Value; var beaconStateTransition = testServiceProvider.GetService <BeaconStateTransition>(); beaconStateTransition.StateTransition(state, block, validateStateRoot: false); var stateRoot = state.HashTreeRoot(miscellaneousParameters, timeParameters, stateListLengths, maxOperationsPerBlock); block.SetStateRoot(stateRoot); TestBlock.SignBlock(testServiceProvider, state, block, ValidatorIndex.None); }
private static AttestationData BuildAttestationData(IServiceProvider testServiceProvider, BeaconState state, Slot slot, CommitteeIndex index) { var beaconChainUtility = testServiceProvider.GetService <BeaconChainUtility>(); var beaconStateAccessor = testServiceProvider.GetService <BeaconStateAccessor>(); if (state.Slot > slot) { throw new ArgumentOutOfRangeException(nameof(slot), slot, $"Slot cannot be greater than state slot {state.Slot}."); } Hash32 blockRoot; if (slot == state.Slot) { var nextBlock = TestBlock.BuildEmptyBlockForNextSlot(testServiceProvider, state, false); blockRoot = nextBlock.ParentRoot; } else { blockRoot = beaconStateAccessor.GetBlockRootAtSlot(state, slot); } Hash32 epochBoundaryRoot; var currentEpoch = beaconStateAccessor.GetCurrentEpoch(state); var currentEpochStartSlot = beaconChainUtility.ComputeStartSlotOfEpoch(currentEpoch); if (slot < currentEpochStartSlot) { var previousEpoch = beaconStateAccessor.GetPreviousEpoch(state); epochBoundaryRoot = beaconStateAccessor.GetBlockRoot(state, previousEpoch); } else if (slot == currentEpochStartSlot) { epochBoundaryRoot = blockRoot; } else { epochBoundaryRoot = beaconStateAccessor.GetBlockRoot(state, currentEpoch); } Epoch sourceEpoch; Hash32 sourceRoot; if (slot < currentEpochStartSlot) { sourceEpoch = state.PreviousJustifiedCheckpoint.Epoch; sourceRoot = state.PreviousJustifiedCheckpoint.Root; } else { sourceEpoch = state.CurrentJustifiedCheckpoint.Epoch; sourceRoot = state.CurrentJustifiedCheckpoint.Root; } //Crosslink parentCrosslink; //if (epochOfSlot == currentEpoch) //{ // parentCrosslink = state.CurrentCrosslinks[(int)(ulong)shard]; //} //else //{ // throw new NotImplementedException(); //} var slotEpoch = beaconChainUtility.ComputeEpochAtSlot(slot); var attestationData = new AttestationData( slot, index, blockRoot, new Checkpoint(sourceEpoch, sourceRoot), new Checkpoint(slotEpoch, epochBoundaryRoot)); return(attestationData); }