diff --git a/codex/blocktype.nim b/codex/blocktype.nim index a26a3157..aa80f5c4 100644 --- a/codex/blocktype.nim +++ b/codex/blocktype.nim @@ -9,6 +9,7 @@ import std/tables import std/sugar +import std/sequtils export tables import pkg/upraises @@ -88,7 +89,9 @@ proc `$`*(b: Block): string = result &= "cid: " & $b.cid result &= "\ndata: " & string.fromBytes(b.data) -func new*( +proc emptyCid*(version: CidVersion, hcodec: MultiCodec, dcodec: MultiCodec): ?!Cid + +proc new*( T: type Block, data: openArray[byte] = [], version = CIDv1, @@ -98,9 +101,13 @@ func new*( ## creates a new block for both storage and network IO ## - let - hash = ? MultiHash.digest($mcodec, data).mapFailure - cid = ? Cid.init(version, codec, hash).mapFailure + let cid = + if all(data, proc (x: byte): bool = x == 0): + ? emptyCid(version, mcodec, codec) + else: + let + hash = ? MultiHash.digest($mcodec, data).mapFailure + ? Cid.init(version, codec, hash).mapFailure # TODO: If the hash is `>=` to the data, # use the Cid as a container!