From 69f1994eeae3c35959bf395e337291879a0409b1 Mon Sep 17 00:00:00 2001 From: Balazs Komuves Date: Tue, 1 Oct 2024 21:00:27 +0200 Subject: [PATCH] refactoring the structure of the nimble package --- goldilocks_hash.nim | 7 +++++++ goldilocks_hash.nimble | 5 +++++ {poseidon2 => goldilocks_hash}/goldilocks.nim | 0 goldilocks_hash/poseidon2.nim | 14 ++++++++++++++ .../poseidon2}/compress.nim | 2 +- .../poseidon2}/merkle.nim | 2 +- .../poseidon2}/permutation.nim | 2 +- .../poseidon2}/sponge.nim | 4 ++-- {poseidon2 => goldilocks_hash}/types.nim | 0 poseidon2_goldilocks.nim | 17 ----------------- poseidon2_goldilocks.nimble | 5 ----- reference/README.md | 4 +++- reference/TestGen/TestGoldilocks.hs | 2 +- reference/TestGen/TestMerkle.hs | 2 +- reference/TestGen/TestPermutation.hs | 2 +- reference/TestGen/TestSponge.hs | 2 +- .../field}/fieldTestCases.nim | 0 .../field}/testField.nim | 6 +++--- .../poseidon2/merkleTestCases.nim | 2 +- .../poseidon2/permTestCases.nim | 2 +- .../poseidon2/spongeTestCases.nim | 2 +- .../poseidon2/testCompress.nim | 7 +++---- .../poseidon2/testMerkle.nim | 6 +++--- .../poseidon2/testPermutation.nim | 6 +++--- .../poseidon2/testSponge.nim | 8 ++++---- tests/test.nim | 13 +++++-------- 26 files changed, 62 insertions(+), 60 deletions(-) create mode 100644 goldilocks_hash.nim create mode 100644 goldilocks_hash.nimble rename {poseidon2 => goldilocks_hash}/goldilocks.nim (100%) create mode 100644 goldilocks_hash/poseidon2.nim rename {poseidon2 => goldilocks_hash/poseidon2}/compress.nim (95%) rename {poseidon2 => goldilocks_hash/poseidon2}/merkle.nim (99%) rename {poseidon2 => goldilocks_hash/poseidon2}/permutation.nim (97%) rename {poseidon2 => goldilocks_hash/poseidon2}/sponge.nim (99%) rename {poseidon2 => goldilocks_hash}/types.nim (100%) delete mode 100644 poseidon2_goldilocks.nim delete mode 100644 poseidon2_goldilocks.nimble rename tests/{poseidon2 => goldilocks_hash/field}/fieldTestCases.nim (100%) rename tests/{poseidon2 => goldilocks_hash/field}/testField.nim (91%) rename tests/{ => goldilocks_hash}/poseidon2/merkleTestCases.nim (99%) rename tests/{ => goldilocks_hash}/poseidon2/permTestCases.nim (99%) rename tests/{ => goldilocks_hash}/poseidon2/spongeTestCases.nim (99%) rename tests/{ => goldilocks_hash}/poseidon2/testCompress.nim (95%) rename tests/{ => goldilocks_hash}/poseidon2/testMerkle.nim (87%) rename tests/{ => goldilocks_hash}/poseidon2/testPermutation.nim (92%) rename tests/{ => goldilocks_hash}/poseidon2/testSponge.nim (96%) diff --git a/goldilocks_hash.nim b/goldilocks_hash.nim new file mode 100644 index 0000000..f31f32b --- /dev/null +++ b/goldilocks_hash.nim @@ -0,0 +1,7 @@ + +import goldilocks_hash/types +import goldilocks_hash/goldilocks + +export types +export goldilocks + diff --git a/goldilocks_hash.nimble b/goldilocks_hash.nimble new file mode 100644 index 0000000..deb26e3 --- /dev/null +++ b/goldilocks_hash.nimble @@ -0,0 +1,5 @@ +version = "0.0.1" +author = "Balazs Komuves" +description = "Airthmetic hash functions (Poseidon2, Monolith) over the Goldilocks field" +license = "MIT" + diff --git a/poseidon2/goldilocks.nim b/goldilocks_hash/goldilocks.nim similarity index 100% rename from poseidon2/goldilocks.nim rename to goldilocks_hash/goldilocks.nim diff --git a/goldilocks_hash/poseidon2.nim b/goldilocks_hash/poseidon2.nim new file mode 100644 index 0000000..197a7bf --- /dev/null +++ b/goldilocks_hash/poseidon2.nim @@ -0,0 +1,14 @@ + +import goldilocks_hash/types +import goldilocks_hash/goldilocks + +import goldilocks_hash/poseidon2/sponge +import goldilocks_hash/poseidon2/merkle +# import goldilocks_hash/poseidon2/permutation +# import goldilocks_hash/poseidon2/compress + +export types +export goldilocks +export sponge +export merkle + diff --git a/poseidon2/compress.nim b/goldilocks_hash/poseidon2/compress.nim similarity index 95% rename from poseidon2/compress.nim rename to goldilocks_hash/poseidon2/compress.nim index 765c1ff..cfb9530 100644 --- a/poseidon2/compress.nim +++ b/goldilocks_hash/poseidon2/compress.nim @@ -1,5 +1,5 @@ -import ./types +import ../types proc c_compress(a, b: var Digest, key: uint64, output: var Digest) {. header: "../cbits/goldilocks.h", importc: "goldilocks_poseidon2_keyed_compress", cdecl .} diff --git a/poseidon2/merkle.nim b/goldilocks_hash/poseidon2/merkle.nim similarity index 99% rename from poseidon2/merkle.nim rename to goldilocks_hash/poseidon2/merkle.nim index 8e0a49c..7f89536 100644 --- a/poseidon2/merkle.nim +++ b/goldilocks_hash/poseidon2/merkle.nim @@ -7,7 +7,7 @@ # - there is no collision if you remove the bottommost layer (or several layers) # - the merkle root of the singleton is not itself -import ./types +import ../types import ./compress #import ./io diff --git a/poseidon2/permutation.nim b/goldilocks_hash/poseidon2/permutation.nim similarity index 97% rename from poseidon2/permutation.nim rename to goldilocks_hash/poseidon2/permutation.nim index e9ee2c1..723bc97 100644 --- a/poseidon2/permutation.nim +++ b/goldilocks_hash/poseidon2/permutation.nim @@ -1,5 +1,5 @@ -import ./types +import ../types # the Poseidon2 permutation (mutable, in-place version) proc permInPlace* (state: var State) {. header: "../cbits/goldilocks.h", importc: "goldilocks_poseidon2_permutation", cdecl .} diff --git a/poseidon2/sponge.nim b/goldilocks_hash/poseidon2/sponge.nim similarity index 99% rename from poseidon2/sponge.nim rename to goldilocks_hash/poseidon2/sponge.nim index 76cc164..e5a8c80 100644 --- a/poseidon2/sponge.nim +++ b/goldilocks_hash/poseidon2/sponge.nim @@ -10,8 +10,8 @@ #import std/assertions # on 1.6.18 with an M2 i got "cannot open file: std/assertions" .... -import ./types -import ./goldilocks +import ../types +import ../goldilocks import ./permutation #import ./io diff --git a/poseidon2/types.nim b/goldilocks_hash/types.nim similarity index 100% rename from poseidon2/types.nim rename to goldilocks_hash/types.nim diff --git a/poseidon2_goldilocks.nim b/poseidon2_goldilocks.nim deleted file mode 100644 index a10e85d..0000000 --- a/poseidon2_goldilocks.nim +++ /dev/null @@ -1,17 +0,0 @@ -# import poseidon2/types -# import poseidon2/io -# import poseidon2/sponge -# import poseidon2/compress -# import poseidon2/merkle -# import poseidon2/spongemerkle - -# export sponge -# export compress -# export merkle -# export spongemerkle -# export fromBytes -# export toBytes -# export toF -# export elements -# export types - diff --git a/poseidon2_goldilocks.nimble b/poseidon2_goldilocks.nimble deleted file mode 100644 index 9ee7a18..0000000 --- a/poseidon2_goldilocks.nimble +++ /dev/null @@ -1,5 +0,0 @@ -version = "0.0.1" -author = "Balazs Komuves" -description = "Poseidon2 hash function over the goldilocks field" -license = "MIT" - diff --git a/reference/README.md b/reference/README.md index 82ae2bd..ad4f489 100644 --- a/reference/README.md +++ b/reference/README.md @@ -2,5 +2,7 @@ Haskell reference implementation -------------------------------- -Used for generating test cases (as Nim doesn't support integers larger than 64 bit) +This is a very inefficient, but easy to read (and check) Haskell implementation +of Poseidon2. +We use it for generating test cases for the real implementation. diff --git a/reference/TestGen/TestGoldilocks.hs b/reference/TestGen/TestGoldilocks.hs index 475e125..125d4ba 100644 --- a/reference/TestGen/TestGoldilocks.hs +++ b/reference/TestGen/TestGoldilocks.hs @@ -64,7 +64,7 @@ hPrintTests h = hPutStrLn h $ unlines writeTests :: IO () writeTests = withFile "fieldTestCases.nim" WriteMode $ \h -> do hPutStrLn h "# generated by TestGen/TestGoldilocks.hs\n" - -- hPutStrLn h "import poseidon2/types\n" + hPutStrLn h "import goldilocks_hash/types\n" hPrintTests h -------------------------------------------------------------------------------- diff --git a/reference/TestGen/TestMerkle.hs b/reference/TestGen/TestMerkle.hs index b4d4bc7..19c464c 100644 --- a/reference/TestGen/TestMerkle.hs +++ b/reference/TestGen/TestMerkle.hs @@ -37,7 +37,7 @@ hPrintTests h = hPutStrLn h $ unlines $ writeTests :: IO () writeTests = withFile "merkleTestCases.nim" WriteMode $ \h -> do hPutStrLn h "# generated by TestGen/TestMerkle.hs\n" - hPutStrLn h "import poseidon2/types\n" + hPutStrLn h "import goldilocks_hash/types\n" hPrintTests h -------------------------------------------------------------------------------- diff --git a/reference/TestGen/TestPermutation.hs b/reference/TestGen/TestPermutation.hs index 31e608a..73c70ba 100644 --- a/reference/TestGen/TestPermutation.hs +++ b/reference/TestGen/TestPermutation.hs @@ -46,7 +46,7 @@ hPrintTests h = hPutStrLn h $ unlines writeTests :: IO () writeTests = withFile "permTestCases.nim" WriteMode $ \h -> do hPutStrLn h "# generated by TestGen/TestPermutation.hs\n" - -- hPutStrLn h "import poseidon2/types\n" + hPutStrLn h "import goldilocks_hash/types\n" hPrintTests h -------------------------------------------------------------------------------- diff --git a/reference/TestGen/TestSponge.hs b/reference/TestGen/TestSponge.hs index d0a67a8..2805e2f 100644 --- a/reference/TestGen/TestSponge.hs +++ b/reference/TestGen/TestSponge.hs @@ -38,7 +38,7 @@ hPrintTests h = hPutStrLn h $ unlines $ writeTests :: IO () writeTests = withFile "spongeTestCases.nim" WriteMode $ \h -> do hPutStrLn h "# generated by TestGen/TestSponge.hs\n" - hPutStrLn h "import poseidon2/types\n" + hPutStrLn h "import goldilocks_hash/types\n" hPrintTests h -------------------------------------------------------------------------------- diff --git a/tests/poseidon2/fieldTestCases.nim b/tests/goldilocks_hash/field/fieldTestCases.nim similarity index 100% rename from tests/poseidon2/fieldTestCases.nim rename to tests/goldilocks_hash/field/fieldTestCases.nim diff --git a/tests/poseidon2/testField.nim b/tests/goldilocks_hash/field/testField.nim similarity index 91% rename from tests/poseidon2/testField.nim rename to tests/goldilocks_hash/field/testField.nim index 0850c08..39e5bfe 100644 --- a/tests/poseidon2/testField.nim +++ b/tests/goldilocks_hash/field/testField.nim @@ -2,14 +2,14 @@ import std/unittest # import std/sequtils -import poseidon2/types -import poseidon2/goldilocks +import goldilocks_hash/types +import goldilocks_hash/goldilocks import ./fieldTestCases #------------------------------------------------------------------------------- -suite "field": +suite "the Goldilocks field": test "negation": var ok = true diff --git a/tests/poseidon2/merkleTestCases.nim b/tests/goldilocks_hash/poseidon2/merkleTestCases.nim similarity index 99% rename from tests/poseidon2/merkleTestCases.nim rename to tests/goldilocks_hash/poseidon2/merkleTestCases.nim index 0d8f695..7fee625 100644 --- a/tests/poseidon2/merkleTestCases.nim +++ b/tests/goldilocks_hash/poseidon2/merkleTestCases.nim @@ -1,6 +1,6 @@ # generated by TestGen/TestMerkle.hs -import poseidon2/types +import goldilocks_hash/types const testcases_merkleroot* : array[175, tuple[n:int,digest:F4]] = [ ( 1 , [ toF( 0x232f21acc9d346d8'u64 ), toF( 0x2eba96d3a73822c1'u64 ), toF( 0x4163308f6d0eff64'u64 ), toF( 0x5190c2b759734aff'u64 ) ] ) diff --git a/tests/poseidon2/permTestCases.nim b/tests/goldilocks_hash/poseidon2/permTestCases.nim similarity index 99% rename from tests/poseidon2/permTestCases.nim rename to tests/goldilocks_hash/poseidon2/permTestCases.nim index e1f055d..7625f06 100644 --- a/tests/poseidon2/permTestCases.nim +++ b/tests/goldilocks_hash/poseidon2/permTestCases.nim @@ -1,6 +1,6 @@ # generated by TestGen/TestPermutation.hs -import poseidon2/types +import goldilocks_hash/types const testcases_perm* : array[16, tuple[xs:F12, ys:F12]] = [ ( [ toF( 0x0000000000000000'u64 ), toF( 0x0000000000000001'u64 ), toF( 0x0000000000000002'u64 ), toF( 0x0000000000000003'u64 ), toF( 0x0000000000000004'u64 ), toF( 0x0000000000000005'u64 ), toF( 0x0000000000000006'u64 ), toF( 0x0000000000000007'u64 ), toF( 0x0000000000000008'u64 ), toF( 0x0000000000000009'u64 ), toF( 0x000000000000000a'u64 ), toF( 0x000000000000000b'u64 ) ] , [ toF( 0x01eaef96bdf1c0c1'u64 ), toF( 0x1f0d2cc525b2540c'u64 ), toF( 0x6282c1dfe1e0358d'u64 ), toF( 0xe780d721f698e1e6'u64 ), toF( 0x280c0b6f753d833b'u64 ), toF( 0x1b942dd5023156ab'u64 ), toF( 0x43f0df3fcccb8398'u64 ), toF( 0xe8e8190585489025'u64 ), toF( 0x56bdbf72f77ada22'u64 ), toF( 0x7911c32bf9dcd705'u64 ), toF( 0xec467926508fbe67'u64 ), toF( 0x6a50450ddf85a6ed'u64 ) ] ) diff --git a/tests/poseidon2/spongeTestCases.nim b/tests/goldilocks_hash/poseidon2/spongeTestCases.nim similarity index 99% rename from tests/poseidon2/spongeTestCases.nim rename to tests/goldilocks_hash/poseidon2/spongeTestCases.nim index 7b40b98..931cc94 100644 --- a/tests/poseidon2/spongeTestCases.nim +++ b/tests/goldilocks_hash/poseidon2/spongeTestCases.nim @@ -1,6 +1,6 @@ # generated by TestGen/TestSponge.hs -import poseidon2/types +import goldilocks_hash/types const testcases_field_rate1* : array[81, tuple[n:int,digest:F4]] = [ ( 0 , [ toF( 0x823867639a2e2e42'u64 ), toF( 0x5a49f311c9c6aed5'u64 ), toF( 0x0755816884b47697'u64 ), toF( 0x5ebb5981aa75ab5c'u64 ) ] ) diff --git a/tests/poseidon2/testCompress.nim b/tests/goldilocks_hash/poseidon2/testCompress.nim similarity index 95% rename from tests/poseidon2/testCompress.nim rename to tests/goldilocks_hash/poseidon2/testCompress.nim index 64e75a3..0f293d1 100644 --- a/tests/poseidon2/testCompress.nim +++ b/tests/goldilocks_hash/poseidon2/testCompress.nim @@ -1,9 +1,8 @@ import std/unittest -# import std/sequtils -import poseidon2/types -import poseidon2/compress +import goldilocks_hash/types +import goldilocks_hash/poseidon2/compress #------------------------------------------------------------------------------- @@ -53,7 +52,7 @@ const refOutKey3: array[4,F] = #------------------------------------------------------------------------------- -suite "compression": +suite "poseidon2 compression": test "compression of [1..4] and [5..8] with key=0": let input1 : Digest = toDigest(refInp1) diff --git a/tests/poseidon2/testMerkle.nim b/tests/goldilocks_hash/poseidon2/testMerkle.nim similarity index 87% rename from tests/poseidon2/testMerkle.nim rename to tests/goldilocks_hash/poseidon2/testMerkle.nim index 8a14d97..ff296bb 100644 --- a/tests/poseidon2/testMerkle.nim +++ b/tests/goldilocks_hash/poseidon2/testMerkle.nim @@ -2,8 +2,8 @@ import std/unittest # import std/sequtils -import poseidon2/types -import poseidon2/merkle +import goldilocks_hash/types +import goldilocks_hash/poseidon2/merkle import ./merkleTestCases @@ -24,7 +24,7 @@ func isOkDigestNim( testcases: openarray[tuple[n:int,digest:F4]] ): bool = ok = false return ok -suite "merkle/Nim": +suite "poseidon2 merkle tree /Nim": test "merkle root of digest sequences": check isOkDigestNim( testcases_merkleroot ) diff --git a/tests/poseidon2/testPermutation.nim b/tests/goldilocks_hash/poseidon2/testPermutation.nim similarity index 92% rename from tests/poseidon2/testPermutation.nim rename to tests/goldilocks_hash/poseidon2/testPermutation.nim index de7b865..4cb0d59 100644 --- a/tests/poseidon2/testPermutation.nim +++ b/tests/goldilocks_hash/poseidon2/testPermutation.nim @@ -2,8 +2,8 @@ import std/unittest # import std/sequtils -import poseidon2/types -import poseidon2/permutation +import goldilocks_hash/types +import goldilocks_hash/poseidon2/permutation import ./permTestCases @@ -41,7 +41,7 @@ const refOut: F12 = #------------------------------------------------------------------------------- -suite "permutation": +suite "poseidon2 permutation": test "permutation of [0..11]": var input = toState(refInp) diff --git a/tests/poseidon2/testSponge.nim b/tests/goldilocks_hash/poseidon2/testSponge.nim similarity index 96% rename from tests/poseidon2/testSponge.nim rename to tests/goldilocks_hash/poseidon2/testSponge.nim index 426ef60..a407dc1 100644 --- a/tests/poseidon2/testSponge.nim +++ b/tests/goldilocks_hash/poseidon2/testSponge.nim @@ -2,8 +2,8 @@ import std/unittest # import std/sequtils -import poseidon2/types -import poseidon2/sponge +import goldilocks_hash/types +import goldilocks_hash/poseidon2/sponge import ./spongeTestCases @@ -29,7 +29,7 @@ func isOkFeltNim(r: static int, testcases: openarray[tuple[n:int,digest:F4]] ): ok = false return ok -suite "sponge/Nim": +suite "poseidon2 sponge /Nim": test "sponge for field elements w/ rate = 1": check isOkFeltNim( 1 , testcases_field_rate1 ) test "sponge for field elements w/ rate = 2": check isOkFeltNim( 2 , testcases_field_rate2 ) @@ -58,7 +58,7 @@ func isOkBytesC(r: static int, testcases: openarray[tuple[n:int,digest:F4]] ): b ok = false return ok -suite "sponge/C": +suite "poseidon2 sponge /C": test "sponge for field elements w/ rate = 1": check isOkFeltC( 1 , testcases_field_rate1 ) test "sponge for field elements w/ rate = 2": check isOkFeltC( 2 , testcases_field_rate2 ) diff --git a/tests/test.nim b/tests/test.nim index f81820a..eb08bbd 100644 --- a/tests/test.nim +++ b/tests/test.nim @@ -1,11 +1,8 @@ -#import ./poseidon2/testSpongeMerkle -#import ./poseidon2/testIo -#import ./poseidon2/testReadme -import ./poseidon2/testField -import ./poseidon2/testPermutation -import ./poseidon2/testCompress -import ./poseidon2/testSponge -import ./poseidon2/testMerkle +import ./goldilocks_hash/field/testField +import ./goldilocks_hash/poseidon2/testPermutation +import ./goldilocks_hash/poseidon2/testCompress +import ./goldilocks_hash/poseidon2/testSponge +import ./goldilocks_hash/poseidon2/testMerkle {.warning[UnusedImport]: off.}