From c35200f2262656920e893721a6e6477300dd3887 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Olivier=20B=C3=A9gassat?= Date: Tue, 12 May 2026 01:04:55 +0200 Subject: [PATCH] feat: tests for felt Poseidon Poseidon of - range(k) with k = 7, 16, 256 - [0]*k, with k = 1, 16, 256 more tests (65k u32 and 65k felt) added large test (262k felt and u32 Poseidon) Signed-off-by: DavePearce --- pkg/test/zkc_bench_test.go | 109 +++++++ pkg/test/zkc_unit_test.go | 4 - pkg/zkc/compiler/parser/parser.go | 2 +- pkg/zkc/vm/internal/word/word.go | 4 +- testdata/zkc/bench/poseidon/README.md | 41 +++ .../bench/poseidon/impl/felt/_mds_matrix.zkc | 20 ++ .../zkc/bench/poseidon/impl/felt/_results.zkc | 193 ++++++++++++ .../poseidon/impl/felt/_round_constants.zkc | 64 ++++ .../zkc/bench/poseidon/impl/felt/poseidon.zkc | 277 +++++++++++++++++ .../zkc/bench/poseidon/impl/felt/state.zkc | 55 ++++ .../bench/poseidon/impl/u32/_mds_matrix.zkc | 20 ++ .../zkc/bench/poseidon/impl/u32/_results.zkc | 193 ++++++++++++ .../poseidon/impl/u32/_round_constants.zkc | 64 ++++ .../zkc/bench/poseidon/impl/u32/poseidon.zkc | 290 ++++++++++++++++++ .../zkc/bench/poseidon/impl/u32/state.zkc | 53 ++++ .../poseidon/test/felt/permutation_01.accepts | 1 + .../poseidon/test/felt/permutation_01.zkc | 28 ++ .../poseidon_range_01.koalabear_16.accepts | 1 + .../poseidon/test/felt/poseidon_range_01.zkc | 41 +++ .../poseidon_range_02.koalabear_16.accepts | 1 + .../poseidon/test/felt/poseidon_range_02.zkc | 40 +++ .../poseidon_range_03.koalabear_16.accepts | 1 + .../poseidon/test/felt/poseidon_range_03.zkc | 39 +++ .../poseidon_zeros_01.koalabear_16.accepts | 1 + .../poseidon/test/felt/poseidon_zeros_01.zkc | 26 ++ .../poseidon_zeros_02.koalabear_16.accepts | 1 + .../poseidon/test/felt/poseidon_zeros_02.zkc | 26 ++ .../poseidon_zeros_03.koalabear_16.accepts | 1 + .../poseidon/test/felt/poseidon_zeros_03.zkc | 26 ++ ...poseidon_zeros_big_01.koalabear_16.accepts | 1 + .../test/felt/poseidon_zeros_big_01.zkc | 26 ++ ...poseidon_zeros_big_02.koalabear_16.accepts | 1 + .../test/felt/poseidon_zeros_big_02.zkc | 26 ++ ...poseidon_zeros_big_03.koalabear_16.accepts | 1 + .../test/felt/poseidon_zeros_big_03.zkc | 26 ++ .../zkc/bench/poseidon/test/felt/utils_01.zkc | 17 + .../zkc/bench/poseidon/test/felt/utils_02.zkc | 13 + .../zkc/bench/poseidon/test/felt/utils_03.zkc | 21 ++ .../zkc/bench/poseidon/test/felt/utils_04.zkc | 21 ++ .../zkc/bench/poseidon/test/felt/utils_05.zkc | 21 ++ .../poseidon/test/u32/permutation_01.accepts | 1 + .../poseidon/test/u32/permutation_01.zkc | 39 +++ .../poseidon/test/u32/poseidon1_01.acceptsX | 5 + .../poseidon/test/u32/poseidon_02.accepts | 1 + .../bench/poseidon/test/u32/poseidon_02.zkc | 38 +++ .../poseidon/test/u32/poseidon_03.accepts | 4 + .../bench/poseidon/test/u32/poseidon_03.zkc | 35 +++ .../poseidon_range_01.koalabear_16.accepts | 1 + .../poseidon/test/u32/poseidon_range_01.zkc | 40 +++ .../poseidon_range_02.koalabear_16.accepts | 1 + .../poseidon/test/u32/poseidon_range_02.zkc | 40 +++ .../poseidon_range_03.koalabear_16.accepts | 1 + .../poseidon/test/u32/poseidon_range_03.zkc | 40 +++ ...poseidon_zeros_big_01.koalabear_16.accepts | 1 + .../test/u32/poseidon_zeros_big_01.zkc | 25 ++ ...poseidon_zeros_big_02.koalabear_16.accepts | 1 + .../test/u32/poseidon_zeros_big_02.zkc | 25 ++ ...poseidon_zeros_big_03.koalabear_16.accepts | 1 + .../test/u32/poseidon_zeros_big_03.zkc | 25 ++ .../zkc/bench/poseidon/test/u32/utils_01.zkc | 17 + .../zkc/bench/poseidon/test/u32/utils_02.zkc | 13 + .../zkc/bench/poseidon/test/u32/utils_03.zkc | 21 ++ .../zkc/bench/poseidon/test/u32/utils_04.zkc | 21 ++ .../zkc/bench/poseidon/test/u32/utils_05.zkc | 22 ++ .../zkc/bench/poseidon/utils/constants.zkc | 21 ++ testdata/zkc/bench/poseidon/utils/memory.zkc | 7 + testdata/zkc/unit/felt_casting_01.accepts | 1 + testdata/zkc/unit/felt_casting_01.zkc | 17 + testdata/zkc/unit/felt_memory_01.accepts | 1 + testdata/zkc/unit/felt_memory_01.zkc | 25 ++ 70 files changed, 2279 insertions(+), 7 deletions(-) create mode 100644 testdata/zkc/bench/poseidon/README.md create mode 100644 testdata/zkc/bench/poseidon/impl/felt/_mds_matrix.zkc create mode 100644 testdata/zkc/bench/poseidon/impl/felt/_results.zkc create mode 100644 testdata/zkc/bench/poseidon/impl/felt/_round_constants.zkc create mode 100644 testdata/zkc/bench/poseidon/impl/felt/poseidon.zkc create mode 100644 testdata/zkc/bench/poseidon/impl/felt/state.zkc create mode 100644 testdata/zkc/bench/poseidon/impl/u32/_mds_matrix.zkc create mode 100644 testdata/zkc/bench/poseidon/impl/u32/_results.zkc create mode 100644 testdata/zkc/bench/poseidon/impl/u32/_round_constants.zkc create mode 100644 testdata/zkc/bench/poseidon/impl/u32/poseidon.zkc create mode 100644 testdata/zkc/bench/poseidon/impl/u32/state.zkc create mode 100644 testdata/zkc/bench/poseidon/test/felt/permutation_01.accepts create mode 100644 testdata/zkc/bench/poseidon/test/felt/permutation_01.zkc create mode 100644 testdata/zkc/bench/poseidon/test/felt/poseidon_range_01.koalabear_16.accepts create mode 100644 testdata/zkc/bench/poseidon/test/felt/poseidon_range_01.zkc create mode 100644 testdata/zkc/bench/poseidon/test/felt/poseidon_range_02.koalabear_16.accepts create mode 100644 testdata/zkc/bench/poseidon/test/felt/poseidon_range_02.zkc create mode 100644 testdata/zkc/bench/poseidon/test/felt/poseidon_range_03.koalabear_16.accepts create mode 100644 testdata/zkc/bench/poseidon/test/felt/poseidon_range_03.zkc create mode 100644 testdata/zkc/bench/poseidon/test/felt/poseidon_zeros_01.koalabear_16.accepts create mode 100644 testdata/zkc/bench/poseidon/test/felt/poseidon_zeros_01.zkc create mode 100644 testdata/zkc/bench/poseidon/test/felt/poseidon_zeros_02.koalabear_16.accepts create mode 100644 testdata/zkc/bench/poseidon/test/felt/poseidon_zeros_02.zkc create mode 100644 testdata/zkc/bench/poseidon/test/felt/poseidon_zeros_03.koalabear_16.accepts create mode 100644 testdata/zkc/bench/poseidon/test/felt/poseidon_zeros_03.zkc create mode 100644 testdata/zkc/bench/poseidon/test/felt/poseidon_zeros_big_01.koalabear_16.accepts create mode 100644 testdata/zkc/bench/poseidon/test/felt/poseidon_zeros_big_01.zkc create mode 100644 testdata/zkc/bench/poseidon/test/felt/poseidon_zeros_big_02.koalabear_16.accepts create mode 100644 testdata/zkc/bench/poseidon/test/felt/poseidon_zeros_big_02.zkc create mode 100644 testdata/zkc/bench/poseidon/test/felt/poseidon_zeros_big_03.koalabear_16.accepts create mode 100644 testdata/zkc/bench/poseidon/test/felt/poseidon_zeros_big_03.zkc create mode 100644 testdata/zkc/bench/poseidon/test/felt/utils_01.zkc create mode 100644 testdata/zkc/bench/poseidon/test/felt/utils_02.zkc create mode 100644 testdata/zkc/bench/poseidon/test/felt/utils_03.zkc create mode 100644 testdata/zkc/bench/poseidon/test/felt/utils_04.zkc create mode 100644 testdata/zkc/bench/poseidon/test/felt/utils_05.zkc create mode 100644 testdata/zkc/bench/poseidon/test/u32/permutation_01.accepts create mode 100644 testdata/zkc/bench/poseidon/test/u32/permutation_01.zkc create mode 100644 testdata/zkc/bench/poseidon/test/u32/poseidon1_01.acceptsX create mode 100644 testdata/zkc/bench/poseidon/test/u32/poseidon_02.accepts create mode 100644 testdata/zkc/bench/poseidon/test/u32/poseidon_02.zkc create mode 100644 testdata/zkc/bench/poseidon/test/u32/poseidon_03.accepts create mode 100644 testdata/zkc/bench/poseidon/test/u32/poseidon_03.zkc create mode 100644 testdata/zkc/bench/poseidon/test/u32/poseidon_range_01.koalabear_16.accepts create mode 100644 testdata/zkc/bench/poseidon/test/u32/poseidon_range_01.zkc create mode 100644 testdata/zkc/bench/poseidon/test/u32/poseidon_range_02.koalabear_16.accepts create mode 100644 testdata/zkc/bench/poseidon/test/u32/poseidon_range_02.zkc create mode 100644 testdata/zkc/bench/poseidon/test/u32/poseidon_range_03.koalabear_16.accepts create mode 100644 testdata/zkc/bench/poseidon/test/u32/poseidon_range_03.zkc create mode 100644 testdata/zkc/bench/poseidon/test/u32/poseidon_zeros_big_01.koalabear_16.accepts create mode 100644 testdata/zkc/bench/poseidon/test/u32/poseidon_zeros_big_01.zkc create mode 100644 testdata/zkc/bench/poseidon/test/u32/poseidon_zeros_big_02.koalabear_16.accepts create mode 100644 testdata/zkc/bench/poseidon/test/u32/poseidon_zeros_big_02.zkc create mode 100644 testdata/zkc/bench/poseidon/test/u32/poseidon_zeros_big_03.koalabear_16.accepts create mode 100644 testdata/zkc/bench/poseidon/test/u32/poseidon_zeros_big_03.zkc create mode 100644 testdata/zkc/bench/poseidon/test/u32/utils_01.zkc create mode 100644 testdata/zkc/bench/poseidon/test/u32/utils_02.zkc create mode 100644 testdata/zkc/bench/poseidon/test/u32/utils_03.zkc create mode 100644 testdata/zkc/bench/poseidon/test/u32/utils_04.zkc create mode 100644 testdata/zkc/bench/poseidon/test/u32/utils_05.zkc create mode 100644 testdata/zkc/bench/poseidon/utils/constants.zkc create mode 100644 testdata/zkc/bench/poseidon/utils/memory.zkc create mode 100644 testdata/zkc/unit/felt_casting_01.accepts create mode 100644 testdata/zkc/unit/felt_casting_01.zkc create mode 100644 testdata/zkc/unit/felt_memory_01.accepts create mode 100644 testdata/zkc/unit/felt_memory_01.zkc diff --git a/pkg/test/zkc_bench_test.go b/pkg/test/zkc_bench_test.go index 3a39017b4..1cd1b9197 100644 --- a/pkg/test/zkc_bench_test.go +++ b/pkg/test/zkc_bench_test.go @@ -57,6 +57,115 @@ func Test_ZkcBench_Keccakf(t *testing.T) { /*func Test_ZkcBench_KeccakfBatched(t *testing.T) { checkZkcBench(t, "zkc/bench/keccakf_batched", field.BLS12_377, field.KOALABEAR_16) }*/ +// =================================================================== +// Poseidon utils tests +// =================================================================== + +func Test_ZkcBench_Poseidon_u32_utils_01(t *testing.T) { + checkZkcBench(t, "zkc/bench/poseidon/test/u32/utils_01", field.KOALABEAR_16) +} +func Test_ZkcBench_Poseidon_u32_utils_02(t *testing.T) { + checkZkcBench(t, "zkc/bench/poseidon/test/u32/utils_02", field.KOALABEAR_16) +} +func Test_ZkcBench_Poseidon_u32_utils_03(t *testing.T) { + checkZkcBench(t, "zkc/bench/poseidon/test/u32/utils_03", field.KOALABEAR_16) +} +func Test_ZkcBench_Poseidon_u32_utils_04(t *testing.T) { + checkZkcBench(t, "zkc/bench/poseidon/test/u32/utils_04", field.KOALABEAR_16) +} +func Test_ZkcBench_Poseidon_u32_utils_05(t *testing.T) { + checkZkcBench(t, "zkc/bench/poseidon/test/u32/utils_05", field.KOALABEAR_16) +} + +// =================================================================== +// Poseidon u32 tests +// =================================================================== + +func Test_ZkcBench_Poseidon_u32_Permutation_01(t *testing.T) { + checkZkcBench(t, "zkc/bench/poseidon/test/u32/permutation_01", field.KOALABEAR_16) +} +func Test_ZkcBench_Poseidon_u32_Range_01(t *testing.T) { + checkZkcBench(t, "zkc/bench/poseidon/test/u32/poseidon_range_01", field.KOALABEAR_16) +} +func Test_ZkcBench_Poseidon_u32_Range_02(t *testing.T) { + checkZkcBench(t, "zkc/bench/poseidon/test/u32/poseidon_range_02", field.KOALABEAR_16) +} +func Test_ZkcBench_Poseidon_u32_Range_03(t *testing.T) { + checkZkcBench(t, "zkc/bench/poseidon/test/u32/poseidon_range_03", field.KOALABEAR_16) +} + +func Test_ZkcBench_Poseidon_u32_Zeros_Big_01(t *testing.T) { + checkZkcBench(t, "zkc/bench/poseidon/test/u32/poseidon_zeros_big_01", field.KOALABEAR_16) +} + +// // these tests are long: > 1min +// func Test_ZkcBench_Poseidon_u32_Zeros_Big_02(t *testing.T) { +// checkZkcBench(t, "zkc/bench/poseidon/test/u32/poseidon_zeros_big_02", field.KOALABEAR_16) +// } +// func Test_ZkcBench_Poseidon_u32_Zeros_Big_03(t *testing.T) { +// checkZkcBench(t, "zkc/bench/poseidon/test/u32/poseidon_zeros_big_03", field.KOALABEAR_16) +// } + +// =================================================================== +// Poseidon utils tests +// =================================================================== + +func Test_ZkcBench_Poseidon_felt_utils_01(t *testing.T) { + checkZkcBench(t, "zkc/bench/poseidon/test/felt/utils_01", field.KOALABEAR_16) +} +func Test_ZkcBench_Poseidon_felt_utils_02(t *testing.T) { + checkZkcBench(t, "zkc/bench/poseidon/test/felt/utils_02", field.KOALABEAR_16) +} +func Test_ZkcBench_Poseidon_felt_utils_03(t *testing.T) { + checkZkcBench(t, "zkc/bench/poseidon/test/felt/utils_03", field.KOALABEAR_16) +} +func Test_ZkcBench_Poseidon_felt_utils_04(t *testing.T) { + checkZkcBench(t, "zkc/bench/poseidon/test/felt/utils_04", field.KOALABEAR_16) +} +func Test_ZkcBench_Poseidon_felt_utils_05(t *testing.T) { + checkZkcBench(t, "zkc/bench/poseidon/test/felt/utils_05", field.KOALABEAR_16) +} + +// =================================================================== +// Poseidon felt tests +// =================================================================== + +func Test_ZkcBench_Poseidon_felt_Permutation_01(t *testing.T) { + checkZkcBench(t, "zkc/bench/poseidon/test/felt/permutation_01", field.KOALABEAR_16) +} +func Test_ZkcBench_Poseidon_felt_Range_01(t *testing.T) { + checkZkcBench(t, "zkc/bench/poseidon/test/felt/poseidon_range_01", field.KOALABEAR_16) +} +func Test_ZkcBench_Poseidon_felt_Range_02(t *testing.T) { + checkZkcBench(t, "zkc/bench/poseidon/test/felt/poseidon_range_02", field.KOALABEAR_16) +} +func Test_ZkcBench_Poseidon_felt_Range_03(t *testing.T) { + checkZkcBench(t, "zkc/bench/poseidon/test/felt/poseidon_range_03", field.KOALABEAR_16) +} +func Test_ZkcBench_Poseidon_felt_Zeros_01(t *testing.T) { + checkZkcBench(t, "zkc/bench/poseidon/test/felt/poseidon_zeros_01", field.KOALABEAR_16) +} +func Test_ZkcBench_Poseidon_felt_Zeros_02(t *testing.T) { + checkZkcBench(t, "zkc/bench/poseidon/test/felt/poseidon_zeros_02", field.KOALABEAR_16) +} +func Test_ZkcBench_Poseidon_felt_Zeros_03(t *testing.T) { + checkZkcBench(t, "zkc/bench/poseidon/test/felt/poseidon_zeros_03", field.KOALABEAR_16) +} +func Test_ZkcBench_Poseidon_felt_Zeros_Big_01(t *testing.T) { + checkZkcBench(t, "zkc/bench/poseidon/test/felt/poseidon_zeros_big_01", field.KOALABEAR_16) +} + +// // these tests are long: > 1min +// func Test_ZkcBench_Poseidon_felt_Zeros_Big_02(t *testing.T) { +// checkZkcBench(t, "zkc/bench/poseidon/test/felt/poseidon_zeros_big_02", field.KOALABEAR_16) +// } +// func Test_ZkcBench_Poseidon_felt_Zeros_Big_03(t *testing.T) { +// checkZkcBench(t, "zkc/bench/poseidon/test/felt/poseidon_zeros_big_03", field.KOALABEAR_16) +// } + +// =================================================================== +// Other tests +// =================================================================== func Test_ZkcBench_Sort(t *testing.T) { checkZkcBench(t, "zkc/bench/sort", field.BLS12_377, field.KOALABEAR_16) diff --git a/pkg/test/zkc_unit_test.go b/pkg/test/zkc_unit_test.go index 79c34812c..b93733bd7 100644 --- a/pkg/test/zkc_unit_test.go +++ b/pkg/test/zkc_unit_test.go @@ -804,7 +804,3 @@ func Test_ZkcUnit_SkipIf_05(t *testing.T) { func checkZkcUnit(t *testing.T, test string, config util.Config) { util.CheckValid(t, test, "zkc", config.Words(vm.WORD_UINT, vm.WORD_UINT64)) } - -// =================================================================== -// Field element -// =================================================================== diff --git a/pkg/zkc/compiler/parser/parser.go b/pkg/zkc/compiler/parser/parser.go index 48198a648..a3e99bdb2 100644 --- a/pkg/zkc/compiler/parser/parser.go +++ b/pkg/zkc/compiler/parser/parser.go @@ -246,7 +246,7 @@ func (p *Parser) tokenStrings(toks []lex.Token) []string { return names } -// parseConstant parses a constants declation which must be of the form +// parseConstant parses a constants declaration which must be of the form // // const cdef (, cdef)* // diff --git a/pkg/zkc/vm/internal/word/word.go b/pkg/zkc/vm/internal/word/word.go index 92e456890..6bbc56535 100644 --- a/pkg/zkc/vm/internal/word/word.go +++ b/pkg/zkc/vm/internal/word/word.go @@ -34,8 +34,8 @@ type Base[W any] interface { // values within the machine. The reason for abstracting this concept is to // allow a machine compiled for a larger word size to be automatically lowered // to a machine for a smaller word size. For example, our source program might -// be written for a 64bit machine and we wish to executed it on 16bit machine -// (i.e. because our target field configuration has a maximum register size of +// be written for a 64bit machine and we wish to execute it on 16bit machine +// (e.g. because our target field configuration has a maximum register size of // 16bits). type Word[W any] interface { // Add two words together, producing another (along with an overflow bit). diff --git a/testdata/zkc/bench/poseidon/README.md b/testdata/zkc/bench/poseidon/README.md new file mode 100644 index 000000000..c2017cad6 --- /dev/null +++ b/testdata/zkc/bench/poseidon/README.md @@ -0,0 +1,41 @@ +# Generating data + +The Poseidon hash function requires two pieces of data besides the (nonempty) input byte slice: + +- the mds matrix of size t×t +- the round constants a matrix of size r×t + where t ≡ state width t and r ≡ total rounds. + +This data can be generated using the [poseidon-tools](https://github.com/khovratovich/poseidon-tools) library. + +## Generating an mds matrix + +The following generates the MDS matrix for the koalabear prime with state width 16. + +```bash + python3 +>>> from poseidon.mds_matrix import generate_mds_matrix +>>> KOALABEAR_P = 2130706433 +>>> STATE_WIDTH = 16 +>>> [[f"{k:08x}" for k in l] for l in generate_mds_matrix(STATE_WIDTH, KOALABEAR_P)] +``` + +## Getting round constants + +For the round constants I used `_KB_ROUND_CONSTANTS_16` from the tests of that repo. + +## Stuff + +```bash + python3 +>>> from poseidon.poseidon import Poseidon +>>> KOALABEAR_P = 2130706433 +>>> pos = Poseidon(prime=KOALABEAR_P, alpha=3, t=16, r_f=8, r_p=20) +# t is the state_width, no rate is specified (it defaults to t-1), r_f is the number of full rounds (which has to be +# even), r_p that of partial rounds +>>> pos.sponge_hash(list(range(16)), 1) +[584229223] +>>> pos.sponge_hash(list(range(16)), 15) +[584229223, 1225903167, 435734976, 745693090, 1580884015, 1393870516, 1514786559, 1416327482, 401740899, 305698337, 123847430, 1985271412, 660999169, 1953826170, 1390527262] +# 1 and 15 are the respectve output_size's, which have to be ≤ rate +``` diff --git a/testdata/zkc/bench/poseidon/impl/felt/_mds_matrix.zkc b/testdata/zkc/bench/poseidon/impl/felt/_mds_matrix.zkc new file mode 100644 index 000000000..0c46f0cc7 --- /dev/null +++ b/testdata/zkc/bench/poseidon/impl/felt/_mds_matrix.zkc @@ -0,0 +1,20 @@ +// STATE_WIDTH × STATE_WIDTH matrix +// M_{a,b} = Mij with ij = 16 × a + b +static mds_matrix(ij:u8) -> (Mij:𝔽) { + 0x07f00000, 0x0ef0f0f1, 0x23471c72, 0x281af287, 0x6bf33334, 0x42861862, 0x1cdd1746, 0x2c2c8591, 0x59f55556, 0x6fc28f5d, 0x5ccec4ed, 0x41da12f7, 0x7164924a, 0x5bf72c24, 0x47f77778, 0x4dd6b5ae, + 0x10eeeeef, 0x07f00000, 0x0ef0f0f1, 0x23471c72, 0x281af287, 0x6bf33334, 0x42861862, 0x1cdd1746, 0x2c2c8591, 0x59f55556, 0x6fc28f5d, 0x5ccec4ed, 0x41da12f7, 0x7164924a, 0x5bf72c24, 0x47f77778, + 0x63c92493, 0x10eeeeef, 0x07f00000, 0x0ef0f0f1, 0x23471c72, 0x281af287, 0x6bf33334, 0x42861862, 0x1cdd1746, 0x2c2c8591, 0x59f55556, 0x6fc28f5d, 0x5ccec4ed, 0x41da12f7, 0x7164924a, 0x5bf72c24, + 0x3a9d89d9, 0x63c92493, 0x10eeeeef, 0x07f00000, 0x0ef0f0f1, 0x23471c72, 0x281af287, 0x6bf33334, 0x42861862, 0x1cdd1746, 0x2c2c8591, 0x59f55556, 0x6fc28f5d, 0x5ccec4ed, 0x41da12f7, 0x7164924a, + 0x34eaaaab, 0x3a9d89d9, 0x63c92493, 0x10eeeeef, 0x07f00000, 0x0ef0f0f1, 0x23471c72, 0x281af287, 0x6bf33334, 0x42861862, 0x1cdd1746, 0x2c2c8591, 0x59f55556, 0x6fc28f5d, 0x5ccec4ed, 0x41da12f7, + 0x39ba2e8c, 0x34eaaaab, 0x3a9d89d9, 0x63c92493, 0x10eeeeef, 0x07f00000, 0x0ef0f0f1, 0x23471c72, 0x281af287, 0x6bf33334, 0x42861862, 0x1cdd1746, 0x2c2c8591, 0x59f55556, 0x6fc28f5d, 0x5ccec4ed, + 0x58e66667, 0x39ba2e8c, 0x34eaaaab, 0x3a9d89d9, 0x63c92493, 0x10eeeeef, 0x07f00000, 0x0ef0f0f1, 0x23471c72, 0x281af287, 0x6bf33334, 0x42861862, 0x1cdd1746, 0x2c2c8591, 0x59f55556, 0x6fc28f5d, + 0x468e38e4, 0x58e66667, 0x39ba2e8c, 0x34eaaaab, 0x3a9d89d9, 0x63c92493, 0x10eeeeef, 0x07f00000, 0x0ef0f0f1, 0x23471c72, 0x281af287, 0x6bf33334, 0x42861862, 0x1cdd1746, 0x2c2c8591, 0x59f55556, + 0x0fe00000, 0x468e38e4, 0x58e66667, 0x39ba2e8c, 0x34eaaaab, 0x3a9d89d9, 0x63c92493, 0x10eeeeef, 0x07f00000, 0x0ef0f0f1, 0x23471c72, 0x281af287, 0x6bf33334, 0x42861862, 0x1cdd1746, 0x2c2c8591, + 0x48924925, 0x0fe00000, 0x468e38e4, 0x58e66667, 0x39ba2e8c, 0x34eaaaab, 0x3a9d89d9, 0x63c92493, 0x10eeeeef, 0x07f00000, 0x0ef0f0f1, 0x23471c72, 0x281af287, 0x6bf33334, 0x42861862, 0x1cdd1746, + 0x69d55556, 0x48924925, 0x0fe00000, 0x468e38e4, 0x58e66667, 0x39ba2e8c, 0x34eaaaab, 0x3a9d89d9, 0x63c92493, 0x10eeeeef, 0x07f00000, 0x0ef0f0f1, 0x23471c72, 0x281af287, 0x6bf33334, 0x42861862, + 0x32cccccd, 0x69d55556, 0x48924925, 0x0fe00000, 0x468e38e4, 0x58e66667, 0x39ba2e8c, 0x34eaaaab, 0x3a9d89d9, 0x63c92493, 0x10eeeeef, 0x07f00000, 0x0ef0f0f1, 0x23471c72, 0x281af287, 0x6bf33334, + 0x1fc00000, 0x32cccccd, 0x69d55556, 0x48924925, 0x0fe00000, 0x468e38e4, 0x58e66667, 0x39ba2e8c, 0x34eaaaab, 0x3a9d89d9, 0x63c92493, 0x10eeeeef, 0x07f00000, 0x0ef0f0f1, 0x23471c72, 0x281af287, + 0x54aaaaab, 0x1fc00000, 0x32cccccd, 0x69d55556, 0x48924925, 0x0fe00000, 0x468e38e4, 0x58e66667, 0x39ba2e8c, 0x34eaaaab, 0x3a9d89d9, 0x63c92493, 0x10eeeeef, 0x07f00000, 0x0ef0f0f1, 0x23471c72, + 0x3f800000, 0x54aaaaab, 0x1fc00000, 0x32cccccd, 0x69d55556, 0x48924925, 0x0fe00000, 0x468e38e4, 0x58e66667, 0x39ba2e8c, 0x34eaaaab, 0x3a9d89d9, 0x63c92493, 0x10eeeeef, 0x07f00000, 0x0ef0f0f1, + 0x7f000000, 0x3f800000, 0x54aaaaab, 0x1fc00000, 0x32cccccd, 0x69d55556, 0x48924925, 0x0fe00000, 0x468e38e4, 0x58e66667, 0x39ba2e8c, 0x34eaaaab, 0x3a9d89d9, 0x63c92493, 0x10eeeeef, 0x07f00000 +} diff --git a/testdata/zkc/bench/poseidon/impl/felt/_results.zkc b/testdata/zkc/bench/poseidon/impl/felt/_results.zkc new file mode 100644 index 000000000..2916d885e --- /dev/null +++ b/testdata/zkc/bench/poseidon/impl/felt/_results.zkc @@ -0,0 +1,193 @@ +// results are obtained with the following command +// python3 -c "from poseidon.poseidon import Poseidon; KOALABEAR_P = 2130706433; pos = Poseidon(prime=KOALABEAR_P, alpha=3, t=16, r_f=8, r_p=20); pos.sponge_hash(range(XXX), 15)" > output.txt 2>&1 +// replacing XXX with 7, 16, 256 respectively and copying the result + +static results_poseidon_range_7(ij:u8) -> (Rij:𝔽) { + 0x362e517e, + 0x2046663b, + 0x6f66ef6b, + 0x3dbaf0c1, + 0x2319f56b, + 0x64e61516, + 0x4c624307, + 0x6f0be16c, + 0x4802e7c3, + 0x2cac08b4, + 0x6ac517b0, + 0x2743eb39, + 0x6b826249, + 0x65ca07ee, + 0x48bc5b1b, + 0x356e26d8, +} + +static results_poseidon_range_16(ij:u8) -> (Rij:𝔽) { + 0x22d2a167, + 0x4911cc3f, + 0x19f8c9c0, + 0x2c725fa2, + 0x5e3a602f, + 0x5314c6b4, + 0x5a49ceff, + 0x546b713a, + 0x17f21463, + 0x12389621, + 0x0761c306, + 0x7654d674, + 0x27660c01, + 0x7475057a, + 0x52e1c31e, + 0x61973dfb, +} + +static results_poseidon_range_256(ij:u8) -> (Rij:𝔽) { + 0x271c8229, + 0x727a7388, + 0x62edde19, + 0x07da259c, + 0x42e1642f, + 0x25512854, + 0x0984d864, + 0x28192e26, + 0x0c884443, + 0x515d24f6, + 0x6192dcd5, + 0x15453862, + 0x1223175e, + 0x5fe133e8, + 0x69b186d1, + 0x4d04e284, +} + +static results_poseidon_zeros_1(ij:u8) -> (Rij:𝔽) { + 0x575cd201, + 0x7a759ad4, + 0x4c8b5cee, + 0x71899383, + 0x5b501db2, + 0x7112a138, + 0x4630624f, + 0x61f01af4, + 0x323a1379, + 0x328b53b9, + 0x13c26fa2, + 0x3ed3287c, + 0x79811d70, + 0x5ccaf1c6, + 0x07b0fd6d, + 0x7c4e9f27, +} + +static results_poseidon_zeros_16(ij:u8) -> (Rij:𝔽) { + 0x5a5faf93, + 0x44476824, + 0x7e77d1aa, + 0x49b298ff, + 0x1682d9d0, + 0x3aec1bbb, + 0x2e78f3e5, + 0x5cd0366d, + 0x68bbd72d, + 0x79f1c79b, + 0x644e1d28, + 0x1ed961f0, + 0x11e7672a, + 0x4ba86f19, + 0x1ec73662, + 0x06a05093, +} + +static results_poseidon_zeros_256(ij:u8) -> (Rij:𝔽) { + 0x6fbb7934, + 0x40f944a4, + 0x0ee275f0, + 0x0545e8b7, + 0x5d8950d6, + 0x23d1b013, + 0x6a53c5cf, + 0x7d588984, + 0x4cb562a5, + 0x3d08f400, + 0x43c210d2, + 0x572309e4, + 0x2570ad53, + 0x7accb79c, + 0x13db0bb8, + 0x0e21f8b2, +} + +static results_poseidon_zeros_2_to_the_14(ij:u8) -> (Rij:𝔽) { + 0x48cdf234, + 0x5bdf842d, + 0x4cb1e4bb, + 0x65ba3c36, + 0x30a42a01, + 0x0e71b7b5, + 0x2383338c, + 0x3a0e52b1, + 0x6fccc541, + 0x2183b55e, + 0x6d9c0e76, + 0x6e6db189, + 0x1fe48215, + 0x51228e9b, + 0x58999987, + 0x0088c3bd, +} + +static results_poseidon_zeros_2_to_the_16(ij:u8) -> (Rij:𝔽) { + 0x1bb62370, + 0x17f76303, + 0x3b21106c, + 0x5d260ef2, + 0x69a5b09e, + 0x5c5a5e12, + 0x4b9e4318, + 0x2e467f54, + 0x78819a30, + 0x46b74f95, + 0x2cb26af6, + 0x07f4242c, + 0x1d60b807, + 0x1f66ad60, + 0x5abf7644, + 0x4a27fb88, +} + +static results_poseidon_zeros_2_to_the_18(ij:u8) -> (Rij:𝔽) { + 0x4952180a, + 0x1bae33c0, + 0x67da8b52, + 0x35410fef, + 0x3a1c5841, + 0x6a2f6a31, + 0x0c32646b, + 0x5a47019b, + 0x749311b0, + 0x7de625b5, + 0x2bee65b8, + 0x48d451d3, + 0x2ad561b1, + 0x22d44298, + 0x6e3fb781, + 0x0894eb57, +} + +static results_poseidon_zeros_2_to_the_20(ij:u8) -> (Rij:𝔽) { + 0x5d3806af, + 0x19db630e, + 0x116a1a97, + 0x3b89dee4, + 0x3b50d1f5, + 0x3f828727, + 0x13d03e94, + 0x4a6aeeb6, + 0x0c0ed47f, + 0x3cb2340c, + 0x4b12db5a, + 0x720e22e5, + 0x4def8c36, + 0x1c22abd7, + 0x67cd7e44, + 0x6d51f595, +} diff --git a/testdata/zkc/bench/poseidon/impl/felt/_round_constants.zkc b/testdata/zkc/bench/poseidon/impl/felt/_round_constants.zkc new file mode 100644 index 000000000..0ae995858 --- /dev/null +++ b/testdata/zkc/bench/poseidon/impl/felt/_round_constants.zkc @@ -0,0 +1,64 @@ +// 28 rows ≡ 28 rounds +// ≡ 4 + 20 + 4 +// ≡ 4 (full) + 20 (prtl) + 4 (full) +static round_constants(ij:u16) -> (Rij:𝔽) { + 0x7ee56a48, 0x11367045, 0x12e41941, 0x7ebbc12b, 0x1970b7d5, 0x662b60e8, 0x3e4990c6, 0x679f91f5, 0x350813bb, 0x00874ad4, 0x28a0081a, 0x18fa5872, 0x5f25b071, 0x5e5d5998, 0x5e6fd3e7, 0x5b2e2660, + 0x6f1837bf, 0x3fe6182b, 0x1edd7ac5, 0x57470d00, 0x43d486d5, 0x1982c70f, 0x0ea53af9, 0x61d6165b, 0x51639c00, 0x2dec352c, 0x2950e531, 0x2d2cb947, 0x08256cef, 0x1a0109f6, 0x1f51faf3, 0x5cef1c62, + 0x3d65e50e, 0x33d91626, 0x133d5a1e, 0x0ff49b0d, 0x38900cd1, 0x2c22cc3f, 0x28852bb2, 0x06c65a02, 0x7b2cf7bc, 0x68016e1a, 0x15e16bc0, 0x5248149a, 0x6dd212a0, 0x18d6830a, 0x5001be82, 0x64dac34e, + 0x5902b287, 0x426583a0, 0x0c921632, 0x3fe028a5, 0x245f8e49, 0x43bb297e, 0x7873dbd9, 0x3cc987df, 0x286bb4ce, 0x640a8dcd, 0x512a8e36, 0x03a4cf55, 0x481837a2, 0x03d6da84, 0x73726ac7, 0x760e7fdf, + 0x54dfeb5d, 0x7d40afd6, 0x722cb316, 0x106a4573, 0x45a7ccdb, 0x44061375, 0x154077a5, 0x45744faa, 0x4eb5e5ee, 0x3794e83f, 0x47c7093c, 0x5694903c, 0x69cb6299, 0x373df84c, 0x46a0df58, 0x46b8758a, + 0x3241ebcb, 0x0b09d233, 0x1af42357, 0x1e66cec2, 0x43e7dc24, 0x259a5d61, 0x27e85a3b, 0x1b9133fa, 0x343e5628, 0x485cd4c2, 0x16e269f5, 0x165b60c6, 0x25f683d9, 0x124f81f9, 0x174331f9, 0x77344dc5, + 0x5a821dba, 0x5fc4177f, 0x54153bf5, 0x5e3f1194, 0x3bdbf191, 0x088c84a3, 0x68256c9b, 0x3c90bbc6, 0x6846166a, 0x03f4238d, 0x463335fb, 0x5e3d3551, 0x6e59ae6f, 0x32d06cc0, 0x596293f3, 0x6c87edb2, + 0x08fc60b5, 0x34bcca80, 0x24f007f3, 0x62731c6f, 0x1e1db6c6, 0x0ca409bb, 0x585c1e78, 0x56e94edc, 0x16d22734, 0x18e11467, 0x7b2c3730, 0x770075e4, 0x35d1b18c, 0x22be3db5, 0x4fb1fbb7, 0x477cb3ed, + 0x7d5311c6, 0x5b62ae7d, 0x559c5fa8, 0x77f15048, 0x3211570b, 0x490fef6a, 0x77ec311f, 0x2247171b, 0x4e0ac711, 0x2edf69c9, 0x3b5a8850, 0x65809421, 0x5619b4aa, 0x362019a7, 0x6bf9d4ed, 0x5b413dff, + 0x617e181e, 0x5e7ab57b, 0x33ad7833, 0x3466c7ca, 0x6488dff4, 0x71f068f4, 0x056e891f, 0x04f1eccc, 0x663257d5, 0x671e31b9, 0x5871987c, 0x280c109e, 0x2a227761, 0x350a25e9, 0x5b91b1c4, 0x7a073546, + 0x01826270, 0x53a67720, 0x0ed4b074, 0x34cf0c4e, 0x6e751e88, 0x29bd5f59, 0x49ec32df, 0x7693452b, 0x3cf09e58, 0x6ba0e2bf, 0x7ab93acf, 0x3ce597df, 0x536e3d42, 0x147a808d, 0x5e32eb56, 0x5a203323, + 0x50965766, 0x6d44b7c5, 0x6698636a, 0x57b84f9f, 0x554b61b9, 0x6da0ab28, 0x1585b6ac, 0x6705a2b4, 0x152872f6, 0x0f4409fd, 0x23a9dd60, 0x6f2b18d4, 0x65ac9fd4, 0x2f0efbea, 0x591e67fd, 0x217ca19b, + 0x469c90ca, 0x03d60ef5, 0x4ea7857e, 0x07c86a4f, 0x288ed461, 0x2fe51b22, 0x7e293614, 0x2c4beb85, 0x5b0b7d11, 0x1e17dff6, 0x089beae1, 0x0a5acf1a, 0x2fc33d8f, 0x60422dc6, 0x6e1dc939, 0x635351b9, + 0x55522fc0, 0x3eb94ef7, 0x2a24a65c, 0x2e139c76, 0x51391144, 0x78cc0742, 0x579538f9, 0x44de9aae, 0x3c2f1e2e, 0x195747be, 0x2496339c, 0x650b2e39, 0x52899665, 0x6cb35558, 0x0f461c1c, 0x70f6b270, + 0x3faaa36f, 0x62e3348a, 0x672167cb, 0x394c880b, 0x2a46ba82, 0x63ffb74a, 0x1cf875d6, 0x53d12772, 0x036a4552, 0x3bdd9f2b, 0x02f72c24, 0x02b6006c, 0x077fe158, 0x1f9d6ea4, 0x20904d6f, 0x5d6534fa, + 0x066d8974, 0x6198f1f4, 0x26301ab4, 0x41f274c2, 0x00eac15c, 0x28b54b47, 0x2339739d, 0x48c6281c, 0x4ed935fc, 0x3f9187fa, 0x4a1930a6, 0x3ad4d736, 0x0f3f1889, 0x635a388f, 0x2862c145, 0x277ed1e8, + 0x4db23cad, 0x1f1b11f5, 0x1f3dba2b, 0x1c26eb4e, 0x0f7f5546, 0x6cd024b0, 0x67c47902, 0x793b8900, 0x0e8a283c, 0x4590b7ea, 0x6f567a2b, 0x5dc97300, 0x15247bc6, 0x50567fcb, 0x133eff84, 0x547dc2ef, + 0x34eb3dbb, 0x12402317, 0x66c6ae49, 0x174338b6, 0x24251008, 0x1b514927, 0x062d98d6, 0x7af30bbc, 0x26af15e8, 0x70d907a3, 0x5dfc5cac, 0x731f27ec, 0x53aa7d3f, 0x63ab0ec6, 0x216053f4, 0x18796b39, + 0x19156afd, 0x5eea6973, 0x6704c6a9, 0x0dce002b, 0x331169c0, 0x714d7178, 0x3ddaffaf, 0x7e464957, 0x20ca59ea, 0x679820c9, 0x42ef21a1, 0x798ea089, 0x14a74fa3, 0x0c06cf18, 0x6a4c8d52, 0x620f6d81, + 0x2220901a, 0x5277bb90, 0x230bf95e, 0x0ad8847a, 0x5e96e8b6, 0x77b4056e, 0x70a50d2c, 0x5f0eed59, 0x3646c4df, 0x10eb9a87, 0x21eed6b7, 0x534add36, 0x6e3e7421, 0x2b25810e, 0x1d8f707b, 0x45318a1a, + 0x677f8ff2, 0x0258c9e0, 0x4cd02a00, 0x2e24ff15, 0x634a715d, 0x4ac01e59, 0x601511e1, 0x26e9c01a, 0x4c165c6e, 0x57cd1140, 0x3ac6543b, 0x6787d847, 0x037dfbf9, 0x6dd9d079, 0x4d24b281, 0x2a6f407d, + 0x0131df8e, 0x4b8a7896, 0x23700858, 0x2cf5e534, 0x12aafc3f, 0x54568d03, 0x1a250735, 0x5331686d, 0x4ce76d91, 0x799c1a8c, 0x2b7a8ac9, 0x60aee672, 0x74f7421c, 0x3c42146d, 0x26d369c5, 0x4ae54a12, + 0x7eea16d1, 0x5ce3eae8, 0x69f28994, 0x262b8642, 0x610d4cc4, 0x5e1af21c, 0x1a8526d0, 0x316b127b, 0x3576fe5d, 0x02d968a0, 0x4ba00f51, 0x40bed993, 0x377fb907, 0x7859216e, 0x1931d9d1, 0x53b0934e, + 0x71914ff7, 0x4eabae6c, 0x7196468e, 0x164b3cc2, 0x58cb66c0, 0x4c147307, 0x6b3afccd, 0x4236518b, 0x4ad85605, 0x291382e1, 0x1e89b6cf, 0x5e16c3a8, 0x2e675921, 0x24300954, 0x05e555c3, 0x78880a24, + 0x763a3125, 0x4f53b240, 0x18b7fa43, 0x2bbe8a73, 0x1c9a12f2, 0x3f6fd40d, 0x0e1d4ec4, 0x1361c64d, 0x09a8f470, 0x03d23a40, 0x109ad290, 0x28c2fb88, 0x3b6498f2, 0x74d8be57, 0x6a4277d2, 0x18c2b3d4, + 0x6252c30c, 0x07cc2560, 0x209fe15b, 0x52a55fac, 0x4df19eb7, 0x02521116, 0x5e414ff1, 0x3cd9a1f4, 0x005aad15, 0x27a53f00, 0x72bbe9cb, 0x71d8bd7d, 0x4194b79a, 0x48e87a72, 0x3341553c, 0x63d34faa, + 0x132a01e3, 0x3833e2d9, 0x49726e04, 0x054957f8, 0x7b71bce4, 0x73eec57d, 0x556e5533, 0x1fa93fde, 0x346a8ca8, 0x1162dfde, 0x5c30d028, 0x094a4294, 0x3052dcda, 0x37988498, 0x51f06b97, 0x65848779, + 0x7599b0d4, 0x436fdabc, 0x66c5b77d, 0x40c86a9e, 0x27e7055b, 0x6d0dd9d8, 0x7e5598b5, 0x1a4d04f3, 0x5e3b2bc7, 0x533b5b2f, 0x3e33a125, 0x664d71ce, 0x382e6c2a, 0x24c4eb6e, 0x13f246f7, 0x07e2d7ef +} + +static default_round_constants(ij:u16) -> (Rij:𝔽) { + 0x177366cd, 0x4b6952d1, 0x184dc725, 0x4368079e, 0x182b19e8, 0x398d6f81, 0x28130667, 0x4bc97c39, 0x4c0bc40e, 0x0c8a6c42, 0x77df9150, 0x38d2a89a, 0x1e9a74e8, 0x14ee8de2, 0x222debd7, 0x1802c1fd, + 0x1857fc8a, 0x60ff6f42, 0x00bb6a62, 0x50faa1dc, 0x437bdfd1, 0x13428e4f, 0x288a0f4a, 0x50058122, 0x79540962, 0x1d8a143d, 0x33e39f16, 0x47384188, 0x2ed3b84c, 0x1a119f0a, 0x2c54eaff, 0x59433c04, + 0x3d69e498, 0x428140c1, 0x30c22c73, 0x043fca0c, 0x1b559a2e, 0x708600f0, 0x03c07c28, 0x17857f68, 0x4b7599c4, 0x37f14756, 0x086ca7f5, 0x1c82d864, 0x2b692293, 0x5ff22dff, 0x343f350e, 0x7d43d5f3, + 0x60a632e4, 0x6ec93b60, 0x1378255c, 0x7344d8cb, 0x4b371710, 0x5d2d8e8e, 0x67ce6e1b, 0x3fac84ad, 0x7cb231e7, 0x2b85254b, 0x25fe9ebf, 0x3b5d415b, 0x18fc429f, 0x3bb4d4a3, 0x06d49266, 0x403a9f2f, + 0x39571c4d, 0x7b3c0402, 0x6c63f39a, 0x3c01d3a3, 0x7449846c, 0x4c3c3e6d, 0x4d1271d7, 0x19c13c2d, 0x4e19613b, 0x7c4852f3, 0x3a19f3b1, 0x33e9c2ea, 0x485cf3b2, 0x177dbf36, 0x48b3028e, 0x088e908f, + 0x2309a0d7, 0x790fbb67, 0x10109755, 0x2eff1b84, 0x4427aaed, 0x45f5bdcc, 0x7b1326af, 0x2993b7b0, 0x5c4829bd, 0x64f31700, 0x57e1b67e, 0x75313910, 0x086197e9, 0x693b1f5d, 0x52c91d3a, 0x2f8e6f29, + 0x6c272d73, 0x1cb98ba6, 0x7ac0cb1f, 0x76755656, 0x305ae0f0, 0x50690167, 0x1696e81c, 0x029782fc, 0x15848d04, 0x17976253, 0x52370ea3, 0x3fef9347, 0x6a65c593, 0x63b69981, 0x25555f4e, 0x27d4e26f, + 0x0b4bfb94, 0x1ce72312, 0x67d586d3, 0x2dd156f1, 0x2542e717, 0x6163f3b1, 0x4d2d0d63, 0x019661be, 0x01e0830c, 0x136f5053, 0x1f5dee95, 0x088607f6, 0x46fa84a5, 0x4d401259, 0x388b5e6d, 0x428b2093, + 0x7e0215ca, 0x3f33237e, 0x2fa47615, 0x0a923762, 0x6469fc2c, 0x50de36fc, 0x079dd2be, 0x5d25d408, 0x20a4c417, 0x3e919380, 0x065d3143, 0x10187995, 0x22858d82, 0x0b55b10e, 0x49c14873, 0x4dbea407, + 0x510505cb, 0x74604c2c, 0x6e12422c, 0x31d2bc6f, 0x4abc755f, 0x213ffed9, 0x10864257, 0x339c39ef, 0x67ac310c, 0x603c996b, 0x4e95a863, 0x2b50485b, 0x4d93ea8f, 0x1cf81c9a, 0x0d9a13da, 0x63071071, + 0x0b03eb46, 0x1ff764f8, 0x610a2010, 0x14dd47f1, 0x545afa3f, 0x6e3a8913, 0x2f362ded, 0x0f37ff11, 0x67724465, 0x3362ad09, 0x08ecdd19, 0x59c3471f, 0x32082f72, 0x793d6d25, 0x6a086a1f, 0x1eb51f40, + 0x0336115b, 0x1de6e380, 0x7b6bb725, 0x315d3dcf, 0x224693c4, 0x4f5f6846, 0x3e4521f9, 0x72a313b1, 0x0b3ae1ca, 0x5c0be563, 0x515bac33, 0x11775bb9, 0x34cb426f, 0x1710dcbd, 0x769f178f, 0x45bd882f, + 0x60cadbd6, 0x31c0a2a4, 0x7968f8fd, 0x6a13e997, 0x7020de0d, 0x680ed11b, 0x3c6d11ee, 0x6f65fe24, 0x26dca7d6, 0x1835b260, 0x5e9f4edc, 0x7c04ee2a, 0x1e41f994, 0x41f02326, 0x67e411aa, 0x7cf090a9, + 0x18a136b5, 0x7901be2e, 0x1a6ae736, 0x06876652, 0x47fd6f3b, 0x03041342, 0x24903949, 0x00307f3d, 0x02fdbb8a, 0x6a70af55, 0x20c26749, 0x68838a05, 0x5cfd89a0, 0x12a82dbc, 0x1af2ea3f, 0x09ebe69a, + 0x53b0a5f5, 0x2fa22433, 0x45017aa2, 0x4dee2566, 0x73bcda76, 0x1b2c5604, 0x69b8d30d, 0x7ad2a178, 0x212deab6, 0x59865db1, 0x165f5250, 0x3f74dfdf, 0x07c1e51d, 0x1b7e9855, 0x70daffcc, 0x3e673356, + 0x7ce24cc2, 0x2d9238f8, 0x1cb6039f, 0x4f9baefc, 0x43721c99, 0x6ce9d61f, 0x297ebc1b, 0x2a42034a, 0x408b899d, 0x35248997, 0x276a54d5, 0x6e4cbe62, 0x42e04162, 0x31fa07cf, 0x50e4aab8, 0x14dcd6f6, + 0x00c4861a, 0x12da790e, 0x3fa257db, 0x078f7c74, 0x0e95a5ad, 0x1e8a7721, 0x0350b631, 0x389b8cce, 0x50089702, 0x5e5b611a, 0x2f6e7433, 0x31e4feaf, 0x73e684cf, 0x4a6b0304, 0x59af8634, 0x05996652, + 0x1eb24113, 0x440e2316, 0x7715278f, 0x4e0deddf, 0x000b13c9, 0x6499506e, 0x442dc23e, 0x786fad2c, 0x2260c918, 0x0c156d86, 0x04cb5854, 0x5ba9767b, 0x69dc47d0, 0x04cf37d8, 0x72ce387e, 0x2083f38f, + 0x27305537, 0x00e6f4ba, 0x2b3e497d, 0x640cbbeb, 0x40948921, 0x1256b32c, 0x26c5ff9e, 0x49400010, 0x6307651d, 0x0c0b87d2, 0x32f352cf, 0x4501e164, 0x63d43281, 0x6b015892, 0x7abe3594, 0x444632df, + 0x390ab06b, 0x03867b72, 0x5d027ce4, 0x0660ef2a, 0x6feff36b, 0x20cd3bda, 0x599fe9a2, 0x6c2cb4c6, 0x424d1b6e, 0x15f2471a, 0x6ce12c96, 0x42314aec, 0x575138c3, 0x6d3c7529, 0x47a946ab, 0x6b17a895, + 0x6e41d597, 0x6f90b0bb, 0x1b7251e1, 0x3b9e6e2f, 0x292de946, 0x4747490a, 0x35652c49, 0x2f40fc84, 0x0a297595, 0x26ba8663, 0x599dc336, 0x14fd4bb4, 0x2459c6d5, 0x6d9172e0, 0x0628e5bf, 0x778cc2f2, + 0x76e256b1, 0x2ce2681e, 0x1a3c639c, 0x769d6fe6, 0x3c19f53c, 0x1ccd5aea, 0x3c891a08, 0x282843a3, 0x1bca2b8e, 0x17622ed4, 0x5d5f862b, 0x797fc339, 0x43e7bdff, 0x3b4f82af, 0x201339b1, 0x2e1b080a, + 0x0d4ae7f9, 0x0852e629, 0x6228413e, 0x50fbe5d1, 0x1263f1f7, 0x077fdb49, 0x0db1a445, 0x7b21efcd, 0x7c1142fe, 0x63a91930, 0x0a5f79bf, 0x732ae7fb, 0x23315cdb, 0x2d182a9d, 0x2b4bdae3, 0x1a509ddb, + 0x4db8e670, 0x4a096555, 0x294c0465, 0x6f5b70c3, 0x45481ff9, 0x667f975a, 0x5db80b62, 0x2919febc, 0x0292a214, 0x1ed30f83, 0x2668dac5, 0x241ae0a9, 0x41f24663, 0x48b93edb, 0x2754eba2, 0x3c3d6baa, + 0x47dbc236, 0x4eb9f10f, 0x5b9c2cd3, 0x0e1c9e9e, 0x15e8f173, 0x2a1646e0, 0x21d2fda6, 0x274d01af, 0x14e82176, 0x62525470, 0x553d842e, 0x360fbea8, 0x429a5750, 0x62c973dd, 0x56d90bea, 0x171199d4, + 0x52321141, 0x7c5ccfcc, 0x5b7c0e4d, 0x5ea1c1e0, 0x62c37411, 0x18872bb4, 0x253db64d, 0x23d8bf80, 0x6faf33aa, 0x5804f05c, 0x25d85fb9, 0x55798ab9, 0x4b050ba8, 0x6495f91e, 0x2056d156, 0x5a7b0c3b, + 0x51fb5fb8, 0x2038c00f, 0x5305aa6c, 0x744f9bef, 0x42a182ea, 0x0b3f816b, 0x6b2ab968, 0x12ce17fa, 0x25664d77, 0x0deaf12a, 0x39e2e25e, 0x01f8e4e7, 0x75294363, 0x29ef597a, 0x5cbad414, 0x270a712e, + 0x05d8e787, 0x73872668, 0x1fb8181c, 0x68e8059f, 0x11ed2bb3, 0x56748f04, 0x32918577, 0x2ffa9d7a, 0x69747e81, 0x6f2e7f0c, 0x0d2eb326, 0x36316c2f, 0x25ca6ca8, 0x703074e6, 0x2d3531d1, 0x34914fa7, +} diff --git a/testdata/zkc/bench/poseidon/impl/felt/poseidon.zkc b/testdata/zkc/bench/poseidon/impl/felt/poseidon.zkc new file mode 100644 index 000000000..4b3cfb9e4 --- /dev/null +++ b/testdata/zkc/bench/poseidon/impl/felt/poseidon.zkc @@ -0,0 +1,277 @@ +include "_round_constants.zkc" +include "_mds_matrix.zkc" +include "state.zkc" +include "../../utils/constants.zkc" +include "../../utils/memory.zkc" + +// =================================================================================== +// zkc implementation of Poseidon_1 permutation using zkc's native field element type +// =================================================================================== + +// poseidon performs the Poseidon1 hash of the nonempty byte range +// +// sa..ea +// +// with sa := address, ea := address + size and copies the results over to +// destination +fn poseidon(address:Address, size_in_bytes:u32, destination:Address, apply_mds_initially:u1) { + + if size_in_bytes == 0 { + // printf "poseidon called with empty inputs\n" + // printf "\n" + fail + } + + // printf "RATE = %d\n", RATE + // printf "BYTES_PER_FELT = %d\n", BYTES_PER_FELT + // printf "BYTES_PER_BLOCK = %d\n", BYTES_PER_BLOCK + // printf "\n" + + var n_blocks:u32 = (size_in_bytes + (BYTES_PER_BLOCK - 1)) / BYTES_PER_BLOCK + var final_block_size:u32 = size_in_bytes % BYTES_PER_BLOCK + var final_block_is_partial:u1 + + final_block_is_partial = (final_block_size == 0 ? 0:1) + + initialize_state(size_in_bytes) + + var curr_address:Address = address + var curr_size:u32 = BYTES_PER_BLOCK + + // printf "size = %x\n", size_in_bytes + // printf "n_rounds = %x\n", n_blocks + // printf "\n" + + for i:u32 = 0; i(size_in_bytes:u32) { + zero_out_state() + + // the "length" of the message is the number of field elements + var number_of_felts:u32 = (size_in_bytes + (BYTES_PER_FELT_as_u32 - 1)) / BYTES_PER_FELT_as_u32 + + // taking the modulus is unnecessary in any reasonable application of the Poseidon hash function + write_to_state(RATE, number_of_felts as 𝔽) + + // printf "after state initialization:\n" + print_state() +} + +// zero_out_state sets the state (σ, τ) to all zeros, +fn zero_out_state() { + for i:u8 = 0; i<(2 * STATE_WIDTH); i = i + 1 { + write_to_state(i, 0) + } +} + +// update_state updates the current state σ to σ' defined by +// adding the next block of data carrying felts (blk) to the +// rate many first coordinates of σ: +// +// σ' ≡ σ + blk +// +// ←σ→ ←blk→ +// ┌ ┐ ┌ ┐ +// │ A │ │ a │ +// │ B │ │ b │ +// │ │ │ │ +// │ ⋮ │ │ ⋮ │ +// │ │ │ │ +// │ Q │ │ q │ +// ≡ │ R │ + │ r │ +// ├ ┤ ├ ┤ +// │ λ │ │ 0 │ +// │ μ │ │ 0 │ +// │ ⋮ │ │ ⋮ │ +// │ π │ │ 0 │ +// └ ┘ └ ┘ +fn update_state(input_address:Address, block_size:u32) { + + var quotient:u32 + var remainder:u8 + + quotient = block_size / (BYTES_PER_FELT as u32) + remainder = (block_size % (BYTES_PER_FELT as u32)) as u8 + + var n_full_felts:u8 = RATE + var with_partl:u1 = 0 + + // correct values for n_full_felts and with_partl if necessary + if quotient<(RATE as u32) { + n_full_felts = quotient as u8 + } + if remainder != 0 { + with_partl = 1 + } + + var input_felt:𝔽 + var state_felt:𝔽 + var curr_address:Address = input_address + + for i:u8 = 0; i(offset:Address) -> (felt:𝔽) { + // // TODO: this crashes: + // felt = (ram[(offset + 2) as Address]::ram[(offset + 1) as Address]::ram[(offset + 0) as Address]) as 𝔽 + felt = ram[(offset + 2) as Address] as 𝔽 + felt = (felt * (256 as 𝔽)) + (ram[(offset + 1) as Address] as 𝔽) + felt = (felt * (256 as 𝔽)) + (ram[(offset + 0) as Address] as 𝔽) +} + +fn get_partial_felt(offset:Address, n_bytes:u8) -> (felt:𝔽) { + felt = 0 + + if n_bytes == 0 { + return + } + + if n_bytes>BYTES_PER_FELT { + fail + } + + for i:u8 = n_bytes; i>0; i = i - 1 { + felt = (felt * (256 as 𝔽)) + (ram[offset + ((i - 1) as Address)] as 𝔽) + } +} + +fn permutation(apply_mds_initially:u1) { + + if apply_mds_initially == 1 { + apply_mds() + } + + for r:u8 = 0; r (res:𝔽) { + res = x * x + res = x * res + return +} + +// add_round_constants adds round constants to the state +fn add_round_constants(r:u8) { + var index:u16 = (r as u16) * (STATE_WIDTH as u16) + + for i:u8 = 0; i(r:u8) { + add_round_constants(r) + for i:u8 = 0; i(r:u8) { + add_round_constants(r) + felt_state[0] = sbox(felt_state[0]) + // printf "after prtl sbox:\n" + print_state() + apply_mds() +} + +// apply_mds applies the STATE_WIDTH x STATE_WIDTH mds matrix to the +// state σ, viewed as a column vector w/ STATE_WIDTH many rows. +// +// Note: matrix multiplications are performed on directly on felts +fn apply_mds() { + + // Note: with STATE_WIDTH = 16, the final value of index is 256, whence the u9 + var index:u9 = 0 + + // computation of the i-th coefficient of MDS × σ + var matrix_product_coefficient:𝔽 + for i:u8 = 0; i (felt:𝔽) + +fn write_to_state(address:u8, value:𝔽) -> () { + felt_state[address] = value +} + +fn read_from_state(address:u8) -> (value:𝔽) { + value = felt_state[address] + return +} + +fn write_to_tmp(address:u8, value:𝔽) -> () { + felt_state[address + STATE_WIDTH] = value +} + +fn read_from_tmp(address:u8) -> (value:𝔽) { + value = felt_state[address + STATE_WIDTH] + return +} + +fn wipe_tmp() { + for i:u8 = 0; i(address:Address, index:u8) -> (address_updt:Address) { + var b3:u8 + var b2:u8 + var b1:u8 + var b0:u8 + b3::b2::b1::b0 = (felt_state[index] as u32) + ram[address + 3] = b3 + ram[address + 2] = b2 + ram[address + 1] = b1 + ram[address + 0] = b0 + address_updt = address + 4 +} + +fn print_state() { + for i:u8 = 0; i (Mij:u32) { + 0x07f00000, 0x0ef0f0f1, 0x23471c72, 0x281af287, 0x6bf33334, 0x42861862, 0x1cdd1746, 0x2c2c8591, 0x59f55556, 0x6fc28f5d, 0x5ccec4ed, 0x41da12f7, 0x7164924a, 0x5bf72c24, 0x47f77778, 0x4dd6b5ae, + 0x10eeeeef, 0x07f00000, 0x0ef0f0f1, 0x23471c72, 0x281af287, 0x6bf33334, 0x42861862, 0x1cdd1746, 0x2c2c8591, 0x59f55556, 0x6fc28f5d, 0x5ccec4ed, 0x41da12f7, 0x7164924a, 0x5bf72c24, 0x47f77778, + 0x63c92493, 0x10eeeeef, 0x07f00000, 0x0ef0f0f1, 0x23471c72, 0x281af287, 0x6bf33334, 0x42861862, 0x1cdd1746, 0x2c2c8591, 0x59f55556, 0x6fc28f5d, 0x5ccec4ed, 0x41da12f7, 0x7164924a, 0x5bf72c24, + 0x3a9d89d9, 0x63c92493, 0x10eeeeef, 0x07f00000, 0x0ef0f0f1, 0x23471c72, 0x281af287, 0x6bf33334, 0x42861862, 0x1cdd1746, 0x2c2c8591, 0x59f55556, 0x6fc28f5d, 0x5ccec4ed, 0x41da12f7, 0x7164924a, + 0x34eaaaab, 0x3a9d89d9, 0x63c92493, 0x10eeeeef, 0x07f00000, 0x0ef0f0f1, 0x23471c72, 0x281af287, 0x6bf33334, 0x42861862, 0x1cdd1746, 0x2c2c8591, 0x59f55556, 0x6fc28f5d, 0x5ccec4ed, 0x41da12f7, + 0x39ba2e8c, 0x34eaaaab, 0x3a9d89d9, 0x63c92493, 0x10eeeeef, 0x07f00000, 0x0ef0f0f1, 0x23471c72, 0x281af287, 0x6bf33334, 0x42861862, 0x1cdd1746, 0x2c2c8591, 0x59f55556, 0x6fc28f5d, 0x5ccec4ed, + 0x58e66667, 0x39ba2e8c, 0x34eaaaab, 0x3a9d89d9, 0x63c92493, 0x10eeeeef, 0x07f00000, 0x0ef0f0f1, 0x23471c72, 0x281af287, 0x6bf33334, 0x42861862, 0x1cdd1746, 0x2c2c8591, 0x59f55556, 0x6fc28f5d, + 0x468e38e4, 0x58e66667, 0x39ba2e8c, 0x34eaaaab, 0x3a9d89d9, 0x63c92493, 0x10eeeeef, 0x07f00000, 0x0ef0f0f1, 0x23471c72, 0x281af287, 0x6bf33334, 0x42861862, 0x1cdd1746, 0x2c2c8591, 0x59f55556, + 0x0fe00000, 0x468e38e4, 0x58e66667, 0x39ba2e8c, 0x34eaaaab, 0x3a9d89d9, 0x63c92493, 0x10eeeeef, 0x07f00000, 0x0ef0f0f1, 0x23471c72, 0x281af287, 0x6bf33334, 0x42861862, 0x1cdd1746, 0x2c2c8591, + 0x48924925, 0x0fe00000, 0x468e38e4, 0x58e66667, 0x39ba2e8c, 0x34eaaaab, 0x3a9d89d9, 0x63c92493, 0x10eeeeef, 0x07f00000, 0x0ef0f0f1, 0x23471c72, 0x281af287, 0x6bf33334, 0x42861862, 0x1cdd1746, + 0x69d55556, 0x48924925, 0x0fe00000, 0x468e38e4, 0x58e66667, 0x39ba2e8c, 0x34eaaaab, 0x3a9d89d9, 0x63c92493, 0x10eeeeef, 0x07f00000, 0x0ef0f0f1, 0x23471c72, 0x281af287, 0x6bf33334, 0x42861862, + 0x32cccccd, 0x69d55556, 0x48924925, 0x0fe00000, 0x468e38e4, 0x58e66667, 0x39ba2e8c, 0x34eaaaab, 0x3a9d89d9, 0x63c92493, 0x10eeeeef, 0x07f00000, 0x0ef0f0f1, 0x23471c72, 0x281af287, 0x6bf33334, + 0x1fc00000, 0x32cccccd, 0x69d55556, 0x48924925, 0x0fe00000, 0x468e38e4, 0x58e66667, 0x39ba2e8c, 0x34eaaaab, 0x3a9d89d9, 0x63c92493, 0x10eeeeef, 0x07f00000, 0x0ef0f0f1, 0x23471c72, 0x281af287, + 0x54aaaaab, 0x1fc00000, 0x32cccccd, 0x69d55556, 0x48924925, 0x0fe00000, 0x468e38e4, 0x58e66667, 0x39ba2e8c, 0x34eaaaab, 0x3a9d89d9, 0x63c92493, 0x10eeeeef, 0x07f00000, 0x0ef0f0f1, 0x23471c72, + 0x3f800000, 0x54aaaaab, 0x1fc00000, 0x32cccccd, 0x69d55556, 0x48924925, 0x0fe00000, 0x468e38e4, 0x58e66667, 0x39ba2e8c, 0x34eaaaab, 0x3a9d89d9, 0x63c92493, 0x10eeeeef, 0x07f00000, 0x0ef0f0f1, + 0x7f000000, 0x3f800000, 0x54aaaaab, 0x1fc00000, 0x32cccccd, 0x69d55556, 0x48924925, 0x0fe00000, 0x468e38e4, 0x58e66667, 0x39ba2e8c, 0x34eaaaab, 0x3a9d89d9, 0x63c92493, 0x10eeeeef, 0x07f00000 +} diff --git a/testdata/zkc/bench/poseidon/impl/u32/_results.zkc b/testdata/zkc/bench/poseidon/impl/u32/_results.zkc new file mode 100644 index 000000000..456a82961 --- /dev/null +++ b/testdata/zkc/bench/poseidon/impl/u32/_results.zkc @@ -0,0 +1,193 @@ +// results are obtained with the following command +// python3 -c "from poseidon.poseidon import Poseidon; KOALABEAR_P = 2130706433; pos = Poseidon(prime=KOALABEAR_P, alpha=3, t=16, r_f=8, r_p=20); pos.sponge_hash(range(XXX), 15)" > output.txt 2>&1 +// replacing XXX with 7, 16, 256 respectively and copying the result + +static results_poseidon_range_7(ij:u8) -> (Rij:u32) { + 0x362e517e, + 0x2046663b, + 0x6f66ef6b, + 0x3dbaf0c1, + 0x2319f56b, + 0x64e61516, + 0x4c624307, + 0x6f0be16c, + 0x4802e7c3, + 0x2cac08b4, + 0x6ac517b0, + 0x2743eb39, + 0x6b826249, + 0x65ca07ee, + 0x48bc5b1b, + 0x356e26d8, +} + +static results_poseidon_range_16(ij:u8) -> (Rij:u32) { + 0x22d2a167, + 0x4911cc3f, + 0x19f8c9c0, + 0x2c725fa2, + 0x5e3a602f, + 0x5314c6b4, + 0x5a49ceff, + 0x546b713a, + 0x17f21463, + 0x12389621, + 0x0761c306, + 0x7654d674, + 0x27660c01, + 0x7475057a, + 0x52e1c31e, + 0x61973dfb, +} + +static results_poseidon_range_256(ij:u8) -> (Rij:u32) { + 0x271c8229, + 0x727a7388, + 0x62edde19, + 0x07da259c, + 0x42e1642f, + 0x25512854, + 0x0984d864, + 0x28192e26, + 0x0c884443, + 0x515d24f6, + 0x6192dcd5, + 0x15453862, + 0x1223175e, + 0x5fe133e8, + 0x69b186d1, + 0x4d04e284, +} + +static results_poseidon_zeros_1(ij:u8) -> (Rij:u32) { + 0x575cd201, + 0x7a759ad4, + 0x4c8b5cee, + 0x71899383, + 0x5b501db2, + 0x7112a138, + 0x4630624f, + 0x61f01af4, + 0x323a1379, + 0x328b53b9, + 0x13c26fa2, + 0x3ed3287c, + 0x79811d70, + 0x5ccaf1c6, + 0x07b0fd6d, + 0x7c4e9f27, +} + +static results_poseidon_zeros_16(ij:u8) -> (Rij:u32) { + 0x5a5faf93, + 0x44476824, + 0x7e77d1aa, + 0x49b298ff, + 0x1682d9d0, + 0x3aec1bbb, + 0x2e78f3e5, + 0x5cd0366d, + 0x68bbd72d, + 0x79f1c79b, + 0x644e1d28, + 0x1ed961f0, + 0x11e7672a, + 0x4ba86f19, + 0x1ec73662, + 0x06a05093, +} + +static results_poseidon_zeros_256(ij:u8) -> (Rij:u32) { + 0x6fbb7934, + 0x40f944a4, + 0x0ee275f0, + 0x0545e8b7, + 0x5d8950d6, + 0x23d1b013, + 0x6a53c5cf, + 0x7d588984, + 0x4cb562a5, + 0x3d08f400, + 0x43c210d2, + 0x572309e4, + 0x2570ad53, + 0x7accb79c, + 0x13db0bb8, + 0x0e21f8b2, +} + +static results_poseidon_zeros_2_to_the_14(ij:u8) -> (Rij:u32) { + 0x48cdf234, + 0x5bdf842d, + 0x4cb1e4bb, + 0x65ba3c36, + 0x30a42a01, + 0x0e71b7b5, + 0x2383338c, + 0x3a0e52b1, + 0x6fccc541, + 0x2183b55e, + 0x6d9c0e76, + 0x6e6db189, + 0x1fe48215, + 0x51228e9b, + 0x58999987, + 0x0088c3bd, +} + +static results_poseidon_zeros_2_to_the_16(ij:u8) -> (Rij:u32) { + 0x1bb62370, + 0x17f76303, + 0x3b21106c, + 0x5d260ef2, + 0x69a5b09e, + 0x5c5a5e12, + 0x4b9e4318, + 0x2e467f54, + 0x78819a30, + 0x46b74f95, + 0x2cb26af6, + 0x07f4242c, + 0x1d60b807, + 0x1f66ad60, + 0x5abf7644, + 0x4a27fb88, +} + +static results_poseidon_zeros_2_to_the_18(ij:u8) -> (Rij:u32) { + 0x4952180a, + 0x1bae33c0, + 0x67da8b52, + 0x35410fef, + 0x3a1c5841, + 0x6a2f6a31, + 0x0c32646b, + 0x5a47019b, + 0x749311b0, + 0x7de625b5, + 0x2bee65b8, + 0x48d451d3, + 0x2ad561b1, + 0x22d44298, + 0x6e3fb781, + 0x0894eb57, +} + +static results_poseidon_zeros_2_to_the_20(ij:u8) -> (Rij:u32) { + 0x5d3806af, + 0x19db630e, + 0x116a1a97, + 0x3b89dee4, + 0x3b50d1f5, + 0x3f828727, + 0x13d03e94, + 0x4a6aeeb6, + 0x0c0ed47f, + 0x3cb2340c, + 0x4b12db5a, + 0x720e22e5, + 0x4def8c36, + 0x1c22abd7, + 0x67cd7e44, + 0x6d51f595, +} diff --git a/testdata/zkc/bench/poseidon/impl/u32/_round_constants.zkc b/testdata/zkc/bench/poseidon/impl/u32/_round_constants.zkc new file mode 100644 index 000000000..dced38343 --- /dev/null +++ b/testdata/zkc/bench/poseidon/impl/u32/_round_constants.zkc @@ -0,0 +1,64 @@ +// 28 rows ≡ 28 rounds +// ≡ 4 + 20 + 4 +// ≡ 4 (full) + 20 (prtl) + 4 (full) +static round_constants(ij:u16) -> (Rij:u32) { + 0x7ee56a48, 0x11367045, 0x12e41941, 0x7ebbc12b, 0x1970b7d5, 0x662b60e8, 0x3e4990c6, 0x679f91f5, 0x350813bb, 0x00874ad4, 0x28a0081a, 0x18fa5872, 0x5f25b071, 0x5e5d5998, 0x5e6fd3e7, 0x5b2e2660, + 0x6f1837bf, 0x3fe6182b, 0x1edd7ac5, 0x57470d00, 0x43d486d5, 0x1982c70f, 0x0ea53af9, 0x61d6165b, 0x51639c00, 0x2dec352c, 0x2950e531, 0x2d2cb947, 0x08256cef, 0x1a0109f6, 0x1f51faf3, 0x5cef1c62, + 0x3d65e50e, 0x33d91626, 0x133d5a1e, 0x0ff49b0d, 0x38900cd1, 0x2c22cc3f, 0x28852bb2, 0x06c65a02, 0x7b2cf7bc, 0x68016e1a, 0x15e16bc0, 0x5248149a, 0x6dd212a0, 0x18d6830a, 0x5001be82, 0x64dac34e, + 0x5902b287, 0x426583a0, 0x0c921632, 0x3fe028a5, 0x245f8e49, 0x43bb297e, 0x7873dbd9, 0x3cc987df, 0x286bb4ce, 0x640a8dcd, 0x512a8e36, 0x03a4cf55, 0x481837a2, 0x03d6da84, 0x73726ac7, 0x760e7fdf, + 0x54dfeb5d, 0x7d40afd6, 0x722cb316, 0x106a4573, 0x45a7ccdb, 0x44061375, 0x154077a5, 0x45744faa, 0x4eb5e5ee, 0x3794e83f, 0x47c7093c, 0x5694903c, 0x69cb6299, 0x373df84c, 0x46a0df58, 0x46b8758a, + 0x3241ebcb, 0x0b09d233, 0x1af42357, 0x1e66cec2, 0x43e7dc24, 0x259a5d61, 0x27e85a3b, 0x1b9133fa, 0x343e5628, 0x485cd4c2, 0x16e269f5, 0x165b60c6, 0x25f683d9, 0x124f81f9, 0x174331f9, 0x77344dc5, + 0x5a821dba, 0x5fc4177f, 0x54153bf5, 0x5e3f1194, 0x3bdbf191, 0x088c84a3, 0x68256c9b, 0x3c90bbc6, 0x6846166a, 0x03f4238d, 0x463335fb, 0x5e3d3551, 0x6e59ae6f, 0x32d06cc0, 0x596293f3, 0x6c87edb2, + 0x08fc60b5, 0x34bcca80, 0x24f007f3, 0x62731c6f, 0x1e1db6c6, 0x0ca409bb, 0x585c1e78, 0x56e94edc, 0x16d22734, 0x18e11467, 0x7b2c3730, 0x770075e4, 0x35d1b18c, 0x22be3db5, 0x4fb1fbb7, 0x477cb3ed, + 0x7d5311c6, 0x5b62ae7d, 0x559c5fa8, 0x77f15048, 0x3211570b, 0x490fef6a, 0x77ec311f, 0x2247171b, 0x4e0ac711, 0x2edf69c9, 0x3b5a8850, 0x65809421, 0x5619b4aa, 0x362019a7, 0x6bf9d4ed, 0x5b413dff, + 0x617e181e, 0x5e7ab57b, 0x33ad7833, 0x3466c7ca, 0x6488dff4, 0x71f068f4, 0x056e891f, 0x04f1eccc, 0x663257d5, 0x671e31b9, 0x5871987c, 0x280c109e, 0x2a227761, 0x350a25e9, 0x5b91b1c4, 0x7a073546, + 0x01826270, 0x53a67720, 0x0ed4b074, 0x34cf0c4e, 0x6e751e88, 0x29bd5f59, 0x49ec32df, 0x7693452b, 0x3cf09e58, 0x6ba0e2bf, 0x7ab93acf, 0x3ce597df, 0x536e3d42, 0x147a808d, 0x5e32eb56, 0x5a203323, + 0x50965766, 0x6d44b7c5, 0x6698636a, 0x57b84f9f, 0x554b61b9, 0x6da0ab28, 0x1585b6ac, 0x6705a2b4, 0x152872f6, 0x0f4409fd, 0x23a9dd60, 0x6f2b18d4, 0x65ac9fd4, 0x2f0efbea, 0x591e67fd, 0x217ca19b, + 0x469c90ca, 0x03d60ef5, 0x4ea7857e, 0x07c86a4f, 0x288ed461, 0x2fe51b22, 0x7e293614, 0x2c4beb85, 0x5b0b7d11, 0x1e17dff6, 0x089beae1, 0x0a5acf1a, 0x2fc33d8f, 0x60422dc6, 0x6e1dc939, 0x635351b9, + 0x55522fc0, 0x3eb94ef7, 0x2a24a65c, 0x2e139c76, 0x51391144, 0x78cc0742, 0x579538f9, 0x44de9aae, 0x3c2f1e2e, 0x195747be, 0x2496339c, 0x650b2e39, 0x52899665, 0x6cb35558, 0x0f461c1c, 0x70f6b270, + 0x3faaa36f, 0x62e3348a, 0x672167cb, 0x394c880b, 0x2a46ba82, 0x63ffb74a, 0x1cf875d6, 0x53d12772, 0x036a4552, 0x3bdd9f2b, 0x02f72c24, 0x02b6006c, 0x077fe158, 0x1f9d6ea4, 0x20904d6f, 0x5d6534fa, + 0x066d8974, 0x6198f1f4, 0x26301ab4, 0x41f274c2, 0x00eac15c, 0x28b54b47, 0x2339739d, 0x48c6281c, 0x4ed935fc, 0x3f9187fa, 0x4a1930a6, 0x3ad4d736, 0x0f3f1889, 0x635a388f, 0x2862c145, 0x277ed1e8, + 0x4db23cad, 0x1f1b11f5, 0x1f3dba2b, 0x1c26eb4e, 0x0f7f5546, 0x6cd024b0, 0x67c47902, 0x793b8900, 0x0e8a283c, 0x4590b7ea, 0x6f567a2b, 0x5dc97300, 0x15247bc6, 0x50567fcb, 0x133eff84, 0x547dc2ef, + 0x34eb3dbb, 0x12402317, 0x66c6ae49, 0x174338b6, 0x24251008, 0x1b514927, 0x062d98d6, 0x7af30bbc, 0x26af15e8, 0x70d907a3, 0x5dfc5cac, 0x731f27ec, 0x53aa7d3f, 0x63ab0ec6, 0x216053f4, 0x18796b39, + 0x19156afd, 0x5eea6973, 0x6704c6a9, 0x0dce002b, 0x331169c0, 0x714d7178, 0x3ddaffaf, 0x7e464957, 0x20ca59ea, 0x679820c9, 0x42ef21a1, 0x798ea089, 0x14a74fa3, 0x0c06cf18, 0x6a4c8d52, 0x620f6d81, + 0x2220901a, 0x5277bb90, 0x230bf95e, 0x0ad8847a, 0x5e96e8b6, 0x77b4056e, 0x70a50d2c, 0x5f0eed59, 0x3646c4df, 0x10eb9a87, 0x21eed6b7, 0x534add36, 0x6e3e7421, 0x2b25810e, 0x1d8f707b, 0x45318a1a, + 0x677f8ff2, 0x0258c9e0, 0x4cd02a00, 0x2e24ff15, 0x634a715d, 0x4ac01e59, 0x601511e1, 0x26e9c01a, 0x4c165c6e, 0x57cd1140, 0x3ac6543b, 0x6787d847, 0x037dfbf9, 0x6dd9d079, 0x4d24b281, 0x2a6f407d, + 0x0131df8e, 0x4b8a7896, 0x23700858, 0x2cf5e534, 0x12aafc3f, 0x54568d03, 0x1a250735, 0x5331686d, 0x4ce76d91, 0x799c1a8c, 0x2b7a8ac9, 0x60aee672, 0x74f7421c, 0x3c42146d, 0x26d369c5, 0x4ae54a12, + 0x7eea16d1, 0x5ce3eae8, 0x69f28994, 0x262b8642, 0x610d4cc4, 0x5e1af21c, 0x1a8526d0, 0x316b127b, 0x3576fe5d, 0x02d968a0, 0x4ba00f51, 0x40bed993, 0x377fb907, 0x7859216e, 0x1931d9d1, 0x53b0934e, + 0x71914ff7, 0x4eabae6c, 0x7196468e, 0x164b3cc2, 0x58cb66c0, 0x4c147307, 0x6b3afccd, 0x4236518b, 0x4ad85605, 0x291382e1, 0x1e89b6cf, 0x5e16c3a8, 0x2e675921, 0x24300954, 0x05e555c3, 0x78880a24, + 0x763a3125, 0x4f53b240, 0x18b7fa43, 0x2bbe8a73, 0x1c9a12f2, 0x3f6fd40d, 0x0e1d4ec4, 0x1361c64d, 0x09a8f470, 0x03d23a40, 0x109ad290, 0x28c2fb88, 0x3b6498f2, 0x74d8be57, 0x6a4277d2, 0x18c2b3d4, + 0x6252c30c, 0x07cc2560, 0x209fe15b, 0x52a55fac, 0x4df19eb7, 0x02521116, 0x5e414ff1, 0x3cd9a1f4, 0x005aad15, 0x27a53f00, 0x72bbe9cb, 0x71d8bd7d, 0x4194b79a, 0x48e87a72, 0x3341553c, 0x63d34faa, + 0x132a01e3, 0x3833e2d9, 0x49726e04, 0x054957f8, 0x7b71bce4, 0x73eec57d, 0x556e5533, 0x1fa93fde, 0x346a8ca8, 0x1162dfde, 0x5c30d028, 0x094a4294, 0x3052dcda, 0x37988498, 0x51f06b97, 0x65848779, + 0x7599b0d4, 0x436fdabc, 0x66c5b77d, 0x40c86a9e, 0x27e7055b, 0x6d0dd9d8, 0x7e5598b5, 0x1a4d04f3, 0x5e3b2bc7, 0x533b5b2f, 0x3e33a125, 0x664d71ce, 0x382e6c2a, 0x24c4eb6e, 0x13f246f7, 0x07e2d7ef +} + +static default_round_constants(ij:u16) -> (Rij:u32) { + 0x177366cd, 0x4b6952d1, 0x184dc725, 0x4368079e, 0x182b19e8, 0x398d6f81, 0x28130667, 0x4bc97c39, 0x4c0bc40e, 0x0c8a6c42, 0x77df9150, 0x38d2a89a, 0x1e9a74e8, 0x14ee8de2, 0x222debd7, 0x1802c1fd, + 0x1857fc8a, 0x60ff6f42, 0x00bb6a62, 0x50faa1dc, 0x437bdfd1, 0x13428e4f, 0x288a0f4a, 0x50058122, 0x79540962, 0x1d8a143d, 0x33e39f16, 0x47384188, 0x2ed3b84c, 0x1a119f0a, 0x2c54eaff, 0x59433c04, + 0x3d69e498, 0x428140c1, 0x30c22c73, 0x043fca0c, 0x1b559a2e, 0x708600f0, 0x03c07c28, 0x17857f68, 0x4b7599c4, 0x37f14756, 0x086ca7f5, 0x1c82d864, 0x2b692293, 0x5ff22dff, 0x343f350e, 0x7d43d5f3, + 0x60a632e4, 0x6ec93b60, 0x1378255c, 0x7344d8cb, 0x4b371710, 0x5d2d8e8e, 0x67ce6e1b, 0x3fac84ad, 0x7cb231e7, 0x2b85254b, 0x25fe9ebf, 0x3b5d415b, 0x18fc429f, 0x3bb4d4a3, 0x06d49266, 0x403a9f2f, + 0x39571c4d, 0x7b3c0402, 0x6c63f39a, 0x3c01d3a3, 0x7449846c, 0x4c3c3e6d, 0x4d1271d7, 0x19c13c2d, 0x4e19613b, 0x7c4852f3, 0x3a19f3b1, 0x33e9c2ea, 0x485cf3b2, 0x177dbf36, 0x48b3028e, 0x088e908f, + 0x2309a0d7, 0x790fbb67, 0x10109755, 0x2eff1b84, 0x4427aaed, 0x45f5bdcc, 0x7b1326af, 0x2993b7b0, 0x5c4829bd, 0x64f31700, 0x57e1b67e, 0x75313910, 0x086197e9, 0x693b1f5d, 0x52c91d3a, 0x2f8e6f29, + 0x6c272d73, 0x1cb98ba6, 0x7ac0cb1f, 0x76755656, 0x305ae0f0, 0x50690167, 0x1696e81c, 0x029782fc, 0x15848d04, 0x17976253, 0x52370ea3, 0x3fef9347, 0x6a65c593, 0x63b69981, 0x25555f4e, 0x27d4e26f, + 0x0b4bfb94, 0x1ce72312, 0x67d586d3, 0x2dd156f1, 0x2542e717, 0x6163f3b1, 0x4d2d0d63, 0x019661be, 0x01e0830c, 0x136f5053, 0x1f5dee95, 0x088607f6, 0x46fa84a5, 0x4d401259, 0x388b5e6d, 0x428b2093, + 0x7e0215ca, 0x3f33237e, 0x2fa47615, 0x0a923762, 0x6469fc2c, 0x50de36fc, 0x079dd2be, 0x5d25d408, 0x20a4c417, 0x3e919380, 0x065d3143, 0x10187995, 0x22858d82, 0x0b55b10e, 0x49c14873, 0x4dbea407, + 0x510505cb, 0x74604c2c, 0x6e12422c, 0x31d2bc6f, 0x4abc755f, 0x213ffed9, 0x10864257, 0x339c39ef, 0x67ac310c, 0x603c996b, 0x4e95a863, 0x2b50485b, 0x4d93ea8f, 0x1cf81c9a, 0x0d9a13da, 0x63071071, + 0x0b03eb46, 0x1ff764f8, 0x610a2010, 0x14dd47f1, 0x545afa3f, 0x6e3a8913, 0x2f362ded, 0x0f37ff11, 0x67724465, 0x3362ad09, 0x08ecdd19, 0x59c3471f, 0x32082f72, 0x793d6d25, 0x6a086a1f, 0x1eb51f40, + 0x0336115b, 0x1de6e380, 0x7b6bb725, 0x315d3dcf, 0x224693c4, 0x4f5f6846, 0x3e4521f9, 0x72a313b1, 0x0b3ae1ca, 0x5c0be563, 0x515bac33, 0x11775bb9, 0x34cb426f, 0x1710dcbd, 0x769f178f, 0x45bd882f, + 0x60cadbd6, 0x31c0a2a4, 0x7968f8fd, 0x6a13e997, 0x7020de0d, 0x680ed11b, 0x3c6d11ee, 0x6f65fe24, 0x26dca7d6, 0x1835b260, 0x5e9f4edc, 0x7c04ee2a, 0x1e41f994, 0x41f02326, 0x67e411aa, 0x7cf090a9, + 0x18a136b5, 0x7901be2e, 0x1a6ae736, 0x06876652, 0x47fd6f3b, 0x03041342, 0x24903949, 0x00307f3d, 0x02fdbb8a, 0x6a70af55, 0x20c26749, 0x68838a05, 0x5cfd89a0, 0x12a82dbc, 0x1af2ea3f, 0x09ebe69a, + 0x53b0a5f5, 0x2fa22433, 0x45017aa2, 0x4dee2566, 0x73bcda76, 0x1b2c5604, 0x69b8d30d, 0x7ad2a178, 0x212deab6, 0x59865db1, 0x165f5250, 0x3f74dfdf, 0x07c1e51d, 0x1b7e9855, 0x70daffcc, 0x3e673356, + 0x7ce24cc2, 0x2d9238f8, 0x1cb6039f, 0x4f9baefc, 0x43721c99, 0x6ce9d61f, 0x297ebc1b, 0x2a42034a, 0x408b899d, 0x35248997, 0x276a54d5, 0x6e4cbe62, 0x42e04162, 0x31fa07cf, 0x50e4aab8, 0x14dcd6f6, + 0x00c4861a, 0x12da790e, 0x3fa257db, 0x078f7c74, 0x0e95a5ad, 0x1e8a7721, 0x0350b631, 0x389b8cce, 0x50089702, 0x5e5b611a, 0x2f6e7433, 0x31e4feaf, 0x73e684cf, 0x4a6b0304, 0x59af8634, 0x05996652, + 0x1eb24113, 0x440e2316, 0x7715278f, 0x4e0deddf, 0x000b13c9, 0x6499506e, 0x442dc23e, 0x786fad2c, 0x2260c918, 0x0c156d86, 0x04cb5854, 0x5ba9767b, 0x69dc47d0, 0x04cf37d8, 0x72ce387e, 0x2083f38f, + 0x27305537, 0x00e6f4ba, 0x2b3e497d, 0x640cbbeb, 0x40948921, 0x1256b32c, 0x26c5ff9e, 0x49400010, 0x6307651d, 0x0c0b87d2, 0x32f352cf, 0x4501e164, 0x63d43281, 0x6b015892, 0x7abe3594, 0x444632df, + 0x390ab06b, 0x03867b72, 0x5d027ce4, 0x0660ef2a, 0x6feff36b, 0x20cd3bda, 0x599fe9a2, 0x6c2cb4c6, 0x424d1b6e, 0x15f2471a, 0x6ce12c96, 0x42314aec, 0x575138c3, 0x6d3c7529, 0x47a946ab, 0x6b17a895, + 0x6e41d597, 0x6f90b0bb, 0x1b7251e1, 0x3b9e6e2f, 0x292de946, 0x4747490a, 0x35652c49, 0x2f40fc84, 0x0a297595, 0x26ba8663, 0x599dc336, 0x14fd4bb4, 0x2459c6d5, 0x6d9172e0, 0x0628e5bf, 0x778cc2f2, + 0x76e256b1, 0x2ce2681e, 0x1a3c639c, 0x769d6fe6, 0x3c19f53c, 0x1ccd5aea, 0x3c891a08, 0x282843a3, 0x1bca2b8e, 0x17622ed4, 0x5d5f862b, 0x797fc339, 0x43e7bdff, 0x3b4f82af, 0x201339b1, 0x2e1b080a, + 0x0d4ae7f9, 0x0852e629, 0x6228413e, 0x50fbe5d1, 0x1263f1f7, 0x077fdb49, 0x0db1a445, 0x7b21efcd, 0x7c1142fe, 0x63a91930, 0x0a5f79bf, 0x732ae7fb, 0x23315cdb, 0x2d182a9d, 0x2b4bdae3, 0x1a509ddb, + 0x4db8e670, 0x4a096555, 0x294c0465, 0x6f5b70c3, 0x45481ff9, 0x667f975a, 0x5db80b62, 0x2919febc, 0x0292a214, 0x1ed30f83, 0x2668dac5, 0x241ae0a9, 0x41f24663, 0x48b93edb, 0x2754eba2, 0x3c3d6baa, + 0x47dbc236, 0x4eb9f10f, 0x5b9c2cd3, 0x0e1c9e9e, 0x15e8f173, 0x2a1646e0, 0x21d2fda6, 0x274d01af, 0x14e82176, 0x62525470, 0x553d842e, 0x360fbea8, 0x429a5750, 0x62c973dd, 0x56d90bea, 0x171199d4, + 0x52321141, 0x7c5ccfcc, 0x5b7c0e4d, 0x5ea1c1e0, 0x62c37411, 0x18872bb4, 0x253db64d, 0x23d8bf80, 0x6faf33aa, 0x5804f05c, 0x25d85fb9, 0x55798ab9, 0x4b050ba8, 0x6495f91e, 0x2056d156, 0x5a7b0c3b, + 0x51fb5fb8, 0x2038c00f, 0x5305aa6c, 0x744f9bef, 0x42a182ea, 0x0b3f816b, 0x6b2ab968, 0x12ce17fa, 0x25664d77, 0x0deaf12a, 0x39e2e25e, 0x01f8e4e7, 0x75294363, 0x29ef597a, 0x5cbad414, 0x270a712e, + 0x05d8e787, 0x73872668, 0x1fb8181c, 0x68e8059f, 0x11ed2bb3, 0x56748f04, 0x32918577, 0x2ffa9d7a, 0x69747e81, 0x6f2e7f0c, 0x0d2eb326, 0x36316c2f, 0x25ca6ca8, 0x703074e6, 0x2d3531d1, 0x34914fa7, +} diff --git a/testdata/zkc/bench/poseidon/impl/u32/poseidon.zkc b/testdata/zkc/bench/poseidon/impl/u32/poseidon.zkc new file mode 100644 index 000000000..242d5b1a9 --- /dev/null +++ b/testdata/zkc/bench/poseidon/impl/u32/poseidon.zkc @@ -0,0 +1,290 @@ +include "_round_constants.zkc" +include "_mds_matrix.zkc" +include "state.zkc" +include "../../utils/constants.zkc" +include "../../utils/memory.zkc" + +// ============================================= +// zkc implementation of Poseidon_1 permutation +// ============================================= + +// we use as source the implementation found in +// +// https://github.com/khovratovich/poseidon-tools/tree/main +// +// One notable feature of this implementation is that the length +// of the message is included in the state at initialization time. + +// // round_constants is a matrix with TOTAL_ROUNDS many rows and STATE_WIDTH many columns +// // mds_matrix is a square matrix of format STATE_WIDTH × STATE_WIDTH +// input round_constants(index:u16) -> (rc:u32) +// input mds_matrix(index:u16) -> (md:u32) + +// this implementation does not use the native field element type yet + +// poseidon performs the Poseidon1 hash of the nonempty byte range +// +// sa..ea +// +// with sa := address, ea := address + size and copies the results over to +// destination +fn poseidon(address:Address, size_in_bytes:u32, destination:Address, apply_mds_initially:u1) { + + if size_in_bytes == 0 { + fail + } + + var n_rounds:u32 = (size_in_bytes + (BYTES_PER_BLOCK - 1)) / BYTES_PER_BLOCK + var final_size:u32 = size_in_bytes % BYTES_PER_BLOCK + var final_partial_round:u1 = 0 + + if final_size != 0 { + final_partial_round = 1 + } + + initialize_state(size_in_bytes) + + var curr_address:Address = address + var curr_size:u32 = BYTES_PER_BLOCK + + for i:u32 = 0; i(size_in_bytes:u32) { + zero_out_state() + + // the "length" of the message is the number of field elements + var number_of_felts:u32 = (size_in_bytes + (BYTES_PER_FELT_as_u32 - 1)) / BYTES_PER_FELT_as_u32 + + // taking the modulus is unnecessary in any reasonable application of the Poseidon hash function + write_to_state(RATE, number_of_felts % KOALABEAR_PRIME) + + print_state() +} + +// zero_out_state sets the state (σ, τ) to all zeros, +// this includes both +// - σ: the actual state portion of the state +// - τ: the "tmp" portion of the state +fn zero_out_state() { + for i:u8 = 0; i<(2 * STATE_WIDTH); i = i + 1 { + write_to_state(i, 0) + } +} + +// update_state updates the current state σ to σ' defined by +// adding the next block of data carrying felts (blk) to the +// rate many first coordinates of σ: +// +// σ' ≡ σ + blk +// +// ←σ→ ←blk→ +// ┌ ┐ ┌ ┐ +// │ A │ │ a │ +// │ B │ │ b │ +// │ │ │ │ +// │ ⋮ │ │ ⋮ │ +// │ │ │ │ +// │ Q │ │ q │ +// ≡ │ R │ + │ r │ +// ├ ┤ ├ ┤ +// │ λ │ │ 0 │ +// │ μ │ │ 0 │ +// │ ⋮ │ │ ⋮ │ +// │ π │ │ 0 │ +// └ ┘ └ ┘ +fn update_state(input_address:Address, block_size:u32) { + + var quotient:u32 + var remainder:u8 + + quotient = block_size / (BYTES_PER_FELT as u32) + remainder = (block_size % (BYTES_PER_FELT as u32)) as u8 + + var n_full_felts:u8 = RATE + var with_partl:u1 = 0 + + // correct values for n_full_felts and with_partl if necessary + if quotient<(RATE as u32) { + n_full_felts = quotient as u8 + } + if remainder != 0 { + with_partl = 1 + } + + var input_felt:u32 + var state_felt:u32 + var overflow:u1 + var curr_address:Address = input_address + + for i:u8 = 0; i(offset:Address) -> (felt:u32) { + felt = (ram[(offset + 2) as Address]::ram[(offset + 1) as Address]::ram[(offset + 0) as Address]) as u32 +} + +fn get_partial_felt(offset:Address, n_bytes:u8) -> (felt:u32) { + felt = 0 + + if n_bytes == 0 { + return + } + + if n_bytes>BYTES_PER_FELT { + fail + } + + for i:u8 = n_bytes; i>0; i = i - 1 { + felt = (felt << 8) + (ram[offset + ((i - 1) as u64)] as u32) + } +} + +fn permutation(apply_mds_initially:u1) { + + if apply_mds_initially == 1 { + apply_mds() + } + + for r:u8 = 0; r (res:u32) { + var aux:u64 + + // square + aux = (x as u64) * (x as u64) + res = (aux % (KOALABEAR_PRIME as u64)) as u32 + + // cube + aux = (res as u64) * (x as u64) + res = (aux % (KOALABEAR_PRIME as u64)) as u32 + + return +} + +// add_round_constants adds round constants to the state +fn add_round_constants(r:u8) { + var index:u16 = (r as u16) * (STATE_WIDTH as u16) + var round_constant:u32 + var state_value:u32 + var overflow:u1 + + for i:u8 = 0; i(r:u8) { + add_round_constants(r) + for i:u8 = 0; i(r:u8) { + add_round_constants(r) + u32_state[0] = sbox(u32_state[0]) + print_state() + apply_mds() +} + +// apply_mds applies the STATE_WIDTH x STATE_WIDTH mds matrix to the +// state σ, viewed as a column vector w/ STATE_WIDTH many rows. +// +// Note: matrix multiplications are performed on u72's: there are +// STATE_WIDTH < 2**8 terms to sum per cell and both mds[i,j] and +// σ[j] are u32's, thus MDS × σ has (unreduced) u72 coefficients +fn apply_mds() { + + // Note: with STATE_WIDTH = 16, the final value of index is 256, whence the u9 + var index:u9 = 0 + + // computation of the i-th coefficient of MDS × σ + for i:u8 = 0; i (st:u32) + +fn write_to_state(address:u8, value:u32) -> () { + u32_state[address] = value +} + +fn read_from_state(address:u8) -> (value:u32) { + value = u32_state[address] + return +} + +fn write_to_tmp(address:u8, value:u32) -> () { + u32_state[address + STATE_WIDTH] = value +} + +fn read_from_tmp(address:u8) -> (value:u32) { + value = u32_state[address + STATE_WIDTH] + return +} + +fn wipe_tmp() { + for i:u8 = 0; i(address:Address, index:u8) -> (address_updt:Address) { + var b3:u8 + var b2:u8 + var b1:u8 + var b0:u8 + b3::b2::b1::b0 = u32_state[index] + ram[address + 3] = b3 + ram[address + 2] = b2 + ram[address + 1] = b1 + ram[address + 0] = b0 + address_updt = address + 4 +} + +fn print_state() { + for i:u8 = 0; i() { + + // we write the message + // + // 0x00 01 02 ... fe ff + // + // into the state + for i:u8 = 0; i<16; i = i + 1 { + write_to_state(i, 0) + } + var message_size:u32 = 16 + var message_offset:Address = 0 + + print_state() + + permutation(FALSE) + + print_state() +} diff --git a/testdata/zkc/bench/poseidon/test/felt/poseidon_range_01.koalabear_16.accepts b/testdata/zkc/bench/poseidon/test/felt/poseidon_range_01.koalabear_16.accepts new file mode 100644 index 000000000..0967ef424 --- /dev/null +++ b/testdata/zkc/bench/poseidon/test/felt/poseidon_range_01.koalabear_16.accepts @@ -0,0 +1 @@ +{} diff --git a/testdata/zkc/bench/poseidon/test/felt/poseidon_range_01.zkc b/testdata/zkc/bench/poseidon/test/felt/poseidon_range_01.zkc new file mode 100644 index 000000000..36ee75605 --- /dev/null +++ b/testdata/zkc/bench/poseidon/test/felt/poseidon_range_01.zkc @@ -0,0 +1,41 @@ +include "../../impl/felt/poseidon.zkc" +include "../../impl/felt/state.zkc" +include "../../impl/felt/_results.zkc" +include "../../utils/memory.zkc" + +// =================================================================== +// poseidon +// =================================================================== + +// static results_poseidon_range_7(index:u8) -> (res:𝔽) + +const NUMBER_OF_FELTS_IN_RANGE:u32 = 7 + +fn main() { + + // we write a message to RAM that will translate to the felts 0, 1, 2, ..., 254, 255 ∈ 𝔽 + // + // 00 00 00 ⇒ 0 ∈ 𝔽 + // 01 00 00 ⇒ 1 ∈ 𝔽 + // 02 00 00 ⇒ 2 ∈ 𝔽 + // 05 00 00 ⇒ fe ∈ 𝔽 + // ⋮ ⋮ ⋮ ⇒ ⋮ + // ff 00 00 ⇒ ff ∈ 𝔽 + // + // to memory. + for i:Address = 0; i<(255 as Address); i = i + 1 { + write_8(i * (BYTES_PER_FELT as Address), i as u8) + } + + var message_offset:Address = 0 + var message_size_in_bytes:u32 = NUMBER_OF_FELTS_IN_RANGE * (BYTES_PER_FELT as u32) + + poseidon(message_offset, message_size_in_bytes, 256, 0) + + for i:u8 = 0; i() { + + // we write a message to RAM that will translate to the felts 0, 1, 2, ..., 254, 255 ∈ 𝔽 + // + // 00 00 00 ⇒ 0 ∈ 𝔽 + // 01 00 00 ⇒ 1 ∈ 𝔽 + // 02 00 00 ⇒ 2 ∈ 𝔽 + // 05 00 00 ⇒ fe ∈ 𝔽 + // ⋮ ⋮ ⋮ ⇒ ⋮ + // ff 00 00 ⇒ ff ∈ 𝔽 + // + // to memory. + for i:Address = 0; i<(255 as Address); i = i + 1 { + write_8(i * (BYTES_PER_FELT as Address), i as u8) + } + + var message_offset:Address = 0 + var message_size_in_bytes:u32 = NUMBER_OF_FELTS_IN_RANGE * (BYTES_PER_FELT as u32) + + poseidon(message_offset, message_size_in_bytes, 256, 0) + + for i:u8 = 0; i() { + + // we write a message to RAM that will translate to the felts 0, 1, 2, ..., 254, 255 ∈ 𝔽 + // + // 00 00 00 ⇒ 0 ∈ 𝔽 + // 01 00 00 ⇒ 1 ∈ 𝔽 + // 02 00 00 ⇒ 2 ∈ 𝔽 + // 05 00 00 ⇒ fe ∈ 𝔽 + // ⋮ ⋮ ⋮ ⇒ ⋮ + // ff 00 00 ⇒ ff ∈ 𝔽 + // + // to memory. + for i:Address = 0; i<(256 as Address); i = i + 1 { + write_8(i * (BYTES_PER_FELT as Address), i as u8) + } + + var message_offset:Address = 0 + var message_size_in_bytes:u32 = NUMBER_OF_FELTS_IN_RANGE * (BYTES_PER_FELT as u32) + + poseidon(message_offset, message_size_in_bytes, 1024, 0) + + for i:u8 = 0; i() { + + var message_offset:Address = 0 + var message_size_in_bytes:u32 = NUMBER_OF_FELTS_IN_RANGE * (BYTES_PER_FELT as u32) + + // ram is empty + poseidon(message_offset, message_size_in_bytes, 256, 0) + + for i:u8 = 0; i() { + + var message_offset:Address = 0 + var message_size_in_bytes:u32 = NUMBER_OF_FELTS_IN_RANGE * (BYTES_PER_FELT as u32) + + // ram is empty + poseidon(message_offset, message_size_in_bytes, 256, 0) + + for i:u8 = 0; i() { + + var message_offset:Address = 0 + var message_size_in_bytes:u32 = NUMBER_OF_FELTS_IN_RANGE * (BYTES_PER_FELT as u32) + + // ram is empty at this point + poseidon(message_offset, message_size_in_bytes, 256, 0) + + for i:u8 = 0; i() { + + var message_offset:Address = 0 + var message_size_in_bytes:u32 = NUMBER_OF_FELTS_IN_RANGE * (BYTES_PER_FELT as u32) + + // ram is empty + poseidon(message_offset, message_size_in_bytes, 256, 0) + + for i:u8 = 0; i() { + + var message_offset:Address = 0 + var message_size_in_bytes:u32 = NUMBER_OF_FELTS_IN_RANGE * (BYTES_PER_FELT as u32) + + // ram is empty + poseidon(message_offset, message_size_in_bytes, 256, 0) + + for i:u8 = 0; i() { + + var message_offset:Address = 0 + var message_size_in_bytes:u32 = NUMBER_OF_FELTS_IN_RANGE * (BYTES_PER_FELT as u32) + + // ram is empty + poseidon(message_offset, message_size_in_bytes, 256, 0) + + for i:u8 = 0; i() { + for i:u8 = 0; i<16; i = i + 1 { + write_8((i * 4) as Address, i as u8) + } + var one:u8 = ram[4] + if one != 1 { + fail + } +} diff --git a/testdata/zkc/bench/poseidon/test/felt/utils_02.zkc b/testdata/zkc/bench/poseidon/test/felt/utils_02.zkc new file mode 100644 index 000000000..223f8aea4 --- /dev/null +++ b/testdata/zkc/bench/poseidon/test/felt/utils_02.zkc @@ -0,0 +1,13 @@ +include "../../impl/felt/poseidon.zkc" +include "../../impl/felt/state.zkc" +include "../../utils/memory.zkc" + +// =================================================================== +// write_to_state test +// =================================================================== + +fn main() { + for i:u8 = 0; i<16; i = i + 1 { + write_to_state(i as u8, i as 𝔽) + } +} diff --git a/testdata/zkc/bench/poseidon/test/felt/utils_03.zkc b/testdata/zkc/bench/poseidon/test/felt/utils_03.zkc new file mode 100644 index 000000000..795b6774b --- /dev/null +++ b/testdata/zkc/bench/poseidon/test/felt/utils_03.zkc @@ -0,0 +1,21 @@ +include "../../impl/felt/poseidon.zkc" +include "../../impl/felt/state.zkc" +include "../../utils/memory.zkc" + +// =================================================================== +// read_from_state and write_to_state test +// =================================================================== + +fn main() { + var zero:𝔽 = read_from_state(0) + write_to_state(1, 1) + var one:𝔽 = read_from_state(1) + + // zero should hold 0, one should hold 1 + if zero != 0 { + fail + } + if one != 1 { + fail + } +} diff --git a/testdata/zkc/bench/poseidon/test/felt/utils_04.zkc b/testdata/zkc/bench/poseidon/test/felt/utils_04.zkc new file mode 100644 index 000000000..dc2cb45f7 --- /dev/null +++ b/testdata/zkc/bench/poseidon/test/felt/utils_04.zkc @@ -0,0 +1,21 @@ +include "../../impl/felt/poseidon.zkc" +include "../../impl/felt/state.zkc" +include "../../utils/memory.zkc" + +// =================================================================== +// read_from_tmp and write_to_tmp test +// =================================================================== + +fn main() { + var zero:𝔽 = read_from_tmp(1) + write_to_tmp(1, 1) + var one:𝔽 = read_from_tmp(1) + + // zero should hold 0, one should hold 1 + if zero != 0 { + fail + } + if one != 1 { + fail + } +} diff --git a/testdata/zkc/bench/poseidon/test/felt/utils_05.zkc b/testdata/zkc/bench/poseidon/test/felt/utils_05.zkc new file mode 100644 index 000000000..132efba45 --- /dev/null +++ b/testdata/zkc/bench/poseidon/test/felt/utils_05.zkc @@ -0,0 +1,21 @@ +include "../../impl/felt/poseidon.zkc" +include "../../impl/felt/state.zkc" +include "../../utils/memory.zkc" + +// =================================================================== +// wipe_tmp test +// =================================================================== + +fn main() { + write_to_tmp(1, 1) + var before_wipe:𝔽 = read_from_tmp(1) + wipe_tmp() + var after_wipe:𝔽 = read_from_tmp(1) + + if before_wipe != 1 { + fail + } + if after_wipe != 0 { + fail + } +} diff --git a/testdata/zkc/bench/poseidon/test/u32/permutation_01.accepts b/testdata/zkc/bench/poseidon/test/u32/permutation_01.accepts new file mode 100644 index 000000000..0ad6ad255 --- /dev/null +++ b/testdata/zkc/bench/poseidon/test/u32/permutation_01.accepts @@ -0,0 +1 @@ +{ "expected_output_state": "0x245d3e75_37bfd942_70da00fc_2f7e1587_153e4ff0_20ea7aad_0349495c_486d04cc_6cb3cf8d_438cc171_6a2250c6_56a976c1_2a52cbb8_4345852e_72482f06_46106d12" } diff --git a/testdata/zkc/bench/poseidon/test/u32/permutation_01.zkc b/testdata/zkc/bench/poseidon/test/u32/permutation_01.zkc new file mode 100644 index 000000000..7b1412de4 --- /dev/null +++ b/testdata/zkc/bench/poseidon/test/u32/permutation_01.zkc @@ -0,0 +1,39 @@ +include "../../impl/u32/poseidon.zkc" +include "../../impl/u32/state.zkc" + +// =================================================================== +// poseidon +// =================================================================== + +input expected_output_state(index:u8) -> (res:u32) + +const FALSE:u1 = 0 + +fn main() { + + // we write the message + // + // 0x00 01 02 ... fe ff + // + // into the state + for i:u8 = 0; i<16; i = i + 1 { + write_to_state(i, 0) + } + var message_size:u32 = 16 + var message_offset:Address = 0 + + print_state() + + permutation(FALSE) + + print_state() + + // print_expected_output() +} + +fn print_expected_output() { + printf "\nExpected output\n" + for i:u8 = 0; i (res:u32) + +fn main() { + + // we write the message + // + // 0x00 01 02 ... fe ff + // + // into memory + for i:Address = 0; i<16; i = i + 1 { + write_8(i, i as u8) + } + + var message_size:u32 = 16 + var message_offset:Address = 0 + + poseidon(message_offset, message_size, 256, 0) + + print_state() + + print_expected_output() +} + +fn print_expected_output() { + printf "\nExpected output\n" + for i:u8 = 0; i (res:u32) + +fn main() { + + // we write a message to RAM that will translate to the felts [0].repeat(16) ∈ 𝔽^16 + var number_of_felts:u32 = 16 + for i:Address = 0; i<(number_of_felts as Address); i = i + 1 { + // Recall that BYTES_PER_FELT ≡ 3 + write_8(i * 3, 0) + } + + var message_offset:Address = 0 + var message_size_in_bytes:u32 = number_of_felts * (BYTES_PER_FELT as u32) + + poseidon(message_offset, message_size_in_bytes, 256, 0) + + print_state() + + print_expected_output() +} + +fn print_expected_output() { + printf "\nExpected output:\n" + for i:u8 = 0; i() { + + // we write a message to RAM that will translate to the felts 0, 1, 2, ..., d, e ∈ 𝔽 + // + // 00 00 00 ⇒ 0 ∈ 𝔽 + // 01 00 00 ⇒ 1 ∈ 𝔽 + // 02 00 00 ⇒ 2 ∈ 𝔽 + // ⋮ ⋮ ⋮ ⇒ ⋮ + // 0d 00 00 ⇒ d ∈ 𝔽 + // 0e 00 00 ⇒ e ∈ 𝔽 + // + // to memory. + for i:Address = 0; i<(NUMBER_OF_FELTS as Address); i = i + 1 { + // Recall that BYTES_PER_FELT ≡ 3 + write_8(i * (BYTES_PER_FELT as Address), i as u8) + } + + var message_offset:Address = 0 + var message_size_in_bytes:u32 = NUMBER_OF_FELTS * (BYTES_PER_FELT as u32) + + poseidon(message_offset, message_size_in_bytes, 256, 0) + + for i:u8 = 0; i() { + + // we write a message to RAM that will translate to the felts 0, 1, 2, ..., d, e ∈ 𝔽 + // + // 00 00 00 ⇒ 0 ∈ 𝔽 + // 01 00 00 ⇒ 1 ∈ 𝔽 + // 02 00 00 ⇒ 2 ∈ 𝔽 + // ⋮ ⋮ ⋮ ⇒ ⋮ + // 0d 00 00 ⇒ d ∈ 𝔽 + // 0e 00 00 ⇒ e ∈ 𝔽 + // + // to memory. + for i:Address = 0; i<(NUMBER_OF_FELTS as Address); i = i + 1 { + // Recall that BYTES_PER_FELT ≡ 3 + write_8(i * (BYTES_PER_FELT as Address), i as u8) + } + + var message_offset:Address = 0 + var message_size_in_bytes:u32 = NUMBER_OF_FELTS * (BYTES_PER_FELT as u32) + + poseidon(message_offset, message_size_in_bytes, 256, 0) + + for i:u8 = 0; i() { + + // we write a message to RAM that will translate to the felts 0, 1, 2, ..., 254, 255 ∈ 𝔽 + // + // 00 00 00 ⇒ 0 ∈ 𝔽 + // 01 00 00 ⇒ 1 ∈ 𝔽 + // 02 00 00 ⇒ 2 ∈ 𝔽 + // ⋮ ⋮ ⋮ ⇒ ⋮ + // fe 00 00 ⇒ fe ∈ 𝔽 + // ff 00 00 ⇒ ff ∈ 𝔽 + // + // to memory. + for i:Address = 0; i<(NUMBER_OF_FELTS as Address); i = i + 1 { + // Recall that BYTES_PER_FELT ≡ 3 + write_8(i * (BYTES_PER_FELT as Address), i as u8) + } + + var message_offset:Address = 0 + var message_size_in_bytes:u32 = NUMBER_OF_FELTS * (BYTES_PER_FELT as u32) + + poseidon(message_offset, message_size_in_bytes, 256, 0) + + for i:u8 = 0; i() { + + var message_offset:Address = 0 + var message_size_in_bytes:u32 = NUMBER_OF_FELTS * (BYTES_PER_FELT as u32) + + poseidon(message_offset, message_size_in_bytes, 256, 0) + + for i:u8 = 0; i() { + + var message_offset:Address = 0 + var message_size_in_bytes:u32 = NUMBER_OF_FELTS * (BYTES_PER_FELT as u32) + + poseidon(message_offset, message_size_in_bytes, 256, 0) + + for i:u8 = 0; i() { + + var message_offset:Address = 0 + var message_size_in_bytes:u32 = NUMBER_OF_FELTS * (BYTES_PER_FELT as u32) + + poseidon(message_offset, message_size_in_bytes, 256, 0) + + for i:u8 = 0; i() { + for i:u8 = 0; i<16; i = i + 1 { + write_8((i * 4) as Address, i as u8) + } + var one:u8 = ram[4] + if one != 1 { + fail + } +} diff --git a/testdata/zkc/bench/poseidon/test/u32/utils_02.zkc b/testdata/zkc/bench/poseidon/test/u32/utils_02.zkc new file mode 100644 index 000000000..bb63df9d9 --- /dev/null +++ b/testdata/zkc/bench/poseidon/test/u32/utils_02.zkc @@ -0,0 +1,13 @@ +include "../../impl/u32/poseidon.zkc" +include "../../impl/u32/state.zkc" +include "../../utils/memory.zkc" + +// =================================================================== +// write_to_state test +// =================================================================== + +fn main() { + for i:u8 = 0; i<16; i = i + 1 { + write_to_state(i as u8, i as u32) + } +} diff --git a/testdata/zkc/bench/poseidon/test/u32/utils_03.zkc b/testdata/zkc/bench/poseidon/test/u32/utils_03.zkc new file mode 100644 index 000000000..6b330a276 --- /dev/null +++ b/testdata/zkc/bench/poseidon/test/u32/utils_03.zkc @@ -0,0 +1,21 @@ +include "../../impl/u32/poseidon.zkc" +include "../../impl/u32/state.zkc" +include "../../utils/memory.zkc" + +// =================================================================== +// read_from_state and write_to_state test +// =================================================================== + +fn main() { + // we write the message 0x00 01 02 ... fe ff into memory + var zero:u32 = read_from_state(0) + write_to_state(1, 1) + var one:u32 = read_from_state(1) + + if zero != 0 { + fail + } + if one != 1 { + fail + } +} diff --git a/testdata/zkc/bench/poseidon/test/u32/utils_04.zkc b/testdata/zkc/bench/poseidon/test/u32/utils_04.zkc new file mode 100644 index 000000000..b85a93dbf --- /dev/null +++ b/testdata/zkc/bench/poseidon/test/u32/utils_04.zkc @@ -0,0 +1,21 @@ +include "../../impl/u32/poseidon.zkc" +include "../../impl/u32/state.zkc" +include "../../utils/memory.zkc" + +// =================================================================== +// read_from_tmp and write_to_tmp test +// =================================================================== + +fn main() { + // we write the message 0x00 01 02 ... fe ff into memory + var zero:u32 = read_from_tmp(1) + write_to_tmp(1, 1) + var one:u32 = read_from_tmp(1) + + if zero != 0 { + fail + } + if one != 1 { + fail + } +} diff --git a/testdata/zkc/bench/poseidon/test/u32/utils_05.zkc b/testdata/zkc/bench/poseidon/test/u32/utils_05.zkc new file mode 100644 index 000000000..d369d9c7d --- /dev/null +++ b/testdata/zkc/bench/poseidon/test/u32/utils_05.zkc @@ -0,0 +1,22 @@ +include "../../impl/u32/poseidon.zkc" +include "../../impl/u32/state.zkc" +include "../../utils/memory.zkc" + +// =================================================================== +// wipe_tmp test +// =================================================================== + +fn main() { + // we write the message 0x00 01 02 ... fe ff into memory + write_to_tmp(1, 1) + var before_wipe:u32 = read_from_tmp(1) + wipe_tmp() + var after_wipe:u32 = read_from_tmp(1) + + if before_wipe != 1 { + fail + } + if after_wipe != 0 { + fail + } +} diff --git a/testdata/zkc/bench/poseidon/utils/constants.zkc b/testdata/zkc/bench/poseidon/utils/constants.zkc new file mode 100644 index 000000000..70b82f4cd --- /dev/null +++ b/testdata/zkc/bench/poseidon/utils/constants.zkc @@ -0,0 +1,21 @@ +// the koalabear prime is defined as +// KOALABEAR_PRIME = 2^31 - 2^24 + 1 ≡ 0x7F000001 ≡ 2130706433 +const KOALABEAR_PRIME:u32 = 0x7F000001 +const ALPHA:u2 = 3 +const BYTES_PER_FELT:u8 = 3 +const BYTES_PER_BLOCK:u32 = (BYTES_PER_FELT * RATE) as u32 +const BYTES_PER_FELT_as_u32:u32 = BYTES_PER_FELT as u32 + +const STATE_WIDTH:u8 = RATE + CAPACITY +const RATE:u8 = 15 +const CAPACITY:u8 = 1 +const OUTPUT_LENGTH:u8 = RATE + +// Poseidon does +// - FULL_ROUNDS_HALF full rounds +// - PRTL_ROUNDS prtl rounds +// - FULL_ROUNDS_HALF full rounds +// whence +const TOTAL_ROUNDS:u8 = FULL_ROUNDS_HALF + PRTL_ROUNDS + FULL_ROUNDS_HALF +const FULL_ROUNDS_HALF:u8 = 4 // 8 = 4 + 4 full rounds +const PRTL_ROUNDS:u8 = 20 diff --git a/testdata/zkc/bench/poseidon/utils/memory.zkc b/testdata/zkc/bench/poseidon/utils/memory.zkc new file mode 100644 index 000000000..368319a23 --- /dev/null +++ b/testdata/zkc/bench/poseidon/utils/memory.zkc @@ -0,0 +1,7 @@ +type Address = u64 + +memory ram(index:Address) -> (st:u8) + +fn write_8(address:Address, value:u8) { + ram[address] = value +} diff --git a/testdata/zkc/unit/felt_casting_01.accepts b/testdata/zkc/unit/felt_casting_01.accepts new file mode 100644 index 000000000..0967ef424 --- /dev/null +++ b/testdata/zkc/unit/felt_casting_01.accepts @@ -0,0 +1 @@ +{} diff --git a/testdata/zkc/unit/felt_casting_01.zkc b/testdata/zkc/unit/felt_casting_01.zkc new file mode 100644 index 000000000..019e42127 --- /dev/null +++ b/testdata/zkc/unit/felt_casting_01.zkc @@ -0,0 +1,17 @@ +// =================================================================== +// felt casting test +// =================================================================== + +fn main() { + var neg_one:𝔽 = 0x7f000000 as 𝔽 // ok + var one:𝔽 = 0x1 as 𝔽 // ok + var zero:𝔽 = 0x0 as 𝔽 // ok + + if (neg_one * neg_one) != one { + fail + } + + if (neg_one + one) != zero { + fail + } +} diff --git a/testdata/zkc/unit/felt_memory_01.accepts b/testdata/zkc/unit/felt_memory_01.accepts new file mode 100644 index 000000000..0967ef424 --- /dev/null +++ b/testdata/zkc/unit/felt_memory_01.accepts @@ -0,0 +1 @@ +{} diff --git a/testdata/zkc/unit/felt_memory_01.zkc b/testdata/zkc/unit/felt_memory_01.zkc new file mode 100644 index 000000000..e6045824c --- /dev/null +++ b/testdata/zkc/unit/felt_memory_01.zkc @@ -0,0 +1,25 @@ +// =================================================================== +// memory test: reads and writes to felt memory +// =================================================================== + +memory felt_memory(address:u8) -> (felt:𝔽) + +fn main() { + var felt:𝔽 = 13 as 𝔽 + var read_felt:𝔽 + write_to_state(0, felt) + read_felt = read_from_state(0) + + if felt != read_felt { + fail + } +} + +fn write_to_state(address:u8, value:𝔽) -> () { + felt_memory[address] = value +} + +fn read_from_state(address:u8) -> (value:𝔽) { + value = felt_memory[address] + return +}