From 629b1d018782fdaaf03676db58f61953872fcd79 Mon Sep 17 00:00:00 2001 From: Maxim Vezenov Date: Mon, 10 Feb 2025 19:18:15 +0000 Subject: [PATCH 1/5] basic msm in noir test --- .../multi_scalar_mul/Nargo.toml | 6 +++ .../multi_scalar_mul/Prover.toml | 26 +++++++++++ .../multi_scalar_mul/src/main.nr | 46 +++++++++++++++++++ 3 files changed, 78 insertions(+) create mode 100644 test_programs/execution_success/multi_scalar_mul/Nargo.toml create mode 100644 test_programs/execution_success/multi_scalar_mul/Prover.toml create mode 100644 test_programs/execution_success/multi_scalar_mul/src/main.nr diff --git a/test_programs/execution_success/multi_scalar_mul/Nargo.toml b/test_programs/execution_success/multi_scalar_mul/Nargo.toml new file mode 100644 index 00000000000..463dc33686c --- /dev/null +++ b/test_programs/execution_success/multi_scalar_mul/Nargo.toml @@ -0,0 +1,6 @@ +[package] +name = "multi_scalar_mul" +type = "bin" +authors = [""] + +[dependencies] \ No newline at end of file diff --git a/test_programs/execution_success/multi_scalar_mul/Prover.toml b/test_programs/execution_success/multi_scalar_mul/Prover.toml new file mode 100644 index 00000000000..88c54b6be45 --- /dev/null +++ b/test_programs/execution_success/multi_scalar_mul/Prover.toml @@ -0,0 +1,26 @@ +scalars = ["0", "0", "0", "0", "0"] + +[[points]] +is_infinite = "0" +x = "0x0000000000000000000000000000000000000000000000000000000000000001" +y = "0x0000000000000002cf135e7506a45d632d270d45f1181294833fc48d823f272c" + +[[points]] +is_infinite = "0" +x = "0x0000000000000000000000000000000000000000000000000000000000000001" +y = "0x0000000000000002cf135e7506a45d632d270d45f1181294833fc48d823f272c" + +[[points]] +is_infinite = "0" +x = "0x0000000000000000000000000000000000000000000000000000000000000001" +y = "0x0000000000000002cf135e7506a45d632d270d45f1181294833fc48d823f272c" + +[[points]] +is_infinite = "0" +x = "0x0000000000000000000000000000000000000000000000000000000000000001" +y = "0x0000000000000002cf135e7506a45d632d270d45f1181294833fc48d823f272c" + +[[points]] +is_infinite = "0" +x = "0x0000000000000000000000000000000000000000000000000000000000000001" +y = "0x0000000000000002cf135e7506a45d632d270d45f1181294833fc48d823f272c" diff --git a/test_programs/execution_success/multi_scalar_mul/src/main.nr b/test_programs/execution_success/multi_scalar_mul/src/main.nr new file mode 100644 index 00000000000..3c87aa4fab4 --- /dev/null +++ b/test_programs/execution_success/multi_scalar_mul/src/main.nr @@ -0,0 +1,46 @@ +// This test provides a basic implementation of a MSM in Noir, that allows us to check +// performance improvements and regressions. +use std::embedded_curve_ops::embedded_curve_add_unsafe; +use std::embedded_curve_ops::EmbeddedCurvePoint; + +unconstrained fn main( + points: [EmbeddedCurvePoint; 5], + scalars: [Field; 5], +) -> pub EmbeddedCurvePoint { + // EmbeddedCurveScalar are two 128-bit numbers + let mut acc = EmbeddedCurvePoint::point_at_infinity(); + for i in 0..1 { + // These should probably be EmbeddedCurveScalars + // let full_scalar: Field = scalars[i].hi * 2.pow_32(128) + scalars[i].lo; + let full_scalar = scalars[i]; + let full_scalar_bits: [u1; 254] = full_scalar.to_be_bits(); + let mut index_of_msb = 0; + // Iterates in BE + for j in 0..254 { + if full_scalar_bits[j] == 1 { + index_of_msb = j; + break; + } + } + + let mut temp = points[i]; + let mut res = EmbeddedCurvePoint::point_at_infinity(); + // When iterative backwards we want to go to bits.len() - 2 + for j in 0..(254 - index_of_msb) { + let k = 253 - j; + + // Add + res = if full_scalar_bits[k] == 1 { + embedded_curve_add_unsafe(res, temp) + } else { + res + }; + // Double + temp = embedded_curve_add_unsafe(temp, temp); + } + + acc = embedded_curve_add_unsafe(acc, res); + } + acc +} + From b1b82a6139a7fb3287211e7b13f61883e49f8783 Mon Sep 17 00:00:00 2001 From: Maxim Vezenov Date: Mon, 10 Feb 2025 19:12:02 -0500 Subject: [PATCH 2/5] Update test_programs/execution_success/multi_scalar_mul/src/main.nr Co-authored-by: Tom French <15848336+TomAFrench@users.noreply.github.com> --- test_programs/execution_success/multi_scalar_mul/src/main.nr | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test_programs/execution_success/multi_scalar_mul/src/main.nr b/test_programs/execution_success/multi_scalar_mul/src/main.nr index 3c87aa4fab4..98a25358f90 100644 --- a/test_programs/execution_success/multi_scalar_mul/src/main.nr +++ b/test_programs/execution_success/multi_scalar_mul/src/main.nr @@ -3,7 +3,7 @@ use std::embedded_curve_ops::embedded_curve_add_unsafe; use std::embedded_curve_ops::EmbeddedCurvePoint; -unconstrained fn main( +fn main( points: [EmbeddedCurvePoint; 5], scalars: [Field; 5], ) -> pub EmbeddedCurvePoint { From aa95588a2c51734036a816d1c434e34f9318392e Mon Sep 17 00:00:00 2001 From: Maxim Vezenov Date: Mon, 10 Feb 2025 19:12:11 -0500 Subject: [PATCH 3/5] Update test_programs/execution_success/multi_scalar_mul/src/main.nr Co-authored-by: Tom French <15848336+TomAFrench@users.noreply.github.com> --- .../execution_success/multi_scalar_mul/src/main.nr | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/test_programs/execution_success/multi_scalar_mul/src/main.nr b/test_programs/execution_success/multi_scalar_mul/src/main.nr index 98a25358f90..2ec86e99de2 100644 --- a/test_programs/execution_success/multi_scalar_mul/src/main.nr +++ b/test_programs/execution_success/multi_scalar_mul/src/main.nr @@ -30,11 +30,9 @@ fn main( let k = 253 - j; // Add - res = if full_scalar_bits[k] == 1 { - embedded_curve_add_unsafe(res, temp) - } else { - res - }; + if full_scalar_bits[k] == 1 { + res = embedded_curve_add_unsafe(res, temp); + } // Double temp = embedded_curve_add_unsafe(temp, temp); } From ebfa938e0c5ab5ed3aeccd5b00432aad55dd274d Mon Sep 17 00:00:00 2001 From: Maxim Vezenov Date: Tue, 11 Feb 2025 15:20:25 +0000 Subject: [PATCH 4/5] fmt and mark main unconstrained --- .../execution_success/multi_scalar_mul/src/main.nr | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/test_programs/execution_success/multi_scalar_mul/src/main.nr b/test_programs/execution_success/multi_scalar_mul/src/main.nr index 2ec86e99de2..9edcd3bba7f 100644 --- a/test_programs/execution_success/multi_scalar_mul/src/main.nr +++ b/test_programs/execution_success/multi_scalar_mul/src/main.nr @@ -3,7 +3,7 @@ use std::embedded_curve_ops::embedded_curve_add_unsafe; use std::embedded_curve_ops::EmbeddedCurvePoint; -fn main( +unconstrained fn main( points: [EmbeddedCurvePoint; 5], scalars: [Field; 5], ) -> pub EmbeddedCurvePoint { @@ -30,9 +30,9 @@ fn main( let k = 253 - j; // Add - if full_scalar_bits[k] == 1 { - res = embedded_curve_add_unsafe(res, temp); - } + if full_scalar_bits[k] == 1 { + res = embedded_curve_add_unsafe(res, temp); + } // Double temp = embedded_curve_add_unsafe(temp, temp); } From 93e45661d3a1324e2037eeee4dfd6c5c0f87731c Mon Sep 17 00:00:00 2001 From: Maxim Vezenov Date: Tue, 11 Feb 2025 15:21:39 +0000 Subject: [PATCH 5/5] add comment --- test_programs/execution_success/multi_scalar_mul/src/main.nr | 1 + 1 file changed, 1 insertion(+) diff --git a/test_programs/execution_success/multi_scalar_mul/src/main.nr b/test_programs/execution_success/multi_scalar_mul/src/main.nr index 9edcd3bba7f..f19391a6a4c 100644 --- a/test_programs/execution_success/multi_scalar_mul/src/main.nr +++ b/test_programs/execution_success/multi_scalar_mul/src/main.nr @@ -3,6 +3,7 @@ use std::embedded_curve_ops::embedded_curve_add_unsafe; use std::embedded_curve_ops::EmbeddedCurvePoint; +// `main` must be marked unconstrained as the function uses `break` internally unconstrained fn main( points: [EmbeddedCurvePoint; 5], scalars: [Field; 5],