mirror of
https://github.com/logos-storage/logos-storage-nim.git
synced 2026-01-15 20:03:09 +00:00
* 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>
103 lines
2.8 KiB
Nim
103 lines
2.8 KiB
Nim
## Nim-Codex
|
|
## Copyright (c) 2023 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/upraises
|
|
|
|
push: {.upraises: [].}
|
|
|
|
import pkg/libp2p
|
|
import pkg/questionable
|
|
import pkg/questionable/results
|
|
|
|
import ../../units
|
|
import ../../errors
|
|
|
|
import ./codex
|
|
|
|
const MaxMerkleTreeSize = 100.MiBs.uint
|
|
const MaxMerkleProofSize = 1.MiBs.uint
|
|
|
|
proc encode*(self: CodexTree): seq[byte] =
|
|
var pb = initProtoBuffer(maxSize = MaxMerkleTreeSize)
|
|
pb.write(1, self.mcodec.uint64)
|
|
pb.write(2, self.leavesCount.uint64)
|
|
for node in self.nodes:
|
|
var nodesPb = initProtoBuffer(maxSize = MaxMerkleTreeSize)
|
|
nodesPb.write(1, node)
|
|
nodesPb.finish()
|
|
pb.write(3, nodesPb)
|
|
|
|
pb.finish
|
|
pb.buffer
|
|
|
|
proc decode*(_: type CodexTree, data: seq[byte]): ?!CodexTree =
|
|
var pb = initProtoBuffer(data, maxSize = MaxMerkleTreeSize)
|
|
var mcodecCode: uint64
|
|
var leavesCount: uint64
|
|
discard ? pb.getField(1, mcodecCode).mapFailure
|
|
discard ? pb.getField(2, leavesCount).mapFailure
|
|
|
|
let mcodec = MultiCodec.codec(mcodecCode.int)
|
|
if mcodec == InvalidMultiCodec:
|
|
return failure("Invalid MultiCodec code " & $mcodecCode)
|
|
|
|
var
|
|
nodesBuff: seq[seq[byte]]
|
|
nodes: seq[ByteHash]
|
|
|
|
if ? pb.getRepeatedField(3, nodesBuff).mapFailure:
|
|
for nodeBuff in nodesBuff:
|
|
var node: ByteHash
|
|
discard ? initProtoBuffer(nodeBuff).getField(1, node).mapFailure
|
|
nodes.add node
|
|
|
|
CodexTree.fromNodes(mcodec, nodes, leavesCount.int)
|
|
|
|
proc encode*(self: CodexProof): seq[byte] =
|
|
var pb = initProtoBuffer(maxSize = MaxMerkleProofSize)
|
|
pb.write(1, self.mcodec.uint64)
|
|
pb.write(2, self.index.uint64)
|
|
pb.write(3, self.nleaves.uint64)
|
|
|
|
for node in self.path:
|
|
var nodesPb = initProtoBuffer(maxSize = MaxMerkleTreeSize)
|
|
nodesPb.write(1, node)
|
|
nodesPb.finish()
|
|
pb.write(4, nodesPb)
|
|
|
|
pb.finish
|
|
pb.buffer
|
|
|
|
proc decode*(_: type CodexProof, data: seq[byte]): ?!CodexProof =
|
|
var pb = initProtoBuffer(data, maxSize = MaxMerkleProofSize)
|
|
var mcodecCode: uint64
|
|
var index: uint64
|
|
var nleaves: uint64
|
|
discard ? pb.getField(1, mcodecCode).mapFailure
|
|
|
|
let mcodec = MultiCodec.codec(mcodecCode.int)
|
|
if mcodec == InvalidMultiCodec:
|
|
return failure("Invalid MultiCodec code " & $mcodecCode)
|
|
|
|
discard ? pb.getField(2, index).mapFailure
|
|
discard ? pb.getField(3, nleaves).mapFailure
|
|
|
|
var
|
|
nodesBuff: seq[seq[byte]]
|
|
nodes: seq[ByteHash]
|
|
|
|
if ? pb.getRepeatedField(4, nodesBuff).mapFailure:
|
|
for nodeBuff in nodesBuff:
|
|
var node: ByteHash
|
|
let nodePb = initProtoBuffer(nodeBuff)
|
|
discard ? nodePb.getField(1, node).mapFailure
|
|
nodes.add node
|
|
|
|
CodexProof.init(mcodec, index.int, nleaves.int, nodes)
|