Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -148,6 +148,7 @@ Extend `MultiFormats`:
| `MultiHash` | `-d:libp2p_multihash_exts` | `const HashExts = []` |
| `MultiAddress` | `-d:libp2p_multiaddress_exts` | `const AddressExts = []` |
| `MultiBase` | `-d:libp2p_multibase_exts` | `const BaseExts = []` |
| `ContentIds` | `-d:libp2p_contentids_exts` | `const ContentIdsExts = []` |

For example, a file called `multihash_exts.nim` could be created and contain `MultiHash` extensions:
```nim
Expand Down
3 changes: 2 additions & 1 deletion libp2p.nimble
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,8 @@ task testmultiformatexts, "Run multiformat extensions tests":
"-d:libp2p_multicodec_exts=../tests/multiformat_exts/multicodec_exts.nim " &
"-d:libp2p_multiaddress_exts=../tests/multiformat_exts/multiaddress_exts.nim " &
"-d:libp2p_multihash_exts=../tests/multiformat_exts/multihash_exts.nim " &
"-d:libp2p_multibase_exts=../tests/multiformat_exts/multibase_exts.nim "
"-d:libp2p_multibase_exts=../tests/multiformat_exts/multibase_exts.nim " &
"-d:libp2p_contentids_exts=../tests/multiformat_exts/contentids_exts.nim "
runTest("multiformat_exts/testmultiformat_exts", opts)

task testnative, "Runs libp2p native tests":
Expand Down
22 changes: 17 additions & 5 deletions libp2p/cid.nim
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
{.used.}

import tables, hashes
import multibase, multicodec, multihash, vbuffer, varint, results
import multibase, multicodec, multihash, vbuffer, varint, results, utility
import stew/base58
import ./utils/sequninit

Expand All @@ -38,6 +38,8 @@ type
hpos*: int
data*: VBuffer

const libp2p_contentids_exts* {.strdefine.} = ""

const ContentIdsList = [
multiCodec("raw"),
multiCodec("dag-pb"),
Expand Down Expand Up @@ -69,11 +71,21 @@ const ContentIdsList = [
multiCodec("ed25519-pub"),
]

proc initCidCodeTable(): Table[int, MultiCodec] {.compileTime.} =
for item in ContentIdsList:
result[int(item)] = item
proc initCidCodeTable(
codecs: openArray[MultiCodec]
): Table[int, MultiCodec] {.compileTime.} =
var res: Table[int, MultiCodec]

for codec in codecs:
res[codec.int] = codec

return res

const CodeContentIds = initCidCodeTable()
when libp2p_contentids_exts != "":
includeFile(libp2p_contentids_exts)
const CodeContentIds = initCidCodeTable(@ContentIdsList & @ContentIdsExts)
else:
const CodeContentIds = initCidCodeTable(@ContentIdsList)

template orError*(exp: untyped, err: untyped): untyped =
exp.mapErr do(_: auto) -> auto:
Expand Down
1 change: 1 addition & 0 deletions tests/multiformat_exts/contentids_exts.nim
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
const ContentIdsExts = [multiCodec("codec_mc1"), multiCodec("codec_mc2")]
46 changes: 46 additions & 0 deletions tests/multiformat_exts/testcontentids_exts.nim
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
{.used.}

# Nim-Libp2p
# 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 unittest2
import ../../libp2p/cid
import ../../libp2p/multicodec
import ../../libp2p/multihash

suite "ContentId extensions":
test "extended contentids correctly hash data":
var bmsg = cast[seq[byte]]("hello")
var cid0 = Cid
.init(CIDv1, multiCodec("codec_mc1"), MultiHash.digest("codec_mc2", bmsg).get())
.tryGet()
var cid1 = Cid
.init(CIDv1, multiCodec("codec_mc2"), MultiHash.digest("codec_mc1", bmsg).get())
.tryGet()
check:
cid0.hex == "0181FE0382FE030668656C6C6F00"
cid1.hex == "0182FE0381FE030568656C6C6F"
$cid0 == "zZ9hvSmq764xLht1dRH"
$cid1 == "z8JZsv4DR12xsE7Fn6"

test "can initialise extended Cids":
let expected1 = "zZ9hvSmq764xLht1dRH"
let expected2 = "z8JZsv4DR12xsE7Fn6"
let cid1 = Cid.init(expected1).get
let cid2 = Cid.init(expected2).get

check:
$cid1 == expected1
cid1.version == CIDv1
cid1.contentType.get == multiCodec("codec_mc1")
cid1.mhash.get.mcodec == multiCodec("codec_mc2")
$cid2 == expected2
cid2.version == CIDv1
cid2.contentType.get == multiCodec("codec_mc2")
cid2.mhash.get.mcodec == multiCodec("codec_mc1")
3 changes: 2 additions & 1 deletion tests/multiformat_exts/testmultiformat_exts.nim
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
import
testmulticodec_exts, testmultihash_exts, testmultiaddress_exts, testmultibase_exts
testmulticodec_exts, testmultihash_exts, testmultiaddress_exts, testmultibase_exts,
testcontentids_exts
Loading