diff --git a/dagger/blocktype.nim b/dagger/blocktype.nim index 6cf0c240..87d3b8e1 100644 --- a/dagger/blocktype.nim +++ b/dagger/blocktype.nim @@ -16,6 +16,9 @@ import pkg/questionable/results import ./errors +const + BlockSize* = 4096 # file chunk read size + type Block* = object of RootObj cid*: Cid diff --git a/dagger/manifest/coders.nim b/dagger/manifest/coders.nim index 8acd1b70..1a3413b8 100644 --- a/dagger/manifest/coders.nim +++ b/dagger/manifest/coders.nim @@ -27,20 +27,20 @@ type ManifestCoderType*[codec: static MultiCodec] = object DagPBCoder* = ManifestCoderType[multiCodec("dag-pb")] -func encode*(_: DagPBCoder, b: Manifest): ?!seq[byte] = +func encode*(_: DagPBCoder, manifest: Manifest): ?!seq[byte] = ## Encode the manifest into a ``ManifestCodec`` ## multicodec container (Dag-pb) for now ## var pbNode = initProtoBuffer() - for c in b.blocks: + for c in manifest.blocks: var pbLink = initProtoBuffer() pbLink.write(1, c.data.buffer) # write Cid links pbLink.finish() pbNode.write(2, pbLink) - let cid = !b.rootHash + let cid = !manifest.rootHash pbNode.write(1, cid.data.buffer) # set the rootHash Cid as the data field pbNode.finish() diff --git a/dagger/manifest/manifest.nim b/dagger/manifest/manifest.nim index 0c1d007e..8e6df348 100644 --- a/dagger/manifest/manifest.nim +++ b/dagger/manifest/manifest.nim @@ -19,6 +19,7 @@ import pkg/chronicles import ./types import ./coders import ../errors +import ../blocktype export coders, Manifest @@ -30,16 +31,21 @@ const func len*(self: Manifest): int = self.blocks.len +func size*(self: Manifest): int = + self.blocks.len * self.blockSize + func `[]`*(self: Manifest, i: Natural): Cid = self.blocks[i] func `[]=`*(self: var Manifest, i: Natural, item: Cid) = + self.rootHash = Cid.none self.blocks[i] = item func `[]`*(self: Manifest, i: BackwardsIndex): Cid = self.blocks[self.len - i.int] func `[]=`*(self: var Manifest, i: BackwardsIndex, item: Cid) = + self.rootHash = Cid.none self.blocks[self.len - i.int] = item proc add*(self: var Manifest, cid: Cid) = @@ -61,6 +67,10 @@ template hashBytes(mh: MultiHash): seq[byte] = mh.data.buffer[mh.dpos..(mh.dpos + mh.size - 1)] proc makeRoot(self: var Manifest): ?!void = + ## Create a tree hash root of the contained + ## block hashes + ## + var stack: seq[MultiHash] @@ -119,7 +129,8 @@ proc init*( blocks: openArray[Cid] = [], version = CIDv1, hcodec = multiCodec("sha2-256"), - codec = multiCodec("raw")): ?!T = + codec = multiCodec("raw"), + blockSize = BlockSize): ?!T = ## Create a manifest using array of `Cid`s ## @@ -131,4 +142,5 @@ proc init*( version: version, codec: codec, hcodec: hcodec, + blockSize: blockSize ).success diff --git a/dagger/manifest/types.nim b/dagger/manifest/types.nim index d1197123..233e3fa5 100644 --- a/dagger/manifest/types.nim +++ b/dagger/manifest/types.nim @@ -40,6 +40,7 @@ template EmptyDigests*: untyped = type Manifest* = object of RootObj rootHash*: ?Cid + blockSize*: int blocks*: seq[Cid] version*: CidVersion hcodec*: MultiCodec diff --git a/dagger/node.nim b/dagger/node.nim index b31fdfab..13d0c876 100644 --- a/dagger/node.nim +++ b/dagger/node.nim @@ -29,9 +29,6 @@ import ./blockexchange logScope: topics = "dagger node" -const - FileChunkSize* = 4096 # file chunk read size - type DaggerError = object of CatchableError