mirror of
https://github.com/codex-storage/nim-codex.git
synced 2025-02-02 08:05:15 +00:00
89 lines
2.6 KiB
Nim
89 lines
2.6 KiB
Nim
import std/sequtils
|
|
import std/sugar
|
|
|
|
import ../../asynctest
|
|
|
|
import pkg/chronos
|
|
import pkg/libp2p/cid
|
|
import pkg/datastore
|
|
|
|
import pkg/codex/merkletree
|
|
import pkg/codex/rng
|
|
import pkg/codex/manifest
|
|
import pkg/codex/chunker
|
|
import pkg/codex/blocktype as bt
|
|
import pkg/codex/slots
|
|
import pkg/codex/stores
|
|
|
|
import ./helpers
|
|
import ../helpers
|
|
import ./backends/helpers
|
|
|
|
suite "Test Prover":
|
|
let
|
|
blockSize = NBytes 1024
|
|
cellSize = NBytes 64
|
|
ecK = 3
|
|
ecM = 2
|
|
|
|
numSlots = ecK + ecM
|
|
numDatasetBlocks = 100
|
|
numTotalBlocks = calcEcBlocksCount(numDatasetBlocks, ecK, ecM) # total number of blocks in the dataset after
|
|
# EC (should will match number of slots)
|
|
originalDatasetSize = numDatasetBlocks * blockSize.int
|
|
totalDatasetSize = numTotalBlocks * blockSize.int
|
|
|
|
var
|
|
datasetBlocks: seq[bt.Block]
|
|
store: BlockStore
|
|
chunker: Chunker
|
|
verifiableManifest: Manifest
|
|
sampler: Poseidon2Sampler
|
|
|
|
setup:
|
|
let
|
|
repoDs = SQLiteDatastore.new(Memory).tryGet()
|
|
metaDs = SQLiteDatastore.new(Memory).tryGet()
|
|
|
|
store = RepoStore.new(repoDs, metaDs)
|
|
chunker = RandomChunker.new(Rng.instance(), size = totalDatasetSize, chunkSize = blockSize)
|
|
datasetBlocks = await chunker.createBlocks(store)
|
|
|
|
let
|
|
(manifest, protectedManifest) =
|
|
await createProtectedManifest(
|
|
datasetBlocks,
|
|
store,
|
|
numDatasetBlocks,
|
|
ecK, ecM,
|
|
blockSize,
|
|
originalDatasetSize,
|
|
totalDatasetSize)
|
|
|
|
builder = Poseidon2Builder.new(store, protectedManifest, cellSize = cellSize).tryGet
|
|
|
|
# build the slots
|
|
verifiableManifest = (await builder.buildManifest()).tryGet
|
|
|
|
test "Should sample and prove a slot":
|
|
let
|
|
r1cs = "tests/circuits/fixtures/proof_main.r1cs"
|
|
wasm = "tests/circuits/fixtures/proof_main.wasm"
|
|
|
|
circomBackend = CircomCompat.init(r1cs, wasm)
|
|
prover = Prover.new(store, circomBackend)
|
|
challenge = 12345.toF.toBytes.toArray32
|
|
proof = (await prover.prove(1, verifiableManifest, 5, challenge)).tryGet
|
|
key = circomBackend.getVerifyingKey().tryGet
|
|
builder = Poseidon2Builder.new(store, verifiableManifest).tryGet
|
|
sampler = Poseidon2Sampler.new(1, store, builder).tryGet
|
|
proofInput = (await sampler.getProofInput(challenge, 5)).tryGet
|
|
inputs = toCircomInputs(PublicInputs(
|
|
slotIndex: proofInput.slotIndex.toF,
|
|
datasetRoot: proofInput.verifyRoot,
|
|
entropy: proofInput.entropy
|
|
))
|
|
|
|
check:
|
|
(await prover.verify(proof, inputs, key[])).tryGet
|