From aba567629655c5063467de8bf0d96424af6b5987 Mon Sep 17 00:00:00 2001 From: jrigada Date: Fri, 3 Mar 2023 14:30:54 -0300 Subject: [PATCH 01/39] update layouts to cairo-lang 0.11 release --- custom_hint_example/src/main.rs | 2 +- src/main.rs | 17 ++- .../builtins_instance_def.rs | 88 +++++++++--- src/types/layout.rs | 130 +++++++++++++----- src/utils.rs | 2 +- src/vm/errors/vm_exception.rs | 8 +- src/vm/runners/builtin_runner/ec_op.rs | 4 +- src/vm/runners/builtin_runner/keccak.rs | 2 +- src/vm/runners/cairo_runner.rs | 18 +-- src/vm/vm_core.rs | 4 +- tests/bitwise_test.rs | 2 +- tests/cairo_run_test.rs | 130 +++++++++--------- tests/pedersen_test.rs | 2 +- tests/skip_instruction_test.rs | 2 +- tests/struct_test.rs | 2 +- 15 files changed, 272 insertions(+), 141 deletions(-) diff --git a/custom_hint_example/src/main.rs b/custom_hint_example/src/main.rs index 7486752864..e7ca3b5e1f 100644 --- a/custom_hint_example/src/main.rs +++ b/custom_hint_example/src/main.rs @@ -41,7 +41,7 @@ fn main() { "main", false, false, - "all", + "all_cairo", false, &mut hint_processor, ) diff --git a/src/main.rs b/src/main.rs index 363dc933aa..fa07271f5c 100644 --- a/src/main.rs +++ b/src/main.rs @@ -38,7 +38,14 @@ struct Args { fn validate_layout(value: &str) -> Result<(), String> { match value { - "plain" | "small" | "dex" | "bitwise" | "perpetual_with_bitwise" | "all" => Ok(()), + "plain" + | "small" + | "dex" + | "starknet" + | "starknet_with_keccak" + | "recursive_large_output" + | "all_cairo" + | "all_solidity" => Ok(()), _ => Err(format!("{value} is not a valid layout")), } } @@ -95,9 +102,11 @@ mod tests { "plain", "small", "dex", - "bitwise", - "perpetual_with_bitwise", - "all", + "starknet", + "starknet_with_keccak", + "recursive_large_output", + "all_cairo", + "all_solidity", ]; for layout in valid_layouts { diff --git a/src/types/instance_definitions/builtins_instance_def.rs b/src/types/instance_definitions/builtins_instance_def.rs index c29ee400b2..21a4cceaed 100644 --- a/src/types/instance_definitions/builtins_instance_def.rs +++ b/src/types/instance_definitions/builtins_instance_def.rs @@ -52,7 +52,19 @@ impl BuiltinsInstanceDef { } } - pub(crate) fn perpetual_with_bitwise() -> BuiltinsInstanceDef { + pub(crate) fn recursive() -> BuiltinsInstanceDef { + BuiltinsInstanceDef { + output: true, + pedersen: Some(PedersenInstanceDef::new(128, 1)), + range_check: Some(RangeCheckInstanceDef::default()), + ecdsa: None, + bitwise: Some(BitwiseInstanceDef::new(8)), + ec_op: None, + keccak: None, + } + } + + pub(crate) fn starknet() -> BuiltinsInstanceDef { BuiltinsInstanceDef { output: true, pedersen: Some(PedersenInstanceDef::new(32, 1)), @@ -61,34 +73,50 @@ impl BuiltinsInstanceDef { bitwise: Some(BitwiseInstanceDef::new(64)), ec_op: Some(EcOpInstanceDef::new(1024)), keccak: None, + // poseidon: todo!(), } } - pub(crate) fn bitwise() -> BuiltinsInstanceDef { + pub(crate) fn starknet_with_keccak() -> BuiltinsInstanceDef { BuiltinsInstanceDef { output: true, - pedersen: Some(PedersenInstanceDef::new(256, 1)), + pedersen: Some(PedersenInstanceDef::new(32, 1)), + range_check: Some(RangeCheckInstanceDef::new(16, 8)), + ecdsa: Some(EcdsaInstanceDef::new(2048)), + bitwise: Some(BitwiseInstanceDef::new(64)), + ec_op: Some(EcOpInstanceDef::new(1024)), + keccak: Some(KeccakInstanceDef::new(2048, vec![200; 8])), + // poseidon: todo!(), + } + } + + pub(crate) fn recursive_large_output() -> BuiltinsInstanceDef { + BuiltinsInstanceDef { + output: true, + pedersen: Some(PedersenInstanceDef::new(32, 1)), range_check: Some(RangeCheckInstanceDef::default()), - ecdsa: Some(EcdsaInstanceDef::new(1024)), + ecdsa: None, bitwise: Some(BitwiseInstanceDef::new(8)), ec_op: None, keccak: None, + // poseidon: None, } } - pub(crate) fn recursive() -> BuiltinsInstanceDef { + pub(crate) fn all_cairo() -> BuiltinsInstanceDef { BuiltinsInstanceDef { output: true, pedersen: Some(PedersenInstanceDef::new(256, 1)), range_check: Some(RangeCheckInstanceDef::default()), - ecdsa: None, + ecdsa: Some(EcdsaInstanceDef::new(2048)), bitwise: Some(BitwiseInstanceDef::new(16)), - ec_op: None, + ec_op: Some(EcOpInstanceDef::new(1024)), keccak: Some(KeccakInstanceDef::new(2048, vec![200; 8])), + // poseidon: todo()!, } } - pub(crate) fn all() -> BuiltinsInstanceDef { + pub(crate) fn all_solidity() -> BuiltinsInstanceDef { BuiltinsInstanceDef { output: true, pedersen: Some(PedersenInstanceDef::default()), @@ -97,6 +125,7 @@ impl BuiltinsInstanceDef { bitwise: Some(BitwiseInstanceDef::default()), ec_op: Some(EcOpInstanceDef::default()), keccak: None, + // poseidon: None, } } } @@ -139,8 +168,19 @@ mod tests { } #[test] - fn get_builtins_perpetual_with_bitwise() { - let builtins = BuiltinsInstanceDef::perpetual_with_bitwise(); + fn get_builtins_recursive() { + let builtins = BuiltinsInstanceDef::recursive(); + assert!(builtins.output); + assert!(builtins.pedersen.is_some()); + assert!(builtins.range_check.is_some()); + assert!(builtins.ecdsa.is_none()); + assert!(builtins.bitwise.is_some()); + assert!(builtins.ec_op.is_none()); + } + + #[test] + fn get_builtins_starknet() { + let builtins = BuiltinsInstanceDef::starknet(); assert!(builtins.output); assert!(builtins.pedersen.is_some()); assert!(builtins.range_check.is_some()); @@ -150,19 +190,20 @@ mod tests { } #[test] - fn get_builtins_bitwise() { - let builtins = BuiltinsInstanceDef::bitwise(); + fn get_builtins_starknet_with_keccak() { + let builtins = BuiltinsInstanceDef::starknet_with_keccak(); assert!(builtins.output); assert!(builtins.pedersen.is_some()); assert!(builtins.range_check.is_some()); assert!(builtins.ecdsa.is_some()); assert!(builtins.bitwise.is_some()); - assert!(builtins.ec_op.is_none()); + assert!(builtins.ec_op.is_some()); + assert!(builtins.keccak.is_some()); } #[test] - fn get_builtins_recursive() { - let builtins = BuiltinsInstanceDef::recursive(); + fn get_builtins_recursive_large_output() { + let builtins = BuiltinsInstanceDef::recursive_large_output(); assert!(builtins.output); assert!(builtins.pedersen.is_some()); assert!(builtins.range_check.is_some()); @@ -172,13 +213,26 @@ mod tests { } #[test] - fn get_builtins_all() { - let builtins = BuiltinsInstanceDef::all(); + fn get_builtins_all_cairo() { + let builtins = BuiltinsInstanceDef::all_cairo(); + assert!(builtins.output); + assert!(builtins.pedersen.is_some()); + assert!(builtins.range_check.is_some()); + assert!(builtins.ecdsa.is_some()); + assert!(builtins.bitwise.is_some()); + assert!(builtins.ec_op.is_some()); + assert!(builtins.keccak.is_some()); + } + + #[test] + fn get_builtins_all_solidity() { + let builtins = BuiltinsInstanceDef::all_solidity(); assert!(builtins.output); assert!(builtins.pedersen.is_some()); assert!(builtins.range_check.is_some()); assert!(builtins.ecdsa.is_some()); assert!(builtins.bitwise.is_some()); assert!(builtins.ec_op.is_some()); + assert!(builtins.keccak.is_none()); } } diff --git a/src/types/layout.rs b/src/types/layout.rs index 1e37c654a5..af28065749 100644 --- a/src/types/layout.rs +++ b/src/types/layout.rs @@ -59,13 +59,28 @@ impl CairoLayout { } } - pub(crate) fn perpetual_with_bitwise_instance() -> CairoLayout { + #[allow(dead_code)] + pub(crate) fn recursive_instance() -> CairoLayout { CairoLayout { - _name: String::from("perpetual_with_bitwise"), + _name: String::from("recursive"), _cpu_component_step: 1, rc_units: 4, - builtins: BuiltinsInstanceDef::perpetual_with_bitwise(), - _public_memory_fraction: 4, + builtins: BuiltinsInstanceDef::recursive(), + _public_memory_fraction: 8, + _memory_units_per_step: 8, + diluted_pool_instance_def: Some(DilutedPoolInstanceDef::default()), + _n_trace_colums: 10, + _cpu_instance_def: CpuInstanceDef::default(), + } + } + + pub(crate) fn starknet_instance() -> CairoLayout { + CairoLayout { + _name: String::from("starknet"), + _cpu_component_step: 1, + rc_units: 4, + builtins: BuiltinsInstanceDef::starknet(), + _public_memory_fraction: 8, _memory_units_per_step: 8, diluted_pool_instance_def: Some(DilutedPoolInstanceDef::new(2, 4, 16)), _n_trace_colums: 10, @@ -73,26 +88,41 @@ impl CairoLayout { } } - pub(crate) fn bitwise_instance() -> CairoLayout { + pub(crate) fn starknet_with_keccak_instance() -> CairoLayout { CairoLayout { - _name: String::from("bitwise"), + _name: String::from("starknet_with_keccak"), _cpu_component_step: 1, rc_units: 4, - builtins: BuiltinsInstanceDef::bitwise(), + builtins: BuiltinsInstanceDef::starknet_with_keccak(), _public_memory_fraction: 8, _memory_units_per_step: 8, diluted_pool_instance_def: Some(DilutedPoolInstanceDef::default()), - _n_trace_colums: 10, + _n_trace_colums: 15, _cpu_instance_def: CpuInstanceDef::default(), } } + + pub(crate) fn recursive_large_output_instance() -> CairoLayout { + CairoLayout { + _name: String::from("recursive_large_output"), + _cpu_component_step: 1, + rc_units: 4, + builtins: BuiltinsInstanceDef::recursive_large_output(), + _public_memory_fraction: 8, + _memory_units_per_step: 8, + diluted_pool_instance_def: Some(DilutedPoolInstanceDef::default()), + _n_trace_colums: 13, + _cpu_instance_def: CpuInstanceDef::default(), + } + } + #[allow(dead_code)] - pub(crate) fn recursive_instance() -> CairoLayout { + pub(crate) fn all_cairo_instance() -> CairoLayout { CairoLayout { - _name: String::from("recursive"), + _name: String::from("all_cairo"), _cpu_component_step: 1, rc_units: 4, - builtins: BuiltinsInstanceDef::recursive(), + builtins: BuiltinsInstanceDef::all_cairo(), _public_memory_fraction: 8, _memory_units_per_step: 8, diluted_pool_instance_def: Some(DilutedPoolInstanceDef::default()), @@ -101,12 +131,12 @@ impl CairoLayout { } } - pub(crate) fn all_instance() -> CairoLayout { + pub(crate) fn all_solidity_instance() -> CairoLayout { CairoLayout { - _name: String::from("all"), + _name: String::from("all_solidity"), _cpu_component_step: 1, rc_units: 8, - builtins: BuiltinsInstanceDef::all(), + builtins: BuiltinsInstanceDef::all_solidity(), _public_memory_fraction: 8, _memory_units_per_step: 8, diluted_pool_instance_def: Some(DilutedPoolInstanceDef::default()), @@ -166,14 +196,32 @@ mod tests { } #[test] - fn get_perpetual_with_bitwise_instance() { - let layout = CairoLayout::perpetual_with_bitwise_instance(); - let builtins = BuiltinsInstanceDef::perpetual_with_bitwise(); - assert_eq!(&layout._name, "perpetual_with_bitwise"); + fn get_recursive_instance() { + let layout = CairoLayout::recursive_instance(); + let builtins = BuiltinsInstanceDef::recursive(); + assert_eq!(&layout._name, "recursive"); + assert_eq!(layout._cpu_component_step, 1); + assert_eq!(layout.rc_units, 4); + assert_eq!(layout.builtins, builtins); + assert_eq!(layout._public_memory_fraction, 8); + assert_eq!(layout._memory_units_per_step, 8); + assert_eq!( + layout.diluted_pool_instance_def, + Some(DilutedPoolInstanceDef::default()) + ); + assert_eq!(layout._n_trace_colums, 10); + assert_eq!(layout._cpu_instance_def, CpuInstanceDef::default()); + } + + #[test] + fn get_starknet_instance() { + let layout = CairoLayout::starknet_instance(); + let builtins = BuiltinsInstanceDef::starknet(); + assert_eq!(&layout._name, "starknet"); assert_eq!(layout._cpu_component_step, 1); assert_eq!(layout.rc_units, 4); assert_eq!(layout.builtins, builtins); - assert_eq!(layout._public_memory_fraction, 4); + assert_eq!(layout._public_memory_fraction, 8); assert_eq!(layout._memory_units_per_step, 8); assert_eq!( layout.diluted_pool_instance_def, @@ -184,10 +232,10 @@ mod tests { } #[test] - fn get_bitwise_instance() { - let layout = CairoLayout::bitwise_instance(); - let builtins = BuiltinsInstanceDef::bitwise(); - assert_eq!(&layout._name, "bitwise"); + fn get_starknet_with_keccak_instance() { + let layout = CairoLayout::starknet_with_keccak_instance(); + let builtins = BuiltinsInstanceDef::starknet_with_keccak(); + assert_eq!(&layout._name, "starknet_with_keccak"); assert_eq!(layout._cpu_component_step, 1); assert_eq!(layout.rc_units, 4); assert_eq!(layout.builtins, builtins); @@ -197,15 +245,33 @@ mod tests { layout.diluted_pool_instance_def, Some(DilutedPoolInstanceDef::default()) ); - assert_eq!(layout._n_trace_colums, 10); + assert_eq!(layout._n_trace_colums, 15); assert_eq!(layout._cpu_instance_def, CpuInstanceDef::default()); } #[test] - fn get_recursive_instance() { - let layout = CairoLayout::recursive_instance(); - let builtins = BuiltinsInstanceDef::recursive(); - assert_eq!(&layout._name, "recursive"); + fn get_recursive_large_output_instance() { + let layout = CairoLayout::recursive_large_output_instance(); + let builtins = BuiltinsInstanceDef::recursive_large_output(); + assert_eq!(&layout._name, "recursive_large_output"); + assert_eq!(layout._cpu_component_step, 1); + assert_eq!(layout.rc_units, 4); + assert_eq!(layout.builtins, builtins); + assert_eq!(layout._public_memory_fraction, 8); + assert_eq!(layout._memory_units_per_step, 8); + assert_eq!( + layout.diluted_pool_instance_def, + Some(DilutedPoolInstanceDef::default()) + ); + assert_eq!(layout._n_trace_colums, 13); + assert_eq!(layout._cpu_instance_def, CpuInstanceDef::default()); + } + + #[test] + fn get_all_cairo_instance() { + let layout = CairoLayout::all_cairo_instance(); + let builtins = BuiltinsInstanceDef::all_cairo(); + assert_eq!(&layout._name, "all_cairo"); assert_eq!(layout._cpu_component_step, 1); assert_eq!(layout.rc_units, 4); assert_eq!(layout.builtins, builtins); @@ -220,10 +286,10 @@ mod tests { } #[test] - fn get_all_instance() { - let layout = CairoLayout::all_instance(); - let builtins = BuiltinsInstanceDef::all(); - assert_eq!(&layout._name, "all"); + fn get_all_solidity_instance() { + let layout = CairoLayout::all_solidity_instance(); + let builtins = BuiltinsInstanceDef::all_solidity(); + assert_eq!(&layout._name, "all_solidity"); assert_eq!(layout._cpu_component_step, 1); assert_eq!(layout.rc_units, 8); assert_eq!(layout.builtins, builtins); diff --git a/src/utils.rs b/src/utils.rs index 8e9db41827..7ea76fa4fe 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -226,7 +226,7 @@ pub mod test_utils { macro_rules! cairo_runner { ($program:expr) => { - CairoRunner::new(&$program, "all", false).unwrap() + CairoRunner::new(&$program, "all_cairo", false).unwrap() }; ($program:expr, $layout:expr) => { CairoRunner::new(&$program, $layout, false).unwrap() diff --git a/src/vm/errors/vm_exception.rs b/src/vm/errors/vm_exception.rs index 070214f72f..4c63144f4d 100644 --- a/src/vm/errors/vm_exception.rs +++ b/src/vm/errors/vm_exception.rs @@ -605,7 +605,7 @@ mod test { .expect("Call to `Program::from_file()` failed."); let mut hint_processor = BuiltinHintProcessor::new_empty(); - let mut cairo_runner = cairo_runner!(program, "all", false); + let mut cairo_runner = cairo_runner!(program, "all_cairo", false); let mut vm = vm!(); let end = cairo_runner.initialize(&mut vm).unwrap(); @@ -625,7 +625,7 @@ mod test { .expect("Call to `Program::from_file()` failed."); let mut hint_processor = BuiltinHintProcessor::new_empty(); - let mut cairo_runner = cairo_runner!(program, "all", false); + let mut cairo_runner = cairo_runner!(program, "all_cairo", false); let mut vm = vm!(); let end = cairo_runner.initialize(&mut vm).unwrap(); @@ -760,7 +760,7 @@ cairo_programs/bad_programs/bad_range_check.cairo:11:5: (pc=0:6) .expect("Call to `Program::from_file()` failed."); let mut hint_processor = BuiltinHintProcessor::new_empty(); - let mut cairo_runner = cairo_runner!(program, "all", false); + let mut cairo_runner = cairo_runner!(program, "all_cairo", false); let mut vm = vm!(); let end = cairo_runner.initialize(&mut vm).unwrap(); @@ -795,7 +795,7 @@ cairo_programs/bad_programs/bad_usort.cairo:64:5: (pc=0:60) .expect("Call to `Program::from_file()` failed."); let mut hint_processor = BuiltinHintProcessor::new_empty(); - let mut cairo_runner = cairo_runner!(program, "all", false); + let mut cairo_runner = cairo_runner!(program, "all_cairo", false); let mut vm = vm!(); let end = cairo_runner.initialize(&mut vm).unwrap(); diff --git a/src/vm/runners/builtin_runner/ec_op.rs b/src/vm/runners/builtin_runner/ec_op.rs index 72b3ee303b..c277249356 100644 --- a/src/vm/runners/builtin_runner/ec_op.rs +++ b/src/vm/runners/builtin_runner/ec_op.rs @@ -991,7 +991,7 @@ mod tests { fn catch_point_same_x() { let program = Path::new("cairo_programs/bad_programs/ec_op_same_x.json"); let cairo_run_config = crate::cairo_run::CairoRunConfig { - layout: "all", + layout: "all_cairo", ..crate::cairo_run::CairoRunConfig::default() }; let result = crate::cairo_run::cairo_run( @@ -1014,7 +1014,7 @@ mod tests { fn catch_point_not_in_curve() { let program = Path::new("cairo_programs/bad_programs/ec_op_not_in_curve.json"); let cairo_run_config = crate::cairo_run::CairoRunConfig { - layout: "all", + layout: "all_cairo", ..crate::cairo_run::CairoRunConfig::default() }; let result = crate::cairo_run::cairo_run( diff --git a/src/vm/runners/builtin_runner/keccak.rs b/src/vm/runners/builtin_runner/keccak.rs index 6fb83920fc..d904664b08 100644 --- a/src/vm/runners/builtin_runner/keccak.rs +++ b/src/vm/runners/builtin_runner/keccak.rs @@ -382,7 +382,7 @@ mod tests { let program = Program::from_file(Path::new("cairo_programs/_keccak.json"), Some("main")).unwrap(); - let mut cairo_runner = cairo_runner!(program, "all"); + let mut cairo_runner = cairo_runner!(program); let mut hint_processor = BuiltinHintProcessor::new_empty(); diff --git a/src/vm/runners/cairo_runner.rs b/src/vm/runners/cairo_runner.rs index 5c3f25dca4..ade30d6121 100644 --- a/src/vm/runners/cairo_runner.rs +++ b/src/vm/runners/cairo_runner.rs @@ -99,9 +99,11 @@ impl CairoRunner { "plain" => CairoLayout::plain_instance(), "small" => CairoLayout::small_instance(), "dex" => CairoLayout::dex_instance(), - "perpetual_with_bitwise" => CairoLayout::perpetual_with_bitwise_instance(), - "bitwise" => CairoLayout::bitwise_instance(), - "all" => CairoLayout::all_instance(), + "starknet" => CairoLayout::starknet_instance(), + "starknet_with_keccak" => CairoLayout::starknet_with_keccak_instance(), + "recursive_large_output" => CairoLayout::recursive_large_output_instance(), + "all_cairo" => CairoLayout::all_cairo_instance(), + "all_solidity" => CairoLayout::all_solidity_instance(), name => return Err(RunnerError::InvalidLayoutName(name.to_string())), }; Ok(CairoRunner { @@ -3365,7 +3367,7 @@ mod tests { .expect("Call to `Program::from_file()` failed."); let mut hint_processor = BuiltinHintProcessor::new_empty(); - let mut cairo_runner = cairo_runner!(program, "all", true); + let mut cairo_runner = cairo_runner!(program, "all_cairo", true); let mut vm = vm!(true); let end = cairo_runner.initialize(&mut vm).unwrap(); @@ -3716,7 +3718,7 @@ mod tests { fn check_range_check_usage_without_builtins() { let program = program!(); - let cairo_runner = cairo_runner!(program); + let cairo_runner = cairo_runner!(program, "plain"); let mut vm = vm!(); vm.builtin_runners = vec![]; vm.current_step = 10000; @@ -4202,7 +4204,7 @@ mod tests { let mut program = program![OUTPUT_BUILTIN_NAME]; program.data = vec_data![(1), (2), (3), (4), (5), (6), (7), (8)]; //Program data len = 8 - let mut cairo_runner = cairo_runner!(program, "all", true); + let mut cairo_runner = cairo_runner!(program, "all_cairo", true); cairo_runner.program_base = Some(Relocatable::from((0, 0))); cairo_runner.execution_base = Some(Relocatable::from((1, 0))); cairo_runner.run_ended = true; @@ -4232,7 +4234,7 @@ mod tests { let mut program = program![OUTPUT_BUILTIN_NAME]; program.data = vec_data![(1), (2), (3), (4), (5), (6), (7), (8)]; //Program data len = 8 - let mut cairo_runner = cairo_runner!(program, "all", true); + let mut cairo_runner = cairo_runner!(program, "all_cairo", true); cairo_runner.program_base = Some(Relocatable::from((0, 0))); cairo_runner.execution_base = Some(Relocatable::from((1, 0))); cairo_runner.run_ended = true; @@ -4262,7 +4264,7 @@ mod tests { let mut program = program![OUTPUT_BUILTIN_NAME, BITWISE_BUILTIN_NAME]; program.data = vec_data![(1), (2), (3), (4), (5), (6), (7), (8)]; //Program data len = 8 - let mut cairo_runner = cairo_runner!(program, "all", true); + let mut cairo_runner = cairo_runner!(program, "all_cairo", true); cairo_runner.program_base = Some(Relocatable::from((0, 0))); cairo_runner.execution_base = Some(Relocatable::from((1, 0))); cairo_runner.run_ended = true; diff --git a/src/vm/vm_core.rs b/src/vm/vm_core.rs index c60a834faf..8b6d2506da 100644 --- a/src/vm/vm_core.rs +++ b/src/vm/vm_core.rs @@ -4042,7 +4042,7 @@ mod tests { .expect("Call to `Program::from_file()` failed."); let mut hint_processor = BuiltinHintProcessor::new_empty(); - let mut cairo_runner = cairo_runner!(program, "all", false); + let mut cairo_runner = cairo_runner!(program, "all_cairo", false); let mut vm = vm!(); let end = cairo_runner.initialize(&mut vm).unwrap(); @@ -4066,7 +4066,7 @@ mod tests { .expect("Call to `Program::from_file()` failed."); let mut hint_processor = BuiltinHintProcessor::new_empty(); - let mut cairo_runner = cairo_runner!(program, "all", false); + let mut cairo_runner = cairo_runner!(program, "all_cairo", false); let mut vm = vm!(); let end = cairo_runner.initialize(&mut vm).unwrap(); diff --git a/tests/bitwise_test.rs b/tests/bitwise_test.rs index c2b5cf14d6..c983187511 100644 --- a/tests/bitwise_test.rs +++ b/tests/bitwise_test.rs @@ -19,7 +19,7 @@ fn bitwise_integration_test() { ) .expect("Failed to deserialize program"); let mut hint_processor = BuiltinHintProcessor::new_empty(); - let mut cairo_runner = CairoRunner::new(&program, "all", false).unwrap(); + let mut cairo_runner = CairoRunner::new(&program, "all_cairo", false).unwrap(); let mut vm = VirtualMachine::new(true); let end = cairo_runner.initialize(&mut vm).unwrap(); assert_matches!( diff --git a/tests/cairo_run_test.rs b/tests/cairo_run_test.rs index d4b7bd88aa..50ed914fd3 100644 --- a/tests/cairo_run_test.rs +++ b/tests/cairo_run_test.rs @@ -306,7 +306,7 @@ fn cairo_run_test_subtraction_if() { fn cairo_run_use_imported_module() { let mut hint_executor = BuiltinHintProcessor::new_empty(); let cairo_run_config = cairo_run::CairoRunConfig { - layout: "all", + layout: "all_cairo", ..cairo_vm::cairo_run::CairoRunConfig::default() }; cairo_run::cairo_run( @@ -321,7 +321,7 @@ fn cairo_run_use_imported_module() { fn cairo_run_bitwise_output() { let mut hint_executor = BuiltinHintProcessor::new_empty(); let cairo_run_config = cairo_run::CairoRunConfig { - layout: "all", + layout: "all_cairo", ..cairo_vm::cairo_run::CairoRunConfig::default() }; cairo_run::cairo_run( @@ -336,7 +336,7 @@ fn cairo_run_bitwise_output() { fn cairo_run_bitwise_recursion() { let mut hint_executor = BuiltinHintProcessor::new_empty(); let cairo_run_config = cairo_run::CairoRunConfig { - layout: "all", + layout: "all_cairo", ..cairo_vm::cairo_run::CairoRunConfig::default() }; cairo_run::cairo_run( @@ -351,7 +351,7 @@ fn cairo_run_bitwise_recursion() { fn cairo_run_integration() { let mut hint_executor = BuiltinHintProcessor::new_empty(); let cairo_run_config = cairo_run::CairoRunConfig { - layout: "all", + layout: "all_cairo", ..cairo_vm::cairo_run::CairoRunConfig::default() }; cairo_run::cairo_run( @@ -366,7 +366,7 @@ fn cairo_run_integration() { fn cairo_run_integration_with_alloc_locals() { let mut hint_executor = BuiltinHintProcessor::new_empty(); let cairo_run_config = cairo_run::CairoRunConfig { - layout: "all", + layout: "all_cairo", ..cairo_vm::cairo_run::CairoRunConfig::default() }; cairo_run::cairo_run( @@ -381,7 +381,7 @@ fn cairo_run_integration_with_alloc_locals() { fn cairo_run_compare_arrays() { let mut hint_executor = BuiltinHintProcessor::new_empty(); let cairo_run_config = cairo_run::CairoRunConfig { - layout: "all", + layout: "all_cairo", ..cairo_vm::cairo_run::CairoRunConfig::default() }; cairo_run::cairo_run( @@ -396,7 +396,7 @@ fn cairo_run_compare_arrays() { fn cairo_run_compare_greater_array() { let mut hint_executor = BuiltinHintProcessor::new_empty(); let cairo_run_config = cairo_run::CairoRunConfig { - layout: "all", + layout: "all_cairo", ..cairo_vm::cairo_run::CairoRunConfig::default() }; cairo_run::cairo_run( @@ -411,7 +411,7 @@ fn cairo_run_compare_greater_array() { fn cairo_run_compare_lesser_array() { let mut hint_executor = BuiltinHintProcessor::new_empty(); let cairo_run_config = cairo_run::CairoRunConfig { - layout: "all", + layout: "all_cairo", ..cairo_vm::cairo_run::CairoRunConfig::default() }; cairo_run::cairo_run( @@ -426,7 +426,7 @@ fn cairo_run_compare_lesser_array() { fn cairo_run_assert_le_felt_hint() { let mut hint_executor = BuiltinHintProcessor::new_empty(); let cairo_run_config = cairo_run::CairoRunConfig { - layout: "all", + layout: "all_cairo", ..cairo_vm::cairo_run::CairoRunConfig::default() }; cairo_run::cairo_run( @@ -441,7 +441,7 @@ fn cairo_run_assert_le_felt_hint() { fn cairo_run_assert_250_bit_element_array() { let mut hint_executor = BuiltinHintProcessor::new_empty(); let cairo_run_config = cairo_run::CairoRunConfig { - layout: "all", + layout: "all_cairo", ..cairo_vm::cairo_run::CairoRunConfig::default() }; cairo_run::cairo_run( @@ -456,7 +456,7 @@ fn cairo_run_assert_250_bit_element_array() { fn cairo_abs_value() { let mut hint_executor = BuiltinHintProcessor::new_empty(); let cairo_run_config = cairo_run::CairoRunConfig { - layout: "all", + layout: "all_cairo", ..cairo_vm::cairo_run::CairoRunConfig::default() }; cairo_run::cairo_run( @@ -471,7 +471,7 @@ fn cairo_abs_value() { fn cairo_run_compare_different_arrays() { let mut hint_executor = BuiltinHintProcessor::new_empty(); let cairo_run_config = cairo_run::CairoRunConfig { - layout: "all", + layout: "all_cairo", ..cairo_vm::cairo_run::CairoRunConfig::default() }; cairo_run::cairo_run( @@ -486,7 +486,7 @@ fn cairo_run_compare_different_arrays() { fn cairo_run_assert_nn() { let mut hint_executor = BuiltinHintProcessor::new_empty(); let cairo_run_config = cairo_run::CairoRunConfig { - layout: "all", + layout: "all_cairo", ..cairo_vm::cairo_run::CairoRunConfig::default() }; cairo_run::cairo_run( @@ -501,7 +501,7 @@ fn cairo_run_assert_nn() { fn cairo_run_sqrt() { let mut hint_executor = BuiltinHintProcessor::new_empty(); let cairo_run_config = cairo_run::CairoRunConfig { - layout: "all", + layout: "all_cairo", ..cairo_vm::cairo_run::CairoRunConfig::default() }; cairo_run::cairo_run( @@ -516,7 +516,7 @@ fn cairo_run_sqrt() { fn cairo_run_assert_not_zero() { let mut hint_executor = BuiltinHintProcessor::new_empty(); let cairo_run_config = cairo_run::CairoRunConfig { - layout: "all", + layout: "all_cairo", ..cairo_vm::cairo_run::CairoRunConfig::default() }; cairo_run::cairo_run( @@ -531,7 +531,7 @@ fn cairo_run_assert_not_zero() { fn cairo_run_split_int() { let mut hint_executor = BuiltinHintProcessor::new_empty(); let cairo_run_config = cairo_run::CairoRunConfig { - layout: "all", + layout: "all_cairo", ..cairo_vm::cairo_run::CairoRunConfig::default() }; cairo_run::cairo_run( @@ -546,7 +546,7 @@ fn cairo_run_split_int() { fn cairo_run_split_int_big() { let mut hint_executor = BuiltinHintProcessor::new_empty(); let cairo_run_config = cairo_run::CairoRunConfig { - layout: "all", + layout: "all_cairo", ..cairo_vm::cairo_run::CairoRunConfig::default() }; cairo_run::cairo_run( @@ -561,7 +561,7 @@ fn cairo_run_split_int_big() { fn cairo_run_split_felt() { let mut hint_executor = BuiltinHintProcessor::new_empty(); let cairo_run_config = cairo_run::CairoRunConfig { - layout: "all", + layout: "all_cairo", ..cairo_vm::cairo_run::CairoRunConfig::default() }; cairo_run::cairo_run( @@ -576,7 +576,7 @@ fn cairo_run_split_felt() { fn cairo_run_math_cmp() { let mut hint_executor = BuiltinHintProcessor::new_empty(); let cairo_run_config = cairo_run::CairoRunConfig { - layout: "all", + layout: "all_cairo", ..cairo_vm::cairo_run::CairoRunConfig::default() }; cairo_run::cairo_run( @@ -591,7 +591,7 @@ fn cairo_run_math_cmp() { fn cairo_run_unsigned_div_rem() { let mut hint_executor = BuiltinHintProcessor::new_empty(); let cairo_run_config = cairo_run::CairoRunConfig { - layout: "all", + layout: "all_cairo", ..cairo_vm::cairo_run::CairoRunConfig::default() }; cairo_run::cairo_run( @@ -606,7 +606,7 @@ fn cairo_run_unsigned_div_rem() { fn cairo_run_signed_div_rem() { let mut hint_executor = BuiltinHintProcessor::new_empty(); let cairo_run_config = cairo_run::CairoRunConfig { - layout: "all", + layout: "all_cairo", ..cairo_vm::cairo_run::CairoRunConfig::default() }; cairo_run::cairo_run( @@ -621,7 +621,7 @@ fn cairo_run_signed_div_rem() { fn cairo_run_assert_lt_felt() { let mut hint_executor = BuiltinHintProcessor::new_empty(); let cairo_run_config = cairo_run::CairoRunConfig { - layout: "all", + layout: "all_cairo", ..cairo_vm::cairo_run::CairoRunConfig::default() }; cairo_run::cairo_run( @@ -636,7 +636,7 @@ fn cairo_run_assert_lt_felt() { fn cairo_run_memcpy() { let mut hint_executor = BuiltinHintProcessor::new_empty(); let cairo_run_config = cairo_run::CairoRunConfig { - layout: "all", + layout: "all_cairo", ..cairo_vm::cairo_run::CairoRunConfig::default() }; cairo_run::cairo_run( @@ -651,7 +651,7 @@ fn cairo_run_memcpy() { fn cairo_run_memset() { let mut hint_executor = BuiltinHintProcessor::new_empty(); let cairo_run_config = cairo_run::CairoRunConfig { - layout: "all", + layout: "all_cairo", ..cairo_vm::cairo_run::CairoRunConfig::default() }; cairo_run::cairo_run( @@ -666,7 +666,7 @@ fn cairo_run_memset() { fn cairo_run_pow() { let mut hint_executor = BuiltinHintProcessor::new_empty(); let cairo_run_config = cairo_run::CairoRunConfig { - layout: "all", + layout: "all_cairo", ..cairo_vm::cairo_run::CairoRunConfig::default() }; cairo_run::cairo_run( @@ -681,7 +681,7 @@ fn cairo_run_pow() { fn cairo_run_dict() { let mut hint_executor = BuiltinHintProcessor::new_empty(); let cairo_run_config = cairo_run::CairoRunConfig { - layout: "all", + layout: "all_cairo", ..cairo_vm::cairo_run::CairoRunConfig::default() }; cairo_run::cairo_run( @@ -696,7 +696,7 @@ fn cairo_run_dict() { fn cairo_run_dict_update() { let mut hint_executor = BuiltinHintProcessor::new_empty(); let cairo_run_config = cairo_run::CairoRunConfig { - layout: "all", + layout: "all_cairo", ..cairo_vm::cairo_run::CairoRunConfig::default() }; cairo_run::cairo_run( @@ -711,7 +711,7 @@ fn cairo_run_dict_update() { fn cairo_run_uint256() { let mut hint_executor = BuiltinHintProcessor::new_empty(); let cairo_run_config = cairo_run::CairoRunConfig { - layout: "all", + layout: "all_cairo", ..cairo_vm::cairo_run::CairoRunConfig::default() }; cairo_run::cairo_run( @@ -726,7 +726,7 @@ fn cairo_run_uint256() { fn cairo_run_find_element() { let mut hint_executor = BuiltinHintProcessor::new_empty(); let cairo_run_config = cairo_run::CairoRunConfig { - layout: "all", + layout: "all_cairo", ..cairo_vm::cairo_run::CairoRunConfig::default() }; cairo_run::cairo_run( @@ -741,7 +741,7 @@ fn cairo_run_find_element() { fn cairo_run_search_sorted_lower() { let mut hint_executor = BuiltinHintProcessor::new_empty(); let cairo_run_config = cairo_run::CairoRunConfig { - layout: "all", + layout: "all_cairo", ..cairo_vm::cairo_run::CairoRunConfig::default() }; cairo_run::cairo_run( @@ -756,7 +756,7 @@ fn cairo_run_search_sorted_lower() { fn cairo_run_usort() { let mut hint_executor = BuiltinHintProcessor::new_empty(); let cairo_run_config = cairo_run::CairoRunConfig { - layout: "all", + layout: "all_cairo", ..cairo_vm::cairo_run::CairoRunConfig::default() }; cairo_run::cairo_run( @@ -771,7 +771,7 @@ fn cairo_run_usort() { fn cairo_run_usort_bad() { let mut hint_executor = BuiltinHintProcessor::new_empty(); let cairo_run_config = cairo_run::CairoRunConfig { - layout: "all", + layout: "all_cairo", ..cairo_vm::cairo_run::CairoRunConfig::default() }; let err = cairo_run::cairo_run( @@ -791,7 +791,7 @@ fn cairo_run_usort_bad() { fn cairo_run_dict_write_bad() { let mut hint_executor = BuiltinHintProcessor::new_empty(); let cairo_run_config = cairo_run::CairoRunConfig { - layout: "all", + layout: "all_cairo", ..cairo_vm::cairo_run::CairoRunConfig::default() }; assert!(cairo_run::cairo_run( @@ -802,7 +802,7 @@ fn cairo_run_dict_write_bad() { .is_err()); let cairo_run_config = cairo_run::CairoRunConfig { - layout: "all", + layout: "all_cairo", ..cairo_vm::cairo_run::CairoRunConfig::default() }; let err = cairo_run::cairo_run( @@ -821,7 +821,7 @@ fn cairo_run_dict_write_bad() { fn cairo_run_dict_update_bad() { let mut hint_executor = BuiltinHintProcessor::new_empty(); let cairo_run_config = cairo_run::CairoRunConfig { - layout: "all", + layout: "all_cairo", ..cairo_vm::cairo_run::CairoRunConfig::default() }; assert!(cairo_run::cairo_run( @@ -832,7 +832,7 @@ fn cairo_run_dict_update_bad() { .is_err()); let cairo_run_config = cairo_run::CairoRunConfig { - layout: "all", + layout: "all_cairo", ..cairo_vm::cairo_run::CairoRunConfig::default() }; let err = cairo_run::cairo_run( @@ -850,7 +850,7 @@ fn cairo_run_dict_update_bad() { fn cairo_run_squash_dict() { let mut hint_executor = BuiltinHintProcessor::new_empty(); let cairo_run_config = cairo_run::CairoRunConfig { - layout: "all", + layout: "all_cairo", ..cairo_vm::cairo_run::CairoRunConfig::default() }; cairo_run::cairo_run( @@ -865,7 +865,7 @@ fn cairo_run_squash_dict() { fn cairo_run_dict_squash() { let mut hint_executor = BuiltinHintProcessor::new_empty(); let cairo_run_config = cairo_run::CairoRunConfig { - layout: "all", + layout: "all_cairo", ..cairo_vm::cairo_run::CairoRunConfig::default() }; cairo_run::cairo_run( @@ -880,7 +880,7 @@ fn cairo_run_dict_squash() { fn cairo_run_set_add() { let mut hint_executor = BuiltinHintProcessor::new_empty(); let cairo_run_config = cairo_run::CairoRunConfig { - layout: "all", + layout: "all_cairo", ..cairo_vm::cairo_run::CairoRunConfig::default() }; cairo_run::cairo_run( @@ -895,7 +895,7 @@ fn cairo_run_set_add() { fn cairo_run_secp() { let mut hint_executor = BuiltinHintProcessor::new_empty(); let cairo_run_config = cairo_run::CairoRunConfig { - layout: "all", + layout: "all_cairo", ..cairo_vm::cairo_run::CairoRunConfig::default() }; cairo_run::cairo_run( @@ -910,7 +910,7 @@ fn cairo_run_secp() { fn cairo_run_signature() { let mut hint_executor = BuiltinHintProcessor::new_empty(); let cairo_run_config = cairo_run::CairoRunConfig { - layout: "all", + layout: "all_cairo", ..cairo_vm::cairo_run::CairoRunConfig::default() }; cairo_run::cairo_run( @@ -925,7 +925,7 @@ fn cairo_run_signature() { fn cairo_run_secp_ec() { let mut hint_executor = BuiltinHintProcessor::new_empty(); let cairo_run_config = cairo_run::CairoRunConfig { - layout: "all", + layout: "all_cairo", ..cairo_vm::cairo_run::CairoRunConfig::default() }; cairo_run::cairo_run( @@ -940,7 +940,7 @@ fn cairo_run_secp_ec() { fn cairo_run_blake2s_hello_world_hash() { let mut hint_executor = BuiltinHintProcessor::new_empty(); let cairo_run_config = cairo_run::CairoRunConfig { - layout: "all", + layout: "all_cairo", ..cairo_vm::cairo_run::CairoRunConfig::default() }; cairo_run::cairo_run( @@ -955,7 +955,7 @@ fn cairo_run_blake2s_hello_world_hash() { fn cairo_run_finalize_blake2s() { let mut hint_executor = BuiltinHintProcessor::new_empty(); let cairo_run_config = cairo_run::CairoRunConfig { - layout: "all", + layout: "all_cairo", ..cairo_vm::cairo_run::CairoRunConfig::default() }; cairo_run::cairo_run( @@ -969,7 +969,7 @@ fn cairo_run_finalize_blake2s() { fn cairo_run_unsafe_keccak() { let mut hint_executor = BuiltinHintProcessor::new_empty(); let cairo_run_config = cairo_run::CairoRunConfig { - layout: "all", + layout: "all_cairo", ..cairo_vm::cairo_run::CairoRunConfig::default() }; cairo_run::cairo_run( @@ -984,7 +984,7 @@ fn cairo_run_unsafe_keccak() { fn cairo_run_blake2s_felts() { let mut hint_executor = BuiltinHintProcessor::new_empty(); let cairo_run_config = cairo_run::CairoRunConfig { - layout: "all", + layout: "all_cairo", ..cairo_vm::cairo_run::CairoRunConfig::default() }; cairo_run::cairo_run( @@ -999,7 +999,7 @@ fn cairo_run_blake2s_felts() { fn cairo_run_unsafe_keccak_finalize() { let mut hint_executor = BuiltinHintProcessor::new_empty(); let cairo_run_config = cairo_run::CairoRunConfig { - layout: "all", + layout: "all_cairo", ..cairo_vm::cairo_run::CairoRunConfig::default() }; cairo_run::cairo_run( @@ -1014,7 +1014,7 @@ fn cairo_run_unsafe_keccak_finalize() { fn cairo_run_keccak_add_uint256() { let mut hint_executor = BuiltinHintProcessor::new_empty(); let cairo_run_config = cairo_run::CairoRunConfig { - layout: "all", + layout: "all_cairo", ..cairo_vm::cairo_run::CairoRunConfig::default() }; cairo_run::cairo_run( @@ -1029,7 +1029,7 @@ fn cairo_run_keccak_add_uint256() { fn cairo_run_private_keccak() { let mut hint_executor = BuiltinHintProcessor::new_empty(); let cairo_run_config = cairo_run::CairoRunConfig { - layout: "all", + layout: "all_cairo", ..cairo_vm::cairo_run::CairoRunConfig::default() }; cairo_run::cairo_run( @@ -1044,7 +1044,7 @@ fn cairo_run_private_keccak() { fn cairo_run_keccak_copy_inputs() { let mut hint_executor = BuiltinHintProcessor::new_empty(); let cairo_run_config = cairo_run::CairoRunConfig { - layout: "all", + layout: "all_cairo", ..cairo_vm::cairo_run::CairoRunConfig::default() }; cairo_run::cairo_run( @@ -1059,7 +1059,7 @@ fn cairo_run_keccak_copy_inputs() { fn cairo_run_finalize_keccak() { let mut hint_executor = BuiltinHintProcessor::new_empty(); let cairo_run_config = cairo_run::CairoRunConfig { - layout: "all", + layout: "all_cairo", ..cairo_vm::cairo_run::CairoRunConfig::default() }; cairo_run::cairo_run( @@ -1074,7 +1074,7 @@ fn cairo_run_finalize_keccak() { fn cairo_run_operations_with_data() { let mut hint_executor = BuiltinHintProcessor::new_empty(); let cairo_run_config = cairo_run::CairoRunConfig { - layout: "all", + layout: "all_cairo", ..cairo_vm::cairo_run::CairoRunConfig::default() }; cairo_run::cairo_run( @@ -1089,7 +1089,7 @@ fn cairo_run_operations_with_data() { fn cairo_run_sha256() { let mut hint_executor = BuiltinHintProcessor::new_empty(); let cairo_run_config = cairo_run::CairoRunConfig { - layout: "all", + layout: "all_cairo", ..cairo_vm::cairo_run::CairoRunConfig::default() }; cairo_run::cairo_run( @@ -1104,7 +1104,7 @@ fn cairo_run_sha256() { fn cairo_run_math_cmp_and_pow_integration() { let mut hint_executor = BuiltinHintProcessor::new_empty(); let cairo_run_config = cairo_run::CairoRunConfig { - layout: "all", + layout: "all_cairo", ..cairo_vm::cairo_run::CairoRunConfig::default() }; cairo_run::cairo_run( @@ -1119,7 +1119,7 @@ fn cairo_run_math_cmp_and_pow_integration() { fn cairo_run_uint256_integration() { let mut hint_executor = BuiltinHintProcessor::new_empty(); let cairo_run_config = cairo_run::CairoRunConfig { - layout: "all", + layout: "all_cairo", ..cairo_vm::cairo_run::CairoRunConfig::default() }; cairo_run::cairo_run( @@ -1134,7 +1134,7 @@ fn cairo_run_uint256_integration() { fn cairo_run_set_integration() { let mut hint_executor = BuiltinHintProcessor::new_empty(); let cairo_run_config = cairo_run::CairoRunConfig { - layout: "all", + layout: "all_cairo", ..cairo_vm::cairo_run::CairoRunConfig::default() }; cairo_run::cairo_run( @@ -1149,7 +1149,7 @@ fn cairo_run_set_integration() { fn cairo_run_memory_module_integration() { let mut hint_executor = BuiltinHintProcessor::new_empty(); let cairo_run_config = cairo_run::CairoRunConfig { - layout: "all", + layout: "all_cairo", ..cairo_vm::cairo_run::CairoRunConfig::default() }; cairo_run::cairo_run( @@ -1164,7 +1164,7 @@ fn cairo_run_memory_module_integration() { fn cairo_run_dict_integration() { let mut hint_executor = BuiltinHintProcessor::new_empty(); let cairo_run_config = cairo_run::CairoRunConfig { - layout: "all", + layout: "all_cairo", ..cairo_vm::cairo_run::CairoRunConfig::default() }; cairo_run::cairo_run( @@ -1179,7 +1179,7 @@ fn cairo_run_dict_integration() { fn cairo_run_secp_integration() { let mut hint_executor = BuiltinHintProcessor::new_empty(); let cairo_run_config = cairo_run::CairoRunConfig { - layout: "all", + layout: "all_cairo", ..cairo_vm::cairo_run::CairoRunConfig::default() }; cairo_run::cairo_run( @@ -1194,7 +1194,7 @@ fn cairo_run_secp_integration() { fn cairo_run_keccak_integration() { let mut hint_executor = BuiltinHintProcessor::new_empty(); let cairo_run_config = cairo_run::CairoRunConfig { - layout: "all", + layout: "all_cairo", ..cairo_vm::cairo_run::CairoRunConfig::default() }; cairo_run::cairo_run( @@ -1209,7 +1209,7 @@ fn cairo_run_keccak_integration() { fn cairo_run_blake2s_integration() { let mut hint_executor = BuiltinHintProcessor::new_empty(); let cairo_run_config = cairo_run::CairoRunConfig { - layout: "all", + layout: "all_cairo", ..cairo_vm::cairo_run::CairoRunConfig::default() }; cairo_run::cairo_run( @@ -1239,7 +1239,7 @@ fn cairo_run_relocate_segments() { fn cairo_run_error_msg_attr() { let mut hint_executor = BuiltinHintProcessor::new_empty(); let cairo_run_config = cairo_run::CairoRunConfig { - layout: "all", + layout: "all_cairo", ..cairo_vm::cairo_run::CairoRunConfig::default() }; let err = cairo_run::cairo_run( @@ -1257,7 +1257,7 @@ fn cairo_run_error_msg_attr() { fn cairo_run_error_msg_attr_ap_based_reference() { let mut hint_executor = BuiltinHintProcessor::new_empty(); let cairo_run_config = cairo_run::CairoRunConfig { - layout: "all", + layout: "all_cairo", ..cairo_vm::cairo_run::CairoRunConfig::default() }; let err = cairo_run::cairo_run( @@ -1275,7 +1275,7 @@ fn cairo_run_error_msg_attr_ap_based_reference() { fn cairo_run_error_msg_attr_complex_reference() { let mut hint_executor = BuiltinHintProcessor::new_empty(); let cairo_run_config = cairo_run::CairoRunConfig { - layout: "all", + layout: "all_cairo", ..cairo_vm::cairo_run::CairoRunConfig::default() }; let err = cairo_run::cairo_run( @@ -1307,7 +1307,7 @@ fn cairo_run_dict_store_cast_pointer() { fn cairo_run_verify_signature_hint() { let mut hint_executor = BuiltinHintProcessor::new_empty(); let cairo_run_config = cairo_run::CairoRunConfig { - layout: "all", + layout: "all_cairo", ..cairo_vm::cairo_run::CairoRunConfig::default() }; cairo_run::cairo_run( diff --git a/tests/pedersen_test.rs b/tests/pedersen_test.rs index 0392243d69..6cdf778163 100644 --- a/tests/pedersen_test.rs +++ b/tests/pedersen_test.rs @@ -13,7 +13,7 @@ fn pedersen_integration_test() { let program = Program::from_file(Path::new("cairo_programs/pedersen_test.json"), Some("main")) .expect("Failed to deserialize program"); let mut hint_processor = BuiltinHintProcessor::new_empty(); - let mut cairo_runner = CairoRunner::new(&program, "all", false).unwrap(); + let mut cairo_runner = CairoRunner::new(&program, "all_cairo", false).unwrap(); let mut vm = VirtualMachine::new(true); let end = cairo_runner.initialize(&mut vm).unwrap(); assert_matches!( diff --git a/tests/skip_instruction_test.rs b/tests/skip_instruction_test.rs index c8675e58a5..eb71a134ce 100644 --- a/tests/skip_instruction_test.rs +++ b/tests/skip_instruction_test.rs @@ -21,7 +21,7 @@ fn skip_next_instruction_test() { let mut hint_processor = BuiltinHintProcessor::new_empty(); - let mut cairo_runner = CairoRunner::new(&program, "all", false).unwrap(); + let mut cairo_runner = CairoRunner::new(&program, "all_cairo", false).unwrap(); let mut vm = VirtualMachine::new(false); let end = cairo_runner.initialize(&mut vm).unwrap(); assert_matches!( diff --git a/tests/struct_test.rs b/tests/struct_test.rs index cd443c051f..19986d0156 100644 --- a/tests/struct_test.rs +++ b/tests/struct_test.rs @@ -17,7 +17,7 @@ fn struct_integration_test() { let program = Program::from_file(Path::new("cairo_programs/struct.json"), Some("main")) .expect("Failed to deserialize program"); let mut hint_processor = BuiltinHintProcessor::new_empty(); - let mut cairo_runner = CairoRunner::new(&program, "all", false).unwrap(); + let mut cairo_runner = CairoRunner::new(&program, "all_cairo", false).unwrap(); let mut vm = VirtualMachine::new(true); let end = cairo_runner.initialize(&mut vm).unwrap(); From 72eed988bd75c338d5c1239036f1d85eac0dbe3b Mon Sep 17 00:00:00 2001 From: jrigada Date: Fri, 3 Mar 2023 16:50:43 -0300 Subject: [PATCH 02/39] update layout all --- README.md | 2 +- bench/criterion_benchmark.rs | 2 +- bench/iai_benchmark.rs | 2 +- bench/run_benchmarks.sh | 32 +++++++++++++++++++++++++++----- 4 files changed, 30 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 4c197bd2cc..ea6bc1ef2d 100644 --- a/README.md +++ b/README.md @@ -133,7 +133,7 @@ let program = ```rust let mut vm = VirtualMachine::new(false); -let mut cairo_runner = CairoRunner::new(&program, "all", false); +let mut cairo_runner = CairoRunner::new(&program, "all_cairo", false); let mut hint_processor = BuiltinHintProcessor::new_empty(); diff --git a/bench/criterion_benchmark.rs b/bench/criterion_benchmark.rs index 4df2f75bc1..bccb64a779 100644 --- a/bench/criterion_benchmark.rs +++ b/bench/criterion_benchmark.rs @@ -28,7 +28,7 @@ const BENCH_PATH: &str = "cairo_programs/benchmarks/"; pub fn criterion_benchmarks(c: &mut Criterion) { let mut hint_executor = BuiltinHintProcessor::new_empty(); let cairo_run_config = cairo_vm::cairo_run::CairoRunConfig { - layout: "all", + layout: "all_cairo", ..cairo_vm::cairo_run::CairoRunConfig::default() }; for benchmark_name in build_bench_strings() { diff --git a/bench/iai_benchmark.rs b/bench/iai_benchmark.rs index 9763e99983..ce99c54941 100644 --- a/bench/iai_benchmark.rs +++ b/bench/iai_benchmark.rs @@ -11,7 +11,7 @@ macro_rules! iai_bench_expand_prog { ($val: ident) => { fn $val() -> Result { let cairo_run_config = cairo_vm::cairo_run::CairoRunConfig { - layout: "all", + layout: "all_cairo", ..cairo_vm::cairo_run::CairoRunConfig::default() }; let mut hint_executor = BuiltinHintProcessor::new_empty(); diff --git a/bench/run_benchmarks.sh b/bench/run_benchmarks.sh index 624b2e01d0..6ac4b45c89 100755 --- a/bench/run_benchmarks.sh +++ b/bench/run_benchmarks.sh @@ -1,15 +1,37 @@ #!/usr/bin/env sh -tests_path="../cairo_programs/benchmarks" +tests_path="cairo_programs/benchmarks" +trace_enabled=${1:-false} set -e +source ../cairo-rs-py/scripts/cairo-rs-py/bin/activate + +for input_file in "$tests_path"/*.cairo; do + if [ -f "$input_file" ]; then + output_file="${input_file%.cairo}.json" + cairo-compile --cairo_path="cairo_programs" "$input_file" --output "$output_file" + echo "Compiled $input_file to $output_file" + fi +done + +deactivate + for file in $(ls $tests_path | grep .cairo | sed -E 's/\.cairo//'); do echo "Running $file benchmark" export PATH="$(pyenv root)/shims:$PATH" - hyperfine \ - -n "Cairo VM (CPython)" "PYENV_VERSION=3.7.12 cairo-run --layout all --program $tests_path/$file.json" \ - -n "Cairo VM (PyPy)" "PYENV_VERSION=pypy3.7-7.3.9 cairo-run --layout all --program $tests_path/$file.json" \ - -n "cairo-rs (Rust)" "../target/release/cairo-rs-run $tests_path/$file.json --layout all" + if [ "$trace_enabled" = true ]; then + hyperfine -w 0 -r 2 -i --show-output \ + -n "Cairo VM (CPython)" "source ../cairo-rs-py/scripts/cairo-lang/bin/activate && cairo-run --layout all --program $tests_path/$file.json --trace_file $tests_path/$file.trace" \ + -n "Cairo VM (PyPy)" "source ../cairo-rs-py/scripts/cairo-rs-pypy/bin/activate && cairo-run --layout all --program $tests_path/$file.json --trace_file $tests_path/$file.trace" \ + -n "cairo-rs (Rust)" "target/release/cairo-rs-run $tests_path/$file.json --layout all --trace_file $tests_path/$file.trace" + else + hyperfine -w 0 -r 2 -i --show-output \ + -n "Cairo VM (CPython)" "source ../cairo-rs-py/scripts/cairo-lang/bin/activate && cairo-run --layout all --program $tests_path/$file.json" \ + -n "Cairo VM (PyPy)" "source ../cairo-rs-py/scripts/cairo-rs-pypy/bin/activate && cairo-run --layout all --program $tests_path/$file.json" \ + -n "cairo-rs (Rust)" "target/release/cairo-rs-run $tests_path/$file.json --layout all" + fi done + + From cee5613e200be59c0c72c6b8b6b039d5f035bed4 Mon Sep 17 00:00:00 2001 From: jrigada Date: Fri, 3 Mar 2023 17:00:42 -0300 Subject: [PATCH 03/39] update benches and makefile --- Makefile | 8 ++++---- README.md | 4 ++-- bench/run_benchmarks.sh | 12 ++++++------ 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/Makefile b/Makefile index f87c6cb330..ea3b9b3548 100644 --- a/Makefile +++ b/Makefile @@ -32,10 +32,10 @@ $(TEST_PROOF_DIR)/%.json: $(TEST_PROOF_DIR)/%.cairo cairo-compile --cairo_path="$(TEST_PROOF_DIR):$(PROOF_BENCH_DIR)" $< --output $@ --proof_mode $(TEST_PROOF_DIR)/%.rs.trace $(TEST_PROOF_DIR)/%.rs.memory: $(TEST_PROOF_DIR)/%.json $(RELBIN) - cargo llvm-cov run --release --no-report -- --layout all --proof_mode $< --trace_file $@ --memory_file $(@D)/$(*F).rs.memory + cargo llvm-cov run --release --no-report -- --layout all_cairo --proof_mode $< --trace_file $@ --memory_file $(@D)/$(*F).rs.memory $(TEST_PROOF_DIR)/%.trace $(TEST_PROOF_DIR)/%.memory: $(TEST_PROOF_DIR)/%.json - cairo-run --layout all --proof_mode --program $< --trace_file $@ --memory_file $(@D)/$(*F).memory + cairo-run --layout all_cairo --proof_mode --program $< --trace_file $@ --memory_file $(@D)/$(*F).memory $(PROOF_BENCH_DIR)/%.json: $(PROOF_BENCH_DIR)/%.cairo cairo-compile --cairo_path="$(TEST_PROOF_DIR):$(PROOF_BENCH_DIR)" $< --output $@ --proof_mode @@ -68,10 +68,10 @@ $(TEST_DIR)/%.json: $(TEST_DIR)/%.cairo cairo-compile --cairo_path="$(TEST_DIR):$(BENCH_DIR)" $< --output $@ $(TEST_DIR)/%.rs.trace $(TEST_DIR)/%.rs.memory: $(TEST_DIR)/%.json $(RELBIN) - cargo llvm-cov run --release --no-report -- --layout all $< --trace_file $@ --memory_file $(@D)/$(*F).rs.memory + cargo llvm-cov run --release --no-report -- --layout all_cairo $< --trace_file $@ --memory_file $(@D)/$(*F).rs.memory $(TEST_DIR)/%.trace $(TEST_DIR)/%.memory: $(TEST_DIR)/%.json - cairo-run --layout all --program $< --trace_file $@ --memory_file $(@D)/$(*F).memory + cairo-run --layout all_cairo --program $< --trace_file $@ --memory_file $(@D)/$(*F).memory $(BENCH_DIR)/%.json: $(BENCH_DIR)/%.cairo cairo-compile --cairo_path="$(TEST_DIR):$(BENCH_DIR)" $< --output $@ diff --git a/README.md b/README.md index ea6bc1ef2d..f8d5a78031 100644 --- a/README.md +++ b/README.md @@ -94,7 +94,7 @@ cairo-compile cairo_programs/abs_value_array.cairo --output cairo_programs/abs_v To run a compiled .json program through the VM, call the executable giving it the path and name of the file to be executed. For example: ```bash -target/release/cairo-rs-run cairo_programs/abs_value_array_compiled.json --layout all +target/release/cairo-rs-run cairo_programs/abs_value_array_compiled.json --layout all_cairo ``` The flag `--layout` determines which builtins can be used. More info about layouts [here](https://www.cairo-lang.org/docs/how_cairo_works/builtins.html#layouts). @@ -109,7 +109,7 @@ cargo build --release cairo-compile cairo_programs/abs_value_array.cairo --output cairo_programs/abs_value_array_compiled.json -target/release/cairo-rs-run cairo_programs/abs_value_array_compiled.json --layout all +target/release/cairo-rs-run cairo_programs/abs_value_array_compiled.json --layout all_cairo ``` ### Using hints diff --git a/bench/run_benchmarks.sh b/bench/run_benchmarks.sh index 6ac4b45c89..5115ef993a 100755 --- a/bench/run_benchmarks.sh +++ b/bench/run_benchmarks.sh @@ -23,14 +23,14 @@ for file in $(ls $tests_path | grep .cairo | sed -E 's/\.cairo//'); do if [ "$trace_enabled" = true ]; then hyperfine -w 0 -r 2 -i --show-output \ - -n "Cairo VM (CPython)" "source ../cairo-rs-py/scripts/cairo-lang/bin/activate && cairo-run --layout all --program $tests_path/$file.json --trace_file $tests_path/$file.trace" \ - -n "Cairo VM (PyPy)" "source ../cairo-rs-py/scripts/cairo-rs-pypy/bin/activate && cairo-run --layout all --program $tests_path/$file.json --trace_file $tests_path/$file.trace" \ - -n "cairo-rs (Rust)" "target/release/cairo-rs-run $tests_path/$file.json --layout all --trace_file $tests_path/$file.trace" + -n "Cairo VM (CPython)" "source ../cairo-rs-py/scripts/cairo-lang/bin/activate && cairo-run --layout all_cairo --program $tests_path/$file.json --trace_file $tests_path/$file.trace" \ + -n "Cairo VM (PyPy)" "source ../cairo-rs-py/scripts/cairo-rs-pypy/bin/activate && cairo-run --layout all_cairo --program $tests_path/$file.json --trace_file $tests_path/$file.trace" \ + -n "cairo-rs (Rust)" "target/release/cairo-rs-run $tests_path/$file.json --layout all_cairo --trace_file $tests_path/$file.trace" else hyperfine -w 0 -r 2 -i --show-output \ - -n "Cairo VM (CPython)" "source ../cairo-rs-py/scripts/cairo-lang/bin/activate && cairo-run --layout all --program $tests_path/$file.json" \ - -n "Cairo VM (PyPy)" "source ../cairo-rs-py/scripts/cairo-rs-pypy/bin/activate && cairo-run --layout all --program $tests_path/$file.json" \ - -n "cairo-rs (Rust)" "target/release/cairo-rs-run $tests_path/$file.json --layout all" + -n "Cairo VM (CPython)" "source ../cairo-rs-py/scripts/cairo-lang/bin/activate && cairo-run --layout all_cairo --program $tests_path/$file.json" \ + -n "Cairo VM (PyPy)" "source ../cairo-rs-py/scripts/cairo-rs-pypy/bin/activate && cairo-run --layout all_cairo --program $tests_path/$file.json" \ + -n "cairo-rs (Rust)" "target/release/cairo-rs-run $tests_path/$file.json --layout all_cairo" fi done From f4bdd250eeba0fc5fef8e1307fa820e80936cc21 Mon Sep 17 00:00:00 2001 From: Federica Date: Fri, 3 Mar 2023 18:31:36 -0300 Subject: [PATCH 04/39] Add instance def --- src/types/instance_definitions/mod.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/types/instance_definitions/mod.rs b/src/types/instance_definitions/mod.rs index 78b6eb82fe..53bcc15d1b 100644 --- a/src/types/instance_definitions/mod.rs +++ b/src/types/instance_definitions/mod.rs @@ -6,4 +6,5 @@ pub mod ec_op_instance_def; pub mod ecdsa_instance_def; pub mod keccak_instance_def; pub mod pedersen_instance_def; +pub mod poseidon_instance_def; pub mod range_check_instance_def; From d8c11580a008e4cb21350c9ddc42ab32955d980c Mon Sep 17 00:00:00 2001 From: Federica Date: Fri, 3 Mar 2023 18:32:28 -0300 Subject: [PATCH 05/39] Add file --- .../poseidon_instance_def.rs | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 src/types/instance_definitions/poseidon_instance_def.rs diff --git a/src/types/instance_definitions/poseidon_instance_def.rs b/src/types/instance_definitions/poseidon_instance_def.rs new file mode 100644 index 0000000000..ea8c98d3ea --- /dev/null +++ b/src/types/instance_definitions/poseidon_instance_def.rs @@ -0,0 +1,44 @@ +#[derive(Clone, Debug, PartialEq)] +pub(crate) struct PoseidonInstanceDef { + pub(crate) ratio: u32, + pub(crate) partial_rounds_partition: Vec, +} + +impl PoseidonInstanceDef { + pub(crate) fn default() -> Self { + PoseidonInstanceDef { + ratio: 32, + partial_rounds_partition: vec![64, 22], + } + } + + pub(crate) fn new(ratio: u32, partial_rounds_partition: Vec) -> Self { + PoseidonInstanceDef { + ratio, + partial_rounds_partition, + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_new() { + let builtin_instance = PoseidonInstanceDef { + ratio: 8, + partial_rounds_partition: vec![1, 2], + }; + assert_eq!(PoseidonInstanceDef::new(8, vec![1, 2]), builtin_instance); + } + + #[test] + fn test_default() { + let builtin_instance = PoseidonInstanceDef { + ratio: 32, + partial_rounds_partition: vec![64, 22], + }; + assert_eq!(PoseidonInstanceDef::default(), builtin_instance); + } +} From f481b3dbc067dae75fa11c103e602dd93f77973a Mon Sep 17 00:00:00 2001 From: Federica Date: Fri, 3 Mar 2023 18:35:00 -0300 Subject: [PATCH 06/39] Add poseidon instance def to builtin instance def --- .../instance_definitions/builtins_instance_def.rs | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/types/instance_definitions/builtins_instance_def.rs b/src/types/instance_definitions/builtins_instance_def.rs index c29ee400b2..8ce4fb654b 100644 --- a/src/types/instance_definitions/builtins_instance_def.rs +++ b/src/types/instance_definitions/builtins_instance_def.rs @@ -1,7 +1,8 @@ use super::{ bitwise_instance_def::BitwiseInstanceDef, ec_op_instance_def::EcOpInstanceDef, ecdsa_instance_def::EcdsaInstanceDef, keccak_instance_def::KeccakInstanceDef, - pedersen_instance_def::PedersenInstanceDef, range_check_instance_def::RangeCheckInstanceDef, + pedersen_instance_def::PedersenInstanceDef, poseidon_instance_def::PoseidonInstanceDef, + range_check_instance_def::RangeCheckInstanceDef, }; #[derive(Debug, PartialEq)] @@ -13,6 +14,7 @@ pub(crate) struct BuiltinsInstanceDef { pub(crate) bitwise: Option, pub(crate) ec_op: Option, pub(crate) keccak: Option, + pub(crate) poseidon: Option, } impl BuiltinsInstanceDef { @@ -25,6 +27,7 @@ impl BuiltinsInstanceDef { bitwise: None, ec_op: None, keccak: None, + poseidon: None, } } @@ -37,6 +40,7 @@ impl BuiltinsInstanceDef { bitwise: None, ec_op: None, keccak: None, + poseidon: None, } } @@ -49,6 +53,7 @@ impl BuiltinsInstanceDef { bitwise: None, ec_op: None, keccak: None, + poseidon: None, } } @@ -61,6 +66,7 @@ impl BuiltinsInstanceDef { bitwise: Some(BitwiseInstanceDef::new(64)), ec_op: Some(EcOpInstanceDef::new(1024)), keccak: None, + poseidon: None, } } @@ -73,6 +79,7 @@ impl BuiltinsInstanceDef { bitwise: Some(BitwiseInstanceDef::new(8)), ec_op: None, keccak: None, + poseidon: None, } } @@ -85,6 +92,7 @@ impl BuiltinsInstanceDef { bitwise: Some(BitwiseInstanceDef::new(16)), ec_op: None, keccak: Some(KeccakInstanceDef::new(2048, vec![200; 8])), + poseidon: None, } } @@ -97,6 +105,7 @@ impl BuiltinsInstanceDef { bitwise: Some(BitwiseInstanceDef::default()), ec_op: Some(EcOpInstanceDef::default()), keccak: None, + poseidon: Some(PoseidonInstanceDef::default()), // Added for testing } } } From 835d35c8374addd84f023d0b6cfb5fcc06737f76 Mon Sep 17 00:00:00 2001 From: Federica Date: Fri, 3 Mar 2023 18:58:13 -0300 Subject: [PATCH 07/39] Add Poseidon to BuiltinRunners --- .../poseidon_instance_def.rs | 4 ++-- src/vm/runners/builtin_runner/mod.rs | 22 +++++++++++++++++++ 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/src/types/instance_definitions/poseidon_instance_def.rs b/src/types/instance_definitions/poseidon_instance_def.rs index ea8c98d3ea..3d6e02b5b7 100644 --- a/src/types/instance_definitions/poseidon_instance_def.rs +++ b/src/types/instance_definitions/poseidon_instance_def.rs @@ -12,7 +12,7 @@ impl PoseidonInstanceDef { } } - pub(crate) fn new(ratio: u32, partial_rounds_partition: Vec) -> Self { + pub(crate) fn _new(ratio: u32, partial_rounds_partition: Vec) -> Self { PoseidonInstanceDef { ratio, partial_rounds_partition, @@ -30,7 +30,7 @@ mod tests { ratio: 8, partial_rounds_partition: vec![1, 2], }; - assert_eq!(PoseidonInstanceDef::new(8, vec![1, 2]), builtin_instance); + assert_eq!(PoseidonInstanceDef::_new(8, vec![1, 2]), builtin_instance); } #[test] diff --git a/src/vm/runners/builtin_runner/mod.rs b/src/vm/runners/builtin_runner/mod.rs index 78e1b95677..2a243bcbda 100644 --- a/src/vm/runners/builtin_runner/mod.rs +++ b/src/vm/runners/builtin_runner/mod.rs @@ -11,10 +11,12 @@ mod ec_op; mod hash; mod keccak; mod output; +mod poseidon; mod range_check; mod signature; pub use self::keccak::KeccakBuiltinRunner; +use self::poseidon::PoseidonBuiltinRunner; pub use bitwise::BitwiseBuiltinRunner; pub use ec_op::EcOpBuiltinRunner; pub use hash::HashBuiltinRunner; @@ -30,6 +32,7 @@ pub const SIGNATURE_BUILTIN_NAME: &str = "ecdsa"; pub const BITWISE_BUILTIN_NAME: &str = "bitwise"; pub const EC_OP_BUILTIN_NAME: &str = "ec_op"; pub const KECCAK_BUILTIN_NAME: &str = "keccak"; +pub const POSEIDON_BUILTIN_NAME: &str = "poseidon"; /* NB: this enum is no accident: we may need (and cairo-rs-py *does* need) * structs containing this to be `Send`. The only two ways to achieve that @@ -48,6 +51,7 @@ pub enum BuiltinRunner { RangeCheck(RangeCheckBuiltinRunner), Keccak(KeccakBuiltinRunner), Signature(SignatureBuiltinRunner), + Poseidon(PoseidonBuiltinRunner), } impl BuiltinRunner { @@ -63,6 +67,7 @@ impl BuiltinRunner { } BuiltinRunner::Keccak(ref mut keccak) => keccak.initialize_segments(segments), BuiltinRunner::Signature(ref mut signature) => signature.initialize_segments(segments), + BuiltinRunner::Poseidon(ref mut poseidon) => poseidon.initialize_segments(segments), } } @@ -75,6 +80,7 @@ impl BuiltinRunner { BuiltinRunner::RangeCheck(ref range_check) => range_check.initial_stack(), BuiltinRunner::Keccak(ref keccak) => keccak.initial_stack(), BuiltinRunner::Signature(ref signature) => signature.initial_stack(), + BuiltinRunner::Poseidon(ref poseidon) => poseidon.initial_stack(), } } @@ -96,6 +102,9 @@ impl BuiltinRunner { BuiltinRunner::Signature(ref mut signature) => { signature.final_stack(segments, stack_pointer) } + BuiltinRunner::Poseidon(ref mut poseidon) => { + poseidon.final_stack(segments, stack_pointer) + } } } @@ -114,6 +123,7 @@ impl BuiltinRunner { } BuiltinRunner::Keccak(ref keccak) => keccak.get_allocated_memory_units(vm), BuiltinRunner::Signature(ref signature) => signature.get_allocated_memory_units(vm), + BuiltinRunner::Poseidon(ref poseidon) => poseidon.get_allocated_memory_units(vm), } } @@ -127,6 +137,7 @@ impl BuiltinRunner { BuiltinRunner::RangeCheck(ref range_check) => range_check.base(), BuiltinRunner::Keccak(ref keccak) => keccak.base(), BuiltinRunner::Signature(ref signature) => signature.base(), + BuiltinRunner::Poseidon(ref poseidon) => poseidon.base(), } } @@ -139,6 +150,7 @@ impl BuiltinRunner { BuiltinRunner::RangeCheck(range_check) => Some(range_check.ratio()), BuiltinRunner::Keccak(keccak) => Some(keccak.ratio()), BuiltinRunner::Signature(ref signature) => Some(signature.ratio()), + BuiltinRunner::Poseidon(poseidon) => Some(poseidon.ratio()), } } @@ -151,6 +163,7 @@ impl BuiltinRunner { BuiltinRunner::RangeCheck(ref range_check) => range_check.add_validation_rule(memory), BuiltinRunner::Keccak(ref keccak) => keccak.add_validation_rule(memory), BuiltinRunner::Signature(ref signature) => signature.add_validation_rule(memory), + BuiltinRunner::Poseidon(ref poseidon) => poseidon.add_validation_rule(memory), } } @@ -171,6 +184,7 @@ impl BuiltinRunner { BuiltinRunner::Signature(ref signature) => { signature.deduce_memory_cell(address, memory) } + BuiltinRunner::Poseidon(ref poseidon) => poseidon.deduce_memory_cell(address, memory), } } @@ -200,6 +214,7 @@ impl BuiltinRunner { } BuiltinRunner::Keccak(ref keccak) => keccak.get_memory_segment_addresses(), BuiltinRunner::Signature(ref signature) => signature.get_memory_segment_addresses(), + BuiltinRunner::Poseidon(ref poseidon) => poseidon.get_memory_segment_addresses(), } } @@ -212,6 +227,7 @@ impl BuiltinRunner { BuiltinRunner::RangeCheck(ref range_check) => range_check.get_used_cells(segments), BuiltinRunner::Keccak(ref keccak) => keccak.get_used_cells(segments), BuiltinRunner::Signature(ref signature) => signature.get_used_cells(segments), + BuiltinRunner::Poseidon(ref poseidon) => poseidon.get_used_cells(segments), } } @@ -227,6 +243,7 @@ impl BuiltinRunner { BuiltinRunner::RangeCheck(ref range_check) => range_check.get_used_instances(segments), BuiltinRunner::Keccak(ref keccak) => keccak.get_used_instances(segments), BuiltinRunner::Signature(ref signature) => signature.get_used_instances(segments), + BuiltinRunner::Poseidon(ref poseidon) => poseidon.get_used_instances(segments), } } @@ -271,6 +288,7 @@ impl BuiltinRunner { BuiltinRunner::Output(_) => 0, BuiltinRunner::Keccak(builtin) => builtin.cells_per_instance, BuiltinRunner::Signature(builtin) => builtin.cells_per_instance, + BuiltinRunner::Poseidon(builtin) => builtin.cells_per_instance, } } @@ -283,6 +301,7 @@ impl BuiltinRunner { BuiltinRunner::Output(_) => 0, BuiltinRunner::Keccak(builtin) => builtin.n_input_cells, BuiltinRunner::Signature(builtin) => builtin.n_input_cells, + BuiltinRunner::Poseidon(builtin) => builtin.n_input_cells, } } @@ -295,6 +314,7 @@ impl BuiltinRunner { BuiltinRunner::Output(_) => OUTPUT_BUILTIN_NAME, BuiltinRunner::Keccak(_) => KECCAK_BUILTIN_NAME, BuiltinRunner::Signature(_) => SIGNATURE_BUILTIN_NAME, + BuiltinRunner::Poseidon(_) => POSEIDON_BUILTIN_NAME, } } @@ -374,6 +394,7 @@ impl BuiltinRunner { BuiltinRunner::Signature(ref signature) => { signature.get_used_cells_and_allocated_size(vm) } + BuiltinRunner::Poseidon(ref poseidon) => poseidon.get_used_cells_and_allocated_size(vm), } } @@ -387,6 +408,7 @@ impl BuiltinRunner { BuiltinRunner::RangeCheck(ref mut range_check) => range_check.stop_ptr = Some(stop_ptr), BuiltinRunner::Keccak(ref mut keccak) => keccak.stop_ptr = Some(stop_ptr), BuiltinRunner::Signature(ref mut signature) => signature.stop_ptr = Some(stop_ptr), + BuiltinRunner::Poseidon(ref mut poseidon) => poseidon.stop_ptr = Some(stop_ptr), } } } From b601a91777f2eb80a2372b3c6ed21ad3f63467d6 Mon Sep 17 00:00:00 2001 From: Federica Date: Mon, 6 Mar 2023 11:48:35 -0300 Subject: [PATCH 08/39] Add simple tests program --- cairo_programs/poseidon_builtin.cairo | 13 +++++++++++++ src/vm/errors/runner_errors.rs | 2 ++ src/vm/runners/builtin_runner/mod.rs | 6 ++++++ 3 files changed, 21 insertions(+) create mode 100644 cairo_programs/poseidon_builtin.cairo diff --git a/cairo_programs/poseidon_builtin.cairo b/cairo_programs/poseidon_builtin.cairo new file mode 100644 index 0000000000..791199b4a1 --- /dev/null +++ b/cairo_programs/poseidon_builtin.cairo @@ -0,0 +1,13 @@ +%builtins poseidon + from starkware.cairo.common.cairo_builtins import PoseidonBuiltin + from starkware.cairo.common.poseidon_state import PoseidonBuiltinState + + func main{poseidon_ptr: PoseidonBuiltin*}() { + assert poseidon_ptr[0].input = PoseidonBuiltinState(1,2,3); + let result = poseidon_ptr[0].output; + let poseidon_ptr = poseidon_ptr + PoseidonBuiltin.SIZE; + assert result.s0 = 442682200349489646213731521593476982257703159825582578145778919623645026501; + assert result.s1 = 2233832504250924383748553933071188903279928981104663696710686541536735838182; + assert result.s2 = 2512222140811166287287541003826449032093371832913959128171347018667852712082; + return (); + } \ No newline at end of file diff --git a/src/vm/errors/runner_errors.rs b/src/vm/errors/runner_errors.rs index 730e30f464..48e2a143e6 100644 --- a/src/vm/errors/runner_errors.rs +++ b/src/vm/errors/runner_errors.rs @@ -81,4 +81,6 @@ pub enum RunnerError { KeccakNoFirstInput, #[error("keccak_builtin: Failed to convert input cells to u64 values")] KeccakInputCellsNotU64, + #[error("{0}: Expected integer at address {1}")] + BuiltinExpectedInteger(&'static str, Relocatable), } diff --git a/src/vm/runners/builtin_runner/mod.rs b/src/vm/runners/builtin_runner/mod.rs index 2a243bcbda..894ff9059d 100644 --- a/src/vm/runners/builtin_runner/mod.rs +++ b/src/vm/runners/builtin_runner/mod.rs @@ -455,6 +455,12 @@ impl From for BuiltinRunner { } } +impl From for BuiltinRunner { + fn from(runner: PoseidonBuiltinRunner) -> Self { + BuiltinRunner::Poseidon(runner) + } +} + #[cfg(test)] mod tests { use super::*; From 2a9d2ddbf728036415d5830e07074f8217b53053 Mon Sep 17 00:00:00 2001 From: Federica Date: Mon, 6 Mar 2023 15:07:14 -0300 Subject: [PATCH 09/39] Prevent poseidon from being rejected by deserialize --- src/serde/deserialize_program.rs | 5 ++++- src/vm/runners/builtin_runner/mod.rs | 2 +- src/vm/runners/cairo_runner.rs | 16 ++++++++++++++-- 3 files changed, 19 insertions(+), 4 deletions(-) diff --git a/src/serde/deserialize_program.rs b/src/serde/deserialize_program.rs index bfe1f6deb6..ba07939433 100644 --- a/src/serde/deserialize_program.rs +++ b/src/serde/deserialize_program.rs @@ -6,7 +6,8 @@ use crate::{ }, vm::runners::builtin_runner::{ BITWISE_BUILTIN_NAME, EC_OP_BUILTIN_NAME, HASH_BUILTIN_NAME, KECCAK_BUILTIN_NAME, - OUTPUT_BUILTIN_NAME, RANGE_CHECK_BUILTIN_NAME, SIGNATURE_BUILTIN_NAME, + OUTPUT_BUILTIN_NAME, POSEIDON_BUILTIN_NAME, RANGE_CHECK_BUILTIN_NAME, + SIGNATURE_BUILTIN_NAME, }, }; use felt::{Felt, PRIME_STR}; @@ -26,6 +27,7 @@ pub enum BuiltinName { keccak, bitwise, ec_op, + poseidon, } impl BuiltinName { @@ -38,6 +40,7 @@ impl BuiltinName { BuiltinName::keccak => KECCAK_BUILTIN_NAME, BuiltinName::bitwise => BITWISE_BUILTIN_NAME, BuiltinName::ec_op => EC_OP_BUILTIN_NAME, + BuiltinName::poseidon => POSEIDON_BUILTIN_NAME, } } } diff --git a/src/vm/runners/builtin_runner/mod.rs b/src/vm/runners/builtin_runner/mod.rs index 894ff9059d..a73d0eacdd 100644 --- a/src/vm/runners/builtin_runner/mod.rs +++ b/src/vm/runners/builtin_runner/mod.rs @@ -16,7 +16,7 @@ mod range_check; mod signature; pub use self::keccak::KeccakBuiltinRunner; -use self::poseidon::PoseidonBuiltinRunner; +pub use self::poseidon::PoseidonBuiltinRunner; pub use bitwise::BitwiseBuiltinRunner; pub use ec_op::EcOpBuiltinRunner; pub use hash::HashBuiltinRunner; diff --git a/src/vm/runners/cairo_runner.rs b/src/vm/runners/cairo_runner.rs index 5c3f25dca4..aaccb4fd16 100644 --- a/src/vm/runners/cairo_runner.rs +++ b/src/vm/runners/cairo_runner.rs @@ -47,8 +47,9 @@ use std::{ }; use super::builtin_runner::{ - KeccakBuiltinRunner, BITWISE_BUILTIN_NAME, EC_OP_BUILTIN_NAME, HASH_BUILTIN_NAME, - KECCAK_BUILTIN_NAME, OUTPUT_BUILTIN_NAME, RANGE_CHECK_BUILTIN_NAME, SIGNATURE_BUILTIN_NAME, + KeccakBuiltinRunner, PoseidonBuiltinRunner, BITWISE_BUILTIN_NAME, EC_OP_BUILTIN_NAME, + HASH_BUILTIN_NAME, KECCAK_BUILTIN_NAME, OUTPUT_BUILTIN_NAME, POSEIDON_BUILTIN_NAME, + RANGE_CHECK_BUILTIN_NAME, SIGNATURE_BUILTIN_NAME, }; #[derive(Clone, Debug, Eq, PartialEq)] @@ -141,6 +142,7 @@ impl CairoRunner { BITWISE_BUILTIN_NAME, EC_OP_BUILTIN_NAME, KECCAK_BUILTIN_NAME, + POSEIDON_BUILTIN_NAME, ]; if !is_subsequence(&self.program.builtins, &builtin_ordered_list) { return Err(RunnerError::DisorderedBuiltins); @@ -222,6 +224,16 @@ impl CairoRunner { } } + if let Some(instance_def) = self.layout.builtins.poseidon.as_ref() { + let included = self.program.builtins.contains(&POSEIDON_BUILTIN_NAME); + if included || self.proof_mode { + builtin_runners.push(( + POSEIDON_BUILTIN_NAME, + PoseidonBuiltinRunner::new(instance_def.ratio, included).into(), + )); + } + } + let inserted_builtins = builtin_runners .iter() .map(|x| &x.0) From 8dbfac787dd92066f397d3396957b6588318ae96 Mon Sep 17 00:00:00 2001 From: Federica Date: Mon, 6 Mar 2023 16:57:58 -0300 Subject: [PATCH 10/39] Use modified version of starknet-crypto poseidon hash (need permute fn to be public in order to access full state --- src/vm/runners/builtin_runner/mod.rs | 2 + .../builtin_runner/poseidon_constants.rs | 539 ++++++++++++++++++ .../runners/builtin_runner/poseidon_utils.rs | 52 ++ 3 files changed, 593 insertions(+) create mode 100644 src/vm/runners/builtin_runner/poseidon_constants.rs create mode 100644 src/vm/runners/builtin_runner/poseidon_utils.rs diff --git a/src/vm/runners/builtin_runner/mod.rs b/src/vm/runners/builtin_runner/mod.rs index a73d0eacdd..4d65d36b73 100644 --- a/src/vm/runners/builtin_runner/mod.rs +++ b/src/vm/runners/builtin_runner/mod.rs @@ -12,6 +12,8 @@ mod hash; mod keccak; mod output; mod poseidon; +mod poseidon_constants; +mod poseidon_utils; mod range_check; mod signature; diff --git a/src/vm/runners/builtin_runner/poseidon_constants.rs b/src/vm/runners/builtin_runner/poseidon_constants.rs new file mode 100644 index 0000000000..b5a2067845 --- /dev/null +++ b/src/vm/runners/builtin_runner/poseidon_constants.rs @@ -0,0 +1,539 @@ +// Code ported from the build.rs script here: +// https://github.com/eqlabs/pathfinder/blob/00a1a74a90a7b8a7f1d07ac3e616be1cb39cf8f1/crates/stark_poseidon/build.rs + +use lazy_static::lazy_static; +use starknet_crypto::FieldElement; + +pub(crate) const FULL_ROUNDS: usize = 8; +pub(crate) const PARTIAL_ROUNDS: usize = 83; + +lazy_static! { + pub(crate) static ref POSEIDON_COMP_CONSTS: Vec = get_poseidon_comp_constants(); +} + +fn get_poseidon_comp_constants() -> Vec { + let round_keys = RAW_ROUND_KEYS + .iter() + .map(|key| key.map(|num| FieldElement::from_dec_str(num).expect("Invalid round key"))) + .collect::>(); + compress_roundkeys(&round_keys) +} + +pub fn compress_roundkeys(rcs: &[[FieldElement; 3]]) -> Vec { + let mut result = Vec::new(); + + // Add first full rounds + result.extend(rcs[..FULL_ROUNDS / 2].iter().flatten()); + + // Add compressed partial rounds and first of the last full rounds + result.extend(compress_roundkeys_partial(rcs)); + + // Add last full rounds except the first of them + result.extend( + rcs[(FULL_ROUNDS / 2 + PARTIAL_ROUNDS + 1)..] + .iter() + .flatten(), + ); + + result +} + +pub fn compress_roundkeys_partial(rcs: &[[FieldElement; 3]]) -> Vec { + let mut result = Vec::new(); + + let mut idx = FULL_ROUNDS / 2; + let mut state: [FieldElement; 3] = [FieldElement::ZERO; 3]; + + // Add keys for partial rounds + for _ in 0..PARTIAL_ROUNDS { + // AddRoundKey + state[0] += rcs[idx][0]; + state[1] += rcs[idx][1]; + state[2] += rcs[idx][2]; + + // Add last state + result.push(state[2]); + + // Reset last state + state[2] = FieldElement::ZERO; + + // MixLayer + let t = state[0] + state[1] + state[2]; + state[0] = t + FieldElement::TWO * state[0]; + state[1] = t - FieldElement::TWO * state[1]; + state[2] = t - FieldElement::THREE * state[2]; + + idx += 1; + } + + // Add keys for first of the last full rounds + state[0] += rcs[idx][0]; + state[1] += rcs[idx][1]; + state[2] += rcs[idx][2]; + result.push(state[0]); + result.push(state[1]); + result.push(state[2]); + + result +} + +// Extracted from: +// https://github.com/starkware-industries/poseidon/blob/5403dff9ff4eadb07deb5c0a43e88bedb011deb8/poseidon3.txt + +pub const RAW_ROUND_KEYS: [[&str; 3]; 91] = [ + [ + "2950795762459345168613727575620414179244544320470208355568817838579231751791", + "1587446564224215276866294500450702039420286416111469274423465069420553242820", + "1645965921169490687904413452218868659025437693527479459426157555728339600137", + ], + [ + "2782373324549879794752287702905278018819686065818504085638398966973694145741", + "3409172630025222641379726933524480516420204828329395644967085131392375707302", + "2379053116496905638239090788901387719228422033660130943198035907032739387135", + ], + [ + "2570819397480941104144008784293466051718826502582588529995520356691856497111", + "3546220846133880637977653625763703334841539452343273304410918449202580719746", + "2720682389492889709700489490056111332164748138023159726590726667539759963454", + ], + [ + "1899653471897224903834726250400246354200311275092866725547887381599836519005", + "2369443697923857319844855392163763375394720104106200469525915896159690979559", + "2354174693689535854311272135513626412848402744119855553970180659094265527996", + ], + [ + "2404084503073127963385083467393598147276436640877011103379112521338973185443", + "950320777137731763811524327595514151340412860090489448295239456547370725376", + "2121140748740143694053732746913428481442990369183417228688865837805149503386", + ], + [ + "2372065044800422557577242066480215868569521938346032514014152523102053709709", + "2618497439310693947058545060953893433487994458443568169824149550389484489896", + "3518297267402065742048564133910509847197496119850246255805075095266319996916", + ], + [ + "340529752683340505065238931581518232901634742162506851191464448040657139775", + "1954876811294863748406056845662382214841467408616109501720437541211031966538", + "813813157354633930267029888722341725864333883175521358739311868164460385261", + ], + [ + "71901595776070443337150458310956362034911936706490730914901986556638720031", + "2789761472166115462625363403490399263810962093264318361008954888847594113421", + "2628791615374802560074754031104384456692791616314774034906110098358135152410", + ], + [ + "3617032588734559635167557152518265808024917503198278888820567553943986939719", + "2624012360209966117322788103333497793082705816015202046036057821340914061980", + "149101987103211771991327927827692640556911620408176100290586418839323044234", + ], + [ + "1039927963829140138166373450440320262590862908847727961488297105916489431045", + "2213946951050724449162431068646025833746639391992751674082854766704900195669", + "2792724903541814965769131737117981991997031078369482697195201969174353468597", + ], + [ + "3212031629728871219804596347439383805499808476303618848198208101593976279441", + "3343514080098703935339621028041191631325798327656683100151836206557453199613", + "614054702436541219556958850933730254992710988573177298270089989048553060199", + ], + [ + "148148081026449726283933484730968827750202042869875329032965774667206931170", + "1158283532103191908366672518396366136968613180867652172211392033571980848414", + "1032400527342371389481069504520755916075559110755235773196747439146396688513", + ], + [ + "806900704622005851310078578853499250941978435851598088619290797134710613736", + "462498083559902778091095573017508352472262817904991134671058825705968404510", + "1003580119810278869589347418043095667699674425582646347949349245557449452503", + ], + [ + "619074932220101074089137133998298830285661916867732916607601635248249357793", + "2635090520059500019661864086615522409798872905401305311748231832709078452746", + "978252636251682252755279071140187792306115352460774007308726210405257135181", + ], + [ + "1766912167973123409669091967764158892111310474906691336473559256218048677083", + "1663265127259512472182980890707014969235283233442916350121860684522654120381", + "3532407621206959585000336211742670185380751515636605428496206887841428074250", + ], + [ + "2507023127157093845256722098502856938353143387711652912931112668310034975446", + "3321152907858462102434883844787153373036767230808678981306827073335525034593", + "3039253036806065280643845548147711477270022154459620569428286684179698125661", + ], + [ + "103480338868480851881924519768416587261556021758163719199282794248762465380", + "2394049781357087698434751577708655768465803975478348134669006211289636928495", + "2660531560345476340796109810821127229446538730404600368347902087220064379579", + ], + [ + "3603166934034556203649050570865466556260359798872408576857928196141785055563", + "1553799760191949768532188139643704561532896296986025007089826672890485412324", + "2744284717053657689091306578463476341218866418732695211367062598446038965164", + ], + [ + "320745764922149897598257794663594419839885234101078803811049904310835548856", + "979382242100682161589753881721708883681034024104145498709287731138044566302", + "1860426855810549882740147175136418997351054138609396651615467358416651354991", + ], + [ + "336173081054369235994909356892506146234495707857220254489443629387613956145", + "1632470326779699229772327605759783482411227247311431865655466227711078175883", + "921958250077481394074960433988881176409497663777043304881055317463712938502", + ], + [ + "3034358982193370602048539901033542101022185309652879937418114324899281842797", + "25626282149517463867572353922222474817434101087272320606729439087234878607", + "3002662261401575565838149305485737102400501329139562227180277188790091853682", + ], + [ + "2939684373453383817196521641512509179310654199629514917426341354023324109367", + "1076484609897998179434851570277297233169621096172424141759873688902355505136", + "2575095284833160494841112025725243274091830284746697961080467506739203605049", + ], + [ + "3565075264617591783581665711620369529657840830498005563542124551465195621851", + "2197016502533303822395077038351174326125210255869204501838837289716363437993", + "331415322883530754594261416546036195982886300052707474899691116664327869405", + ], + [ + "1935011233711290003793244296594669823169522055520303479680359990463281661839", + "3495901467168087413996941216661589517270845976538454329511167073314577412322", + "954195417117133246453562983448451025087661597543338750600301835944144520375", + ], + [ + "1271840477709992894995746871435810599280944810893784031132923384456797925777", + "2565310762274337662754531859505158700827688964841878141121196528015826671847", + "3365022288251637014588279139038152521653896670895105540140002607272936852513", + ], + [ + "1660592021628965529963974299647026602622092163312666588591285654477111176051", + "970104372286014048279296575474974982288801187216974504035759997141059513421", + "2617024574317953753849168721871770134225690844968986289121504184985993971227", + ], + [ + "999899815343607746071464113462778273556695659506865124478430189024755832262", + "2228536129413411161615629030408828764980855956560026807518714080003644769896", + "2701953891198001564547196795777701119629537795442025393867364730330476403227", + ], + [ + "837078355588159388741598313782044128527494922918203556465116291436461597853", + "2121749601840466143704862369657561429793951309962582099604848281796392359214", + "771812260179247428733132708063116523892339056677915387749121983038690154755", + ], + [ + "3317336423132806446086732225036532603224267214833263122557471741829060578219", + "481570067997721834712647566896657604857788523050900222145547508314620762046", + "242195042559343964206291740270858862066153636168162642380846129622127460192", + ], + [ + "2855462178889999218204481481614105202770810647859867354506557827319138379686", + "3525521107148375040131784770413887305850308357895464453970651672160034885202", + "1320839531502392535964065058804908871811967681250362364246430459003920305799", + ], + [ + "2514191518588387125173345107242226637171897291221681115249521904869763202419", + "2798335750958827619666318316247381695117827718387653874070218127140615157902", + "2808467767967035643407948058486565877867906577474361783201337540214875566395", + ], + [ + "3551834385992706206273955480294669176699286104229279436819137165202231595747", + "1219439673853113792340300173186247996249367102884530407862469123523013083971", + "761519904537984520554247997444508040636526566551719396202550009393012691157", + ], + [ + "3355402549169351700500518865338783382387571349497391475317206324155237401353", + "199541098009731541347317515995192175813554789571447733944970283654592727138", + "192100490643078165121235261796864975568292640203635147901612231594408079071", + ], + [ + "1187019357602953326192019968809486933768550466167033084944727938441427050581", + "189525349641911362389041124808934468936759383310282010671081989585219065700", + "2831653363992091308880573627558515686245403755586311978724025292003353336665", + ], + [ + "2052859812632218952608271535089179639890275494426396974475479657192657094698", + "1670756178709659908159049531058853320846231785448204274277900022176591811072", + "3538757242013734574731807289786598937548399719866320954894004830207085723125", + ], + [ + "710549042741321081781917034337800036872214466705318638023070812391485261299", + "2345013122330545298606028187653996682275206910242635100920038943391319595180", + "3528369671971445493932880023233332035122954362711876290904323783426765912206", + ], + [ + "1167120829038120978297497195837406760848728897181138760506162680655977700764", + "3073243357129146594530765548901087443775563058893907738967898816092270628884", + "378514724418106317738164464176041649567501099164061863402473942795977719726", + ], + [ + "333391138410406330127594722511180398159664250722328578952158227406762627796", + "1727570175639917398410201375510924114487348765559913502662122372848626931905", + "968312190621809249603425066974405725769739606059422769908547372904403793174", + ], + [ + "360659316299446405855194688051178331671817370423873014757323462844775818348", + "1386580151907705298970465943238806620109618995410132218037375811184684929291", + "3604888328937389309031638299660239238400230206645344173700074923133890528967", + ], + [ + "2496185632263372962152518155651824899299616724241852816983268163379540137546", + "486538168871046887467737983064272608432052269868418721234810979756540672990", + "1558415498960552213241704009433360128041672577274390114589014204605400783336", + ], + [ + "3512058327686147326577190314835092911156317204978509183234511559551181053926", + "2235429387083113882635494090887463486491842634403047716936833563914243946191", + "1290896777143878193192832813769470418518651727840187056683408155503813799882", + ], + [ + "1143310336918357319571079551779316654556781203013096026972411429993634080835", + "3235435208525081966062419599803346573407862428113723170955762956243193422118", + "1293239921425673430660897025143433077974838969258268884994339615096356996604", + ], + [ + "236252269127612784685426260840574970698541177557674806964960352572864382971", + "1733907592497266237374827232200506798207318263912423249709509725341212026275", + "302004309771755665128395814807589350526779835595021835389022325987048089868", + ], + [ + "3018926838139221755384801385583867283206879023218491758435446265703006270945", + "39701437664873825906031098349904330565195980985885489447836580931425171297", + "908381723021746969965674308809436059628307487140174335882627549095646509778", + ], + [ + "219062858908229855064136253265968615354041842047384625689776811853821594358", + "1283129863776453589317845316917890202859466483456216900835390291449830275503", + "418512623547417594896140369190919231877873410935689672661226540908900544012", + ], + [ + "1792181590047131972851015200157890246436013346535432437041535789841136268632", + "370546432987510607338044736824316856592558876687225326692366316978098770516", + "3323437805230586112013581113386626899534419826098235300155664022709435756946", + ], + [ + "910076621742039763058481476739499965761942516177975130656340375573185415877", + "1762188042455633427137702520675816545396284185254002959309669405982213803405", + "2186362253913140345102191078329764107619534641234549431429008219905315900520", + ], + [ + "2230647725927681765419218738218528849146504088716182944327179019215826045083", + "1069243907556644434301190076451112491469636357133398376850435321160857761825", + "2695241469149243992683268025359863087303400907336026926662328156934068747593", + ], + [ + "1361519681544413849831669554199151294308350560528931040264950307931824877035", + "1339116632207878730171031743761550901312154740800549632983325427035029084904", + "790593524918851401449292693473498591068920069246127392274811084156907468875", + ], + [ + "2723400368331924254840192318398326090089058735091724263333980290765736363637", + "3457180265095920471443772463283225391927927225993685928066766687141729456030", + "1483675376954327086153452545475557749815683871577400883707749788555424847954", + ], + [ + "2926303836265506736227240325795090239680154099205721426928300056982414025239", + "543969119775473768170832347411484329362572550684421616624136244239799475526", + "237401230683847084256617415614300816373730178313253487575312839074042461932", + ], + [ + "844568412840391587862072008674263874021460074878949862892685736454654414423", + "151922054871708336050647150237534498235916969120198637893731715254687336644", + "1299332034710622815055321547569101119597030148120309411086203580212105652312", + ], + [ + "487046922649899823989594814663418784068895385009696501386459462815688122993", + "1104883249092599185744249485896585912845784382683240114120846423960548576851", + "1458388705536282069567179348797334876446380557083422364875248475157495514484", + ], + [ + "850248109622750774031817200193861444623975329881731864752464222442574976566", + "2885843173858536690032695698009109793537724845140477446409245651176355435722", + "3027068551635372249579348422266406787688980506275086097330568993357835463816", + ], + [ + "3231892723647447539926175383213338123506134054432701323145045438168976970994", + "1719080830641935421242626784132692936776388194122314954558418655725251172826", + "1172253756541066126131022537343350498482225068791630219494878195815226839450", + ], + [ + "1619232269633026603732619978083169293258272967781186544174521481891163985093", + "3495680684841853175973173610562400042003100419811771341346135531754869014567", + "1576161515913099892951745452471618612307857113799539794680346855318958552758", + ], + [ + "2618326122974253423403350731396350223238201817594761152626832144510903048529", + "2696245132758436974032479782852265185094623165224532063951287925001108567649", + "930116505665110070247395429730201844026054810856263733273443066419816003444", + ], + [ + "2786389174502246248523918824488629229455088716707062764363111940462137404076", + "1555260846425735320214671887347115247546042526197895180675436886484523605116", + "2306241912153325247392671742757902161446877415586158295423293240351799505917", + ], + [ + "411529621724849932999694270803131456243889635467661223241617477462914950626", + "1542495485262286701469125140275904136434075186064076910329015697714211835205", + "1853045663799041100600825096887578544265580718909350942241802897995488264551", + ], + [ + "2963055259497271220202739837493041799968576111953080503132045092194513937286", + "2303806870349915764285872605046527036748108533406243381676768310692344456050", + "2622104986201990620910286730213140904984256464479840856728424375142929278875", + ], + [ + "2369987021925266811581727383184031736927816625797282287927222602539037105864", + "285070227712021899602056480426671736057274017903028992288878116056674401781", + "3034087076179360957800568733595959058628497428787907887933697691951454610691", + ], + [ + "469095854351700119980323115747590868855368701825706298740201488006320881056", + "360001976264385426746283365024817520563236378289230404095383746911725100012", + "3438709327109021347267562000879503009590697221730578667498351600602230296178", + ], + [ + "63573904800572228121671659287593650438456772568903228287754075619928214969", + "3470881855042989871434874691030920672110111605547839662680968354703074556970", + "724559311507950497340993415408274803001166693839947519425501269424891465492", + ], + [ + "880409284677518997550768549487344416321062350742831373397603704465823658986", + "6876255662475867703077362872097208259197756317287339941435193538565586230", + "2701916445133770775447884812906226786217969545216086200932273680400909154638", + ], + [ + "425152119158711585559310064242720816611629181537672850898056934507216982586", + "1475552998258917706756737045704649573088377604240716286977690565239187213744", + "2413772448122400684309006716414417978370152271397082147158000439863002593561", + ], + [ + "392160855822256520519339260245328807036619920858503984710539815951012864164", + "1075036996503791536261050742318169965707018400307026402939804424927087093987", + "2176439430328703902070742432016450246365760303014562857296722712989275658921", + ], + [ + "1413865976587623331051814207977382826721471106513581745229680113383908569693", + "4879283427490523253696177116563427032332223531862961281430108575019551814", + "3392583297537374046875199552977614390492290683707960975137418536812266544902", + ], + [ + "3600854486849487646325182927019642276644093512133907046667282144129939150983", + "2779924664161372134024229593301361846129279572186444474616319283535189797834", + "2722699960903170449291146429799738181514821447014433304730310678334403972040", + ], + [ + "819109815049226540285781191874507704729062681836086010078910930707209464699", + "3046121243742768013822760785918001632929744274211027071381357122228091333823", + "1339019590803056172509793134119156250729668216522001157582155155947567682278", + ], + [ + "1933279639657506214789316403763326578443023901555983256955812717638093967201", + "2138221547112520744699126051903811860205771600821672121643894708182292213541", + "2694713515543641924097704224170357995809887124438248292930846280951601597065", + ], + [ + "2471734202930133750093618989223585244499567111661178960753938272334153710615", + "504903761112092757611047718215309856203214372330635774577409639907729993533", + "1943979703748281357156510253941035712048221353507135074336243405478613241290", + ], + [ + "684525210957572142559049112233609445802004614280157992196913315652663518936", + "1705585400798782397786453706717059483604368413512485532079242223503960814508", + "192429517716023021556170942988476050278432319516032402725586427701913624665", + ], + [ + "1586493702243128040549584165333371192888583026298039652930372758731750166765", + "686072673323546915014972146032384917012218151266600268450347114036285993377", + "3464340397998075738891129996710075228740496767934137465519455338004332839215", + ], + [ + "2805249176617071054530589390406083958753103601524808155663551392362371834663", + "667746464250968521164727418691487653339733392025160477655836902744186489526", + "1131527712905109997177270289411406385352032457456054589588342450404257139778", + ], + [ + "1908969485750011212309284349900149072003218505891252313183123635318886241171", + "1025257076985551890132050019084873267454083056307650830147063480409707787695", + "2153175291918371429502545470578981828372846236838301412119329786849737957977", + ], + [ + "3410257749736714576487217882785226905621212230027780855361670645857085424384", + "3442969106887588154491488961893254739289120695377621434680934888062399029952", + "3029953900235731770255937704976720759948880815387104275525268727341390470237", + ], + [ + "85453456084781138713939104192561924536933417707871501802199311333127894466", + "2730629666577257820220329078741301754580009106438115341296453318350676425129", + "178242450661072967256438102630920745430303027840919213764087927763335940415", + ], + [ + "2844589222514708695700541363167856718216388819406388706818431442998498677557", + "3547876269219141094308889387292091231377253967587961309624916269569559952944", + "2525005406762984211707203144785482908331876505006839217175334833739957826850", + ], + [ + "3096397013555211396701910432830904669391580557191845136003938801598654871345", + "574424067119200181933992948252007230348512600107123873197603373898923821490", + "1714030696055067278349157346067719307863507310709155690164546226450579547098", + ], + [ + "2339895272202694698739231405357972261413383527237194045718815176814132612501", + "3562501318971895161271663840954705079797767042115717360959659475564651685069", + "69069358687197963617161747606993436483967992689488259107924379545671193749", + ], + [ + "2614502738369008850475068874731531583863538486212691941619835266611116051561", + "655247349763023251625727726218660142895322325659927266813592114640858573566", + "2305235672527595714255517865498269719545193172975330668070873705108690670678", + ], + [ + "926416070297755413261159098243058134401665060349723804040714357642180531931", + "866523735635840246543516964237513287099659681479228450791071595433217821460", + "2284334068466681424919271582037156124891004191915573957556691163266198707693", + ], + [ + "1812588309302477291425732810913354633465435706480768615104211305579383928792", + "2836899808619013605432050476764608707770404125005720004551836441247917488507", + "2989087789022865112405242078196235025698647423649950459911546051695688370523", + ], + [ + "68056284404189102136488263779598243992465747932368669388126367131855404486", + "505425339250887519581119854377342241317528319745596963584548343662758204398", + "2118963546856545068961709089296976921067035227488975882615462246481055679215", + ], + [ + "2253872596319969096156004495313034590996995209785432485705134570745135149681", + "1625090409149943603241183848936692198923183279116014478406452426158572703264", + "179139838844452470348634657368199622305888473747024389514258107503778442495", + ], + [ + "1567067018147735642071130442904093290030432522257811793540290101391210410341", + "2737301854006865242314806979738760349397411136469975337509958305470398783585", + "3002738216460904473515791428798860225499078134627026021350799206894618186256", + ], + [ + "374029488099466837453096950537275565120689146401077127482884887409712315162", + "973403256517481077805460710540468856199855789930951602150773500862180885363", + "2691967457038172130555117632010860984519926022632800605713473799739632878867", + ], + [ + "3515906794910381201365530594248181418811879320679684239326734893975752012109", + "148057579455448384062325089530558091463206199724854022070244924642222283388", + "1541588700238272710315890873051237741033408846596322948443180470429851502842", + ], + [ + "147013865879011936545137344076637170977925826031496203944786839068852795297", + "2630278389304735265620281704608245039972003761509102213752997636382302839857", + "1359048670759642844930007747955701205155822111403150159614453244477853867621", + ], + [ + "2438984569205812336319229336885480537793786558293523767186829418969842616677", + "2137792255841525507649318539501906353254503076308308692873313199435029594138", + "2262318076430740712267739371170174514379142884859595360065535117601097652755", + ], + [ + "2792703718581084537295613508201818489836796608902614779596544185252826291584", + "2294173715793292812015960640392421991604150133581218254866878921346561546149", + "2770011224727997178743274791849308200493823127651418989170761007078565678171", + ], +]; diff --git a/src/vm/runners/builtin_runner/poseidon_utils.rs b/src/vm/runners/builtin_runner/poseidon_utils.rs new file mode 100644 index 0000000000..447afbf050 --- /dev/null +++ b/src/vm/runners/builtin_runner/poseidon_utils.rs @@ -0,0 +1,52 @@ +use starknet_crypto::FieldElement; + +use super::poseidon_constants::{FULL_ROUNDS, PARTIAL_ROUNDS, POSEIDON_COMP_CONSTS}; + +/// Linear layer for MDS matrix M = ((3,1,1), (1,-1,1), (1,1,2)) +/// Given state vector x, it returns Mx, optimized by precomputing t. +#[inline(always)] +fn mix(state: &mut [FieldElement; 3]) { + let t = state[0] + state[1] + state[2]; + state[0] = t + FieldElement::TWO * state[0]; + state[1] = t - FieldElement::TWO * state[1]; + state[2] = t - FieldElement::THREE * state[2]; +} + +#[inline] +fn round_comp(state: &mut [FieldElement; 3], idx: usize, full: bool) { + if full { + state[0] += POSEIDON_COMP_CONSTS[idx]; + state[1] += POSEIDON_COMP_CONSTS[idx + 1]; + state[2] += POSEIDON_COMP_CONSTS[idx + 2]; + state[0] = state[0] * state[0] * state[0]; + state[1] = state[1] * state[1] * state[1]; + state[2] = state[2] * state[2] * state[2]; + } else { + state[2] += POSEIDON_COMP_CONSTS[idx]; + state[2] = state[2] * state[2] * state[2]; + } + mix(state); +} + +/// Poseidon permutation function +pub fn permute_comp(state: &mut [FieldElement; 3]) { + let mut idx = 0; + + // Full rounds + for _ in 0..(FULL_ROUNDS / 2) { + round_comp(state, idx, true); + idx += 3; + } + + // Partial rounds + for _ in 0..PARTIAL_ROUNDS { + round_comp(state, idx, false); + idx += 1; + } + + // Full rounds + for _ in 0..(FULL_ROUNDS / 2) { + round_comp(state, idx, true); + idx += 3; + } +} From 07f8cc6c78034cd2f87598a20978ed1a16519e8b Mon Sep 17 00:00:00 2001 From: Federica Date: Mon, 6 Mar 2023 17:05:20 -0300 Subject: [PATCH 11/39] Add poseidon builtin impl + remove unreleased AddAssign usage --- src/vm/runners/builtin_runner/poseidon.rs | 420 ++++++++++++++++++ .../builtin_runner/poseidon_constants.rs | 12 +- .../runners/builtin_runner/poseidon_utils.rs | 8 +- 3 files changed, 430 insertions(+), 10 deletions(-) create mode 100644 src/vm/runners/builtin_runner/poseidon.rs diff --git a/src/vm/runners/builtin_runner/poseidon.rs b/src/vm/runners/builtin_runner/poseidon.rs new file mode 100644 index 0000000000..8aa1c91f36 --- /dev/null +++ b/src/vm/runners/builtin_runner/poseidon.rs @@ -0,0 +1,420 @@ +use std::cell::RefCell; +use std::collections::HashMap; + +use crate::math_utils::safe_div_usize; +use crate::types::relocatable::{MaybeRelocatable, Relocatable}; +use crate::vm::errors::memory_errors::{InsufficientAllocatedCellsError, MemoryError}; +use crate::vm::errors::runner_errors::RunnerError; +use crate::vm::vm_core::VirtualMachine; +use crate::vm::vm_memory::memory::Memory; +use crate::vm::vm_memory::memory_segments::MemorySegmentManager; +use felt::Felt; +use num_integer::div_ceil; +use starknet_crypto::FieldElement; + +use super::poseidon_utils::permute_comp; +use super::POSEIDON_BUILTIN_NAME; + +#[derive(Debug, Clone)] +pub struct PoseidonBuiltinRunner { + pub base: usize, + ratio: u32, + pub(crate) cells_per_instance: u32, + pub(crate) n_input_cells: u32, + pub(crate) stop_ptr: Option, + pub(crate) included: bool, + pub(self) _verified_addresses: RefCell>, + cache: RefCell>, +} + +impl PoseidonBuiltinRunner { + pub fn new(ratio: u32, included: bool) -> Self { + PoseidonBuiltinRunner { + base: 0, + ratio, + cells_per_instance: 6, + n_input_cells: 3, + stop_ptr: None, + _verified_addresses: RefCell::new(Vec::new()), + included, + cache: RefCell::new(HashMap::new()), + } + } + + pub fn initialize_segments(&mut self, segments: &mut MemorySegmentManager) { + self.base = segments.add().segment_index as usize // segments.add() always returns a positive index + } + + pub fn initial_stack(&self) -> Vec { + if self.included { + vec![MaybeRelocatable::from((self.base as isize, 0))] + } else { + vec![] + } + } + + pub fn base(&self) -> usize { + self.base + } + + pub fn ratio(&self) -> u32 { + self.ratio + } + + pub fn add_validation_rule(&self, _memory: &mut Memory) {} + + pub fn deduce_memory_cell( + &self, + address: Relocatable, + memory: &Memory, + ) -> Result, RunnerError> { + let index = address.offset % self.cells_per_instance as usize; + if index < self.n_input_cells as usize { + return Ok(None); + } + if let Some(felt) = self.cache.borrow().get(&address) { + return Ok(Some(felt.into())); + } + // index will always be less than address.offset, so we can safely unwrap here + let first_input_addr = address.sub_usize(index).unwrap(); + let first_output_addr = first_input_addr + self.n_input_cells as usize; + + let mut input_felts = vec![]; + + for i in 0..self.n_input_cells as usize { + let val = match memory.get(&(first_input_addr + i)) { + Some(value) => { + let num = value + .get_int_ref() + .ok_or(RunnerError::BuiltinExpectedInteger( + POSEIDON_BUILTIN_NAME, + first_input_addr + i, + ))?; + num.clone() + } + _ => return Ok(None), + }; + input_felts.push(val) + } + let poseidon_state: Vec = input_felts + .iter() + .map(|x| FieldElement::from_dec_str(&x.to_str_radix(10)).unwrap()) + .collect(); + let mut poseidon_state: [FieldElement; 3] = poseidon_state.try_into().unwrap(); + permute_comp(&mut poseidon_state); + for (i, elem) in poseidon_state.iter().enumerate() { + self.cache.borrow_mut().insert( + first_output_addr + i, + Felt::from_bytes_be(&elem.to_bytes_be()), + ); + } + + Ok(self.cache.borrow().get(&address).map(|x| x.into())) + } + + pub fn get_allocated_memory_units(&self, vm: &VirtualMachine) -> Result { + let value = safe_div_usize(vm.current_step, self.ratio as usize) + .map_err(|_| MemoryError::ErrorCalculatingMemoryUnits)?; + Ok(self.cells_per_instance as usize * value) + } + + pub fn get_memory_segment_addresses(&self) -> (usize, Option) { + (self.base, self.stop_ptr) + } + + pub fn get_used_cells(&self, segments: &MemorySegmentManager) -> Result { + segments + .get_segment_used_size(self.base()) + .ok_or(MemoryError::MissingSegmentUsedSizes) + } + + pub fn get_used_cells_and_allocated_size( + &self, + vm: &VirtualMachine, + ) -> Result<(usize, usize), MemoryError> { + let ratio = self.ratio as usize; + let min_step = ratio * 2 /* TODO: Override with change */ as usize; + if vm.current_step < min_step { + Err( + InsufficientAllocatedCellsError::MinStepNotReached(min_step, POSEIDON_BUILTIN_NAME) + .into(), + ) + } else { + let used = self.get_used_cells(&vm.segments)?; + let size = self.cells_per_instance as usize + * safe_div_usize(vm.current_step, ratio).map_err(|_| { + InsufficientAllocatedCellsError::CurrentStepNotDivisibleByBuiltinRatio( + POSEIDON_BUILTIN_NAME, + vm.current_step, + ratio, + ) + })?; + if used > size { + return Err(InsufficientAllocatedCellsError::BuiltinCells( + POSEIDON_BUILTIN_NAME, + used, + size, + ) + .into()); + } + Ok((used, size)) + } + } + + pub fn get_used_instances( + &self, + segments: &MemorySegmentManager, + ) -> Result { + let used_cells = self.get_used_cells(segments)?; + Ok(div_ceil(used_cells, self.cells_per_instance as usize)) + } + + pub fn final_stack( + &mut self, + segments: &MemorySegmentManager, + pointer: Relocatable, + ) -> Result { + if self.included { + let stop_pointer_addr = pointer + .sub_usize(1) + .map_err(|_| RunnerError::NoStopPointer(POSEIDON_BUILTIN_NAME))?; + let stop_pointer = segments + .memory + .get_relocatable(stop_pointer_addr) + .map_err(|_| RunnerError::NoStopPointer(POSEIDON_BUILTIN_NAME))?; + if self.base as isize != stop_pointer.segment_index { + return Err(RunnerError::InvalidStopPointerIndex( + POSEIDON_BUILTIN_NAME, + stop_pointer, + self.base, + )); + } + let stop_ptr = stop_pointer.offset; + let num_instances = self.get_used_instances(segments)?; + let used = num_instances * self.cells_per_instance as usize; + if stop_ptr != used { + return Err(RunnerError::InvalidStopPointer( + POSEIDON_BUILTIN_NAME, + Relocatable::from((self.base as isize, used)), + Relocatable::from((self.base as isize, stop_ptr)), + )); + } + self.stop_ptr = Some(stop_ptr); + Ok(stop_pointer_addr) + } else { + let stop_ptr = self.base; + self.stop_ptr = Some(stop_ptr); + Ok(pointer) + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::hint_processor::builtin_hint_processor::builtin_hint_processor_definition::BuiltinHintProcessor; + use crate::relocatable; + use crate::types::program::Program; + use crate::utils::test_utils::*; + use crate::vm::runners::cairo_runner::CairoRunner; + use crate::vm::vm_memory::memory::Memory; + use crate::vm::{ + errors::memory_errors::MemoryError, runners::builtin_runner::BuiltinRunner, + vm_core::VirtualMachine, + }; + use std::collections::HashMap; + + #[test] + fn get_used_instances() { + let builtin = PoseidonBuiltinRunner::new(10, true); + + let mut vm = vm!(); + vm.segments.segment_used_sizes = Some(vec![1]); + + assert_eq!(builtin.get_used_instances(&vm.segments), Ok(1)); + } + + #[test] + fn final_stack() { + let mut builtin = PoseidonBuiltinRunner::new(10, true); + + let mut vm = vm!(); + + vm.segments = segments![ + ((0, 0), (0, 0)), + ((0, 1), (0, 1)), + ((2, 0), (0, 0)), + ((2, 1), (0, 0)) + ]; + + vm.segments.segment_used_sizes = Some(vec![0]); + + let pointer = Relocatable::from((2, 2)); + + assert_eq!( + builtin.final_stack(&vm.segments, pointer).unwrap(), + Relocatable::from((2, 1)) + ); + } + + #[test] + fn final_stack_error_stop_pointer() { + let mut builtin = PoseidonBuiltinRunner::new(10, true); + + let mut vm = vm!(); + + vm.segments = segments![ + ((0, 0), (0, 0)), + ((0, 1), (0, 1)), + ((2, 0), (0, 0)), + ((2, 1), (0, 0)) + ]; + + vm.segments.segment_used_sizes = Some(vec![999]); + + let pointer = Relocatable::from((2, 2)); + + assert_eq!( + builtin.final_stack(&vm.segments, pointer), + Err(RunnerError::InvalidStopPointer( + POSEIDON_BUILTIN_NAME, + relocatable!(0, 999), + relocatable!(0, 0) + )) + ); + } + + #[test] + fn final_stack_error_when_not_included() { + let mut builtin = PoseidonBuiltinRunner::new(10, false); + + let mut vm = vm!(); + + vm.segments = segments![ + ((0, 0), (0, 0)), + ((0, 1), (0, 1)), + ((2, 0), (0, 0)), + ((2, 1), (0, 0)) + ]; + + vm.segments.segment_used_sizes = Some(vec![0]); + + let pointer = Relocatable::from((2, 2)); + + assert_eq!( + builtin.final_stack(&vm.segments, pointer).unwrap(), + Relocatable::from((2, 2)) + ); + } + + #[test] + fn final_stack_error_non_relocatable() { + let mut builtin = PoseidonBuiltinRunner::new(10, true); + + let mut vm = vm!(); + + vm.segments = segments![ + ((0, 0), (0, 0)), + ((0, 1), (0, 1)), + ((2, 0), (0, 0)), + ((2, 1), 2) + ]; + + vm.segments.segment_used_sizes = Some(vec![0]); + + let pointer = Relocatable::from((2, 2)); + + assert_eq!( + builtin.final_stack(&vm.segments, pointer), + Err(RunnerError::NoStopPointer(POSEIDON_BUILTIN_NAME)) + ); + } + + #[test] + fn get_used_cells_and_allocated_size_test() { + let builtin: BuiltinRunner = PoseidonBuiltinRunner::new(10, true).into(); + + let mut vm = vm!(); + + vm.segments.segment_used_sizes = Some(vec![0]); + + let program = program!( + builtins = vec![POSEIDON_BUILTIN_NAME], + data = vec_data!( + (4612671182993129469_i64), + (5189976364521848832_i64), + (18446744073709551615_i128), + (5199546496550207487_i64), + (4612389712311386111_i64), + (5198983563776393216_i64), + (2), + (2345108766317314046_i64), + (5191102247248822272_i64), + (5189976364521848832_i64), + (7), + (1226245742482522112_i64), + (( + "3618502788666131213697322783095070105623107215331596699973092056135872020470", + 10 + )), + (2345108766317314046_i64) + ), + main = Some(8), + ); + + let mut cairo_runner = cairo_runner!(program); + + let mut hint_processor = BuiltinHintProcessor::new_empty(); + + let address = cairo_runner.initialize(&mut vm).unwrap(); + + cairo_runner + .run_until_pc(address, &mut vm, &mut hint_processor) + .unwrap(); + + assert_eq!(builtin.get_used_cells_and_allocated_size(&vm), Ok((0, 3))); + } + + #[test] + fn get_allocated_memory_units() { + let builtin = PoseidonBuiltinRunner::new(10, true); + + let mut vm = vm!(); + + let program = program!( + builtins = vec![POSEIDON_BUILTIN_NAME], + data = vec_data!( + (4612671182993129469_i64), + (5189976364521848832_i64), + (18446744073709551615_i128), + (5199546496550207487_i64), + (4612389712311386111_i64), + (5198983563776393216_i64), + (2), + (2345108766317314046_i64), + (5191102247248822272_i64), + (5189976364521848832_i64), + (7), + (1226245742482522112_i64), + (( + "3618502788666131213697322783095070105623107215331596699973092056135872020470", + 10 + )), + (2345108766317314046_i64) + ), + main = Some(8), + ); + + let mut cairo_runner = cairo_runner!(program); + + let mut hint_processor = BuiltinHintProcessor::new_empty(); + + let address = cairo_runner.initialize(&mut vm).unwrap(); + + cairo_runner + .run_until_pc(address, &mut vm, &mut hint_processor) + .unwrap(); + + assert_eq!(builtin.get_allocated_memory_units(&vm), Ok(3)); + } +} diff --git a/src/vm/runners/builtin_runner/poseidon_constants.rs b/src/vm/runners/builtin_runner/poseidon_constants.rs index b5a2067845..3e04d3822c 100644 --- a/src/vm/runners/builtin_runner/poseidon_constants.rs +++ b/src/vm/runners/builtin_runner/poseidon_constants.rs @@ -47,9 +47,9 @@ pub fn compress_roundkeys_partial(rcs: &[[FieldElement; 3]]) -> Vec Vec Date: Mon, 6 Mar 2023 17:26:53 -0300 Subject: [PATCH 12/39] Fix EOF --- cairo_programs/poseidon_builtin.cairo | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cairo_programs/poseidon_builtin.cairo b/cairo_programs/poseidon_builtin.cairo index 791199b4a1..b7f4ffd88f 100644 --- a/cairo_programs/poseidon_builtin.cairo +++ b/cairo_programs/poseidon_builtin.cairo @@ -10,4 +10,4 @@ assert result.s1 = 2233832504250924383748553933071188903279928981104663696710686541536735838182; assert result.s2 = 2512222140811166287287541003826449032093371832913959128171347018667852712082; return (); - } \ No newline at end of file + } From 559e5aa123064e6c8aae55d763d746c0c3577339 Mon Sep 17 00:00:00 2001 From: Federica Date: Mon, 6 Mar 2023 17:44:35 -0300 Subject: [PATCH 13/39] Save a step --- src/vm/runners/builtin_runner/poseidon.rs | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/src/vm/runners/builtin_runner/poseidon.rs b/src/vm/runners/builtin_runner/poseidon.rs index 8aa1c91f36..b35c1d6c55 100644 --- a/src/vm/runners/builtin_runner/poseidon.rs +++ b/src/vm/runners/builtin_runner/poseidon.rs @@ -79,7 +79,7 @@ impl PoseidonBuiltinRunner { let first_input_addr = address.sub_usize(index).unwrap(); let first_output_addr = first_input_addr + self.n_input_cells as usize; - let mut input_felts = vec![]; + let mut input_felts = Vec::::new(); for i in 0..self.n_input_cells as usize { let val = match memory.get(&(first_input_addr + i)) { @@ -90,17 +90,14 @@ impl PoseidonBuiltinRunner { POSEIDON_BUILTIN_NAME, first_input_addr + i, ))?; - num.clone() + FieldElement::from_dec_str(&num.to_str_radix(10)) + .map_err(|_| RunnerError::FailedStringConversion)? } _ => return Ok(None), }; input_felts.push(val) } - let poseidon_state: Vec = input_felts - .iter() - .map(|x| FieldElement::from_dec_str(&x.to_str_radix(10)).unwrap()) - .collect(); - let mut poseidon_state: [FieldElement; 3] = poseidon_state.try_into().unwrap(); + let mut poseidon_state: [FieldElement; 3] = input_felts.try_into().unwrap(); permute_comp(&mut poseidon_state); for (i, elem) in poseidon_state.iter().enumerate() { self.cache.borrow_mut().insert( From 4c82b4e887eeb332d7c41834a3e8508d12494e06 Mon Sep 17 00:00:00 2001 From: Federica Date: Mon, 6 Mar 2023 17:45:37 -0300 Subject: [PATCH 14/39] Add comment before unwrap --- src/vm/runners/builtin_runner/poseidon.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/vm/runners/builtin_runner/poseidon.rs b/src/vm/runners/builtin_runner/poseidon.rs index b35c1d6c55..65abaf7b54 100644 --- a/src/vm/runners/builtin_runner/poseidon.rs +++ b/src/vm/runners/builtin_runner/poseidon.rs @@ -97,6 +97,7 @@ impl PoseidonBuiltinRunner { }; input_felts.push(val) } + // n_input_cells is fixed to 3, so this try_into will never fail let mut poseidon_state: [FieldElement; 3] = input_felts.try_into().unwrap(); permute_comp(&mut poseidon_state); for (i, elem) in poseidon_state.iter().enumerate() { From 1ff18701f29052c39c420fa8338ee7bbfe16f91f Mon Sep 17 00:00:00 2001 From: Federica Date: Mon, 6 Mar 2023 17:51:31 -0300 Subject: [PATCH 15/39] Clippy --- src/vm/runners/builtin_runner/poseidon.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vm/runners/builtin_runner/poseidon.rs b/src/vm/runners/builtin_runner/poseidon.rs index 65abaf7b54..d7c820c30a 100644 --- a/src/vm/runners/builtin_runner/poseidon.rs +++ b/src/vm/runners/builtin_runner/poseidon.rs @@ -131,7 +131,7 @@ impl PoseidonBuiltinRunner { vm: &VirtualMachine, ) -> Result<(usize, usize), MemoryError> { let ratio = self.ratio as usize; - let min_step = ratio * 2 /* TODO: Override with change */ as usize; + let min_step = ratio * 2_usize /* TODO: Override with change */; if vm.current_step < min_step { Err( InsufficientAllocatedCellsError::MinStepNotReached(min_step, POSEIDON_BUILTIN_NAME) From 8f89d74201bf672b44c1426066b18f2787de5eff Mon Sep 17 00:00:00 2001 From: Federica Date: Mon, 6 Mar 2023 17:58:17 -0300 Subject: [PATCH 16/39] Reorder files --- src/vm/runners/builtin_runner/mod.rs | 1 - src/vm/runners/builtin_runner/poseidon.rs | 4 +--- src/vm/runners/builtin_runner/poseidon_utils/mod.rs | 2 ++ .../builtin_runner/{ => poseidon_utils}/poseidon_constants.rs | 0 .../{poseidon_utils.rs => poseidon_utils/poseidon_hash.rs} | 0 5 files changed, 3 insertions(+), 4 deletions(-) create mode 100644 src/vm/runners/builtin_runner/poseidon_utils/mod.rs rename src/vm/runners/builtin_runner/{ => poseidon_utils}/poseidon_constants.rs (100%) rename src/vm/runners/builtin_runner/{poseidon_utils.rs => poseidon_utils/poseidon_hash.rs} (100%) diff --git a/src/vm/runners/builtin_runner/mod.rs b/src/vm/runners/builtin_runner/mod.rs index 4d65d36b73..fdfd1ab94e 100644 --- a/src/vm/runners/builtin_runner/mod.rs +++ b/src/vm/runners/builtin_runner/mod.rs @@ -12,7 +12,6 @@ mod hash; mod keccak; mod output; mod poseidon; -mod poseidon_constants; mod poseidon_utils; mod range_check; mod signature; diff --git a/src/vm/runners/builtin_runner/poseidon.rs b/src/vm/runners/builtin_runner/poseidon.rs index d7c820c30a..1691b38b7c 100644 --- a/src/vm/runners/builtin_runner/poseidon.rs +++ b/src/vm/runners/builtin_runner/poseidon.rs @@ -12,7 +12,7 @@ use felt::Felt; use num_integer::div_ceil; use starknet_crypto::FieldElement; -use super::poseidon_utils::permute_comp; +use super::poseidon_utils::poseidon_hash::permute_comp; use super::POSEIDON_BUILTIN_NAME; #[derive(Debug, Clone)] @@ -23,7 +23,6 @@ pub struct PoseidonBuiltinRunner { pub(crate) n_input_cells: u32, pub(crate) stop_ptr: Option, pub(crate) included: bool, - pub(self) _verified_addresses: RefCell>, cache: RefCell>, } @@ -35,7 +34,6 @@ impl PoseidonBuiltinRunner { cells_per_instance: 6, n_input_cells: 3, stop_ptr: None, - _verified_addresses: RefCell::new(Vec::new()), included, cache: RefCell::new(HashMap::new()), } diff --git a/src/vm/runners/builtin_runner/poseidon_utils/mod.rs b/src/vm/runners/builtin_runner/poseidon_utils/mod.rs new file mode 100644 index 0000000000..1adc78c98f --- /dev/null +++ b/src/vm/runners/builtin_runner/poseidon_utils/mod.rs @@ -0,0 +1,2 @@ +mod poseidon_constants; +pub(super) mod poseidon_hash; diff --git a/src/vm/runners/builtin_runner/poseidon_constants.rs b/src/vm/runners/builtin_runner/poseidon_utils/poseidon_constants.rs similarity index 100% rename from src/vm/runners/builtin_runner/poseidon_constants.rs rename to src/vm/runners/builtin_runner/poseidon_utils/poseidon_constants.rs diff --git a/src/vm/runners/builtin_runner/poseidon_utils.rs b/src/vm/runners/builtin_runner/poseidon_utils/poseidon_hash.rs similarity index 100% rename from src/vm/runners/builtin_runner/poseidon_utils.rs rename to src/vm/runners/builtin_runner/poseidon_utils/poseidon_hash.rs From 95f5111845f93a9e6d1fc8aa1a5a39fccb2a07f8 Mon Sep 17 00:00:00 2001 From: jrigada Date: Mon, 6 Mar 2023 17:58:55 -0300 Subject: [PATCH 17/39] reset run_benchmark script --- bench/run_benchmarks.sh | 32 +++++--------------------------- 1 file changed, 5 insertions(+), 27 deletions(-) diff --git a/bench/run_benchmarks.sh b/bench/run_benchmarks.sh index 5115ef993a..e963e23b24 100755 --- a/bench/run_benchmarks.sh +++ b/bench/run_benchmarks.sh @@ -1,37 +1,15 @@ #!/usr/bin/env sh -tests_path="cairo_programs/benchmarks" -trace_enabled=${1:-false} +tests_path="../cairo_programs/benchmarks" set -e -source ../cairo-rs-py/scripts/cairo-rs-py/bin/activate - -for input_file in "$tests_path"/*.cairo; do - if [ -f "$input_file" ]; then - output_file="${input_file%.cairo}.json" - cairo-compile --cairo_path="cairo_programs" "$input_file" --output "$output_file" - echo "Compiled $input_file to $output_file" - fi -done - -deactivate - for file in $(ls $tests_path | grep .cairo | sed -E 's/\.cairo//'); do echo "Running $file benchmark" export PATH="$(pyenv root)/shims:$PATH" - if [ "$trace_enabled" = true ]; then - hyperfine -w 0 -r 2 -i --show-output \ - -n "Cairo VM (CPython)" "source ../cairo-rs-py/scripts/cairo-lang/bin/activate && cairo-run --layout all_cairo --program $tests_path/$file.json --trace_file $tests_path/$file.trace" \ - -n "Cairo VM (PyPy)" "source ../cairo-rs-py/scripts/cairo-rs-pypy/bin/activate && cairo-run --layout all_cairo --program $tests_path/$file.json --trace_file $tests_path/$file.trace" \ - -n "cairo-rs (Rust)" "target/release/cairo-rs-run $tests_path/$file.json --layout all_cairo --trace_file $tests_path/$file.trace" - else - hyperfine -w 0 -r 2 -i --show-output \ - -n "Cairo VM (CPython)" "source ../cairo-rs-py/scripts/cairo-lang/bin/activate && cairo-run --layout all_cairo --program $tests_path/$file.json" \ - -n "Cairo VM (PyPy)" "source ../cairo-rs-py/scripts/cairo-rs-pypy/bin/activate && cairo-run --layout all_cairo --program $tests_path/$file.json" \ - -n "cairo-rs (Rust)" "target/release/cairo-rs-run $tests_path/$file.json --layout all_cairo" - fi + hyperfine \ + -n "Cairo VM (CPython)" "PYENV_VERSION=3.7.12 cairo-run --layout all_cairo --program $tests_path/$file.json" \ + -n "Cairo VM (PyPy)" "PYENV_VERSION=pypy3.7-7.3.9 cairo-run --layout all_cairo --program $tests_path/$file.json" \ + -n "cairo-rs (Rust)" "../target/release/cairo-rs-run $tests_path/$file.json --layout all_cairo" done - - From df4b53c7fced30f710b9b5bf8f8b0ea0e6055f5c Mon Sep 17 00:00:00 2001 From: Federica Date: Mon, 6 Mar 2023 18:01:07 -0300 Subject: [PATCH 18/39] Add comment --- src/vm/runners/builtin_runner/poseidon_utils/poseidon_hash.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/vm/runners/builtin_runner/poseidon_utils/poseidon_hash.rs b/src/vm/runners/builtin_runner/poseidon_utils/poseidon_hash.rs index 604ef84ec0..d5a1389c9e 100644 --- a/src/vm/runners/builtin_runner/poseidon_utils/poseidon_hash.rs +++ b/src/vm/runners/builtin_runner/poseidon_utils/poseidon_hash.rs @@ -1,6 +1,8 @@ -use starknet_crypto::FieldElement; +// Code ported from the the implementation from pathfinder here: +// https://github.com/eqlabs/pathfinder/blob/00a1a74a90a7b8a7f1d07ac3e616be1cb39cf8f1/crates/stark_poseidon/src/lib.rs use super::poseidon_constants::{FULL_ROUNDS, PARTIAL_ROUNDS, POSEIDON_COMP_CONSTS}; +use starknet_crypto::FieldElement; /// Linear layer for MDS matrix M = ((3,1,1), (1,-1,1), (1,1,2)) /// Given state vector x, it returns Mx, optimized by precomputing t. From 28a8ea7c851bd45a87c757b9e50c7fa7df9fe5ac Mon Sep 17 00:00:00 2001 From: Federica Date: Mon, 6 Mar 2023 18:14:29 -0300 Subject: [PATCH 19/39] Use constants for cells --- .../poseidon_instance_def.rs | 28 ++++++------------- src/vm/runners/builtin_runner/poseidon.rs | 7 +++-- 2 files changed, 14 insertions(+), 21 deletions(-) diff --git a/src/types/instance_definitions/poseidon_instance_def.rs b/src/types/instance_definitions/poseidon_instance_def.rs index 3d6e02b5b7..7c57ae6e15 100644 --- a/src/types/instance_definitions/poseidon_instance_def.rs +++ b/src/types/instance_definitions/poseidon_instance_def.rs @@ -1,22 +1,18 @@ +pub(crate) const CELLS_PER_POSEIDON: u32 = 6; +pub(crate) const INPUT_CELLS_PER_POSEIDON: u32 = 3; + #[derive(Clone, Debug, PartialEq)] pub(crate) struct PoseidonInstanceDef { pub(crate) ratio: u32, - pub(crate) partial_rounds_partition: Vec, } impl PoseidonInstanceDef { pub(crate) fn default() -> Self { - PoseidonInstanceDef { - ratio: 32, - partial_rounds_partition: vec![64, 22], - } + PoseidonInstanceDef { ratio: 32 } } - pub(crate) fn _new(ratio: u32, partial_rounds_partition: Vec) -> Self { - PoseidonInstanceDef { - ratio, - partial_rounds_partition, - } + pub(crate) fn _new(ratio: u32) -> Self { + PoseidonInstanceDef { ratio } } } @@ -26,19 +22,13 @@ mod tests { #[test] fn test_new() { - let builtin_instance = PoseidonInstanceDef { - ratio: 8, - partial_rounds_partition: vec![1, 2], - }; - assert_eq!(PoseidonInstanceDef::_new(8, vec![1, 2]), builtin_instance); + let builtin_instance = PoseidonInstanceDef { ratio: 8 }; + assert_eq!(PoseidonInstanceDef::_new(8), builtin_instance); } #[test] fn test_default() { - let builtin_instance = PoseidonInstanceDef { - ratio: 32, - partial_rounds_partition: vec![64, 22], - }; + let builtin_instance = PoseidonInstanceDef { ratio: 32 }; assert_eq!(PoseidonInstanceDef::default(), builtin_instance); } } diff --git a/src/vm/runners/builtin_runner/poseidon.rs b/src/vm/runners/builtin_runner/poseidon.rs index 1691b38b7c..0c63bcde3d 100644 --- a/src/vm/runners/builtin_runner/poseidon.rs +++ b/src/vm/runners/builtin_runner/poseidon.rs @@ -2,6 +2,9 @@ use std::cell::RefCell; use std::collections::HashMap; use crate::math_utils::safe_div_usize; +use crate::types::instance_definitions::poseidon_instance_def::{ + CELLS_PER_POSEIDON, INPUT_CELLS_PER_POSEIDON, +}; use crate::types::relocatable::{MaybeRelocatable, Relocatable}; use crate::vm::errors::memory_errors::{InsufficientAllocatedCellsError, MemoryError}; use crate::vm::errors::runner_errors::RunnerError; @@ -31,8 +34,8 @@ impl PoseidonBuiltinRunner { PoseidonBuiltinRunner { base: 0, ratio, - cells_per_instance: 6, - n_input_cells: 3, + cells_per_instance: CELLS_PER_POSEIDON, + n_input_cells: INPUT_CELLS_PER_POSEIDON, stop_ptr: None, included, cache: RefCell::new(HashMap::new()), From 25e3d171d7c32c25856df19f4864e443c07e40d3 Mon Sep 17 00:00:00 2001 From: Federica Date: Mon, 6 Mar 2023 18:29:07 -0300 Subject: [PATCH 20/39] Add more test program --- cairo_programs/poseidon_builtin.cairo | 22 +++++++++++----------- cairo_programs/poseidon_hash.cairo | 25 +++++++++++++++++++++++++ 2 files changed, 36 insertions(+), 11 deletions(-) create mode 100644 cairo_programs/poseidon_hash.cairo diff --git a/cairo_programs/poseidon_builtin.cairo b/cairo_programs/poseidon_builtin.cairo index b7f4ffd88f..c85a6c9ec6 100644 --- a/cairo_programs/poseidon_builtin.cairo +++ b/cairo_programs/poseidon_builtin.cairo @@ -1,13 +1,13 @@ %builtins poseidon - from starkware.cairo.common.cairo_builtins import PoseidonBuiltin - from starkware.cairo.common.poseidon_state import PoseidonBuiltinState +from starkware.cairo.common.cairo_builtins import PoseidonBuiltin +from starkware.cairo.common.poseidon_state import PoseidonBuiltinState - func main{poseidon_ptr: PoseidonBuiltin*}() { - assert poseidon_ptr[0].input = PoseidonBuiltinState(1,2,3); - let result = poseidon_ptr[0].output; - let poseidon_ptr = poseidon_ptr + PoseidonBuiltin.SIZE; - assert result.s0 = 442682200349489646213731521593476982257703159825582578145778919623645026501; - assert result.s1 = 2233832504250924383748553933071188903279928981104663696710686541536735838182; - assert result.s2 = 2512222140811166287287541003826449032093371832913959128171347018667852712082; - return (); - } +func main{poseidon_ptr: PoseidonBuiltin*}() { + assert poseidon_ptr[0].input = PoseidonBuiltinState(1,2,3); + let result = poseidon_ptr[0].output; + let poseidon_ptr = poseidon_ptr + PoseidonBuiltin.SIZE; + assert result.s0 = 442682200349489646213731521593476982257703159825582578145778919623645026501; + assert result.s1 = 2233832504250924383748553933071188903279928981104663696710686541536735838182; + assert result.s2 = 2512222140811166287287541003826449032093371832913959128171347018667852712082; + return (); +} diff --git a/cairo_programs/poseidon_hash.cairo b/cairo_programs/poseidon_hash.cairo new file mode 100644 index 0000000000..31ed1d51c2 --- /dev/null +++ b/cairo_programs/poseidon_hash.cairo @@ -0,0 +1,25 @@ +%builtins poseidon +from starkware.cairo.common.cairo_builtins import PoseidonBuiltin +from starkware.cairo.common.poseidon_state import PoseidonBuiltinState +from starkware.cairo.common.builtin_poseidon.poseidon import poseidon_hash, poseidon_hash_single, poseidon_hash_many +from starkware.cairo.common.alloc import alloc + +func main{poseidon_ptr: PoseidonBuiltin*}() { + //Hash one + let (x) = poseidon_hash_single(218676008889449692916464780911713710628115973574242889792891157041292792362); + assert x = 2835120893146788752888137145656423078969524407843035783270702964188823073934; + // Hash two + let (y) = poseidon_hash(1253795, 18540013156130945068); + assert y = 37282360750367388068593128053386029947772104009544220786084510532118246655; + // TODO: uncomment once hints are implemented + // // Hash five + // let felts: felt* = alloc(); + // assert felts[0] = 84175983715088675913672849362079546; + // assert felts[1] = 9384720329467203286234076408512594689579283578028960384690; + // assert felts[2] = 291883989128409324823849293040390493094093; + // assert felts[3] = 5849589438543859348593485948598349584395839402940940290490324; + // assert felts[4] = 1836254780028456372728992049476335424263474849; + // let (z) = poseidon_hash_many(5, felts); + // assert z = 47102513329160951064697157194713013753695317629154835326726810042406974264; + return(); +} From c7500fea65f032fffe9354d5e42d8790fd6013b3 Mon Sep 17 00:00:00 2001 From: Federica Date: Mon, 6 Mar 2023 18:30:31 -0300 Subject: [PATCH 21/39] Add integration tests --- tests/cairo_run_test.rs | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/tests/cairo_run_test.rs b/tests/cairo_run_test.rs index d4b7bd88aa..33fc4a7666 100644 --- a/tests/cairo_run_test.rs +++ b/tests/cairo_run_test.rs @@ -1317,3 +1317,33 @@ fn cairo_run_verify_signature_hint() { ) .expect("Couldn't run program"); } + +#[test] +fn cairo_run_poseidon_builtin() { + let mut hint_executor = BuiltinHintProcessor::new_empty(); + let cairo_run_config = cairo_run::CairoRunConfig { + layout: "all", + ..cairo_vm::cairo_run::CairoRunConfig::default() + }; + cairo_run::cairo_run( + Path::new("cairo_programs/poseidon_builtin.json"), + &cairo_run_config, + &mut hint_executor, + ) + .expect("Couldn't run program"); +} + +#[test] +fn cairo_run_poseidon_hash() { + let mut hint_executor = BuiltinHintProcessor::new_empty(); + let cairo_run_config = cairo_run::CairoRunConfig { + layout: "all", + ..cairo_vm::cairo_run::CairoRunConfig::default() + }; + cairo_run::cairo_run( + Path::new("cairo_programs/poseidon_hash.json"), + &cairo_run_config, + &mut hint_executor, + ) + .expect("Couldn't run program"); +} From 152d5e4a7ebbcf4a14d4ecaf531dada3e9ca440f Mon Sep 17 00:00:00 2001 From: Federica Date: Mon, 6 Mar 2023 18:41:38 -0300 Subject: [PATCH 22/39] test constant creation doesnt panic --- .../poseidon_utils/poseidon_constants.rs | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/vm/runners/builtin_runner/poseidon_utils/poseidon_constants.rs b/src/vm/runners/builtin_runner/poseidon_utils/poseidon_constants.rs index 3e04d3822c..6284aa89df 100644 --- a/src/vm/runners/builtin_runner/poseidon_utils/poseidon_constants.rs +++ b/src/vm/runners/builtin_runner/poseidon_utils/poseidon_constants.rs @@ -19,7 +19,7 @@ fn get_poseidon_comp_constants() -> Vec { compress_roundkeys(&round_keys) } -pub fn compress_roundkeys(rcs: &[[FieldElement; 3]]) -> Vec { +fn compress_roundkeys(rcs: &[[FieldElement; 3]]) -> Vec { let mut result = Vec::new(); // Add first full rounds @@ -38,7 +38,7 @@ pub fn compress_roundkeys(rcs: &[[FieldElement; 3]]) -> Vec { result } -pub fn compress_roundkeys_partial(rcs: &[[FieldElement; 3]]) -> Vec { +fn compress_roundkeys_partial(rcs: &[[FieldElement; 3]]) -> Vec { let mut result = Vec::new(); let mut idx = FULL_ROUNDS / 2; @@ -537,3 +537,13 @@ pub const RAW_ROUND_KEYS: [[&str; 3]; 91] = [ "2770011224727997178743274791849308200493823127651418989170761007078565678171", ], ]; + +#[cfg(test)] +mod test { + use super::*; + + #[test] + fn getting_poseidon_constants_doesnt_panic() { + let _ = get_poseidon_comp_constants(); + } +} From feee06c391748f9b6b00854a134c1e7c01a5f764 Mon Sep 17 00:00:00 2001 From: Federica Date: Mon, 6 Mar 2023 18:51:05 -0300 Subject: [PATCH 23/39] Add tests --- .../poseidon_utils/poseidon_hash.rs | 64 +++++++++++++++++++ 1 file changed, 64 insertions(+) diff --git a/src/vm/runners/builtin_runner/poseidon_utils/poseidon_hash.rs b/src/vm/runners/builtin_runner/poseidon_utils/poseidon_hash.rs index d5a1389c9e..d84b35a30e 100644 --- a/src/vm/runners/builtin_runner/poseidon_utils/poseidon_hash.rs +++ b/src/vm/runners/builtin_runner/poseidon_utils/poseidon_hash.rs @@ -52,3 +52,67 @@ pub fn permute_comp(state: &mut [FieldElement; 3]) { idx += 3; } } + +#[cfg(test)] +mod test { + use super::*; + + #[test] + fn test_permute_a() { + let mut poseidon_state = [FieldElement::THREE, FieldElement::ZERO, FieldElement::TWO]; + permute_comp(&mut poseidon_state); + assert_eq!( + poseidon_state, + [ + FieldElement::from_hex_be( + "0x268c44203f1c763bca21beb5aec78b9063cdcdd0fdf6b598bb8e1e8f2b6253f" + ) + .unwrap(), + FieldElement::from_hex_be( + "0x2b85c9f686f5d3036db55b2ca58a763a3065bc1bc8efbe0e70f3a7171f6cad3" + ) + .unwrap(), + FieldElement::from_hex_be( + "0x61df3789eef0e1ee0dbe010582a00dd099191e6395dfb976e7be3be2fa9d54b" + ) + .unwrap() + ] + ) + } + + #[test] + fn test_permute_b() { + let mut poseidon_state = [ + FieldElement::from_hex_be( + "0x268c44203f1c763bca21beb5aec78b9063cdcdd0fdf6b598bb8e1e8f2b6253f", + ) + .unwrap(), + FieldElement::from_hex_be( + "0x2b85c9f686f5d3036db55b2ca58a763a3065bc1bc8efbe0e70f3a7171f6cad3", + ) + .unwrap(), + FieldElement::from_hex_be( + "0x61df3789eef0e1ee0dbe010582a00dd099191e6395dfb976e7be3be2fa9d54b", + ) + .unwrap(), + ]; + permute_comp(&mut poseidon_state); + assert_eq!( + poseidon_state, + [ + FieldElement::from_hex_be( + "0x4ec565b1b01606b5222602b20f8ddc4a8a7c75b559b852ab183a0daf5930b5c" + ) + .unwrap(), + FieldElement::from_hex_be( + "0x4d3c32c3c7cd39b6444db42e2437eeda12e459d28ce49a0f761a23d64c29e4c" + ) + .unwrap(), + FieldElement::from_hex_be( + "0x749d4d0ddf41548e039f183b745a08b80fad54e9ac389021148350bdda70a92" + ) + .unwrap() + ] + ) + } +} From 92c4c586cc4f20ddb43a444ffec0b321e4a1db69 Mon Sep 17 00:00:00 2001 From: Federica Date: Tue, 7 Mar 2023 11:02:01 -0300 Subject: [PATCH 24/39] Fix failling tests --- src/vm/runners/builtin_runner/poseidon.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/vm/runners/builtin_runner/poseidon.rs b/src/vm/runners/builtin_runner/poseidon.rs index 0c63bcde3d..ca760c6fcd 100644 --- a/src/vm/runners/builtin_runner/poseidon.rs +++ b/src/vm/runners/builtin_runner/poseidon.rs @@ -132,7 +132,7 @@ impl PoseidonBuiltinRunner { vm: &VirtualMachine, ) -> Result<(usize, usize), MemoryError> { let ratio = self.ratio as usize; - let min_step = ratio * 2_usize /* TODO: Override with change */; + let min_step = ratio * 1_usize /* TODO: Override with change */; if vm.current_step < min_step { Err( InsufficientAllocatedCellsError::MinStepNotReached(min_step, POSEIDON_BUILTIN_NAME) @@ -277,7 +277,7 @@ mod tests { builtin.final_stack(&vm.segments, pointer), Err(RunnerError::InvalidStopPointer( POSEIDON_BUILTIN_NAME, - relocatable!(0, 999), + relocatable!(0, 1002), relocatable!(0, 0) )) ); @@ -371,7 +371,7 @@ mod tests { .run_until_pc(address, &mut vm, &mut hint_processor) .unwrap(); - assert_eq!(builtin.get_used_cells_and_allocated_size(&vm), Ok((0, 3))); + assert_eq!(builtin.get_used_cells_and_allocated_size(&vm), Ok((0, 6))); } #[test] @@ -414,6 +414,6 @@ mod tests { .run_until_pc(address, &mut vm, &mut hint_processor) .unwrap(); - assert_eq!(builtin.get_allocated_memory_units(&vm), Ok(3)); + assert_eq!(builtin.get_allocated_memory_units(&vm), Ok(6)); } } From 691d5d1037cc906dd7b10bf81bcc44fe80ccf12d Mon Sep 17 00:00:00 2001 From: Federica Date: Tue, 7 Mar 2023 11:52:05 -0300 Subject: [PATCH 25/39] Use final values for POSEIDON_COMP_CONSTANTS and move calculation to test module --- .../poseidon_utils/poseidon_constants.rs | 1474 +++++++++++------ 1 file changed, 954 insertions(+), 520 deletions(-) diff --git a/src/vm/runners/builtin_runner/poseidon_utils/poseidon_constants.rs b/src/vm/runners/builtin_runner/poseidon_utils/poseidon_constants.rs index 6284aa89df..ce1c81d28f 100644 --- a/src/vm/runners/builtin_runner/poseidon_utils/poseidon_constants.rs +++ b/src/vm/runners/builtin_runner/poseidon_utils/poseidon_constants.rs @@ -1,6 +1,3 @@ -// Code ported from the build.rs script here: -// https://github.com/eqlabs/pathfinder/blob/00a1a74a90a7b8a7f1d07ac3e616be1cb39cf8f1/crates/stark_poseidon/build.rs - use lazy_static::lazy_static; use starknet_crypto::FieldElement; @@ -8,542 +5,979 @@ pub(crate) const FULL_ROUNDS: usize = 8; pub(crate) const PARTIAL_ROUNDS: usize = 83; lazy_static! { - pub(crate) static ref POSEIDON_COMP_CONSTS: Vec = get_poseidon_comp_constants(); + pub(crate) static ref POSEIDON_COMP_CONSTS: [FieldElement; 107] = [ + FieldElement::from_hex_be( + "0x06861759ea556a2339dd92f9562a30b9e58e2ad98109ae4780b7fd8eac77fe6f" + ) + .unwrap(), + FieldElement::from_hex_be( + "0x03827681995d5af9ffc8397a3d00425a3da43f76abf28a64e4ab1a22f27508c4" + ) + .unwrap(), + FieldElement::from_hex_be( + "0x03a3956d2fad44d0e7f760a2277dc7cb2cac75dc279b2d687a0dbe17704a8309" + ) + .unwrap(), + FieldElement::from_hex_be( + "0x0626c47a7d421fe1f13c4282214aa759291c78f926a2d1c6882031afe67ef4cd" + ) + .unwrap(), + FieldElement::from_hex_be( + "0x078985f8e16505035bd6df5518cfd41f2d327fcc948d772cadfe17baca05d6a6" + ) + .unwrap(), + FieldElement::from_hex_be( + "0x05427f10867514a3204c659875341243c6e26a68b456dc1d142dcf34341696ff" + ) + .unwrap(), + FieldElement::from_hex_be( + "0x05af083f36e4c729454361733f0883c5847cd2c5d9d4cb8b0465e60edce699d7" + ) + .unwrap(), + FieldElement::from_hex_be( + "0x07d71701bde3d06d54fa3f74f7b352a52d3975f92ff84b1ac77e709bfd388882" + ) + .unwrap(), + FieldElement::from_hex_be( + "0x0603da06882019009c26f8a6320a1c5eac1b64f699ffea44e39584467a6b1d3e" + ) + .unwrap(), + FieldElement::from_hex_be( + "0x04332a6f6bde2f288e79ce13f47ad1cdeebd8870fd13a36b613b9721f6453a5d" + ) + .unwrap(), + FieldElement::from_hex_be( + "0x053d0ebf61664c685310a04c4dec2e7e4b9a813aaeff60d6c9e8caeb5cba78e7" + ) + .unwrap(), + FieldElement::from_hex_be( + "0x05346a68894845835ae5ebcb88028d2a6c82f99f928494ee1bfc2d15eaabfebc" + ) + .unwrap(), + FieldElement::from_hex_be( + "0x04b085eb1df4258c3453cc97445954bf3433b6ab9dd5a99592864c00f54a3f9a" + ) + .unwrap(), + FieldElement::from_hex_be( + "0x0731cfd19d508285965f12a079b2a169fdfe0a8e610e6f2d5ca5d7b0961f6d96" + ) + .unwrap(), + FieldElement::from_hex_be( + "0x0217d08b5339852bcc6f7a774936b3e72ecd9e1f9a73d743f8079c1e3587eeaa" + ) + .unwrap(), + FieldElement::from_hex_be( + "0x000c935dd633b0fd63599b13c850dab3cb966ba510c81b20959e267008518c6e" + ) + .unwrap(), + FieldElement::from_hex_be( + "0x052af8d378dd6772ee187ed23f79a7d98cf5a0a387103971467fe940e7b8b2be" + ) + .unwrap(), + FieldElement::from_hex_be( + "0x0294851c98b2682f1ec9918b9f12fcceaa6e28a7b79b2e506362cda595f8ab75" + ) + .unwrap(), + FieldElement::from_hex_be( + "0x011b59990bacc280824d1021418d4f589da8c30063471494c204b169ab086064" + ) + .unwrap(), + FieldElement::from_hex_be( + "0x04b4df56e3d7753f91960d59ae099b9beb2ce690e6bbdcd0b599d49ceb2acd6a" + ) + .unwrap(), + FieldElement::from_hex_be( + "0x005eecfa15a757dc3ecae9fbd8ff06e466243534f30629fc5f1cf09eb5161ac4" + ) + .unwrap(), + FieldElement::from_hex_be( + "0x0680bfdd8b9680e04659227634a1ec5282e5a7cef81b15677f8448bda4279059" + ) + .unwrap(), + FieldElement::from_hex_be( + "0x01d0bf8fab0a1a7a14e2930794f7a3065c17e10b1cedd791b8877d97acd85053" + ) + .unwrap(), + FieldElement::from_hex_be( + "0x02c2c8c79f808ace54ba207053c0d412c0fc11a610f14c48876701a37e32f464" + ) + .unwrap(), + FieldElement::from_hex_be( + "0x0354ec9ed01d20ec52aae19a9b858d3474d8234c11ad7bce630ad56c54afa562" + ) + .unwrap(), + FieldElement::from_hex_be( + "0x030df20fcf6427bac38bb5d1a42287f4e4136ac5892340e994e6ea28deec1e55" + ) + .unwrap(), + FieldElement::from_hex_be( + "0x0528cf329c64e7ee3040bafbdeff61e241d99b424091e31472eda296fc9c6778" + ) + .unwrap(), + FieldElement::from_hex_be( + "0x040416f24f623534634789660df5435ebf0c3e0c69e6c5b5ff6e757930bd1960" + ) + .unwrap(), + FieldElement::from_hex_be( + "0x00380c8f936e2ed9fd488ae3bac7dce315ba21b11e88339cd5444435ccc9ea38" + ) + .unwrap(), + FieldElement::from_hex_be( + "0x01cc4f5d5603d176f1a8e344392efd2d03ad0541832829d245e0e2291f255b75" + ) + .unwrap(), + FieldElement::from_hex_be( + "0x05728917af5da91f9539310d99f5d142e011d6c8e015ea5423c502aa99c09752" + ) + .unwrap(), + FieldElement::from_hex_be( + "0x00efb450a9e86e1a46e295a348f0f23590925107d17c56d7c788fecc17219aa1" + ) + .unwrap(), + FieldElement::from_hex_be( + "0x02020d74d36c421ae1a025616b342d0784b8fcd977de6c53a6c26693774dca99" + ) + .unwrap(), + FieldElement::from_hex_be( + "0x07cfb309b75fd3bf2705558ae511dc82335050969f4bf84fa2b7b4f583989287" + ) + .unwrap(), + FieldElement::from_hex_be( + "0x04651e48b2e9349a5365e009ece626809d7b7d02a617eb98c785a784812d75e9" + ) + .unwrap(), + FieldElement::from_hex_be( + "0x00d77627b270f65122d0269719da923ccae822d9aad0f0947a3b5c8f71c0dcc7" + ) + .unwrap(), + FieldElement::from_hex_be( + "0x0199ad3d641b54c4d571b3fe37773a8b82b003377f0dd8b7d3b7758c32908ea8" + ) + .unwrap(), + FieldElement::from_hex_be( + "0x044f33640a8ecfd3973e2e9172a7333482b2d297be2da289319e72d137cdfe6e" + ) + .unwrap(), + FieldElement::from_hex_be( + "0x07e4adf9894d964189d00a02dcf1e6be7f801234f5216eab6b6f366b6701abf7" + ) + .unwrap(), + FieldElement::from_hex_be( + "0x03641fa5b3c90452f5ff808f8a9817eda7c6aecfb5471dfdca559fb4e711ee90" + ) + .unwrap(), + FieldElement::from_hex_be( + "0x03de5729efd2fcbd897a49a78fa923fc306df32e6e2f0e02d0eee2c2cc3f3533" + ) + .unwrap(), + FieldElement::from_hex_be( + "0x062691891a3fc1e27f622966ca0be20c06563500c8f06c9bdb77bd2882d6c994" + ) + .unwrap(), + FieldElement::from_hex_be( + "0x06608d3bf11c18e4688739f72205763d1590cc4f9885ae1d86e96e0604baa0be" + ) + .unwrap(), + FieldElement::from_hex_be( + "0x011c9c9b39cac71e3419726ce779116d07249f51cbdda4fd98c25cbbf593a316" + ) + .unwrap(), + FieldElement::from_hex_be( + "0x061e23b58203269caef0850f74da27b9748e3312ea40c6844dd68c557c462ad7" + ) + .unwrap(), + FieldElement::from_hex_be( + "0x04182cd9ab1d9488f870a572010bc2a3d9878440b25951e4ce010855cf83bdc8" + ) + .unwrap(), + FieldElement::from_hex_be( + "0x0520fe6c4a096793f9055e6823116d15f1df2fe89d306f9965f6a59f4f3ecb71" + ) + .unwrap(), + FieldElement::from_hex_be( + "0x0346b2b2d6e5810129e093093dcd3dfa99ed6d71f47723ea3fbe4d4e2fd4afa1" + ) + .unwrap(), + FieldElement::from_hex_be( + "0x01359ca923e7f1448ec1dd2a3684bee4e8b682c8e8e973acea72877ce9f7e6cf" + ) + .unwrap(), + FieldElement::from_hex_be( + "0x047c655f55cf307800dfefdad24de86fde9deadab145a1b392420f37b95d9675" + ) + .unwrap(), + FieldElement::from_hex_be( + "0x04ab291f16555fa8a968cd7c9c285a9598efd925f2d58b7aa38ad87dca8441a8" + ) + .unwrap(), + FieldElement::from_hex_be( + "0x039f409c7c782101223d1f6f7d86c21a22c44ef959510e392c9c7c5d17c629c5" + ) + .unwrap(), + FieldElement::from_hex_be( + "0x044be36b782f882ad86eecb0cd6beb02e1a2f9fb5587a3babfacead0cafb6052" + ) + .unwrap(), + FieldElement::from_hex_be( + "0x050a1dfde9b504ad2906db6eb5b507203cd1ceb394c52ce7107679a53a0d538b" + ) + .unwrap(), + FieldElement::from_hex_be( + "0x05c753c14da89e287b181c0dd11ac6c3680bdd7f1017dae083e7aebbeab183ab" + ) + .unwrap(), + FieldElement::from_hex_be( + "0x02cf6306ed32232106c8015a3b180f386eee93e15f7b4f4fa57746525fc0520c" + ) + .unwrap(), + FieldElement::from_hex_be( + "0x02c2014634d52e27420873cf347429091dfc6380689bd4f54d7d8e502c1c3a09" + ) + .unwrap(), + FieldElement::from_hex_be( + "0x03cfb9c5bd93e02b2fdacde2058e33e5975c446345f010d850fc09cdf86ed8a1" + ) + .unwrap(), + FieldElement::from_hex_be( + "0x0363fa71a383cf3897933f1411fc5f806e311e84f72cb50a9ea4e1281f6b0299" + ) + .unwrap(), + FieldElement::from_hex_be( + "0x0728199657067ee16947b3fc76271676b4901b2a3686cffebcb960da91b05df8" + ) + .unwrap(), + FieldElement::from_hex_be( + "0x03fdfbd47d27f3d34f0723b728e8921dc9bde34a9872df5a652a078d7e4ee021" + ) + .unwrap(), + FieldElement::from_hex_be( + "0x07f241379440cacd7dc0efbe7858eb7de53cc02ca7d24197945c453398eff449" + ) + .unwrap(), + FieldElement::from_hex_be( + "0x05b2e8771ea9a0004e3bf056f3727797cbb457a27574d5f104354e52a5c25f0b" + ) + .unwrap(), + FieldElement::from_hex_be( + "0x00a8ddbce708de44a7e0b3b0333146e1e910245be6bf822ea057a081bda2e23e" + ) + .unwrap(), + FieldElement::from_hex_be( + "0x02d521e0daca24e431aa47cd90a0f551c12270e533835613edce2e19aa9b0f61" + ) + .unwrap(), + FieldElement::from_hex_be( + "0x06cdbc0f2aa54d2cf7d5ac3b93f855af03eef7b07aaee00341a6266c30e08ae6" + ) + .unwrap(), + FieldElement::from_hex_be( + "0x03dd96a17111ec8f4c5da3ad6794c0961ceee452cbe92c7a0941112b36ed9bf3" + ) + .unwrap(), + FieldElement::from_hex_be( + "0x05eafb1edeedc5c07ac07fdd06159344a2cfb92196a65d9ec0c5e732c36687dc" + ) + .unwrap(), + FieldElement::from_hex_be( + "0x04ab038d7b09eda9324577b260feaebdbcec5a7b7c7f449b312cfcd065c207e6" + ) + .unwrap(), + FieldElement::from_hex_be( + "0x04ca71981e4df6b505d2b0d94e235608463c58052570f68e495fc80c7fdef220" + ) + .unwrap(), + FieldElement::from_hex_be( + "0x06dee9c6da4617e32aa419899c8ea8137e9b59d7e2759ffe573c15b77e413d2f" + ) + .unwrap(), + FieldElement::from_hex_be( + "0x058f9e60b34ddab84dcbe2396065a4305b4a795a4770e4541e625d0460c6f186" + ) + .unwrap(), + FieldElement::from_hex_be( + "0x047b7b4a802a10c1e6c9c735db6c34042d290906f274bea8fcecef17fc9af632" + ) + .unwrap(), + FieldElement::from_hex_be( + "0x01849bcdb9ad7171096ecc936a186774084a074be0bfc0fbb9463a06a2bd430c" + ) + .unwrap(), + FieldElement::from_hex_be( + "0x041870fbe04438348af5767bddaecd8aea3b49b4217547dec4d699b1466736cc" + ) + .unwrap(), + FieldElement::from_hex_be( + "0x0226c04e598076a9fa02aa64557daf28c0ec42e3d4da68d1965029d284738b07" + ) + .unwrap(), + FieldElement::from_hex_be( + "0x01f0e971f0485a5b42eb92d6655c3ddb475cec4371f269a95335b2a7d6dac0fb" + ) + .unwrap(), + FieldElement::from_hex_be( + "0x009f31cc2907dccbf994d35aa47ee3f4ebdf3703f795047a7b40dd3926431563" + ) + .unwrap(), + FieldElement::from_hex_be( + "0x04b40cce78f3b641e31ce4df58ce5a42c22cfbc198c84451ffe8cca4c64bd7d2" + ) + .unwrap(), + FieldElement::from_hex_be( + "0x0191660489e4bd8a3e4563173de4a226f3ac736962fdfb70f72cb93ce50f8b9f" + ) + .unwrap(), + FieldElement::from_hex_be( + "0x018c0919618db971f74eb01f293f2daea814b475103373dc7ed8dd4c7b467410" + ) + .unwrap(), + FieldElement::from_hex_be( + "0x035b60253848530e845c8753121577d0ef37002e941c3dc1fb240bd57eadc803" + ) + .unwrap(), + FieldElement::from_hex_be( + "0x01ae99db1575ae91c8b43a9f71a5f362581ad9b413d97fa6fd029134957451d5" + ) + .unwrap(), + FieldElement::from_hex_be( + "0x03e6e1d0f3f8a0f728148ebcbd5d7d337d7cb8feb58a37d2d1dfb357e172647b" + ) + .unwrap(), + FieldElement::from_hex_be( + "0x018bc36dffa8f96a659e1a171b55d2706ee3e9ad619e16f5c38dd1f4a209b8f3" + ) + .unwrap(), + FieldElement::from_hex_be( + "0x02c7a3ef1afb6a302b54afc3a107ff9199a16efe9a1cc3ab83fa5b64893de4ed" + ) + .unwrap(), + FieldElement::from_hex_be( + "0x053a7bd889bed07bf5e27dd8e92f6ae85e4fe4e84b0c6dde9856e94469de4bd7" + ) + .unwrap(), + FieldElement::from_hex_be( + "0x04d383ff7ffc6318fda704aca35995f86bec5a02ce9a0bf9d3cc0cc2f03ccea9" + ) + .unwrap(), + FieldElement::from_hex_be( + "0x04667b6762fb8ad53d07ef7e8a65b21ca96e0b3503037710d1292519c326f5cd" + ) + .unwrap(), + FieldElement::from_hex_be( + "0x002cc8b43e75cf0b42a93c39ea98bcd46055dccc9589f02eb7fb536422e5921f" + ) + .unwrap(), + FieldElement::from_hex_be( + "0x06b32ee98680871d38751447bfd76086ba4df0e7be59c55f4b2ce25582bf9c60" + ) + .unwrap(), + FieldElement::from_hex_be( + "0x03e907927c7182faaa3b3c81358b82e734efac1f0609f0862d635cb1387102a3" + ) + .unwrap(), + FieldElement::from_hex_be( + "0x03f3a5057b3a08975f0253728e512af78d2f437973f6a93793ea5e8424fbc6ea" + ) + .unwrap(), + FieldElement::from_hex_be( + "0x014b491d73724779f8aa74b3fd8aa5821c21e1017224726a7a946bb6ca68d8f5" + ) + .unwrap(), + FieldElement::from_hex_be( + "0x05c8278c7bbfc30ae7f60e514fe3b9367aca84c54ad1373861695ea4abb814ef" + ) + .unwrap(), + FieldElement::from_hex_be( + "0x064851937f9836ee5a08a7dde65e44b467018a82ba3bf99bba0b4502755c8074" + ) + .unwrap(), + FieldElement::from_hex_be( + "0x06a9ac84251294769eca450ffb52b441882be77cb85f422ff9ea5e73f1d971dc" + ) + .unwrap(), + FieldElement::from_hex_be( + "0x037ec35b710b0d04c9a2b71f2f7bd098c6a81d991d27f0fc1884f5ca545064de" + ) + .unwrap(), + FieldElement::from_hex_be( + "0x005334f75b052c0235119816883040da72c6d0a61538bdfff46d6a242bfeb7a1" + ) + .unwrap(), + FieldElement::from_hex_be( + "0x05d0af4fcbd9e056c1020cca9d871ae68f80ee4af2ec6547cd49d6dca50aa431" + ) + .unwrap(), + FieldElement::from_hex_be( + "0x030131bce2fba5694114a19c46d24e00b4699dc00f1d53ba5ab99537901b1e65" + ) + .unwrap(), + FieldElement::from_hex_be( + "0x05646a95a7c1ae86b34c0750ed2e641c538f93f13161be3c4957660f2e788965" + ) + .unwrap(), + FieldElement::from_hex_be( + "0x04b9f291d7b430c79fac36230a11f43e78581f5259692b52c90df47b7d4ec01a" + ) + .unwrap(), + FieldElement::from_hex_be( + "0x05006d393d3480f41a98f19127072dc83e00becf6ceb4d73d890e74abae01a13" + ) + .unwrap(), + FieldElement::from_hex_be( + "0x062c9d42199f3b260e7cb8a115143106acf4f702e6b346fd202dc3b26a679d80" + ) + .unwrap(), + FieldElement::from_hex_be( + "0x051274d092db5099f180b1a8a13b7f2c7606836eabd8af54bf1d9ac2dc5717a5" + ) + .unwrap(), + FieldElement::from_hex_be( + "0x061fc552b8eb75e17ad0fb7aaa4ca528f415e14f0d9cdbed861a8db0bfff0c5b" + ) + .unwrap() + ]; } -fn get_poseidon_comp_constants() -> Vec { - let round_keys = RAW_ROUND_KEYS - .iter() - .map(|key| key.map(|num| FieldElement::from_dec_str(num).expect("Invalid round key"))) - .collect::>(); - compress_roundkeys(&round_keys) -} +#[cfg(test)] +mod test { + use super::*; + // When creating the constants for POSEIDON_COMP_CONSTANTS we skip compressing the raw keys and use the final pre-calculated values for performance + // Now we calculate poseidon compressed constants from raw keys for soundness check + + fn get_poseidon_comp_constants() -> Vec { + let round_keys = RAW_ROUND_KEYS + .iter() + .map(|key| key.map(|num| FieldElement::from_dec_str(num).expect("Invalid round key"))) + .collect::>(); + compress_roundkeys(&round_keys) + } + + // Code ported from the build.rs script here: + // https://github.com/eqlabs/pathfinder/blob/00a1a74a90a7b8a7f1d07ac3e616be1cb39cf8f1/crates/stark_poseidon/build.rs -fn compress_roundkeys(rcs: &[[FieldElement; 3]]) -> Vec { - let mut result = Vec::new(); + fn compress_roundkeys(rcs: &[[FieldElement; 3]]) -> Vec { + let mut result = Vec::new(); - // Add first full rounds - result.extend(rcs[..FULL_ROUNDS / 2].iter().flatten()); + // Add first full rounds + result.extend(rcs[..FULL_ROUNDS / 2].iter().flatten()); + // Add compressed partial rounds and first of the last full rounds + result.extend(compress_roundkeys_partial(rcs)); + // Add last full rounds except the first of them + result.extend( + rcs[(FULL_ROUNDS / 2 + PARTIAL_ROUNDS + 1)..] + .iter() + .flatten(), + ); + result + } - // Add compressed partial rounds and first of the last full rounds - result.extend(compress_roundkeys_partial(rcs)); + fn compress_roundkeys_partial(rcs: &[[FieldElement; 3]]) -> Vec { + let mut result = Vec::new(); - // Add last full rounds except the first of them - result.extend( - rcs[(FULL_ROUNDS / 2 + PARTIAL_ROUNDS + 1)..] - .iter() - .flatten(), - ); + let mut idx = FULL_ROUNDS / 2; + let mut state: [FieldElement; 3] = [FieldElement::ZERO; 3]; - result -} + // Add keys for partial rounds + for _ in 0..PARTIAL_ROUNDS { + // AddRoundKey + state[0] = state[0] + rcs[idx][0]; + state[1] = state[1] + rcs[idx][1]; + state[2] = state[2] + rcs[idx][2]; -fn compress_roundkeys_partial(rcs: &[[FieldElement; 3]]) -> Vec { - let mut result = Vec::new(); + // Add last state + result.push(state[2]); - let mut idx = FULL_ROUNDS / 2; - let mut state: [FieldElement; 3] = [FieldElement::ZERO; 3]; + // Reset last state + state[2] = FieldElement::ZERO; - // Add keys for partial rounds - for _ in 0..PARTIAL_ROUNDS { - // AddRoundKey + // MixLayer + let t = state[0] + state[1] + state[2]; + state[0] = t + FieldElement::TWO * state[0]; + state[1] = t - FieldElement::TWO * state[1]; + state[2] = t - FieldElement::THREE * state[2]; + + idx += 1; + } + + // Add keys for first of the last full rounds state[0] = state[0] + rcs[idx][0]; state[1] = state[1] + rcs[idx][1]; state[2] = state[2] + rcs[idx][2]; - - // Add last state + result.push(state[0]); + result.push(state[1]); result.push(state[2]); - // Reset last state - state[2] = FieldElement::ZERO; - - // MixLayer - let t = state[0] + state[1] + state[2]; - state[0] = t + FieldElement::TWO * state[0]; - state[1] = t - FieldElement::TWO * state[1]; - state[2] = t - FieldElement::THREE * state[2]; - - idx += 1; + result } - // Add keys for first of the last full rounds - state[0] = state[0] + rcs[idx][0]; - state[1] = state[1] + rcs[idx][1]; - state[2] = state[2] + rcs[idx][2]; - result.push(state[0]); - result.push(state[1]); - result.push(state[2]); + // Extracted from: + // https://github.com/starkware-industries/poseidon/blob/5403dff9ff4eadb07deb5c0a43e88bedb011deb8/poseidon3.txt - result -} + pub const RAW_ROUND_KEYS: [[&str; 3]; 91] = [ + [ + "2950795762459345168613727575620414179244544320470208355568817838579231751791", + "1587446564224215276866294500450702039420286416111469274423465069420553242820", + "1645965921169490687904413452218868659025437693527479459426157555728339600137", + ], + [ + "2782373324549879794752287702905278018819686065818504085638398966973694145741", + "3409172630025222641379726933524480516420204828329395644967085131392375707302", + "2379053116496905638239090788901387719228422033660130943198035907032739387135", + ], + [ + "2570819397480941104144008784293466051718826502582588529995520356691856497111", + "3546220846133880637977653625763703334841539452343273304410918449202580719746", + "2720682389492889709700489490056111332164748138023159726590726667539759963454", + ], + [ + "1899653471897224903834726250400246354200311275092866725547887381599836519005", + "2369443697923857319844855392163763375394720104106200469525915896159690979559", + "2354174693689535854311272135513626412848402744119855553970180659094265527996", + ], + [ + "2404084503073127963385083467393598147276436640877011103379112521338973185443", + "950320777137731763811524327595514151340412860090489448295239456547370725376", + "2121140748740143694053732746913428481442990369183417228688865837805149503386", + ], + [ + "2372065044800422557577242066480215868569521938346032514014152523102053709709", + "2618497439310693947058545060953893433487994458443568169824149550389484489896", + "3518297267402065742048564133910509847197496119850246255805075095266319996916", + ], + [ + "340529752683340505065238931581518232901634742162506851191464448040657139775", + "1954876811294863748406056845662382214841467408616109501720437541211031966538", + "813813157354633930267029888722341725864333883175521358739311868164460385261", + ], + [ + "71901595776070443337150458310956362034911936706490730914901986556638720031", + "2789761472166115462625363403490399263810962093264318361008954888847594113421", + "2628791615374802560074754031104384456692791616314774034906110098358135152410", + ], + [ + "3617032588734559635167557152518265808024917503198278888820567553943986939719", + "2624012360209966117322788103333497793082705816015202046036057821340914061980", + "149101987103211771991327927827692640556911620408176100290586418839323044234", + ], + [ + "1039927963829140138166373450440320262590862908847727961488297105916489431045", + "2213946951050724449162431068646025833746639391992751674082854766704900195669", + "2792724903541814965769131737117981991997031078369482697195201969174353468597", + ], + [ + "3212031629728871219804596347439383805499808476303618848198208101593976279441", + "3343514080098703935339621028041191631325798327656683100151836206557453199613", + "614054702436541219556958850933730254992710988573177298270089989048553060199", + ], + [ + "148148081026449726283933484730968827750202042869875329032965774667206931170", + "1158283532103191908366672518396366136968613180867652172211392033571980848414", + "1032400527342371389481069504520755916075559110755235773196747439146396688513", + ], + [ + "806900704622005851310078578853499250941978435851598088619290797134710613736", + "462498083559902778091095573017508352472262817904991134671058825705968404510", + "1003580119810278869589347418043095667699674425582646347949349245557449452503", + ], + [ + "619074932220101074089137133998298830285661916867732916607601635248249357793", + "2635090520059500019661864086615522409798872905401305311748231832709078452746", + "978252636251682252755279071140187792306115352460774007308726210405257135181", + ], + [ + "1766912167973123409669091967764158892111310474906691336473559256218048677083", + "1663265127259512472182980890707014969235283233442916350121860684522654120381", + "3532407621206959585000336211742670185380751515636605428496206887841428074250", + ], + [ + "2507023127157093845256722098502856938353143387711652912931112668310034975446", + "3321152907858462102434883844787153373036767230808678981306827073335525034593", + "3039253036806065280643845548147711477270022154459620569428286684179698125661", + ], + [ + "103480338868480851881924519768416587261556021758163719199282794248762465380", + "2394049781357087698434751577708655768465803975478348134669006211289636928495", + "2660531560345476340796109810821127229446538730404600368347902087220064379579", + ], + [ + "3603166934034556203649050570865466556260359798872408576857928196141785055563", + "1553799760191949768532188139643704561532896296986025007089826672890485412324", + "2744284717053657689091306578463476341218866418732695211367062598446038965164", + ], + [ + "320745764922149897598257794663594419839885234101078803811049904310835548856", + "979382242100682161589753881721708883681034024104145498709287731138044566302", + "1860426855810549882740147175136418997351054138609396651615467358416651354991", + ], + [ + "336173081054369235994909356892506146234495707857220254489443629387613956145", + "1632470326779699229772327605759783482411227247311431865655466227711078175883", + "921958250077481394074960433988881176409497663777043304881055317463712938502", + ], + [ + "3034358982193370602048539901033542101022185309652879937418114324899281842797", + "25626282149517463867572353922222474817434101087272320606729439087234878607", + "3002662261401575565838149305485737102400501329139562227180277188790091853682", + ], + [ + "2939684373453383817196521641512509179310654199629514917426341354023324109367", + "1076484609897998179434851570277297233169621096172424141759873688902355505136", + "2575095284833160494841112025725243274091830284746697961080467506739203605049", + ], + [ + "3565075264617591783581665711620369529657840830498005563542124551465195621851", + "2197016502533303822395077038351174326125210255869204501838837289716363437993", + "331415322883530754594261416546036195982886300052707474899691116664327869405", + ], + [ + "1935011233711290003793244296594669823169522055520303479680359990463281661839", + "3495901467168087413996941216661589517270845976538454329511167073314577412322", + "954195417117133246453562983448451025087661597543338750600301835944144520375", + ], + [ + "1271840477709992894995746871435810599280944810893784031132923384456797925777", + "2565310762274337662754531859505158700827688964841878141121196528015826671847", + "3365022288251637014588279139038152521653896670895105540140002607272936852513", + ], + [ + "1660592021628965529963974299647026602622092163312666588591285654477111176051", + "970104372286014048279296575474974982288801187216974504035759997141059513421", + "2617024574317953753849168721871770134225690844968986289121504184985993971227", + ], + [ + "999899815343607746071464113462778273556695659506865124478430189024755832262", + "2228536129413411161615629030408828764980855956560026807518714080003644769896", + "2701953891198001564547196795777701119629537795442025393867364730330476403227", + ], + [ + "837078355588159388741598313782044128527494922918203556465116291436461597853", + "2121749601840466143704862369657561429793951309962582099604848281796392359214", + "771812260179247428733132708063116523892339056677915387749121983038690154755", + ], + [ + "3317336423132806446086732225036532603224267214833263122557471741829060578219", + "481570067997721834712647566896657604857788523050900222145547508314620762046", + "242195042559343964206291740270858862066153636168162642380846129622127460192", + ], + [ + "2855462178889999218204481481614105202770810647859867354506557827319138379686", + "3525521107148375040131784770413887305850308357895464453970651672160034885202", + "1320839531502392535964065058804908871811967681250362364246430459003920305799", + ], + [ + "2514191518588387125173345107242226637171897291221681115249521904869763202419", + "2798335750958827619666318316247381695117827718387653874070218127140615157902", + "2808467767967035643407948058486565877867906577474361783201337540214875566395", + ], + [ + "3551834385992706206273955480294669176699286104229279436819137165202231595747", + "1219439673853113792340300173186247996249367102884530407862469123523013083971", + "761519904537984520554247997444508040636526566551719396202550009393012691157", + ], + [ + "3355402549169351700500518865338783382387571349497391475317206324155237401353", + "199541098009731541347317515995192175813554789571447733944970283654592727138", + "192100490643078165121235261796864975568292640203635147901612231594408079071", + ], + [ + "1187019357602953326192019968809486933768550466167033084944727938441427050581", + "189525349641911362389041124808934468936759383310282010671081989585219065700", + "2831653363992091308880573627558515686245403755586311978724025292003353336665", + ], + [ + "2052859812632218952608271535089179639890275494426396974475479657192657094698", + "1670756178709659908159049531058853320846231785448204274277900022176591811072", + "3538757242013734574731807289786598937548399719866320954894004830207085723125", + ], + [ + "710549042741321081781917034337800036872214466705318638023070812391485261299", + "2345013122330545298606028187653996682275206910242635100920038943391319595180", + "3528369671971445493932880023233332035122954362711876290904323783426765912206", + ], + [ + "1167120829038120978297497195837406760848728897181138760506162680655977700764", + "3073243357129146594530765548901087443775563058893907738967898816092270628884", + "378514724418106317738164464176041649567501099164061863402473942795977719726", + ], + [ + "333391138410406330127594722511180398159664250722328578952158227406762627796", + "1727570175639917398410201375510924114487348765559913502662122372848626931905", + "968312190621809249603425066974405725769739606059422769908547372904403793174", + ], + [ + "360659316299446405855194688051178331671817370423873014757323462844775818348", + "1386580151907705298970465943238806620109618995410132218037375811184684929291", + "3604888328937389309031638299660239238400230206645344173700074923133890528967", + ], + [ + "2496185632263372962152518155651824899299616724241852816983268163379540137546", + "486538168871046887467737983064272608432052269868418721234810979756540672990", + "1558415498960552213241704009433360128041672577274390114589014204605400783336", + ], + [ + "3512058327686147326577190314835092911156317204978509183234511559551181053926", + "2235429387083113882635494090887463486491842634403047716936833563914243946191", + "1290896777143878193192832813769470418518651727840187056683408155503813799882", + ], + [ + "1143310336918357319571079551779316654556781203013096026972411429993634080835", + "3235435208525081966062419599803346573407862428113723170955762956243193422118", + "1293239921425673430660897025143433077974838969258268884994339615096356996604", + ], + [ + "236252269127612784685426260840574970698541177557674806964960352572864382971", + "1733907592497266237374827232200506798207318263912423249709509725341212026275", + "302004309771755665128395814807589350526779835595021835389022325987048089868", + ], + [ + "3018926838139221755384801385583867283206879023218491758435446265703006270945", + "39701437664873825906031098349904330565195980985885489447836580931425171297", + "908381723021746969965674308809436059628307487140174335882627549095646509778", + ], + [ + "219062858908229855064136253265968615354041842047384625689776811853821594358", + "1283129863776453589317845316917890202859466483456216900835390291449830275503", + "418512623547417594896140369190919231877873410935689672661226540908900544012", + ], + [ + "1792181590047131972851015200157890246436013346535432437041535789841136268632", + "370546432987510607338044736824316856592558876687225326692366316978098770516", + "3323437805230586112013581113386626899534419826098235300155664022709435756946", + ], + [ + "910076621742039763058481476739499965761942516177975130656340375573185415877", + "1762188042455633427137702520675816545396284185254002959309669405982213803405", + "2186362253913140345102191078329764107619534641234549431429008219905315900520", + ], + [ + "2230647725927681765419218738218528849146504088716182944327179019215826045083", + "1069243907556644434301190076451112491469636357133398376850435321160857761825", + "2695241469149243992683268025359863087303400907336026926662328156934068747593", + ], + [ + "1361519681544413849831669554199151294308350560528931040264950307931824877035", + "1339116632207878730171031743761550901312154740800549632983325427035029084904", + "790593524918851401449292693473498591068920069246127392274811084156907468875", + ], + [ + "2723400368331924254840192318398326090089058735091724263333980290765736363637", + "3457180265095920471443772463283225391927927225993685928066766687141729456030", + "1483675376954327086153452545475557749815683871577400883707749788555424847954", + ], + [ + "2926303836265506736227240325795090239680154099205721426928300056982414025239", + "543969119775473768170832347411484329362572550684421616624136244239799475526", + "237401230683847084256617415614300816373730178313253487575312839074042461932", + ], + [ + "844568412840391587862072008674263874021460074878949862892685736454654414423", + "151922054871708336050647150237534498235916969120198637893731715254687336644", + "1299332034710622815055321547569101119597030148120309411086203580212105652312", + ], + [ + "487046922649899823989594814663418784068895385009696501386459462815688122993", + "1104883249092599185744249485896585912845784382683240114120846423960548576851", + "1458388705536282069567179348797334876446380557083422364875248475157495514484", + ], + [ + "850248109622750774031817200193861444623975329881731864752464222442574976566", + "2885843173858536690032695698009109793537724845140477446409245651176355435722", + "3027068551635372249579348422266406787688980506275086097330568993357835463816", + ], + [ + "3231892723647447539926175383213338123506134054432701323145045438168976970994", + "1719080830641935421242626784132692936776388194122314954558418655725251172826", + "1172253756541066126131022537343350498482225068791630219494878195815226839450", + ], + [ + "1619232269633026603732619978083169293258272967781186544174521481891163985093", + "3495680684841853175973173610562400042003100419811771341346135531754869014567", + "1576161515913099892951745452471618612307857113799539794680346855318958552758", + ], + [ + "2618326122974253423403350731396350223238201817594761152626832144510903048529", + "2696245132758436974032479782852265185094623165224532063951287925001108567649", + "930116505665110070247395429730201844026054810856263733273443066419816003444", + ], + [ + "2786389174502246248523918824488629229455088716707062764363111940462137404076", + "1555260846425735320214671887347115247546042526197895180675436886484523605116", + "2306241912153325247392671742757902161446877415586158295423293240351799505917", + ], + [ + "411529621724849932999694270803131456243889635467661223241617477462914950626", + "1542495485262286701469125140275904136434075186064076910329015697714211835205", + "1853045663799041100600825096887578544265580718909350942241802897995488264551", + ], + [ + "2963055259497271220202739837493041799968576111953080503132045092194513937286", + "2303806870349915764285872605046527036748108533406243381676768310692344456050", + "2622104986201990620910286730213140904984256464479840856728424375142929278875", + ], + [ + "2369987021925266811581727383184031736927816625797282287927222602539037105864", + "285070227712021899602056480426671736057274017903028992288878116056674401781", + "3034087076179360957800568733595959058628497428787907887933697691951454610691", + ], + [ + "469095854351700119980323115747590868855368701825706298740201488006320881056", + "360001976264385426746283365024817520563236378289230404095383746911725100012", + "3438709327109021347267562000879503009590697221730578667498351600602230296178", + ], + [ + "63573904800572228121671659287593650438456772568903228287754075619928214969", + "3470881855042989871434874691030920672110111605547839662680968354703074556970", + "724559311507950497340993415408274803001166693839947519425501269424891465492", + ], + [ + "880409284677518997550768549487344416321062350742831373397603704465823658986", + "6876255662475867703077362872097208259197756317287339941435193538565586230", + "2701916445133770775447884812906226786217969545216086200932273680400909154638", + ], + [ + "425152119158711585559310064242720816611629181537672850898056934507216982586", + "1475552998258917706756737045704649573088377604240716286977690565239187213744", + "2413772448122400684309006716414417978370152271397082147158000439863002593561", + ], + [ + "392160855822256520519339260245328807036619920858503984710539815951012864164", + "1075036996503791536261050742318169965707018400307026402939804424927087093987", + "2176439430328703902070742432016450246365760303014562857296722712989275658921", + ], + [ + "1413865976587623331051814207977382826721471106513581745229680113383908569693", + "4879283427490523253696177116563427032332223531862961281430108575019551814", + "3392583297537374046875199552977614390492290683707960975137418536812266544902", + ], + [ + "3600854486849487646325182927019642276644093512133907046667282144129939150983", + "2779924664161372134024229593301361846129279572186444474616319283535189797834", + "2722699960903170449291146429799738181514821447014433304730310678334403972040", + ], + [ + "819109815049226540285781191874507704729062681836086010078910930707209464699", + "3046121243742768013822760785918001632929744274211027071381357122228091333823", + "1339019590803056172509793134119156250729668216522001157582155155947567682278", + ], + [ + "1933279639657506214789316403763326578443023901555983256955812717638093967201", + "2138221547112520744699126051903811860205771600821672121643894708182292213541", + "2694713515543641924097704224170357995809887124438248292930846280951601597065", + ], + [ + "2471734202930133750093618989223585244499567111661178960753938272334153710615", + "504903761112092757611047718215309856203214372330635774577409639907729993533", + "1943979703748281357156510253941035712048221353507135074336243405478613241290", + ], + [ + "684525210957572142559049112233609445802004614280157992196913315652663518936", + "1705585400798782397786453706717059483604368413512485532079242223503960814508", + "192429517716023021556170942988476050278432319516032402725586427701913624665", + ], + [ + "1586493702243128040549584165333371192888583026298039652930372758731750166765", + "686072673323546915014972146032384917012218151266600268450347114036285993377", + "3464340397998075738891129996710075228740496767934137465519455338004332839215", + ], + [ + "2805249176617071054530589390406083958753103601524808155663551392362371834663", + "667746464250968521164727418691487653339733392025160477655836902744186489526", + "1131527712905109997177270289411406385352032457456054589588342450404257139778", + ], + [ + "1908969485750011212309284349900149072003218505891252313183123635318886241171", + "1025257076985551890132050019084873267454083056307650830147063480409707787695", + "2153175291918371429502545470578981828372846236838301412119329786849737957977", + ], + [ + "3410257749736714576487217882785226905621212230027780855361670645857085424384", + "3442969106887588154491488961893254739289120695377621434680934888062399029952", + "3029953900235731770255937704976720759948880815387104275525268727341390470237", + ], + [ + "85453456084781138713939104192561924536933417707871501802199311333127894466", + "2730629666577257820220329078741301754580009106438115341296453318350676425129", + "178242450661072967256438102630920745430303027840919213764087927763335940415", + ], + [ + "2844589222514708695700541363167856718216388819406388706818431442998498677557", + "3547876269219141094308889387292091231377253967587961309624916269569559952944", + "2525005406762984211707203144785482908331876505006839217175334833739957826850", + ], + [ + "3096397013555211396701910432830904669391580557191845136003938801598654871345", + "574424067119200181933992948252007230348512600107123873197603373898923821490", + "1714030696055067278349157346067719307863507310709155690164546226450579547098", + ], + [ + "2339895272202694698739231405357972261413383527237194045718815176814132612501", + "3562501318971895161271663840954705079797767042115717360959659475564651685069", + "69069358687197963617161747606993436483967992689488259107924379545671193749", + ], + [ + "2614502738369008850475068874731531583863538486212691941619835266611116051561", + "655247349763023251625727726218660142895322325659927266813592114640858573566", + "2305235672527595714255517865498269719545193172975330668070873705108690670678", + ], + [ + "926416070297755413261159098243058134401665060349723804040714357642180531931", + "866523735635840246543516964237513287099659681479228450791071595433217821460", + "2284334068466681424919271582037156124891004191915573957556691163266198707693", + ], + [ + "1812588309302477291425732810913354633465435706480768615104211305579383928792", + "2836899808619013605432050476764608707770404125005720004551836441247917488507", + "2989087789022865112405242078196235025698647423649950459911546051695688370523", + ], + [ + "68056284404189102136488263779598243992465747932368669388126367131855404486", + "505425339250887519581119854377342241317528319745596963584548343662758204398", + "2118963546856545068961709089296976921067035227488975882615462246481055679215", + ], + [ + "2253872596319969096156004495313034590996995209785432485705134570745135149681", + "1625090409149943603241183848936692198923183279116014478406452426158572703264", + "179139838844452470348634657368199622305888473747024389514258107503778442495", + ], + [ + "1567067018147735642071130442904093290030432522257811793540290101391210410341", + "2737301854006865242314806979738760349397411136469975337509958305470398783585", + "3002738216460904473515791428798860225499078134627026021350799206894618186256", + ], + [ + "374029488099466837453096950537275565120689146401077127482884887409712315162", + "973403256517481077805460710540468856199855789930951602150773500862180885363", + "2691967457038172130555117632010860984519926022632800605713473799739632878867", + ], + [ + "3515906794910381201365530594248181418811879320679684239326734893975752012109", + "148057579455448384062325089530558091463206199724854022070244924642222283388", + "1541588700238272710315890873051237741033408846596322948443180470429851502842", + ], + [ + "147013865879011936545137344076637170977925826031496203944786839068852795297", + "2630278389304735265620281704608245039972003761509102213752997636382302839857", + "1359048670759642844930007747955701205155822111403150159614453244477853867621", + ], + [ + "2438984569205812336319229336885480537793786558293523767186829418969842616677", + "2137792255841525507649318539501906353254503076308308692873313199435029594138", + "2262318076430740712267739371170174514379142884859595360065535117601097652755", + ], + [ + "2792703718581084537295613508201818489836796608902614779596544185252826291584", + "2294173715793292812015960640392421991604150133581218254866878921346561546149", + "2770011224727997178743274791849308200493823127651418989170761007078565678171", + ], + ]; -// Extracted from: -// https://github.com/starkware-industries/poseidon/blob/5403dff9ff4eadb07deb5c0a43e88bedb011deb8/poseidon3.txt - -pub const RAW_ROUND_KEYS: [[&str; 3]; 91] = [ - [ - "2950795762459345168613727575620414179244544320470208355568817838579231751791", - "1587446564224215276866294500450702039420286416111469274423465069420553242820", - "1645965921169490687904413452218868659025437693527479459426157555728339600137", - ], - [ - "2782373324549879794752287702905278018819686065818504085638398966973694145741", - "3409172630025222641379726933524480516420204828329395644967085131392375707302", - "2379053116496905638239090788901387719228422033660130943198035907032739387135", - ], - [ - "2570819397480941104144008784293466051718826502582588529995520356691856497111", - "3546220846133880637977653625763703334841539452343273304410918449202580719746", - "2720682389492889709700489490056111332164748138023159726590726667539759963454", - ], - [ - "1899653471897224903834726250400246354200311275092866725547887381599836519005", - "2369443697923857319844855392163763375394720104106200469525915896159690979559", - "2354174693689535854311272135513626412848402744119855553970180659094265527996", - ], - [ - "2404084503073127963385083467393598147276436640877011103379112521338973185443", - "950320777137731763811524327595514151340412860090489448295239456547370725376", - "2121140748740143694053732746913428481442990369183417228688865837805149503386", - ], - [ - "2372065044800422557577242066480215868569521938346032514014152523102053709709", - "2618497439310693947058545060953893433487994458443568169824149550389484489896", - "3518297267402065742048564133910509847197496119850246255805075095266319996916", - ], - [ - "340529752683340505065238931581518232901634742162506851191464448040657139775", - "1954876811294863748406056845662382214841467408616109501720437541211031966538", - "813813157354633930267029888722341725864333883175521358739311868164460385261", - ], - [ - "71901595776070443337150458310956362034911936706490730914901986556638720031", - "2789761472166115462625363403490399263810962093264318361008954888847594113421", - "2628791615374802560074754031104384456692791616314774034906110098358135152410", - ], - [ - "3617032588734559635167557152518265808024917503198278888820567553943986939719", - "2624012360209966117322788103333497793082705816015202046036057821340914061980", - "149101987103211771991327927827692640556911620408176100290586418839323044234", - ], - [ - "1039927963829140138166373450440320262590862908847727961488297105916489431045", - "2213946951050724449162431068646025833746639391992751674082854766704900195669", - "2792724903541814965769131737117981991997031078369482697195201969174353468597", - ], - [ - "3212031629728871219804596347439383805499808476303618848198208101593976279441", - "3343514080098703935339621028041191631325798327656683100151836206557453199613", - "614054702436541219556958850933730254992710988573177298270089989048553060199", - ], - [ - "148148081026449726283933484730968827750202042869875329032965774667206931170", - "1158283532103191908366672518396366136968613180867652172211392033571980848414", - "1032400527342371389481069504520755916075559110755235773196747439146396688513", - ], - [ - "806900704622005851310078578853499250941978435851598088619290797134710613736", - "462498083559902778091095573017508352472262817904991134671058825705968404510", - "1003580119810278869589347418043095667699674425582646347949349245557449452503", - ], - [ - "619074932220101074089137133998298830285661916867732916607601635248249357793", - "2635090520059500019661864086615522409798872905401305311748231832709078452746", - "978252636251682252755279071140187792306115352460774007308726210405257135181", - ], - [ - "1766912167973123409669091967764158892111310474906691336473559256218048677083", - "1663265127259512472182980890707014969235283233442916350121860684522654120381", - "3532407621206959585000336211742670185380751515636605428496206887841428074250", - ], - [ - "2507023127157093845256722098502856938353143387711652912931112668310034975446", - "3321152907858462102434883844787153373036767230808678981306827073335525034593", - "3039253036806065280643845548147711477270022154459620569428286684179698125661", - ], - [ - "103480338868480851881924519768416587261556021758163719199282794248762465380", - "2394049781357087698434751577708655768465803975478348134669006211289636928495", - "2660531560345476340796109810821127229446538730404600368347902087220064379579", - ], - [ - "3603166934034556203649050570865466556260359798872408576857928196141785055563", - "1553799760191949768532188139643704561532896296986025007089826672890485412324", - "2744284717053657689091306578463476341218866418732695211367062598446038965164", - ], - [ - "320745764922149897598257794663594419839885234101078803811049904310835548856", - "979382242100682161589753881721708883681034024104145498709287731138044566302", - "1860426855810549882740147175136418997351054138609396651615467358416651354991", - ], - [ - "336173081054369235994909356892506146234495707857220254489443629387613956145", - "1632470326779699229772327605759783482411227247311431865655466227711078175883", - "921958250077481394074960433988881176409497663777043304881055317463712938502", - ], - [ - "3034358982193370602048539901033542101022185309652879937418114324899281842797", - "25626282149517463867572353922222474817434101087272320606729439087234878607", - "3002662261401575565838149305485737102400501329139562227180277188790091853682", - ], - [ - "2939684373453383817196521641512509179310654199629514917426341354023324109367", - "1076484609897998179434851570277297233169621096172424141759873688902355505136", - "2575095284833160494841112025725243274091830284746697961080467506739203605049", - ], - [ - "3565075264617591783581665711620369529657840830498005563542124551465195621851", - "2197016502533303822395077038351174326125210255869204501838837289716363437993", - "331415322883530754594261416546036195982886300052707474899691116664327869405", - ], - [ - "1935011233711290003793244296594669823169522055520303479680359990463281661839", - "3495901467168087413996941216661589517270845976538454329511167073314577412322", - "954195417117133246453562983448451025087661597543338750600301835944144520375", - ], - [ - "1271840477709992894995746871435810599280944810893784031132923384456797925777", - "2565310762274337662754531859505158700827688964841878141121196528015826671847", - "3365022288251637014588279139038152521653896670895105540140002607272936852513", - ], - [ - "1660592021628965529963974299647026602622092163312666588591285654477111176051", - "970104372286014048279296575474974982288801187216974504035759997141059513421", - "2617024574317953753849168721871770134225690844968986289121504184985993971227", - ], - [ - "999899815343607746071464113462778273556695659506865124478430189024755832262", - "2228536129413411161615629030408828764980855956560026807518714080003644769896", - "2701953891198001564547196795777701119629537795442025393867364730330476403227", - ], - [ - "837078355588159388741598313782044128527494922918203556465116291436461597853", - "2121749601840466143704862369657561429793951309962582099604848281796392359214", - "771812260179247428733132708063116523892339056677915387749121983038690154755", - ], - [ - "3317336423132806446086732225036532603224267214833263122557471741829060578219", - "481570067997721834712647566896657604857788523050900222145547508314620762046", - "242195042559343964206291740270858862066153636168162642380846129622127460192", - ], - [ - "2855462178889999218204481481614105202770810647859867354506557827319138379686", - "3525521107148375040131784770413887305850308357895464453970651672160034885202", - "1320839531502392535964065058804908871811967681250362364246430459003920305799", - ], - [ - "2514191518588387125173345107242226637171897291221681115249521904869763202419", - "2798335750958827619666318316247381695117827718387653874070218127140615157902", - "2808467767967035643407948058486565877867906577474361783201337540214875566395", - ], - [ - "3551834385992706206273955480294669176699286104229279436819137165202231595747", - "1219439673853113792340300173186247996249367102884530407862469123523013083971", - "761519904537984520554247997444508040636526566551719396202550009393012691157", - ], - [ - "3355402549169351700500518865338783382387571349497391475317206324155237401353", - "199541098009731541347317515995192175813554789571447733944970283654592727138", - "192100490643078165121235261796864975568292640203635147901612231594408079071", - ], - [ - "1187019357602953326192019968809486933768550466167033084944727938441427050581", - "189525349641911362389041124808934468936759383310282010671081989585219065700", - "2831653363992091308880573627558515686245403755586311978724025292003353336665", - ], - [ - "2052859812632218952608271535089179639890275494426396974475479657192657094698", - "1670756178709659908159049531058853320846231785448204274277900022176591811072", - "3538757242013734574731807289786598937548399719866320954894004830207085723125", - ], - [ - "710549042741321081781917034337800036872214466705318638023070812391485261299", - "2345013122330545298606028187653996682275206910242635100920038943391319595180", - "3528369671971445493932880023233332035122954362711876290904323783426765912206", - ], - [ - "1167120829038120978297497195837406760848728897181138760506162680655977700764", - "3073243357129146594530765548901087443775563058893907738967898816092270628884", - "378514724418106317738164464176041649567501099164061863402473942795977719726", - ], - [ - "333391138410406330127594722511180398159664250722328578952158227406762627796", - "1727570175639917398410201375510924114487348765559913502662122372848626931905", - "968312190621809249603425066974405725769739606059422769908547372904403793174", - ], - [ - "360659316299446405855194688051178331671817370423873014757323462844775818348", - "1386580151907705298970465943238806620109618995410132218037375811184684929291", - "3604888328937389309031638299660239238400230206645344173700074923133890528967", - ], - [ - "2496185632263372962152518155651824899299616724241852816983268163379540137546", - "486538168871046887467737983064272608432052269868418721234810979756540672990", - "1558415498960552213241704009433360128041672577274390114589014204605400783336", - ], - [ - "3512058327686147326577190314835092911156317204978509183234511559551181053926", - "2235429387083113882635494090887463486491842634403047716936833563914243946191", - "1290896777143878193192832813769470418518651727840187056683408155503813799882", - ], - [ - "1143310336918357319571079551779316654556781203013096026972411429993634080835", - "3235435208525081966062419599803346573407862428113723170955762956243193422118", - "1293239921425673430660897025143433077974838969258268884994339615096356996604", - ], - [ - "236252269127612784685426260840574970698541177557674806964960352572864382971", - "1733907592497266237374827232200506798207318263912423249709509725341212026275", - "302004309771755665128395814807589350526779835595021835389022325987048089868", - ], - [ - "3018926838139221755384801385583867283206879023218491758435446265703006270945", - "39701437664873825906031098349904330565195980985885489447836580931425171297", - "908381723021746969965674308809436059628307487140174335882627549095646509778", - ], - [ - "219062858908229855064136253265968615354041842047384625689776811853821594358", - "1283129863776453589317845316917890202859466483456216900835390291449830275503", - "418512623547417594896140369190919231877873410935689672661226540908900544012", - ], - [ - "1792181590047131972851015200157890246436013346535432437041535789841136268632", - "370546432987510607338044736824316856592558876687225326692366316978098770516", - "3323437805230586112013581113386626899534419826098235300155664022709435756946", - ], - [ - "910076621742039763058481476739499965761942516177975130656340375573185415877", - "1762188042455633427137702520675816545396284185254002959309669405982213803405", - "2186362253913140345102191078329764107619534641234549431429008219905315900520", - ], - [ - "2230647725927681765419218738218528849146504088716182944327179019215826045083", - "1069243907556644434301190076451112491469636357133398376850435321160857761825", - "2695241469149243992683268025359863087303400907336026926662328156934068747593", - ], - [ - "1361519681544413849831669554199151294308350560528931040264950307931824877035", - "1339116632207878730171031743761550901312154740800549632983325427035029084904", - "790593524918851401449292693473498591068920069246127392274811084156907468875", - ], - [ - "2723400368331924254840192318398326090089058735091724263333980290765736363637", - "3457180265095920471443772463283225391927927225993685928066766687141729456030", - "1483675376954327086153452545475557749815683871577400883707749788555424847954", - ], - [ - "2926303836265506736227240325795090239680154099205721426928300056982414025239", - "543969119775473768170832347411484329362572550684421616624136244239799475526", - "237401230683847084256617415614300816373730178313253487575312839074042461932", - ], - [ - "844568412840391587862072008674263874021460074878949862892685736454654414423", - "151922054871708336050647150237534498235916969120198637893731715254687336644", - "1299332034710622815055321547569101119597030148120309411086203580212105652312", - ], - [ - "487046922649899823989594814663418784068895385009696501386459462815688122993", - "1104883249092599185744249485896585912845784382683240114120846423960548576851", - "1458388705536282069567179348797334876446380557083422364875248475157495514484", - ], - [ - "850248109622750774031817200193861444623975329881731864752464222442574976566", - "2885843173858536690032695698009109793537724845140477446409245651176355435722", - "3027068551635372249579348422266406787688980506275086097330568993357835463816", - ], - [ - "3231892723647447539926175383213338123506134054432701323145045438168976970994", - "1719080830641935421242626784132692936776388194122314954558418655725251172826", - "1172253756541066126131022537343350498482225068791630219494878195815226839450", - ], - [ - "1619232269633026603732619978083169293258272967781186544174521481891163985093", - "3495680684841853175973173610562400042003100419811771341346135531754869014567", - "1576161515913099892951745452471618612307857113799539794680346855318958552758", - ], - [ - "2618326122974253423403350731396350223238201817594761152626832144510903048529", - "2696245132758436974032479782852265185094623165224532063951287925001108567649", - "930116505665110070247395429730201844026054810856263733273443066419816003444", - ], - [ - "2786389174502246248523918824488629229455088716707062764363111940462137404076", - "1555260846425735320214671887347115247546042526197895180675436886484523605116", - "2306241912153325247392671742757902161446877415586158295423293240351799505917", - ], - [ - "411529621724849932999694270803131456243889635467661223241617477462914950626", - "1542495485262286701469125140275904136434075186064076910329015697714211835205", - "1853045663799041100600825096887578544265580718909350942241802897995488264551", - ], - [ - "2963055259497271220202739837493041799968576111953080503132045092194513937286", - "2303806870349915764285872605046527036748108533406243381676768310692344456050", - "2622104986201990620910286730213140904984256464479840856728424375142929278875", - ], - [ - "2369987021925266811581727383184031736927816625797282287927222602539037105864", - "285070227712021899602056480426671736057274017903028992288878116056674401781", - "3034087076179360957800568733595959058628497428787907887933697691951454610691", - ], - [ - "469095854351700119980323115747590868855368701825706298740201488006320881056", - "360001976264385426746283365024817520563236378289230404095383746911725100012", - "3438709327109021347267562000879503009590697221730578667498351600602230296178", - ], - [ - "63573904800572228121671659287593650438456772568903228287754075619928214969", - "3470881855042989871434874691030920672110111605547839662680968354703074556970", - "724559311507950497340993415408274803001166693839947519425501269424891465492", - ], - [ - "880409284677518997550768549487344416321062350742831373397603704465823658986", - "6876255662475867703077362872097208259197756317287339941435193538565586230", - "2701916445133770775447884812906226786217969545216086200932273680400909154638", - ], - [ - "425152119158711585559310064242720816611629181537672850898056934507216982586", - "1475552998258917706756737045704649573088377604240716286977690565239187213744", - "2413772448122400684309006716414417978370152271397082147158000439863002593561", - ], - [ - "392160855822256520519339260245328807036619920858503984710539815951012864164", - "1075036996503791536261050742318169965707018400307026402939804424927087093987", - "2176439430328703902070742432016450246365760303014562857296722712989275658921", - ], - [ - "1413865976587623331051814207977382826721471106513581745229680113383908569693", - "4879283427490523253696177116563427032332223531862961281430108575019551814", - "3392583297537374046875199552977614390492290683707960975137418536812266544902", - ], - [ - "3600854486849487646325182927019642276644093512133907046667282144129939150983", - "2779924664161372134024229593301361846129279572186444474616319283535189797834", - "2722699960903170449291146429799738181514821447014433304730310678334403972040", - ], - [ - "819109815049226540285781191874507704729062681836086010078910930707209464699", - "3046121243742768013822760785918001632929744274211027071381357122228091333823", - "1339019590803056172509793134119156250729668216522001157582155155947567682278", - ], - [ - "1933279639657506214789316403763326578443023901555983256955812717638093967201", - "2138221547112520744699126051903811860205771600821672121643894708182292213541", - "2694713515543641924097704224170357995809887124438248292930846280951601597065", - ], - [ - "2471734202930133750093618989223585244499567111661178960753938272334153710615", - "504903761112092757611047718215309856203214372330635774577409639907729993533", - "1943979703748281357156510253941035712048221353507135074336243405478613241290", - ], - [ - "684525210957572142559049112233609445802004614280157992196913315652663518936", - "1705585400798782397786453706717059483604368413512485532079242223503960814508", - "192429517716023021556170942988476050278432319516032402725586427701913624665", - ], - [ - "1586493702243128040549584165333371192888583026298039652930372758731750166765", - "686072673323546915014972146032384917012218151266600268450347114036285993377", - "3464340397998075738891129996710075228740496767934137465519455338004332839215", - ], - [ - "2805249176617071054530589390406083958753103601524808155663551392362371834663", - "667746464250968521164727418691487653339733392025160477655836902744186489526", - "1131527712905109997177270289411406385352032457456054589588342450404257139778", - ], - [ - "1908969485750011212309284349900149072003218505891252313183123635318886241171", - "1025257076985551890132050019084873267454083056307650830147063480409707787695", - "2153175291918371429502545470578981828372846236838301412119329786849737957977", - ], - [ - "3410257749736714576487217882785226905621212230027780855361670645857085424384", - "3442969106887588154491488961893254739289120695377621434680934888062399029952", - "3029953900235731770255937704976720759948880815387104275525268727341390470237", - ], - [ - "85453456084781138713939104192561924536933417707871501802199311333127894466", - "2730629666577257820220329078741301754580009106438115341296453318350676425129", - "178242450661072967256438102630920745430303027840919213764087927763335940415", - ], - [ - "2844589222514708695700541363167856718216388819406388706818431442998498677557", - "3547876269219141094308889387292091231377253967587961309624916269569559952944", - "2525005406762984211707203144785482908331876505006839217175334833739957826850", - ], - [ - "3096397013555211396701910432830904669391580557191845136003938801598654871345", - "574424067119200181933992948252007230348512600107123873197603373898923821490", - "1714030696055067278349157346067719307863507310709155690164546226450579547098", - ], - [ - "2339895272202694698739231405357972261413383527237194045718815176814132612501", - "3562501318971895161271663840954705079797767042115717360959659475564651685069", - "69069358687197963617161747606993436483967992689488259107924379545671193749", - ], - [ - "2614502738369008850475068874731531583863538486212691941619835266611116051561", - "655247349763023251625727726218660142895322325659927266813592114640858573566", - "2305235672527595714255517865498269719545193172975330668070873705108690670678", - ], - [ - "926416070297755413261159098243058134401665060349723804040714357642180531931", - "866523735635840246543516964237513287099659681479228450791071595433217821460", - "2284334068466681424919271582037156124891004191915573957556691163266198707693", - ], - [ - "1812588309302477291425732810913354633465435706480768615104211305579383928792", - "2836899808619013605432050476764608707770404125005720004551836441247917488507", - "2989087789022865112405242078196235025698647423649950459911546051695688370523", - ], - [ - "68056284404189102136488263779598243992465747932368669388126367131855404486", - "505425339250887519581119854377342241317528319745596963584548343662758204398", - "2118963546856545068961709089296976921067035227488975882615462246481055679215", - ], - [ - "2253872596319969096156004495313034590996995209785432485705134570745135149681", - "1625090409149943603241183848936692198923183279116014478406452426158572703264", - "179139838844452470348634657368199622305888473747024389514258107503778442495", - ], - [ - "1567067018147735642071130442904093290030432522257811793540290101391210410341", - "2737301854006865242314806979738760349397411136469975337509958305470398783585", - "3002738216460904473515791428798860225499078134627026021350799206894618186256", - ], - [ - "374029488099466837453096950537275565120689146401077127482884887409712315162", - "973403256517481077805460710540468856199855789930951602150773500862180885363", - "2691967457038172130555117632010860984519926022632800605713473799739632878867", - ], - [ - "3515906794910381201365530594248181418811879320679684239326734893975752012109", - "148057579455448384062325089530558091463206199724854022070244924642222283388", - "1541588700238272710315890873051237741033408846596322948443180470429851502842", - ], - [ - "147013865879011936545137344076637170977925826031496203944786839068852795297", - "2630278389304735265620281704608245039972003761509102213752997636382302839857", - "1359048670759642844930007747955701205155822111403150159614453244477853867621", - ], - [ - "2438984569205812336319229336885480537793786558293523767186829418969842616677", - "2137792255841525507649318539501906353254503076308308692873313199435029594138", - "2262318076430740712267739371170174514379142884859595360065535117601097652755", - ], - [ - "2792703718581084537295613508201818489836796608902614779596544185252826291584", - "2294173715793292812015960640392421991604150133581218254866878921346561546149", - "2770011224727997178743274791849308200493823127651418989170761007078565678171", - ], -]; - -#[cfg(test)] -mod test { - use super::*; + #[cfg(test)] + mod test { + use super::*; - #[test] - fn getting_poseidon_constants_doesnt_panic() { - let _ = get_poseidon_comp_constants(); + #[test] + fn check_pre_calculated_poseidon_comp_constants_match_compressed_from_raw_keys() { + let poseidon_comp_constants = get_poseidon_comp_constants(); + assert_eq!(&*POSEIDON_COMP_CONSTS.to_vec(), poseidon_comp_constants); + } } } From 60c493d1dfa24c925557852f7a80bfb7a982db3e Mon Sep 17 00:00:00 2001 From: Federica Date: Tue, 7 Mar 2023 11:56:28 -0300 Subject: [PATCH 26/39] typo --- src/vm/runners/builtin_runner/poseidon_utils/poseidon_hash.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vm/runners/builtin_runner/poseidon_utils/poseidon_hash.rs b/src/vm/runners/builtin_runner/poseidon_utils/poseidon_hash.rs index d84b35a30e..2ff75ace9b 100644 --- a/src/vm/runners/builtin_runner/poseidon_utils/poseidon_hash.rs +++ b/src/vm/runners/builtin_runner/poseidon_utils/poseidon_hash.rs @@ -1,4 +1,4 @@ -// Code ported from the the implementation from pathfinder here: +// Code ported from the implementation from pathfinder here: // https://github.com/eqlabs/pathfinder/blob/00a1a74a90a7b8a7f1d07ac3e616be1cb39cf8f1/crates/stark_poseidon/src/lib.rs use super::poseidon_constants::{FULL_ROUNDS, PARTIAL_ROUNDS, POSEIDON_COMP_CONSTS}; From a9e0051220c89923a955853a568015d5f7e54075 Mon Sep 17 00:00:00 2001 From: Federica Date: Tue, 7 Mar 2023 15:39:44 -0300 Subject: [PATCH 27/39] Solve post-merge conflicts --- src/vm/runners/builtin_runner/poseidon.rs | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/src/vm/runners/builtin_runner/poseidon.rs b/src/vm/runners/builtin_runner/poseidon.rs index ca760c6fcd..22112b0b8a 100644 --- a/src/vm/runners/builtin_runner/poseidon.rs +++ b/src/vm/runners/builtin_runner/poseidon.rs @@ -76,20 +76,19 @@ impl PoseidonBuiltinRunner { if let Some(felt) = self.cache.borrow().get(&address) { return Ok(Some(felt.into())); } - // index will always be less than address.offset, so we can safely unwrap here - let first_input_addr = address.sub_usize(index).unwrap(); - let first_output_addr = first_input_addr + self.n_input_cells as usize; + let first_input_addr = (address - index)?; + let first_output_addr = (first_input_addr + self.n_input_cells as usize)?; let mut input_felts = Vec::::new(); for i in 0..self.n_input_cells as usize { - let val = match memory.get(&(first_input_addr + i)) { + let val = match memory.get(&(first_input_addr + i)?) { Some(value) => { let num = value .get_int_ref() .ok_or(RunnerError::BuiltinExpectedInteger( POSEIDON_BUILTIN_NAME, - first_input_addr + i, + (first_input_addr + i)?, ))?; FieldElement::from_dec_str(&num.to_str_radix(10)) .map_err(|_| RunnerError::FailedStringConversion)? @@ -103,7 +102,7 @@ impl PoseidonBuiltinRunner { permute_comp(&mut poseidon_state); for (i, elem) in poseidon_state.iter().enumerate() { self.cache.borrow_mut().insert( - first_output_addr + i, + (first_output_addr + i)?, Felt::from_bytes_be(&elem.to_bytes_be()), ); } @@ -132,7 +131,7 @@ impl PoseidonBuiltinRunner { vm: &VirtualMachine, ) -> Result<(usize, usize), MemoryError> { let ratio = self.ratio as usize; - let min_step = ratio * 1_usize /* TODO: Override with change */; + let min_step = ratio /* TODO: Override with change */; if vm.current_step < min_step { Err( InsufficientAllocatedCellsError::MinStepNotReached(min_step, POSEIDON_BUILTIN_NAME) @@ -174,9 +173,8 @@ impl PoseidonBuiltinRunner { pointer: Relocatable, ) -> Result { if self.included { - let stop_pointer_addr = pointer - .sub_usize(1) - .map_err(|_| RunnerError::NoStopPointer(POSEIDON_BUILTIN_NAME))?; + let stop_pointer_addr = + (pointer - 1).map_err(|_| RunnerError::NoStopPointer(POSEIDON_BUILTIN_NAME))?; let stop_pointer = segments .memory .get_relocatable(stop_pointer_addr) From 240c6cc4064def696b323782a2cd49fcdd4dbe72 Mon Sep 17 00:00:00 2001 From: Federica Date: Tue, 7 Mar 2023 17:29:24 -0300 Subject: [PATCH 28/39] Implement poseidon hints --- cairo_programs/poseidon_hash.cairo | 19 +++++++++---------- .../builtin_hint_processor_definition.rs | 7 +++++++ .../builtin_hint_processor/hint_code.rs | 3 +++ .../builtin_hint_processor/mod.rs | 1 + 4 files changed, 20 insertions(+), 10 deletions(-) diff --git a/cairo_programs/poseidon_hash.cairo b/cairo_programs/poseidon_hash.cairo index 31ed1d51c2..b2dc178a34 100644 --- a/cairo_programs/poseidon_hash.cairo +++ b/cairo_programs/poseidon_hash.cairo @@ -11,15 +11,14 @@ func main{poseidon_ptr: PoseidonBuiltin*}() { // Hash two let (y) = poseidon_hash(1253795, 18540013156130945068); assert y = 37282360750367388068593128053386029947772104009544220786084510532118246655; - // TODO: uncomment once hints are implemented - // // Hash five - // let felts: felt* = alloc(); - // assert felts[0] = 84175983715088675913672849362079546; - // assert felts[1] = 9384720329467203286234076408512594689579283578028960384690; - // assert felts[2] = 291883989128409324823849293040390493094093; - // assert felts[3] = 5849589438543859348593485948598349584395839402940940290490324; - // assert felts[4] = 1836254780028456372728992049476335424263474849; - // let (z) = poseidon_hash_many(5, felts); - // assert z = 47102513329160951064697157194713013753695317629154835326726810042406974264; + // Hash five + let felts: felt* = alloc(); + assert felts[0] = 84175983715088675913672849362079546; + assert felts[1] = 9384720329467203286234076408512594689579283578028960384690; + assert felts[2] = 291883989128409324823849293040390493094093; + assert felts[3] = 5849589438543859348593485948598349584395839402940940290490324; + assert felts[4] = 1836254780028456372728992049476335424263474849; + let (z) = poseidon_hash_many(5, felts); + assert z = 47102513329160951064697157194713013753695317629154835326726810042406974264; return(); } diff --git a/src/hint_processor/builtin_hint_processor/builtin_hint_processor_definition.rs b/src/hint_processor/builtin_hint_processor/builtin_hint_processor_definition.rs index db4dd67767..a54037aea9 100644 --- a/src/hint_processor/builtin_hint_processor/builtin_hint_processor_definition.rs +++ b/src/hint_processor/builtin_hint_processor/builtin_hint_processor_definition.rs @@ -20,6 +20,7 @@ use crate::{ add_segment, enter_scope, exit_scope, memcpy_continue_copying, memcpy_enter_scope, }, memset_utils::{memset_continue_loop, memset_enter_scope}, + poseidon_utils::{n_more_than_10, n_more_than_2}, pow_utils::pow, secp::{ bigint_utils::{bigint_to_uint256, nondet_bigint3}, @@ -437,6 +438,12 @@ impl HintProcessor for BuiltinHintProcessor { hint_code::VERIFY_ECDSA_SIGNATURE => { verify_ecdsa_signature(vm, &hint_data.ids_data, &hint_data.ap_tracking) } + hint_code::NONDET_N_MORE_THAN_10 => { + n_more_than_10(vm, &hint_data.ids_data, &hint_data.ap_tracking) + } + hint_code::NONDET_N_MORE_THAN_2 => { + n_more_than_2(vm, &hint_data.ids_data, &hint_data.ap_tracking) + } #[cfg(feature = "skip_next_instruction_hint")] hint_code::SKIP_NEXT_INSTRUCTION => skip_next_instruction(vm), code => Err(HintError::UnknownHint(code.to_string())), diff --git a/src/hint_processor/builtin_hint_processor/hint_code.rs b/src/hint_processor/builtin_hint_processor/hint_code.rs index d529b9820f..594555acdb 100644 --- a/src/hint_processor/builtin_hint_processor/hint_code.rs +++ b/src/hint_processor/builtin_hint_processor/hint_code.rs @@ -541,5 +541,8 @@ pub(crate) const RELOCATE_SEGMENT: &str = pub(crate) const TEMPORARY_ARRAY: &str = r#"ids.temporary_array = segments.add_temp_segment()"#; pub(crate) const VERIFY_ECDSA_SIGNATURE: &str = r#"ecdsa_builtin.add_signature(ids.ecdsa_ptr.address_, (ids.signature_r, ids.signature_s))"#; + +pub(crate) const NONDET_N_MORE_THAN_10: &str = "memory[ap] = to_felt_or_relocatable(ids.n >= 10)"; +pub(crate) const NONDET_N_MORE_THAN_2: &str = "memory[ap] = to_felt_or_relocatable(ids.n >= 2)"; #[cfg(feature = "skip_next_instruction_hint")] pub(crate) const SKIP_NEXT_INSTRUCTION: &str = "skip_next_instruction()"; diff --git a/src/hint_processor/builtin_hint_processor/mod.rs b/src/hint_processor/builtin_hint_processor/mod.rs index 32ff08b4f4..66f9305a14 100644 --- a/src/hint_processor/builtin_hint_processor/mod.rs +++ b/src/hint_processor/builtin_hint_processor/mod.rs @@ -11,6 +11,7 @@ pub mod keccak_utils; pub mod math_utils; pub mod memcpy_hint_utils; pub mod memset_utils; +pub mod poseidon_utils; pub mod pow_utils; pub mod secp; pub mod segments; From 38c12411a069c4255d2121fb0c9962ff72804b94 Mon Sep 17 00:00:00 2001 From: Federica Date: Tue, 7 Mar 2023 17:30:42 -0300 Subject: [PATCH 29/39] Add file --- .../builtin_hint_processor/poseidon_utils.rs | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 src/hint_processor/builtin_hint_processor/poseidon_utils.rs diff --git a/src/hint_processor/builtin_hint_processor/poseidon_utils.rs b/src/hint_processor/builtin_hint_processor/poseidon_utils.rs new file mode 100644 index 0000000000..afd4849a50 --- /dev/null +++ b/src/hint_processor/builtin_hint_processor/poseidon_utils.rs @@ -0,0 +1,44 @@ +use std::collections::HashMap; + +use felt::Felt; +use num_traits::{One, Zero}; + +use crate::{ + hint_processor::hint_processor_definition::HintReference, + serde::deserialize_program::ApTracking, + vm::{errors::hint_errors::HintError, vm_core::VirtualMachine}, +}; + +use super::hint_utils::{get_integer_from_var_name, insert_value_into_ap}; + +// Implements hint: "memory[ap] = to_felt_or_relocatable(ids.n >= 10)" +pub fn n_more_than_10( + vm: &mut VirtualMachine, + ids_data: &HashMap, + ap_tracking: &ApTracking, +) -> Result<(), HintError> { + let n = get_integer_from_var_name("n", vm, ids_data, ap_tracking)?; + + let value = if n.as_ref() >= &Felt::from(10) { + Felt::one() + } else { + Felt::zero() + }; + insert_value_into_ap(vm, value) +} + +// Implements hint: "memory[ap] = to_felt_or_relocatable(ids.n >= 2)" +pub fn n_more_than_2( + vm: &mut VirtualMachine, + ids_data: &HashMap, + ap_tracking: &ApTracking, +) -> Result<(), HintError> { + let n = get_integer_from_var_name("n", vm, ids_data, ap_tracking)?; + + let value = if n.as_ref() >= &Felt::from(2) { + Felt::one() + } else { + Felt::zero() + }; + insert_value_into_ap(vm, value) +} From daa97dc3c0030b70347c79f7f365e5e2c73413e9 Mon Sep 17 00:00:00 2001 From: Federica Date: Wed, 8 Mar 2023 10:37:46 -0300 Subject: [PATCH 30/39] Add tests for new hint --- .../builtin_hint_processor/poseidon_utils.rs | 71 +++++++++++++++++++ 1 file changed, 71 insertions(+) diff --git a/src/hint_processor/builtin_hint_processor/poseidon_utils.rs b/src/hint_processor/builtin_hint_processor/poseidon_utils.rs index afd4849a50..56ea5adbbd 100644 --- a/src/hint_processor/builtin_hint_processor/poseidon_utils.rs +++ b/src/hint_processor/builtin_hint_processor/poseidon_utils.rs @@ -42,3 +42,74 @@ pub fn n_more_than_2( }; insert_value_into_ap(vm, value) } + +#[cfg(test)] +mod tests { + use crate::any_box; + use crate::hint_processor::builtin_hint_processor::builtin_hint_processor_definition::BuiltinHintProcessor; + use crate::hint_processor::builtin_hint_processor::builtin_hint_processor_definition::HintProcessorData; + use crate::hint_processor::builtin_hint_processor::poseidon_utils::HashMap; + use crate::hint_processor::hint_processor_definition::HintProcessor; + use crate::hint_processor::hint_processor_definition::HintReference; + use crate::types::exec_scope::ExecutionScopes; + use crate::types::relocatable::MaybeRelocatable; + use crate::vm::errors::memory_errors::MemoryError; + use crate::vm::vm_core::VirtualMachine; + use crate::vm::vm_memory::memory::Memory; + use crate::vm::vm_memory::memory_segments::MemorySegmentManager; + use crate::{hint_processor::builtin_hint_processor::hint_code, utils::test_utils::*}; + use assert_matches::assert_matches; + use std::any::Any; + + #[test] + fn run_n_more_than_10_true() { + let hint_code = hint_code::NONDET_N_MORE_THAN_10; + let mut vm = vm!(); + vm.set_ap(3); + vm.segments = segments![((1, 0), 21)]; + vm.set_fp(1); + let ids_data = ids_data!("n"); + assert_matches!(run_hint!(vm, ids_data, hint_code), Ok(())); + //Check hint memory inserts + check_memory![vm.segments.memory, ((1, 3), 1)]; + } + + #[test] + fn run_n_more_than_10_false() { + let hint_code = hint_code::NONDET_N_MORE_THAN_10; + let mut vm = vm!(); + vm.set_ap(3); + vm.segments = segments![((1, 0), 9)]; + vm.set_fp(1); + let ids_data = ids_data!("n"); + assert_matches!(run_hint!(vm, ids_data, hint_code), Ok(())); + //Check hint memory inserts + check_memory![vm.segments.memory, ((1, 3), 0)]; + } + + #[test] + fn run_n_more_than_2_true() { + let hint_code = hint_code::NONDET_N_MORE_THAN_2; + let mut vm = vm!(); + vm.set_ap(3); + vm.segments = segments![((1, 0), 6)]; + vm.set_fp(1); + let ids_data = ids_data!("n"); + assert_matches!(run_hint!(vm, ids_data, hint_code), Ok(())); + //Check hint memory inserts + check_memory![vm.segments.memory, ((1, 3), 1)]; + } + + #[test] + fn run_n_more_than_2_false() { + let hint_code = hint_code::NONDET_N_MORE_THAN_2; + let mut vm = vm!(); + vm.set_ap(3); + vm.segments = segments![((1, 0), 1)]; + vm.set_fp(1); + let ids_data = ids_data!("n"); + assert_matches!(run_hint!(vm, ids_data, hint_code), Ok(())); + //Check hint memory inserts + check_memory![vm.segments.memory, ((1, 3), 0)]; + } +} From ba970bf9b0ce4f3552c9406a000f4ebf921aa3d6 Mon Sep 17 00:00:00 2001 From: Federica Date: Wed, 8 Mar 2023 10:39:15 -0300 Subject: [PATCH 31/39] Clippy --- .../runners/builtin_runner/poseidon_utils/poseidon_constants.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vm/runners/builtin_runner/poseidon_utils/poseidon_constants.rs b/src/vm/runners/builtin_runner/poseidon_utils/poseidon_constants.rs index ce1c81d28f..b28788a968 100644 --- a/src/vm/runners/builtin_runner/poseidon_utils/poseidon_constants.rs +++ b/src/vm/runners/builtin_runner/poseidon_utils/poseidon_constants.rs @@ -971,7 +971,7 @@ mod test { ]; #[cfg(test)] - mod test { + mod tests { use super::*; #[test] From b4e1ccc4f2e86e6a66ab255d0cfd7560106de03f Mon Sep 17 00:00:00 2001 From: jrigada Date: Wed, 8 Mar 2023 12:25:34 -0300 Subject: [PATCH 32/39] allow dead code in default poseidon --- src/types/instance_definitions/poseidon_instance_def.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/types/instance_definitions/poseidon_instance_def.rs b/src/types/instance_definitions/poseidon_instance_def.rs index 7c57ae6e15..855f03a040 100644 --- a/src/types/instance_definitions/poseidon_instance_def.rs +++ b/src/types/instance_definitions/poseidon_instance_def.rs @@ -7,6 +7,7 @@ pub(crate) struct PoseidonInstanceDef { } impl PoseidonInstanceDef { + #[allow(dead_code)] pub(crate) fn default() -> Self { PoseidonInstanceDef { ratio: 32 } } From 510e7727dea796b3dfc3e329349160b3ba07c8ab Mon Sep 17 00:00:00 2001 From: jrigada Date: Wed, 8 Mar 2023 13:19:41 -0300 Subject: [PATCH 33/39] remove wrong text --- .github/workflows/rust.yml | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml index 058bd11dd7..b289305082 100644 --- a/.github/workflows/rust.yml +++ b/.github/workflows/rust.yml @@ -33,11 +33,7 @@ jobs: uses: Swatinem/rust-cache@v2 - name: Install test dependencies - run: pip install ecdsa fastecdsa sympy cair"Gnark's Bug Bites Back: Why You Shouldn't Leave Your Node Unprotected in the Wild Blockchain Frontier" -"The Gnark Knight Rises: A Tale of Cryptographic Heroes and Villains" -"Blockchains and Breakdowns: The Risks of Gnark's Latest Bug" -"Cracking the Code: How We Uncovered Gnark's Vulnerability and Saved the Blockchain Universe" -"Gnark's Gaffe: Why Even Cryptography Can't Save You from a Good Ol' DDoS Attack"o-lang + run: pip install ecdsa fastecdsa sympy cair - uses: actions/checkout@v3 with: fetch-depth: 0 From 8fc78d75e5e850b8b0856e0441e01f4c09d260d0 Mon Sep 17 00:00:00 2001 From: Juan Rigada <62958725+Jrigada@users.noreply.github.com> Date: Fri, 10 Mar 2023 10:51:44 -0300 Subject: [PATCH 34/39] Update .github/workflows/rust.yml Co-authored-by: fmoletta <99273364+fmoletta@users.noreply.github.com> --- .github/workflows/rust.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml index b289305082..48e96fe5c8 100644 --- a/.github/workflows/rust.yml +++ b/.github/workflows/rust.yml @@ -33,7 +33,7 @@ jobs: uses: Swatinem/rust-cache@v2 - name: Install test dependencies - run: pip install ecdsa fastecdsa sympy cair + run: pip install ecdsa fastecdsa sympy cairo-lang - uses: actions/checkout@v3 with: fetch-depth: 0 From 4211b228ccc873e23e1fe9f364f3454dc5cc1f41 Mon Sep 17 00:00:00 2001 From: Juan Rigada <62958725+Jrigada@users.noreply.github.com> Date: Fri, 10 Mar 2023 10:51:55 -0300 Subject: [PATCH 35/39] Update src/types/instance_definitions/poseidon_instance_def.rs Co-authored-by: fmoletta <99273364+fmoletta@users.noreply.github.com> --- src/types/instance_definitions/poseidon_instance_def.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/types/instance_definitions/poseidon_instance_def.rs b/src/types/instance_definitions/poseidon_instance_def.rs index 855f03a040..7f82195fdc 100644 --- a/src/types/instance_definitions/poseidon_instance_def.rs +++ b/src/types/instance_definitions/poseidon_instance_def.rs @@ -12,7 +12,7 @@ impl PoseidonInstanceDef { PoseidonInstanceDef { ratio: 32 } } - pub(crate) fn _new(ratio: u32) -> Self { + pub(crate) fn new(ratio: u32) -> Self { PoseidonInstanceDef { ratio } } } From 54fe3c3ca704d21227478a5282fbdaca0da5efa3 Mon Sep 17 00:00:00 2001 From: Juan Rigada <62958725+Jrigada@users.noreply.github.com> Date: Fri, 10 Mar 2023 10:52:04 -0300 Subject: [PATCH 36/39] Update src/types/instance_definitions/poseidon_instance_def.rs Co-authored-by: fmoletta <99273364+fmoletta@users.noreply.github.com> --- src/types/instance_definitions/poseidon_instance_def.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/types/instance_definitions/poseidon_instance_def.rs b/src/types/instance_definitions/poseidon_instance_def.rs index 7f82195fdc..5230964859 100644 --- a/src/types/instance_definitions/poseidon_instance_def.rs +++ b/src/types/instance_definitions/poseidon_instance_def.rs @@ -7,7 +7,6 @@ pub(crate) struct PoseidonInstanceDef { } impl PoseidonInstanceDef { - #[allow(dead_code)] pub(crate) fn default() -> Self { PoseidonInstanceDef { ratio: 32 } } From 5f7bd934a2be1f11032dd9ba4509b10b41f2fc60 Mon Sep 17 00:00:00 2001 From: Juan Rigada <62958725+Jrigada@users.noreply.github.com> Date: Fri, 10 Mar 2023 10:52:11 -0300 Subject: [PATCH 37/39] Update src/types/instance_definitions/builtins_instance_def.rs Co-authored-by: fmoletta <99273364+fmoletta@users.noreply.github.com> --- src/types/instance_definitions/builtins_instance_def.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/types/instance_definitions/builtins_instance_def.rs b/src/types/instance_definitions/builtins_instance_def.rs index 2790770231..15e7081c27 100644 --- a/src/types/instance_definitions/builtins_instance_def.rs +++ b/src/types/instance_definitions/builtins_instance_def.rs @@ -118,7 +118,7 @@ impl BuiltinsInstanceDef { bitwise: Some(BitwiseInstanceDef::new(16)), ec_op: Some(EcOpInstanceDef::new(1024)), keccak: Some(KeccakInstanceDef::new(2048, vec![200; 8])), - poseidon: Some(PoseidonInstanceDef { ratio: 256 }), + poseidon: Some(PoseidonInstanceDef::new(256)), } } From 88df85877c2abf8b439895d314e26c82da41a262 Mon Sep 17 00:00:00 2001 From: Juan Rigada <62958725+Jrigada@users.noreply.github.com> Date: Fri, 10 Mar 2023 10:52:18 -0300 Subject: [PATCH 38/39] Update src/types/instance_definitions/builtins_instance_def.rs Co-authored-by: fmoletta <99273364+fmoletta@users.noreply.github.com> --- src/types/instance_definitions/builtins_instance_def.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/types/instance_definitions/builtins_instance_def.rs b/src/types/instance_definitions/builtins_instance_def.rs index 15e7081c27..fd75fe64b3 100644 --- a/src/types/instance_definitions/builtins_instance_def.rs +++ b/src/types/instance_definitions/builtins_instance_def.rs @@ -79,7 +79,7 @@ impl BuiltinsInstanceDef { bitwise: Some(BitwiseInstanceDef::new(64)), ec_op: Some(EcOpInstanceDef::new(1024)), keccak: None, - poseidon: Some(PoseidonInstanceDef { ratio: 32 }), + poseidon: Some(PoseidonInstanceDef::default()), } } From 4c4131f801f3dd8d1193f74e54b7d771937245ed Mon Sep 17 00:00:00 2001 From: Juan Rigada <62958725+Jrigada@users.noreply.github.com> Date: Fri, 10 Mar 2023 10:52:25 -0300 Subject: [PATCH 39/39] Update src/types/instance_definitions/builtins_instance_def.rs Co-authored-by: fmoletta <99273364+fmoletta@users.noreply.github.com> --- src/types/instance_definitions/builtins_instance_def.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/types/instance_definitions/builtins_instance_def.rs b/src/types/instance_definitions/builtins_instance_def.rs index fd75fe64b3..a0b121cb19 100644 --- a/src/types/instance_definitions/builtins_instance_def.rs +++ b/src/types/instance_definitions/builtins_instance_def.rs @@ -92,7 +92,7 @@ impl BuiltinsInstanceDef { bitwise: Some(BitwiseInstanceDef::new(64)), ec_op: Some(EcOpInstanceDef::new(1024)), keccak: Some(KeccakInstanceDef::new(2048, vec![200; 8])), - poseidon: Some(PoseidonInstanceDef { ratio: 32 }), + poseidon: Some(PoseidonInstanceDef::default()), } }