private static AttestationData BuildAttestationData(IServiceProvider testServiceProvider, BeaconState state, Slot slot, CommitteeIndex index) { BeaconChainUtility beaconChainUtility = testServiceProvider.GetService <BeaconChainUtility>(); BeaconStateAccessor beaconStateAccessor = testServiceProvider.GetService <BeaconStateAccessor>(); if (state.Slot > slot) { throw new ArgumentOutOfRangeException(nameof(slot), slot, $"Slot cannot be greater than state slot {state.Slot}."); } Root blockRoot; if (slot == state.Slot) { BeaconBlock nextBlock = TestBlock.BuildEmptyBlockForNextSlot(testServiceProvider, state, BlsSignature.Zero); blockRoot = nextBlock.ParentRoot; } else { blockRoot = beaconStateAccessor.GetBlockRootAtSlot(state, slot); } Root epochBoundaryRoot; Epoch currentEpoch = beaconStateAccessor.GetCurrentEpoch(state); Slot currentEpochStartSlot = beaconChainUtility.ComputeStartSlotOfEpoch(currentEpoch); if (slot < currentEpochStartSlot) { Epoch previousEpoch = beaconStateAccessor.GetPreviousEpoch(state); epochBoundaryRoot = beaconStateAccessor.GetBlockRoot(state, previousEpoch); } else if (slot == currentEpochStartSlot) { epochBoundaryRoot = blockRoot; } else { epochBoundaryRoot = beaconStateAccessor.GetBlockRoot(state, currentEpoch); } Epoch sourceEpoch; Root 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(); //} Epoch slotEpoch = beaconChainUtility.ComputeEpochAtSlot(slot); AttestationData attestationData = new AttestationData( slot, index, blockRoot, new Checkpoint(sourceEpoch, sourceRoot), new Checkpoint(slotEpoch, epochBoundaryRoot)); return(attestationData); }