mirror of
https://github.com/status-im/nim-dagger.git
synced 2025-01-10 06:36:06 +00:00
52c5578c46
* rework merkle tree support * deps * rename merkletree -> codexmerkletree * treed and proof encoding/decoding * small change to invoke proof verification * rename merkletree to codexmerkletree * style * adding codex merkle and coders tests * fixup imports * remove new codecs for now * bump deps * adding trace statement * properly serde of manifest block codecs * use default hash codec * add more trace logging to aid debugging * misc * remove double import * revert un-needded change * proof size changed * bump poseidon2 * add from nodes test * shorte file names * remove upraises * wip poseidon tree * adjust file names * misc * shorten file names * fix bad `elements` iter * don't do asserts * add fromNodes and converters * root and getProof now return result * add poseidon2 tree tests * root now returns result * misc * had to make merkletree a ref, because nim blows up otherwise * root returns a result * root returns a result * import poseidon tests * bump * merkle poseidon2 digest * misc * add merkle digest tests * bump * don't use checksuite * Update tests/codex/merkletree/generictreetests.nim Co-authored-by: markspanbroek <mark@spanbroek.net> Signed-off-by: Dmitriy Ryajov <dryajov@gmail.com> * Update codex/merkletree/merkletree.nim Co-authored-by: markspanbroek <mark@spanbroek.net> Signed-off-by: Dmitriy Ryajov <dryajov@gmail.com> * Update codex/merkletree/merkletree.nim Co-authored-by: markspanbroek <mark@spanbroek.net> Signed-off-by: Dmitriy Ryajov <dryajov@gmail.com> * Update tests/codex/merkletree/generictreetests.nim Co-authored-by: markspanbroek <mark@spanbroek.net> Signed-off-by: Dmitriy Ryajov <dryajov@gmail.com> * missing return * make toBool private (it's still needed otherwise comparison won't work) * added `digestTree` that returns a tree and `digest` for root * test against both poseidon trees - codex and poseidon2 * shorten merkle tree names * don't compare trees - it's going to be too slow * move comparison to mekrle helper * remove merkle utils --------- Signed-off-by: Dmitriy Ryajov <dryajov@gmail.com> Co-authored-by: markspanbroek <mark@spanbroek.net>
156 lines
4.3 KiB
Nim
156 lines
4.3 KiB
Nim
import std/sequtils
|
|
import std/strutils
|
|
import std/options
|
|
|
|
import pkg/chronos
|
|
import pkg/asynctest
|
|
import pkg/libp2p/multicodec
|
|
import pkg/stew/byteutils
|
|
import pkg/questionable
|
|
import pkg/questionable/results
|
|
import pkg/codex/stores/cachestore
|
|
import pkg/codex/chunker
|
|
import pkg/codex/manifest
|
|
import pkg/codex/merkletree
|
|
import pkg/codex/utils
|
|
|
|
import ../helpers
|
|
|
|
type
|
|
StoreProvider* = proc(): BlockStore {.gcsafe.}
|
|
Before* = proc(): Future[void] {.gcsafe.}
|
|
After* = proc(): Future[void] {.gcsafe.}
|
|
|
|
proc commonBlockStoreTests*(name: string,
|
|
provider: StoreProvider,
|
|
before: Before = nil,
|
|
after: After = nil) =
|
|
|
|
asyncchecksuite name & " Store Common":
|
|
var
|
|
newBlock, newBlock1, newBlock2, newBlock3: Block
|
|
manifest: Manifest
|
|
tree: CodexTree
|
|
store: BlockStore
|
|
|
|
setup:
|
|
newBlock = Block.new("New Kids on the Block".toBytes()).tryGet()
|
|
newBlock1 = Block.new("1".repeat(100).toBytes()).tryGet()
|
|
newBlock2 = Block.new("2".repeat(100).toBytes()).tryGet()
|
|
newBlock3 = Block.new("3".repeat(100).toBytes()).tryGet()
|
|
|
|
(manifest, tree) = makeManifestAndTree(@[newBlock, newBlock1, newBlock2, newBlock3]).tryGet()
|
|
|
|
if not isNil(before):
|
|
await before()
|
|
|
|
store = provider()
|
|
|
|
teardown:
|
|
await store.close()
|
|
|
|
if not isNil(after):
|
|
await after()
|
|
|
|
test "putBlock":
|
|
(await store.putBlock(newBlock1)).tryGet()
|
|
check (await store.hasBlock(newBlock1.cid)).tryGet()
|
|
|
|
test "getBlock":
|
|
(await store.putBlock(newBlock)).tryGet()
|
|
let blk = await store.getBlock(newBlock.cid)
|
|
check blk.tryGet() == newBlock
|
|
|
|
test "fail getBlock":
|
|
expect BlockNotFoundError:
|
|
discard (await store.getBlock(newBlock.cid)).tryGet()
|
|
|
|
test "hasBlock":
|
|
(await store.putBlock(newBlock)).tryGet()
|
|
|
|
check:
|
|
(await store.hasBlock(newBlock.cid)).tryGet()
|
|
await newBlock.cid in store
|
|
|
|
test "fail hasBlock":
|
|
check:
|
|
not (await store.hasBlock(newBlock.cid)).tryGet()
|
|
not (await newBlock.cid in store)
|
|
|
|
test "delBlock":
|
|
(await store.putBlock(newBlock1)).tryGet()
|
|
check (await store.hasBlock(newBlock1.cid)).tryGet()
|
|
|
|
(await store.delBlock(newBlock1.cid)).tryGet()
|
|
|
|
check not (await store.hasBlock(newBlock1.cid)).tryGet()
|
|
|
|
test "listBlocks Blocks":
|
|
let
|
|
blocks = @[newBlock1, newBlock2, newBlock3]
|
|
|
|
putHandles = await allFinished(
|
|
blocks.mapIt( store.putBlock( it ) ))
|
|
|
|
for handle in putHandles:
|
|
check not handle.failed
|
|
check handle.read.isOk
|
|
|
|
let
|
|
cids = (await store.listBlocks(blockType = BlockType.Block)).tryGet()
|
|
|
|
var count = 0
|
|
for c in cids:
|
|
if cid =? await c:
|
|
check (await store.hasBlock(cid)).tryGet()
|
|
count.inc
|
|
|
|
check count == 3
|
|
|
|
test "listBlocks Manifest":
|
|
let
|
|
blocks = @[newBlock1, newBlock2, newBlock3]
|
|
manifestBlock = Block.new(manifest.encode().tryGet(), codec = DagPBCodec).tryGet()
|
|
treeBlock = Block.new(tree.encode()).tryGet()
|
|
putHandles = await allFinished(
|
|
(@[treeBlock, manifestBlock] & blocks).mapIt( store.putBlock( it ) ))
|
|
|
|
for handle in putHandles:
|
|
check not handle.failed
|
|
check handle.read.isOk
|
|
|
|
let
|
|
cids = (await store.listBlocks(blockType = BlockType.Manifest)).tryGet()
|
|
|
|
var count = 0
|
|
for c in cids:
|
|
if cid =? (await c):
|
|
check manifestBlock.cid == cid
|
|
check (await store.hasBlock(cid)).tryGet()
|
|
count.inc
|
|
|
|
check count == 1
|
|
|
|
test "listBlocks Both":
|
|
let
|
|
blocks = @[newBlock1, newBlock2, newBlock3]
|
|
manifestBlock = Block.new(manifest.encode().tryGet(), codec = DagPBCodec).tryGet()
|
|
treeBlock = Block.new(tree.encode()).tryGet()
|
|
putHandles = await allFinished(
|
|
(@[treeBlock, manifestBlock] & blocks).mapIt( store.putBlock( it ) ))
|
|
|
|
for handle in putHandles:
|
|
check not handle.failed
|
|
check handle.read.isOk
|
|
|
|
let
|
|
cids = (await store.listBlocks(blockType = BlockType.Both)).tryGet()
|
|
|
|
var count = 0
|
|
for c in cids:
|
|
if cid =? (await c):
|
|
check (await store.hasBlock(cid)).tryGet()
|
|
count.inc
|
|
|
|
check count == 5
|