Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
36 commits
Select commit Hold shift + click to select a range
e2f0900
WIP Add dependency on nim-poseidon2
markspanbroek Nov 2, 2023
0af4b79
WIP Add poseidon2 multihash
markspanbroek Nov 2, 2023
50ce66d
adding codex multicodex
dryajov Dec 1, 2023
dc75506
adding codex multicodecs and hashes
dryajov Dec 4, 2023
1e3b439
correct multicodec spelling
dryajov Dec 6, 2023
36457c9
update deps
dryajov Dec 6, 2023
a4780cf
Update to latest version of constantine
markspanbroek Dec 11, 2023
967b458
adding `codex-root` to cid
dryajov Dec 14, 2023
b239791
adding more codecs
dryajov Dec 22, 2023
1edb317
Merge branch 'master' into multihash-poseidon2
benbierens Aug 6, 2024
87728e2
Merge branch 'master' into multihash-poseidon2
benbierens Aug 8, 2024
ea6680f
Restore: RustTestVectors in testmultihash
benbierens Aug 8, 2024
8df12be
Attempt to fix missing multihash list
benbierens Aug 8, 2024
2b8db4f
Restores access to hash list from testcid
benbierens Aug 8, 2024
08bd710
pulls in updated nim-poseidon2 and constantine.
benbierens Aug 8, 2024
036e110
Attempt to fix dependency resolution on windows CI
benbierens Aug 9, 2024
1be84be
Merge branch 'master' into multihash-poseidon2
dryajov Mar 13, 2025
4c1492b
Update libp2p/cid.nim
dryajov Mar 13, 2025
3e3b5ac
Update libp2p/multibase.nim
dryajov Mar 13, 2025
e31ce69
Update libp2p/multicodec.nim
dryajov Mar 13, 2025
89d391a
Update libp2p/multihash.nim
dryajov Mar 13, 2025
5623a44
Update tests/testcid.nim
dryajov Mar 13, 2025
925bddb
Update tests/testcid.nim
dryajov Mar 13, 2025
285c208
Update tests/testcid.nim
dryajov Mar 13, 2025
588b7d2
Update tests/testmultihash.nim
dryajov Mar 13, 2025
8bb6ff2
Update tests/testmultihash.nim
dryajov Mar 13, 2025
60a37c5
Merge branch 'master' into multihash-poseidon2
munna0908 Mar 17, 2025
7960a1d
replace nimcrypto sha256 with bls_sha256
munna0908 Mar 17, 2025
e9a3c6c
don't export bls public exports (causes conflicts and unnecessary)
dryajov Mar 20, 2025
b6d36fe
skip nimbledeps from stylechecks
dryajov Mar 20, 2025
a7374e8
chore: use token per repo in autobump task (#1288)
richard-ramos Mar 18, 2025
ee83da2
feat: X.509 certificate validation (#1292)
vladopajic Mar 19, 2025
e7f8186
chore(certificate): cosmetics (#1293)
vladopajic Mar 19, 2025
bde9260
add blscurve to requires, for completeness
dryajov Mar 20, 2025
c08d807
Merge remote-tracking branch 'origin' into multihash-poseidon2
dryajov Mar 20, 2025
7eaf79f
Merge commit 'b517b69' into multihash-poseidon2
AuHau Sep 11, 2025
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
3 changes: 3 additions & 0 deletions .pinned
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
bearssl;https://github.com/status-im/nim-bearssl@#34d712933a4e0f91f5e66bc848594a581504a215
blscurve;https://github.com/status-im/nim-blscurve@#52ae4332c749d89fa05226f5493decae568f682c
chronicles;https://github.com/status-im/nim-chronicles@#61759a5e8df8f4d68bcd1b4b8c1adab3e72bbd8d
chronos;https://github.com/status-im/nim-chronos@#b55e2816eb45f698ddaca8d8473e401502562db2
dnsclient;https://github.com/ba0f3/dnsclient.nim@#23214235d4784d24aceed99bbfe153379ea557c8
Expand All @@ -19,3 +20,5 @@ websock;https://github.com/status-im/nim-websock@#d5cd89062cd2d168ef35193c7d29d2
zlib;https://github.com/status-im/nim-zlib@#daa8723fd32299d4ca621c837430c29a5a11e19a
jwt;https://github.com/vacp2p/nim-jwt@#18f8378de52b241f321c1f9ea905456e89b95c6f
bearssl_pkey_decoder;https://github.com/vacp2p/bearssl_pkey_decoder@#21dd3710df9345ed2ad8bf8f882761e07863b8e0
constantine;https://github.com/mratsim/constantine@#v0.2.0
poseidon2;https://github.com/codex-storage/nim-poseidon2@#e173dd817b794d2bdadaa7ed45583798aaa91f0d
1 change: 1 addition & 0 deletions config.nims
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ switch("warning", "LockLevel:off")
--styleCheck:
usages
switch("warningAsError", "UseBase:on")
--excludePath:nimbledeps/
--styleCheck:
error
--mm:
Expand Down
3 changes: 2 additions & 1 deletion libp2p.nimble
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,8 @@ skipDirs = @["tests", "examples", "Nim", "tools", "scripts", "docs"]
requires "nim >= 2.0.0",
"nimcrypto >= 0.6.0 & < 0.7.0", "dnsclient >= 0.3.0 & < 0.4.0", "bearssl >= 0.2.5",
"chronicles >= 0.11.0 & < 0.12.0", "chronos >= 4.0.4", "metrics", "secp256k1",
"stew >= 0.4.0", "websock >= 0.2.0", "unittest2", "results", "quic >= 0.2.10",
"stew >= 0.4.0", "websock >= 0.2.0", "unittest2", "blscurve >= 0.0.1", "results",
"quic >= 0.2.10",
"https://github.com/vacp2p/nim-jwt.git#18f8378de52b241f321c1f9ea905456e89b95c6f"

let nimc = getEnv("NIMC", "nim") # Which nim compiler to use
Expand Down
8 changes: 7 additions & 1 deletion libp2p/cid.nim
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ type
hpos*: int
data*: VBuffer

const ContentIdsList = [
const ContentIdsList* = [
multiCodec("raw"),
multiCodec("dag-pb"),
multiCodec("dag-cbor"),
Expand Down Expand Up @@ -67,6 +67,12 @@ const ContentIdsList = [
multiCodec("torrent-info"),
multiCodec("torrent-file"),
multiCodec("ed25519-pub"),
multiCodec("codex-root"),
multiCodec("codex-manifest"),
multiCodec("codex-block"),
multiCodec("codex-slot-root"),
multiCodec("codex-proving-root"),
multiCodec("codex-slot-cell"),
]

proc initCidCodeTable(): Table[int, MultiCodec] {.compileTime.} =
Expand Down
2 changes: 2 additions & 0 deletions libp2p/multibase.nim
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@

import tables
import results
import sequtils
import stew/[base32, base58, base64]
import ./utils/sequninit

Expand Down Expand Up @@ -387,6 +388,7 @@ proc initMultiBaseNameTable(): Table[string, MBCodec] {.compileTime.} =
const
CodeMultiBases = initMultiBaseCodeTable()
NameMultiBases = initMultiBaseNameTable()
MultibaseList* = MultiBaseCodecs.mapIt(it.name)

proc encodedLength*(mbtype: typedesc[MultiBase], encoding: string, length: int): int =
## Return estimated size of buffer to store MultiBase encoded value with
Expand Down
10 changes: 10 additions & 0 deletions libp2p/multicodec.nim
Original file line number Diff line number Diff line change
Expand Up @@ -370,6 +370,10 @@ const MultiCodecList = [
("skein1024-1008", 0xB3DE),
("skein1024-1016", 0xB3DF),
("skein1024-1024", 0xB3E0),
# poseidon2
("poseidon2-alt_bn_128-sponge-r2", 0xCD10), # bn128 rate 2 sponge
("poseidon2-alt_bn_128-merkle-2kb", 0xCD11), # bn128 2kb compress & merkleize
("poseidon2-alt_bn_128-keyed-compress", 0xCD12), # bn128 keyed compress
# multiaddrs
("ip4", 0x04),
("ip6", 0x29),
Expand Down Expand Up @@ -430,6 +434,12 @@ const MultiCodecList = [
("torrent-info", 0x7B),
("torrent-file", 0x7C),
("ed25519-pub", 0xED),
("codex-manifest", 0xCD01),
("codex-block", 0xCD02),
("codex-root", 0xCD03),
("codex-slot-root", 0xCD04),
("codex-proving-root", 0xCD05),
("codex-slot-cell", 0xCD06),
]

type
Expand Down
36 changes: 28 additions & 8 deletions libp2p/multihash.nim
Original file line number Diff line number Diff line change
Expand Up @@ -25,9 +25,13 @@
{.used.}

import tables
import sequtils
import nimcrypto/[sha, sha2, keccak, blake2, hash, utils]
import poseidon2
import varint, vbuffer, multicodec, multibase
import stew/base58
import blscurve/bls_public_exports

import results
export results
# This is workaround for Nim `import` bug.
Expand Down Expand Up @@ -110,13 +114,9 @@ proc blake2Shash(data: openArray[byte], output: var openArray[byte]) =

proc sha2_256hash(data: openArray[byte], output: var openArray[byte]) =
if len(output) > 0:
var digest = sha256.digest(data)
var length =
if sha256.sizeDigest > len(output):
len(output)
else:
sha256.sizeDigest
copyMem(addr output[0], addr digest.data[0], length)
var digest: array[32, byte]
digest.bls_sha256_digest(data)
copyMem(addr output[0], addr digest[0], 32)

proc sha2_512hash(data: openArray[byte], output: var openArray[byte]) =
if len(output) > 0:
Expand Down Expand Up @@ -226,7 +226,17 @@ proc shake_256hash(data: openArray[byte], output: var openArray[byte]) =
discard sctx.output(addr output[0], uint(len(output)))
sctx.clear()

const HashesList = [
proc poseidon2_sponge_rate2(data: openArray[byte], output: var openArray[byte]) =
if len(output) > 0:
var digest = poseidon2.Sponge.digest(data).toBytes()
copyMem(addr output[0], addr digest[0], uint(len(output)))

proc poseidon2_merkle_2kb_sponge(data: openArray[byte], output: var openArray[byte]) =
if len(output) > 0:
var digest = poseidon2.SpongeMerkle.digest(data, 2048).toBytes()
copyMem(addr output[0], addr digest[0], uint(len(output)))

const HashesList* = [
MHash(mcodec: multiCodec("identity"), size: 0, coder: identhash),
MHash(mcodec: multiCodec("sha1"), size: sha1.sizeDigest, coder: sha1hash),
MHash(
Expand Down Expand Up @@ -348,6 +358,16 @@ const HashesList = [
MHash(mcodec: multiCodec("blake2s-240"), size: 30, coder: blake2Shash),
MHash(mcodec: multiCodec("blake2s-248"), size: 31, coder: blake2Shash),
MHash(mcodec: multiCodec("blake2s-256"), size: 32, coder: blake2Shash),
MHash(
mcodec: multiCodec("poseidon2-alt_bn_128-sponge-r2"),
size: 32,
coder: poseidon2_sponge_rate2,
),
MHash(
mcodec: multiCodec("poseidon2-alt_bn_128-merkle-2kb"),
size: 32,
coder: poseidon2_merkle_2kb_sponge,
),
]

proc initMultiHashCodeTable(): Table[MultiCodec, MHash] {.compileTime.} =
Expand Down
25 changes: 25 additions & 0 deletions tests/testcid.nim
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,11 @@
# those terms.

import unittest2
import std/sequtils
import ../libp2p/[cid, multihash, multicodec]

const MultiHashCodecsList* = HashesList.mapIt(it.mcodec)

suite "Content identifier CID test suite":
test "CIDv0 test vector":
var cid0Text = "QmdfTbBqBPQ7VNxZEYEj14VmRuZBkqFbiwReogJgS1zR1n"
Expand Down Expand Up @@ -66,3 +69,25 @@ suite "Content identifier CID test suite":
cid1 != cid5
cid2 != cid4
cid3 != cid6

test "Check all cids and hashes":
var msg = cast[seq[byte]]("Hello World!")
for cidCodec in ContentIdsList:
for mhashCodec in MultiHashCodecsList:
let cid = Cid
.init(CidVersion.CIDv1, cidCodec, MultiHash.digest($mhashCodec, msg).get())
.get()
check:
cid.mcodec == cidCodec
cid.mhash().get().mcodec == mhashCodec

test "Check all cids and hashes base encode":
var msg = cast[seq[byte]]("Hello World!")
for cidCodec in ContentIdsList:
for mhashCodec in MultiHashCodecsList:
let cid = Cid
.init(CidVersion.CIDv1, cidCodec, MultiHash.digest($mhashCodec, msg).get())
.get()
check:
cid.mcodec == cidCodec
cid.mhash().get().mcodec == mhashCodec
27 changes: 19 additions & 8 deletions tests/testmultihash.nim
Original file line number Diff line number Diff line change
Expand Up @@ -67,16 +67,27 @@ const RustTestVectors = [
B7C42181F40AA1046F39E2EF9EFC6910782A998E0013D172458957957FAC9405
B67D""",
],
[
"poseidon2-alt_bn_128-sponge-r2", "hello world",
"""909A0320823F7FB71C0998153E73AC734AE4870518F5FE324BD2484B68B565C288CF1E1E""",
],
[
"poseidon2-alt_bn_128-merkle-2kb", "hello world",
"""919A0320D9A6AE0CBF28C5E9CBE28D7231D3A4DEDF8B3826B0F8C3C002CA95C21253E614""",
],
]

suite "MultiHash test suite":
template checkTestVector(vector) =
var msg = vector[1]
var bmsg = cast[seq[byte]](msg)
var mh1 = MultiHash.digest(vector[0], bmsg).get()
var mh2 = MultiHash.init(stripSpaces(vector[2])).get()
check:
hex(mh1) == stripSpaces(vector[2])
hex(mh1) == hex(mh2)
mh1 == mh2

test "rust-multihash test vectors":
for item in RustTestVectors:
var msg = item[1]
var bmsg = cast[seq[byte]](msg)
var mh1 = MultiHash.digest(item[0], bmsg).get()
var mh2 = MultiHash.init(stripSpaces(item[2])).get()
check:
hex(mh1) == stripSpaces(item[2])
hex(mh1) == hex(mh2)
mh1 == mh2
checkTestVector(item)