Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Update layouts to cairo-lang 0.11 release #874

Merged
merged 43 commits into from
Mar 10, 2023
Merged
Show file tree
Hide file tree
Changes from 34 commits
Commits
Show all changes
43 commits
Select commit Hold shift + click to select a range
aba5676
update layouts to cairo-lang 0.11 release
Jrigada Mar 3, 2023
72eed98
update layout all
Jrigada Mar 3, 2023
cee5613
update benches and makefile
Jrigada Mar 3, 2023
f4bdd25
Add instance def
fmoletta Mar 3, 2023
d8c1158
Add file
fmoletta Mar 3, 2023
f481b3d
Add poseidon instance def to builtin instance def
fmoletta Mar 3, 2023
835d35c
Add Poseidon to BuiltinRunners
fmoletta Mar 3, 2023
b601a91
Add simple tests program
fmoletta Mar 6, 2023
2a9d2dd
Prevent poseidon from being rejected by deserialize
fmoletta Mar 6, 2023
8dbfac7
Use modified version of starknet-crypto poseidon hash (need permute f…
fmoletta Mar 6, 2023
07f8cc6
Add poseidon builtin impl + remove unreleased AddAssign usage
fmoletta Mar 6, 2023
376ba70
Fix EOF
fmoletta Mar 6, 2023
559e5aa
Save a step
fmoletta Mar 6, 2023
4c82b4e
Add comment before unwrap
fmoletta Mar 6, 2023
1ff1870
Clippy
fmoletta Mar 6, 2023
8f89d74
Reorder files
fmoletta Mar 6, 2023
95f5111
reset run_benchmark script
Jrigada Mar 6, 2023
df4b53c
Add comment
fmoletta Mar 6, 2023
28a8ea7
Use constants for cells
fmoletta Mar 6, 2023
25e3d17
Add more test program
fmoletta Mar 6, 2023
c7500fe
Add integration tests
fmoletta Mar 6, 2023
152d5e4
test constant creation doesnt panic
fmoletta Mar 6, 2023
feee06c
Add tests
fmoletta Mar 6, 2023
92c4c58
Fix failling tests
fmoletta Mar 7, 2023
691d5d1
Use final values for POSEIDON_COMP_CONSTANTS and move calculation to …
fmoletta Mar 7, 2023
60c493d
typo
fmoletta Mar 7, 2023
cef4153
Merge branch 'main' of github.com:lambdaclass/cairo-rs into poseidon-…
fmoletta Mar 7, 2023
a9e0051
Solve post-merge conflicts
fmoletta Mar 7, 2023
240c6cc
Implement poseidon hints
fmoletta Mar 7, 2023
38c1241
Add file
fmoletta Mar 7, 2023
daa97dc
Add tests for new hint
fmoletta Mar 8, 2023
ba970bf
Clippy
fmoletta Mar 8, 2023
0cb6783
merge with poseidon
Jrigada Mar 8, 2023
b4e1ccc
allow dead code in default poseidon
Jrigada Mar 8, 2023
510e772
remove wrong text
Jrigada Mar 8, 2023
8fc78d7
Update .github/workflows/rust.yml
Jrigada Mar 10, 2023
4211b22
Update src/types/instance_definitions/poseidon_instance_def.rs
Jrigada Mar 10, 2023
54fe3c3
Update src/types/instance_definitions/poseidon_instance_def.rs
Jrigada Mar 10, 2023
5f7bd93
Update src/types/instance_definitions/builtins_instance_def.rs
Jrigada Mar 10, 2023
88df858
Update src/types/instance_definitions/builtins_instance_def.rs
Jrigada Mar 10, 2023
4c4131f
Update src/types/instance_definitions/builtins_instance_def.rs
Jrigada Mar 10, 2023
4c88101
merge witn 0.11
Jrigada Mar 10, 2023
4a486fe
Merge branch '0.11' into changes-layout-cairo-lang-0.11
Jrigada Mar 10, 2023
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion .github/workflows/rust.yml
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,11 @@ jobs:
uses: Swatinem/rust-cache@v2

- name: Install test dependencies
run: pip install ecdsa fastecdsa sympy cairo-lang
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
Oppen marked this conversation as resolved.
Show resolved Hide resolved
- uses: actions/checkout@v3
with:
fetch-depth: 0
Expand Down
8 changes: 4 additions & 4 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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 $@
Expand Down
6 changes: 3 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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).

Expand All @@ -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

Expand All @@ -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();

Expand Down
2 changes: 1 addition & 1 deletion bench/criterion_benchmark.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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() {
Expand Down
2 changes: 1 addition & 1 deletion bench/iai_benchmark.rs
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ macro_rules! iai_bench_expand_prog {
($val: ident) => {
fn $val() -> Result<CairoRunner, CairoRunError> {
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();
Expand Down
6 changes: 3 additions & 3 deletions bench/run_benchmarks.sh
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ for file in $(ls $tests_path | grep .cairo | sed -E 's/\.cairo//'); do
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"
-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
13 changes: 13 additions & 0 deletions cairo_programs/poseidon_builtin.cairo
Original file line number Diff line number Diff line change
@@ -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 ();
}
24 changes: 24 additions & 0 deletions cairo_programs/poseidon_hash.cairo
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
%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;
// 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();
}
2 changes: 1 addition & 1 deletion custom_hint_example/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ fn main() {
"main",
false,
false,
"all",
"all_cairo",
false,
&mut hint_processor,
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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},
Expand Down Expand Up @@ -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())),
Expand Down
3 changes: 3 additions & 0 deletions src/hint_processor/builtin_hint_processor/hint_code.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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()";
1 change: 1 addition & 0 deletions src/hint_processor/builtin_hint_processor/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
115 changes: 115 additions & 0 deletions src/hint_processor/builtin_hint_processor/poseidon_utils.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,115 @@
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<String, HintReference>,
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<String, HintReference>,
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)
}

#[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)];
}
}
17 changes: 13 additions & 4 deletions src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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")),
}
}
Expand Down Expand Up @@ -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 {
Expand Down
5 changes: 4 additions & 1 deletion src/serde/deserialize_program.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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};
Expand All @@ -26,6 +27,7 @@ pub enum BuiltinName {
keccak,
bitwise,
ec_op,
poseidon,
}

impl BuiltinName {
Expand All @@ -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,
}
}
}
Expand Down
Loading