From 8a7d74e6b2fa4c2d86d6965871a4d76556855d71 Mon Sep 17 00:00:00 2001 From: Dmitriy Ryajov Date: Mon, 23 Oct 2023 08:58:07 -0600 Subject: [PATCH] removing old por proofs implementation (#593) --- codex/storageproofs/por.nim | 4 - codex/storageproofs/por/por.nim | 482 ------------------ codex/storageproofs/por/serialization.nim | 3 - .../por/serialization/messages.nim | 185 ------- .../por/serialization/serialization.nim | 166 ------ codex/storageproofs/storageproofs.nim | 100 ---- codex/storageproofs/stpnetwork.nim | 106 ---- codex/storageproofs/stpproto.nim | 3 - codex/storageproofs/stpproto/messages.nim | 66 --- codex/storageproofs/stpstore.nim | 130 ----- tests/codex/storageproofs/testnetwork.nim | 117 ----- tests/codex/storageproofs/testpor.nim | 175 ------- tests/codex/storageproofs/teststpstore.nim | 84 --- tests/codex/teststorageproofs.nim | 5 - tests/testCodex.nim | 1 - 15 files changed, 1627 deletions(-) delete mode 100644 codex/storageproofs/por.nim delete mode 100644 codex/storageproofs/por/por.nim delete mode 100644 codex/storageproofs/por/serialization.nim delete mode 100644 codex/storageproofs/por/serialization/messages.nim delete mode 100644 codex/storageproofs/por/serialization/serialization.nim delete mode 100644 codex/storageproofs/storageproofs.nim delete mode 100644 codex/storageproofs/stpnetwork.nim delete mode 100644 codex/storageproofs/stpproto.nim delete mode 100644 codex/storageproofs/stpproto/messages.nim delete mode 100644 codex/storageproofs/stpstore.nim delete mode 100644 tests/codex/storageproofs/testnetwork.nim delete mode 100644 tests/codex/storageproofs/testpor.nim delete mode 100644 tests/codex/storageproofs/teststpstore.nim delete mode 100644 tests/codex/teststorageproofs.nim diff --git a/codex/storageproofs/por.nim b/codex/storageproofs/por.nim deleted file mode 100644 index 79ada5dd..00000000 --- a/codex/storageproofs/por.nim +++ /dev/null @@ -1,4 +0,0 @@ -import ./por/serialization -import ./por/por - -export por, serialization diff --git a/codex/storageproofs/por/por.nim b/codex/storageproofs/por/por.nim deleted file mode 100644 index a4ead3c3..00000000 --- a/codex/storageproofs/por/por.nim +++ /dev/null @@ -1,482 +0,0 @@ -## Nim-Codex -## Copyright (c) 2021 Status Research & Development GmbH -## Licensed under either of -## * Apache License, version 2.0, ([LICENSE-APACHE](LICENSE-APACHE)) -## * MIT license ([LICENSE-MIT](LICENSE-MIT)) -## at your option. -## This file may not be copied, modified, or distributed except according to -## those terms. - -# Implementation of the BLS-based public PoS scheme from -# Shacham H., Waters B., "Compact Proofs of Retrievability" -# using pairing over BLS12-381 ECC -# -# Notation from the paper -# In Z: -# - n: number of blocks -# - s: number of sectors per block -# -# In Z_p: modulo curve order -# - m_{ij}: sectors of the file i:0..n-1 j:0..s-1 -# - α: PoS secret key -# - name: random string -# - μ_j: part of proof, j:0..s-1 -# -# In G_1: multiplicative cyclic group -# - H: {0,1}∗ →G_1 : hash function -# - u_1,…,u_s ←R G_1 : random coefficients -# - σ_i: authenticators -# - σ: part of proof -# -# In G_2: multiplicative cyclic group -# - g: generator of G_2 -# - v ← g^α: PoS public key -# -# In G_T: -# - used only to calculate the two pairings during validation -# -# Implementation: -# Our implementation uses additive cyclic groups instead of the multiplicative -# cyclic group in the paper, thus changing the name of the group operation as in -# blscurve and blst. Thus, point multiplication becomes point addition, and scalar -# exponentiation becomes scalar multiplicaiton. -# -# Number of operations: -# The following table summarizes the number of operations in different phases -# using the following notation: -# - f: file size expressed in units of 31 bytes -# - n: number of blocks -# - s: number of sectors per block -# - q: number of query items -# -# Since f = n * s and s is a parameter of the scheme, it is better to express -# the cost as a function of f and s. This only matters for Setup, all other -# phases are independent of the file size assuming a given q. -# -# | | Setup | Challenge | Proof | Verify | -# |----------------|-----------|---------------|-----------|-----------|-----------| -# | G1 random | s = s | q | | | -# | G1 scalar mult | n * (s+1) = f * (1 + 1/s) | | q | q + s | -# | G1 add | n * s = f | | q-1 | q-1 + s-1 | -# | Hash to G1 | n = f / s | | | q | -# | Z_p mult | = | | s * q | | -# | Z_p add | = | | s * (q-1) | | -# | pairing | = | | | 2 | -# -# -# Storage and communication cost: -# The storage overhead for a file of f_b bytes is given by the n authenticators -# calculated in the setup phase. -# f_b = f * 31 = n * s * 31 -# Each authenticator is a point on G_1, which occupies 48 bytes in compressed form. -# Thus, the overall sorage size in bytes is: -# f_pos = fb + n * 48 = fb * (1 + (48/31) * (1/s)) -# -# Communicaiton cost in the Setup phase is simply related to the storage cost. -# The size of the challenge is -# q * (8 + 48) bytes -# The size of the proof is instead -# s * 32 + 48 bytes -import std/endians - -import pkg/chronos -import pkg/blscurve -import pkg/blscurve/blst/blst_abi - -import ../../rng -import ../../streams - -# sector size in bytes. Must be smaller than the subgroup order r -# which is 255 bits long for BLS12-381 -const - BytesPerSector* = 31 - - # length in bytes of the unique (random) name - Namelen = 512 - -type - # a single sector - ZChar* = array[BytesPerSector, byte] - - # secret key combining the metadata signing key and the POR generation key - SecretKey* = object - signkey*: blscurve.SecretKey - key*: blst_scalar - - # public key combining the metadata signing key and the POR validation key - PublicKey* = object - signkey*: blscurve.PublicKey - key*: blst_p2 - - # POR metadata (called "file tag t_0" in the original paper) - TauZero* = object - name*: array[Namelen, byte] - n*: int64 - u*: seq[blst_p1] - - # signed POR metadata (called "signed file tag t" in the original paper) - Tau* = object - t*: TauZero - signature*: array[96, byte] - - Proof* = object - mu*: seq[blst_scalar] - sigma*: blst_p1 - - # PoR query element - QElement* = object - i*: int64 - v*: blst_scalar - - PoR* = object - ssk*: SecretKey - spk*: PublicKey - tau*: Tau - authenticators*: seq[blst_p1] - -proc fromBytesBE(a: openArray[byte]): blst_scalar = - ## Convert data to blst native form - ## - - var b: array[32, byte] - doAssert(a.len <= b.len) - - let d = b.len - a.len - for i in 0.. postion - ## - - var res: ZChar - stream.setPos(((blockId * spb + sectorId) * ZChar.len).int) - discard await stream.readOnce(addr res[0], ZChar.len) - return res - -proc rndScalar(): blst_scalar = - ## Generate random scalar within the subroup order r - ## - - var scal : array[32, byte] - var scalar : blst_scalar - - while true: - for val in scal.mitems: - val = byte Rng.instance.rand(0xFF) - - scalar.blst_scalar_from_bendian(scal) - if blst_scalar_fr_check(scalar).bool: - break - - return scalar - -proc rndP2(): (blst_p2, blst_scalar) = - ## Generate random point on G2 - ## - - var - x : blst_p2 - x.blst_p2_from_affine(BLS12_381_G2) # init from generator - - let - scalar = rndScalar() - x.blst_p2_mult(x, scalar, 255) - - return (x, scalar) - -proc rndP1(): (blst_p1, blst_scalar) = - ## Generate random point on G1 - var - x : blst_p1 - x.blst_p1_from_affine(BLS12_381_G1) # init from generator - - let - scalar = rndScalar() - x.blst_p1_mult(x, scalar, 255) - - return (x, scalar) - -template posKeygen(): (blst_p2, blst_scalar) = - ## Generate POS key pair - ## - - rndP2() - -proc keyGen*(): (PublicKey, SecretKey) = - ## Generate key pair for signing metadata and for POS tags - ## - - var - pk: PublicKey - sk: SecretKey - ikm: array[32, byte] - - for b in ikm.mitems: - b = byte Rng.instance.rand(0xFF) - - doAssert ikm.keyGen(pk.signkey, sk.signkey) - - (pk.key, sk.key) = posKeygen() - return (pk, sk) - -proc sectorsCount(stream: SeekableStream, s: int64): int64 = - ## Calculate number of blocks for a file - ## - - let - size = stream.size() - n = ((size - 1) div (s * sizeof(ZChar))) + 1 - # debugEcho "File size=", size, " bytes", - # ", blocks=", n, - # ", sectors/block=", $s, - # ", sectorsize=", $sizeof(ZChar), " bytes" - - return n - -proc hashToG1[T: byte|char](msg: openArray[T]): blst_p1 = - ## Hash to curve with Dagger specific domain separation - ## - - const dst = "DAGGER-PROOF-OF-CONCEPT" - result.blst_hash_to_g1(msg, dst, aug = "") - -proc hashNameI(name: array[Namelen, byte], i: int64): blst_p1 = - ## Calculate unique filename and block index based hash - ## - - # # naive implementation, hashing a long string representation - # # such as "[255, 242, 23]1" - # return hashToG1($name & $i) - - # more compact and faster implementation - var namei: array[sizeof(name) + sizeof(int64), byte] - namei[0..sizeof(name)-1] = name - bigEndian64(addr(namei[sizeof(name)]), unsafeAddr(i)) - return hashToG1(namei) - -proc generateAuthenticatorOpt( - stream: SeekableStream, - ssk: SecretKey, - i: int64, - s: int64, - t: TauZero, - ubase: seq[blst_scalar]): Future[blst_p1] {.async.} = - ## Optimized implementation of authenticator generation - ## This implementation is reduces the number of scalar multiplications - ## from s+1 to 1+1 , using knowledge about the scalars (r_j) - ## used to generate u_j as u_j = g^{r_j} - ## - ## With the paper's multiplicative notation, we use: - ## (H(file||i)\cdot g^{\sum{j=0}^{s-1}{r_j \cdot m[i][j]}})^{\alpha} - ## - - var sum: blst_fr - var sums: blst_scalar - for j in 0.. G_T - ## - - var - aa: blst_p1_affine - bb: blst_p2_affine - l: blst_fp12 - - blst_p1_to_affine(aa, a) - blst_p2_to_affine(bb, b) - - blst_miller_loop(l, bb, aa) - blst_final_exp(result, l) - -proc verifyPairingsNaive(a1: blst_p1, a2: blst_p2, b1: blst_p1, b2: blst_p2) : bool = - let e1 = pairing(a1, a2) - let e2 = pairing(b1, b2) - return e1 == e2 - -proc verifyPairings(a1: blst_p1, a2: blst_p2, b1: blst_p1, b2: blst_p2) : bool = - ## Wrapper to select verify pairings implementation - ## - - verifyPairingsNaive(a1, a2, b1, b2) - #verifyPairingsNeg(a1, a2, b1, b2) - -proc verifyProof*( - self: PoR, - q: seq[QElement], - mus: seq[blst_scalar], - sigma: blst_p1): bool = - ## Verify a BLS proof given a query - ## - - # verify signature on Tau - var signature: blscurve.Signature - if not signature.fromBytes(self.tau.signature): - return false - - if not verify(self.spk.signkey, $self.tau.t, signature): - return false - - var first: blst_p1 - for qelem in q: - var prod: blst_p1 - prod.blst_p1_mult(hashNameI(self.tau.t.name, qelem.i), qelem.v, 255) - first.blst_p1_add_or_double(first, prod) - doAssert(blst_p1_on_curve(first).bool) - - let us = self.tau.t.u - var second: blst_p1 - for j in 0.. 0: - await self.tagsHandle(res.get) - except CatchableError as exc: - trace "Exception handling Storage Proofs message", exc = exc.msg - finally: - await conn.close() - - self.handler = handle - self.codec = Codec - -proc new*( - T: type StpNetwork, - switch: Switch, - discovery: Discovery -): StpNetwork = - ## create a new StpNetwork instance - let - self = StpNetwork( - switch: switch, - discovery: discovery) - - self.init() - self diff --git a/codex/storageproofs/stpproto.nim b/codex/storageproofs/stpproto.nim deleted file mode 100644 index 364582be..00000000 --- a/codex/storageproofs/stpproto.nim +++ /dev/null @@ -1,3 +0,0 @@ -import ./stpproto/messages - -export messages diff --git a/codex/storageproofs/stpproto/messages.nim b/codex/storageproofs/stpproto/messages.nim deleted file mode 100644 index d79b1cc6..00000000 --- a/codex/storageproofs/stpproto/messages.nim +++ /dev/null @@ -1,66 +0,0 @@ -## Nim-Codex -## Copyright (c) 2022 Status Research & Development GmbH -## Licensed under either of -## * Apache License, version 2.0, ([LICENSE-APACHE](LICENSE-APACHE)) -## * MIT license ([LICENSE-MIT](LICENSE-MIT)) -## at your option. -## This file may not be copied, modified, or distributed except according to -## those terms. - -import pkg/questionable/results -import pkg/libp2p/protobuf/minprotobuf - -type - Tag* = object - idx*: int64 - tag*: seq[byte] - - TagsMessage* = object - cid*: seq[byte] - tags*: seq[Tag] - -func write*(pb: var ProtoBuffer, field: int, value: Tag) = - var ipb = initProtoBuffer() - ipb.write(1, value.idx.uint64) - ipb.write(2, value.tag) - ipb.finish() - pb.write(field, ipb) - -func encode*(msg: TagsMessage): seq[byte] = - var ipb = initProtoBuffer() - ipb.write(1, msg.cid) - - for tag in msg.tags: - ipb.write(2, tag) - - ipb.finish() - ipb.buffer - -func decode*(_: type Tag, pb: ProtoBuffer): ProtoResult[Tag] = - var - value = Tag() - idx: uint64 - - discard ? pb.getField(1, idx) - value.idx = idx.int64 - - discard ? pb.getField(2, value.tag) - - ok(value) - -func decode*(_: type TagsMessage, msg: openArray[byte]): ProtoResult[TagsMessage] = - var - value = TagsMessage() - pb = initProtoBuffer(msg) - - discard ? pb.getField(1, value.cid) - - var - bytes: seq[seq[byte]] - - discard ? pb.getRepeatedField(2, bytes) - - for b in bytes: - value.tags.add(? Tag.decode(initProtoBuffer(b))) - - ok(value) diff --git a/codex/storageproofs/stpstore.nim b/codex/storageproofs/stpstore.nim deleted file mode 100644 index b5f979c3..00000000 --- a/codex/storageproofs/stpstore.nim +++ /dev/null @@ -1,130 +0,0 @@ -## Nim-Dagger -## Copyright (c) 2022 Status Research & Development GmbH -## Licensed under either of -## * Apache License, version 2.0, ([LICENSE-APACHE](LICENSE-APACHE)) -## * MIT license ([LICENSE-MIT](LICENSE-MIT)) -## at your option. -## This file may not be copied, modified, or distributed except according to -## those terms. - -import std/os -import std/strformat - -import pkg/libp2p -import pkg/chronos -import pkg/chronicles -import pkg/stew/io2 -import pkg/questionable -import pkg/questionable/results - -import ../errors -import ../formats - -import ./stpproto -import ./por - -type - StpStore* = object - authDir*: string - postfixLen*: int - -template stpPath*(self: StpStore, cid: Cid): string = - self.authDir / ($cid)[^self.postfixLen..^1] / $cid - -proc retrieve*( - self: StpStore, - cid: Cid -): Future[?!PorMessage] {.async.} = - ## Retrieve authenticators from data store - ## - - let path = self.stpPath(cid) / "por" - var data: seq[byte] - if ( - let res = io2.readFile(path, data); - res.isErr): - let error = io2.ioErrorMsg(res.error) - trace "Cannot retrieve storage proof data from fs", path , error - return failure("Cannot retrieve storage proof data from fs") - - return PorMessage.decode(data).mapFailure(CatchableError) - -proc store*( - self: StpStore, - por: PorMessage, - cid: Cid -): Future[?!void] {.async.} = - ## Persist storage proofs - ## - - let - dir = self.stpPath(cid) - - if io2.createPath(dir).isErr: - trace "Unable to create storage proofs prefix dir", dir - return failure(&"Unable to create storage proofs prefix dir ${dir}") - - let path = dir / "por" - if ( - let res = io2.writeFile(path, por.encode()); - res.isErr): - let error = io2.ioErrorMsg(res.error) - trace "Unable to store storage proofs", path, cid, error - return failure( - &"Unable to store storage proofs - path = ${path} cid = ${cid} error = ${error}") - - return success() - -proc retrieve*( - self: StpStore, - cid: Cid, - blocks: seq[int] -): Future[?!seq[Tag]] {.async.} = - var tags: seq[Tag] - for b in blocks: - var tag = Tag(idx: b) - let path = self.stpPath(cid) / $b - if ( - let res = io2.readFile(path, tag.tag); - res.isErr): - let error = io2.ioErrorMsg(res.error) - trace "Cannot retrieve tags from fs", path , error - return failure("Cannot retrieve tags from fs") - tags.add(tag) - - return tags.success - -proc store*( - self: StpStore, - tags: seq[Tag], - cid: Cid -): Future[?!void] {.async.} = - let - dir = self.stpPath(cid) - - if io2.createPath(dir).isErr: - trace "Unable to create storage proofs prefix dir", dir - return failure(&"Unable to create storage proofs prefix dir ${dir}") - - for t in tags: - let path = dir / $t.idx - if ( - let res = io2.writeFile(path, t.tag); - res.isErr): - let error = io2.ioErrorMsg(res.error) - trace "Unable to store tags", path, cid, error - return failure( - &"Unable to store tags - path = ${path} cid = ${cid} error = ${error}") - - return success() - -proc init*( - T: type StpStore, - authDir: string, - postfixLen: int = 2 -): StpStore = - ## Init StpStore - ## - StpStore( - authDir: authDir, - postfixLen: postfixLen) diff --git a/tests/codex/storageproofs/testnetwork.nim b/tests/codex/storageproofs/testnetwork.nim deleted file mode 100644 index 538cbfdf..00000000 --- a/tests/codex/storageproofs/testnetwork.nim +++ /dev/null @@ -1,117 +0,0 @@ -import std/sequtils - -import pkg/asynctest -import pkg/chronos -import pkg/libp2p/errors -import pkg/contractabi as ca - -import pkg/codex/rng -import pkg/codex/chunker -import pkg/codex/storageproofs -import pkg/codex/discovery -import pkg/codex/manifest -import pkg/codex/stores -import pkg/codex/storageproofs as st -import pkg/codex/blocktype as bt -import pkg/codex/streams - -import ../examples -import ../helpers - -const - BlockSize = 31'nb * 64 - DataSetSize = BlockSize * 100 - -asyncchecksuite "Storage Proofs Network": - let - hostAddr = ca.Address.example - blocks = toSeq([1, 5, 10, 14, 20, 12, 22]) # TODO: maybe make them random - - var - stpNetwork1: StpNetwork - stpNetwork2: StpNetwork - switch1: Switch - switch2: Switch - discovery1: MockDiscovery - discovery2: MockDiscovery - - chunker: RandomChunker - manifest: Manifest - store: BlockStore - ssk: st.SecretKey - spk: st.PublicKey - porMsg: PorMessage - cid: Cid - porStream: StoreStream - por: PoR - tags: seq[Tag] - - setup: - chunker = RandomChunker.new(Rng.instance(), size = DataSetSize.int, chunkSize = BlockSize) - store = CacheStore.new(cacheSize = DataSetSize, chunkSize = BlockSize) - manifest = Manifest.new(blockSize = BlockSize).tryGet() - (spk, ssk) = st.keyGen() - - while ( - let chunk = await chunker.getBytes(); - chunk.len > 0): - - let blk = bt.Block.new(chunk).tryGet() - manifest.add(blk.cid) - (await store.putBlock(blk)).tryGet() - - cid = manifest.cid.tryGet() - porStream = StoreStream.new(store, manifest) - por = await PoR.init( - porStream, - ssk, spk, - BlockSize.int) - - porMsg = por.toMessage() - tags = blocks.mapIt( - Tag(idx: it, tag: porMsg.authenticators[it])) - - switch1 = newStandardSwitch() - switch2 = newStandardSwitch() - - discovery1 = MockDiscovery.new() - discovery2 = MockDiscovery.new() - - stpNetwork1 = StpNetwork.new(switch1, discovery1) - stpNetwork2 = StpNetwork.new(switch2, discovery2) - - switch1.mount(stpNetwork1) - switch2.mount(stpNetwork2) - - await switch1.start() - await switch2.start() - - teardown: - await switch1.stop() - await switch2.stop() - await close(porStream) - - test "Should upload to host": - var - done = newFuture[void]() - - discovery1.findHostProvidersHandler = proc(d: MockDiscovery, host: ca.Address): - Future[seq[SignedPeerRecord]] {.async, gcsafe.} = - check hostAddr == host - return @[switch2.peerInfo.signedPeerRecord] - - proc tagsHandler(msg: TagsMessage) {.async, gcsafe.} = - check: - Cid.init(msg.cid).tryGet() == cid - msg.tags == tags - - done.complete() - - stpNetwork2.tagsHandle = tagsHandler - (await stpNetwork1.uploadTags( - cid, - blocks, - porMsg.authenticators, - hostAddr)).tryGet() - - await done.wait(1.seconds) diff --git a/tests/codex/storageproofs/testpor.nim b/tests/codex/storageproofs/testpor.nim deleted file mode 100644 index e0c8ff58..00000000 --- a/tests/codex/storageproofs/testpor.nim +++ /dev/null @@ -1,175 +0,0 @@ -import pkg/chronos -import pkg/asynctest - -import pkg/blscurve/blst/blst_abi - -import pkg/codex/streams -import pkg/codex/storageproofs as st -import pkg/codex/stores -import pkg/codex/manifest -import pkg/codex/chunker -import pkg/codex/rng -import pkg/codex/blocktype as bt - -import ../helpers - -const - BlockSize = 31'nb * 4 - SectorSize = 31'nb - SectorsPerBlock = BlockSize div SectorSize - DataSetSize = BlockSize * 100 - -asyncchecksuite "BLS PoR": - var - chunker: RandomChunker - manifest: Manifest - store: BlockStore - ssk: st.SecretKey - spk: st.PublicKey - porStream: StoreStream - proofStream: StoreStream - - setup: - chunker = RandomChunker.new(Rng.instance(), size = DataSetSize.int, chunkSize = BlockSize) - store = CacheStore.new(cacheSize = DataSetSize, chunkSize = BlockSize) - manifest = Manifest.new(blockSize = BlockSize).tryGet() - (spk, ssk) = st.keyGen() - - porStream = StoreStream.new(store, manifest) - proofStream = StoreStream.new(store, manifest) - - while ( - let chunk = await chunker.getBytes(); - chunk.len > 0): - - let blk = bt.Block.new(chunk).tryGet() - manifest.add(blk.cid) - (await store.putBlock(blk)).tryGet() - - teardown: - await close(porStream) - await close(proofStream) - - proc createPor(): Future[PoR] = - return PoR.init( - porStream, - ssk, - spk, - BlockSize.int) - - proc createProof(por: PoR, q: seq[QElement]): Future[Proof] = - return generateProof( - proofStream, - q, - por.authenticators, - SectorsPerBlock) - - test "Test PoR without corruption": - let - por = await createPor() - q = generateQuery(por.tau, 22) - proof = await createProof(por, q) - - check por.verifyProof(q, proof.mu, proof.sigma) - - test "Test PoR with corruption - query: 22, corrupted blocks: 300, bytes: 10": - let - por = await createPor() - pos = await store.corruptBlocks(manifest, 30, 10) - q = generateQuery(por.tau, 22) - proof = await createProof(por, q) - - check pos.len == 30 - check not por.verifyProof(q, proof.mu, proof.sigma) - -asyncchecksuite "Test Serialization": - var - chunker: RandomChunker - manifest: Manifest - store: BlockStore - ssk: st.SecretKey - spk: st.PublicKey - por: PoR - q: seq[QElement] - proof: Proof - porStream: StoreStream - proofStream: StoreStream - - setup: - chunker = RandomChunker.new(Rng.instance(), size = DataSetSize.int, chunkSize = BlockSize) - store = CacheStore.new(cacheSize = DataSetSize, chunkSize = BlockSize) - manifest = Manifest.new(blockSize = BlockSize).tryGet() - - while ( - let chunk = await chunker.getBytes(); - chunk.len > 0): - - let blk = bt.Block.new(chunk).tryGet() - manifest.add(blk.cid) - (await store.putBlock(blk)).tryGet() - - (spk, ssk) = st.keyGen() - porStream = StoreStream.new(store, manifest) - por = await PoR.init( - porStream, - ssk, - spk, - BlockSize.int) - q = generateQuery(por.tau, 22) - proofStream = StoreStream.new(store, manifest) - proof = await generateProof( - proofStream, - q, - por.authenticators, - SectorsPerBlock) - - teardown: - await close(porStream) - await close(proofStream) - - test "Serialize Public Key": - var - spkMessage = spk.toMessage() - - check: - spk.signkey == spkMessage.fromMessage().tryGet().signkey - spk.key.blst_p2_is_equal(spkMessage.fromMessage().tryGet().key).bool - - test "Serialize TauZero": - var - tauZeroMessage = por.tau.t.toMessage() - tauZero = tauZeroMessage.fromMessage().tryGet() - - check: - por.tau.t.name == tauZero.name - por.tau.t.n == tauZero.n - - for i in 0.. 0): - - let blk = bt.Block.new(chunk).tryGet() - manifest.add(blk.cid) - (await store.putBlock(blk)).tryGet() - - cid = manifest.cid.tryGet() - porStream = StoreStream.new(store, manifest) - por = await PoR.init( - porStream, - ssk, spk, - BlockSize.int) - - porMsg = por.toMessage() - tags = blocks.mapIt( - Tag(idx: it, tag: porMsg.authenticators[it]) ) - - repoDir = getAppDir() / "stp" - createDir(repoDir) - stpstore = st.StpStore.init(repoDir) - - teardown: - await close(porStream) - removeDir(repoDir) - - test "Should store Storage Proofs": - check (await stpstore.store(por.toMessage(), cid)).isOk - check fileExists(stpstore.stpPath(cid) / "por") - - test "Should retrieve Storage Proofs": - discard await stpstore.store(por.toMessage(), cid) - check (await stpstore.retrieve(cid)).tryGet() == porMsg - - test "Should store tags": - check (await stpstore.store(tags, cid)).isOk - for t in tags: - check fileExists(stpstore.stpPath(cid) / $t.idx ) - - test "Should retrieve tags": - discard await stpstore.store(tags, cid) - check (await stpstore.retrieve(cid, blocks)).tryGet() == tags diff --git a/tests/codex/teststorageproofs.nim b/tests/codex/teststorageproofs.nim deleted file mode 100644 index e90a8c0b..00000000 --- a/tests/codex/teststorageproofs.nim +++ /dev/null @@ -1,5 +0,0 @@ -import ./storageproofs/teststpstore -import ./storageproofs/testpor -import ./storageproofs/testnetwork - -{.warning[UnusedImport]: off.} diff --git a/tests/testCodex.nim b/tests/testCodex.nim index 65db04d6..db907684 100644 --- a/tests/testCodex.nim +++ b/tests/testCodex.nim @@ -1,6 +1,5 @@ import ./codex/teststores import ./codex/testblockexchange -import ./codex/teststorageproofs import ./codex/testasyncheapqueue import ./codex/testchunking import ./codex/testmanifest