Skip to content

Commit e68b3ee

Browse files
markspanbroekdryajov
authored andcommitted
WIP Add poseidon2 multihash
1 parent 632f986 commit e68b3ee

File tree

3 files changed

+33
-9
lines changed

3 files changed

+33
-9
lines changed

libp2p/multicodec.nim

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,7 @@ const MultiCodecList = [
176176
("skein1024-992", 0xB3DC), ("skein1024-1000", 0xB3DD),
177177
("skein1024-1008", 0xB3DE), ("skein1024-1016", 0xB3DF),
178178
("skein1024-1024", 0xB3E0),
179+
("poseidon2-alt_bn_128-a2-cdx1", 0xCD0001),
179180
# multiaddrs
180181
("ip4", 0x04),
181182
("ip6", 0x29),

libp2p/multihash.nim

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525

2626
import tables
2727
import nimcrypto/[sha, sha2, keccak, blake2, hash, utils]
28+
import poseidon2
2829
import varint, vbuffer, multicodec, multibase
2930
import stew/base58
3031
import stew/results
@@ -179,6 +180,11 @@ proc shake_256hash(data: openArray[byte], output: var openArray[byte]) =
179180
discard sctx.output(addr output[0], uint(len(output)))
180181
sctx.clear()
181182

183+
proc poseidon2hash(data: openArray[byte], output: var openArray[byte]) =
184+
if len(output) > 0:
185+
var digest = poseidon2.merkleRoot(data).toBytes()
186+
copyMem(addr output[0], addr digest[0], uint(len(output)))
187+
182188
const
183189
HashesList = [
184190
MHash(mcodec: multiCodec("identity"), size: 0,
@@ -315,7 +321,8 @@ const
315321
MHash(mcodec: multiCodec("blake2s-232"), size: 29, coder: blake2Shash),
316322
MHash(mcodec: multiCodec("blake2s-240"), size: 30, coder: blake2Shash),
317323
MHash(mcodec: multiCodec("blake2s-248"), size: 31, coder: blake2Shash),
318-
MHash(mcodec: multiCodec("blake2s-256"), size: 32, coder: blake2Shash)
324+
MHash(mcodec: multiCodec("blake2s-256"), size: 32, coder: blake2Shash),
325+
MHash(mcodec: multiCodec("poseidon2-alt_bn_128-a2-cdx1"), size: 32, coder: poseidon2hash)
319326
]
320327

321328
proc initMultiHashCodeTable(): Table[MultiCodec, MHash] {.compileTime.} =

tests/testmultihash.nim

Lines changed: 24 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -85,15 +85,31 @@ const
8585
]
8686
]
8787

88+
const CodexTestVectors = [
89+
[
90+
"poseidon2-alt_bn_128-a2-cdx1",
91+
"hello world",
92+
# TODO: https://github.com/codex-storage/nim-poseidon2/issues/5#issuecomment-1787447258
93+
"8180B406 20 68656C6C6F20776F726C64000000000000000000000000000000000000000000"
94+
]
95+
]
8896

8997
suite "MultiHash test suite":
98+
99+
template checkTestVector(vector) =
100+
var msg = vector[1]
101+
var bmsg = cast[seq[byte]](msg)
102+
var mh1 = MultiHash.digest(vector[0], bmsg).get()
103+
var mh2 = MultiHash.init(stripSpaces(vector[2])).get()
104+
check:
105+
hex(mh1) == stripSpaces(vector[2])
106+
hex(mh1) == hex(mh2)
107+
mh1 == mh2
108+
90109
test "rust-multihash test vectors":
91110
for item in RustTestVectors:
92-
var msg = item[1]
93-
var bmsg = cast[seq[byte]](msg)
94-
var mh1 = MultiHash.digest(item[0], bmsg).get()
95-
var mh2 = MultiHash.init(stripSpaces(item[2])).get()
96-
check:
97-
hex(mh1) == stripSpaces(item[2])
98-
hex(mh1) == hex(mh2)
99-
mh1 == mh2
111+
checkTestVector(item)
112+
113+
test "codex test vectors":
114+
for item in CodexTestVectors:
115+
checkTestVector(item)

0 commit comments

Comments
 (0)