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

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
109 changes: 109 additions & 0 deletions pkg/test/zkc_bench_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)
}
Comment thread
OlivierBBB marked this conversation as resolved.
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)
Expand Down
4 changes: 0 additions & 4 deletions pkg/test/zkc_unit_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
// ===================================================================
2 changes: 1 addition & 1 deletion pkg/zkc/compiler/parser/parser.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)*
//
Expand Down
4 changes: 2 additions & 2 deletions pkg/zkc/vm/internal/word/word.go
Original file line number Diff line number Diff line change
Expand Up @@ -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).
Expand Down
41 changes: 41 additions & 0 deletions testdata/zkc/bench/poseidon/README.md
Original file line number Diff line number Diff line change
@@ -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
```
20 changes: 20 additions & 0 deletions testdata/zkc/bench/poseidon/impl/felt/_mds_matrix.zkc
Original file line number Diff line number Diff line change
@@ -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
}
Loading
Loading