import ../contracts/requests import ../blocktype as bt import ../merkletree import ../manifest import ../stores/blockstore import std/bitops import std/sugar import pkg/chronicles import pkg/chronos import pkg/questionable import pkg/questionable/results import pkg/constantine/math/arithmetic import pkg/poseidon2/types import pkg/poseidon2 import misc import slotblocks import types # Index naming convention: # "Index" => The index of an ElementType within a ContainerType. # Some examples: # SlotBlockIndex => The index of a Block within a Slot. # DatasetBlockIndex => The index of a Block within a Dataset. logScope: topics = "codex datasampler" type DataSampler* = ref object of RootObj slot: Slot blockStore: BlockStore slotBlocks: SlotBlocks # The following data is invariant over time for a given slot: datasetRoot: FieldElement slotRootHash: FieldElement slotPoseidonTree: MerkleTree datasetToSlotProof: MerkleProof blockSize: uint64 numberOfCellsInSlot: uint64 datasetSlotIndex: uint64 numberOfCellsPerBlock: uint64 proc getNumberOfCellsInSlot*(slot: Slot): uint64 = (slot.request.ask.slotSize.truncate(uint64) div CellSize) proc new*( T: type DataSampler, slot: Slot, blockStore: BlockStore, datasetRoot: FieldElement, slotPoseidonTree: MerkleTree, datasetToSlotProof: MerkleProof ): Future[?!DataSampler] {.async.} = # Create a DataSampler for a slot. # A DataSampler can create the input required for the proving circuit. without slotBlocks =? await SlotBlocks.new(slot, blockStore), err: error "Failed to create SlotBlocks object for slot" return failure(err) let numberOfCellsInSlot = getNumberOfCellsInSlot(slot) blockSize = slotBlocks.manifest.blockSize.uint64 success(DataSampler( slot: slot, blockStore: blockStore, slotBlocks: slotBlocks, datasetRoot: datasetRoot, slotRootHash: toF(1234), # TODO - when slotPoseidonTree is a poseidon tree, its root should be a FieldElement. slotPoseidonTree: slotPoseidonTree, datasetToSlotProof: datasetToSlotProof, blockSize: blockSize, numberOfCellsInSlot: numberOfCellsInSlot, datasetSlotIndex: slot.slotIndex.truncate(uint64), numberOfCellsPerBlock: blockSize div CellSize )) func extractLowBits*[n: static int](A: BigInt[n], k: int): uint64 = assert(k > 0 and k <= 64) var r: uint64 = 0 for i in 0..