Skip to content

Commit

Permalink
Merge branch 'dynamic-layout' into dynamic-layout-2
Browse files Browse the repository at this point in the history
  • Loading branch information
JulianGCalderon committed Sep 18, 2024
2 parents 351a9cd + cdab848 commit dfa84ac
Show file tree
Hide file tree
Showing 4 changed files with 197 additions and 127 deletions.
39 changes: 39 additions & 0 deletions .github/workflows/rust.yml
Original file line number Diff line number Diff line change
Expand Up @@ -725,6 +725,45 @@ jobs:
- name: Run script
run: ./vm/src/tests/compare_factorial_outputs_all_layouts.sh

compare-outputs-dynamic-layout:
name: Compare factorial outputs for all layouts
needs: [ build-programs, build-release ]
runs-on: ubuntu-22.04
steps:
- name: Checkout
uses: actions/checkout@v3

- name: Python3 Build
uses: actions/setup-python@v4
with:
python-version: '3.9'
cache: 'pip'

- name: Install cairo-lang and deps
run: pip install -r requirements.txt

- name: Fetch release binary
uses: actions/cache/restore@v3
with:
key: cli-bin-rel-${{ github.sha }}
path: target/release/cairo-vm-cli
fail-on-cache-miss: true

- uses: actions/download-artifact@master
with:
name: proof_programs
path: cairo_programs/proof_programs/

- name: Fetch programs
uses: actions/cache/restore@v3
with:
path: ${{ env.CAIRO_PROGRAMS_PATH }}
key: cairo_proof_programs-cache-${{ hashFiles('cairo_programs/**/*.cairo', 'examples/wasm-demo/src/array_sum.cairo') }}
fail-on-cache-miss: true

- name: Run script
run: ./vm/src/tests/compare_outputs_dynamic_layout.sh

compare-run-from-cairo-pie-all-outputs:
name: Compare all outputs from running Cairo PIEs
needs: [ build-programs, build-release, run-cairo-release ]
Expand Down
23 changes: 0 additions & 23 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -123,26 +123,6 @@ $(BAD_TEST_DIR)/%.json: $(BAD_TEST_DIR)/%.cairo
$(PRINT_TEST_DIR)/%.json: $(PRINT_TEST_DIR)/%.cairo
cairo-compile $< --output $@

# =======================
# Run with dynamic layout
# =======================

CAIRO_DYN_MEM_PROOF:=$(patsubst $(TEST_PROOF_DIR)/%.json, $(TEST_PROOF_DIR)/%.dyn.memory, $(COMPILED_PROOF_TESTS))
CAIRO_DYN_TRACE_PROOF:=$(patsubst $(TEST_PROOF_DIR)/%.json, $(TEST_PROOF_DIR)/%.dyn.trace, $(COMPILED_PROOF_TESTS))
CAIRO_DYN_AIR_PUBLIC_INPUT:=$(patsubst $(TEST_PROOF_DIR)/%.json, $(TEST_PROOF_DIR)/%.dyn.air_public_input, $(COMPILED_PROOF_TESTS))
CAIRO_DYN_AIR_PRIVATE_INPUT:=$(patsubst $(TEST_PROOF_DIR)/%.json, $(TEST_PROOF_DIR)/%.dyn.air_private_input, $(COMPILED_PROOF_TESTS))

CAIRO_DYN_RS_MEM_PROOF:=$(patsubst $(TEST_PROOF_DIR)/%.json, $(TEST_PROOF_DIR)/%.rs.dyn.memory, $(COMPILED_PROOF_TESTS))
CAIRO_DYN_RS_TRACE_PROOF:=$(patsubst $(TEST_PROOF_DIR)/%.json, $(TEST_PROOF_DIR)/%.rs.dyn.trace, $(COMPILED_PROOF_TESTS))
CAIRO_DYN_RS_AIR_PUBLIC_INPUT:=$(patsubst $(TEST_PROOF_DIR)/%.json, $(TEST_PROOF_DIR)/%.rs.dyn.air_public_input, $(COMPILED_PROOF_TESTS))
CAIRO_DYN_RS_AIR_PRIVATE_INPUT:=$(patsubst $(TEST_PROOF_DIR)/%.json, $(TEST_PROOF_DIR)/%.rs.dyn.air_private_input, $(COMPILED_PROOF_TESTS))

$(TEST_PROOF_DIR)/%.rs.dyn.trace $(TEST_PROOF_DIR)/%.rs.dyn.memory $(TEST_PROOF_DIR)/%.rs.dyn.air_public_input $(TEST_PROOF_DIR)/%.rs.dyn.air_private_input: $(TEST_PROOF_DIR)/%.json $(RELBIN)
cargo run -p cairo-vm-cli --release -- --layout dynamic --proof_mode $< --trace_file $(@D)/$(*F).rs.dyn.trace --memory_file $(@D)/$(*F).rs.dyn.memory --air_public_input $(@D)/$(*F).rs.dyn.air_public_input --air_private_input $(@D)/$(*F).rs.dyn.air_private_input --cairo_layout_params_file cairo_layout_params_file.json

$(TEST_PROOF_DIR)/%.dyn.trace $(TEST_PROOF_DIR)/%.dyn.memory $(TEST_PROOF_DIR)/%.dyn.air_public_input $(TEST_PROOF_DIR)/%.dyn.air_private_input: $(TEST_PROOF_DIR)/%.json cairo_layout_params_file.json
cairo-run --layout dynamic --proof_mode --program $< --trace_file $(@D)/$(*F).dyn.trace --air_public_input $(@D)/$(*F).dyn.air_public_input --memory_file $(@D)/$(*F).dyn.memory --air_private_input $(@D)/$(*F).dyn.air_private_input --cairo_layout_params_file cairo_layout_params_file.json

# ======================
# Test Cairo 1 Contracts
# ======================
Expand Down Expand Up @@ -352,9 +332,6 @@ compare_pie: $(CAIRO_RS_PIE) $(CAIRO_PIE)
compare_all_pie_outputs: $(CAIRO_RS_PIE)
cd vm/src/tests; ./compare_all_pie_outputs.sh

compare_all_proof_dyn: $(COMPILED_DYN_PROOF_TESTS) $(CAIRO_DYN_RS_TRACE_PROOF) $(CAIRO_DYN_TRACE_PROOF) $(CAIRO_DYN_RS_MEM_PROOF) $(CAIRO_DYN_MEM_PROOF) $(CAIRO_DYN_RS_AIR_PUBLIC_INPUT) $(CAIRO_DYN_AIR_PUBLIC_INPUT) $(CAIRO_DYN_RS_AIR_PRIVATE_INPUT) $(CAIRO_DYN_AIR_PRIVATE_INPUT)
cd vm/src/tests; ./compare_vm_state_dyn.sh trace memory proof_mode air_public_input air_private_input

# Run with nightly enable the `doc_cfg` feature wich let us provide clear explaination about which parts of the code are behind a feature flag
docs:
RUSTDOCFLAGS="--cfg docsrs" cargo +nightly doc --verbose --release --locked --no-deps --all-features --open
Expand Down
158 changes: 158 additions & 0 deletions vm/src/tests/compare_outputs_dynamic_layout.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,158 @@
#!/usr/bin/env bash
#
# Compares programs with different dynamic layouts against cairo-lang

# Setup constants
COMPILED_PROGRAMS_DIR="cairo_programs/proof_programs"
TEMP_FOLDER=$(mktemp -d)

# Build temporary dynamic layout params files
cat <<EOF > "$TEMP_FOLDER/all_cairo.json"
{
"rc_units": 4,
"log_diluted_units_per_step": 4,
"cpu_component_step": 8,
"memory_units_per_step": 8,
"uses_pedersen_builtin": true,
"pedersen_ratio": 256,
"uses_range_check_builtin": true,
"range_check_ratio": 8,
"uses_ecdsa_builtin": true,
"ecdsa_ratio": 2048,
"uses_bitwise_builtin": true,
"bitwise_ratio": 16,
"uses_ec_op_builtin": true,
"ec_op_ratio": 1024,
"uses_keccak_builtin": true,
"keccak_ratio": 2048,
"uses_poseidon_builtin": true,
"poseidon_ratio": 256,
"uses_range_check96_builtin": true,
"range_check96_ratio": 8,
"range_check96_ratio_den": 1,
"uses_add_mod_builtin": true,
"add_mod_ratio": 128,
"add_mod_ratio_den": 1,
"uses_mul_mod_builtin": true,
"mul_mod_ratio": 256,
"mul_mod_ratio_den": 1
}
EOF
cat <<EOF > "$TEMP_FOLDER/double_all_cairo.json"
{
"rc_units": 8,
"log_diluted_units_per_step": 8,
"cpu_component_step": 16,
"memory_units_per_step": 16,
"uses_pedersen_builtin": true,
"pedersen_ratio": 512,
"uses_range_check_builtin": true,
"range_check_ratio": 16,
"uses_ecdsa_builtin": true,
"ecdsa_ratio": 4096,
"uses_bitwise_builtin": true,
"bitwise_ratio": 32,
"uses_ec_op_builtin": true,
"ec_op_ratio": 2048,
"uses_keccak_builtin": true,
"keccak_ratio": 4096,
"uses_poseidon_builtin": true,
"poseidon_ratio": 512,
"uses_range_check96_builtin": true,
"range_check96_ratio": 16,
"range_check96_ratio_den": 1,
"uses_add_mod_builtin": true,
"add_mod_ratio": 256,
"add_mod_ratio_den": 1,
"uses_mul_mod_builtin": true,
"mul_mod_ratio": 512,
"mul_mod_ratio_den": 1
}
EOF

# Build cases to execute
CASES=(
"factorial.json;all_cairo"
"fibonacci.json;all_cairo"
"factorial.json;double_all_cairo"
"fibonacci.json;double_all_cairo"
)

passed_tests=0
failed_tests=0
exit_code=0

for case in "${CASES[@]}"; do
IFS=";" read -r program layout <<< "$case"

full_program="$COMPILED_PROGRAMS_DIR/$program"
full_layout="$TEMP_FOLDER/$layout.json"

# Run cairo-vm
echo "Running cairo-vm with case: $case"
cargo run -p cairo-vm-cli --release -- "$full_program" \
--layout "dynamic" --cairo_layout_params_file "$full_layout" --proof_mode \
--trace_file program_rs.trace --memory_file program_rs.memory --air_public_input program_rs.air_public_input --air_private_input program_rs.air_private_input

# Run cairo-lang
echo "Running cairo-lang with case: $case"
cairo-run --program "$full_program" \
--layout "dynamic" --cairo_layout_params_file "$full_layout" --proof_mode \
--trace_file program_py.trace --memory_file program_py.memory --air_public_input program_py.air_public_input --air_private_input program_py.air_private_input

# Compare trace
echo "Running trace comparison for case: $case"
if ! diff -q program_rs.trace program_py.trace; then
echo "Trace differs for case: $case"
exit_code=1
failed_tests=$((failed_tests + 1))
else
passed_tests=$((passed_tests + 1))
fi

# Compare memory
echo "Running memory comparison for case: $case"
if ! ./vm/src/tests/memory_comparator.py program_rs.memory program_py.memory; then
echo "Memory differs for case: $case"
exit_code=1
failed_tests=$((failed_tests + 1))
else
passed_tests=$((passed_tests + 1))
fi

# Compare air public input
echo "Running air public input comparison for case: $case"
if ! ./vm/src/tests/air_public_input_comparator.py program_rs.air_public_input program_py.air_public_input; then
echo "Air public input differs for case: $case"
exit_code=1
failed_tests=$((failed_tests + 1))
else
passed_tests=$((passed_tests + 1))
fi

# Compare air private input
echo "Running air private input comparison for case: $case"
if ! ./vm/src/tests/air_private_input_comparator.py program_rs.air_private_input program_py.air_private_input; then
echo "Air private input differs for case: $case"
exit_code=1
failed_tests=$((failed_tests + 1))
else
passed_tests=$((passed_tests + 1))
fi

# Clean files generated by the script
echo "Cleaning files"
rm program_rs.*
rm program_py.*
done

if test $failed_tests != 0; then
echo "Comparisons: $failed_tests failed, $passed_tests passed, $((failed_tests + passed_tests)) total"
elif test $passed_tests = 0; then
echo "No tests ran!"
exit_code=2
else
echo "All $passed_tests tests passed; no discrepancies found"
fi

exit "${exit_code}"
104 changes: 0 additions & 104 deletions vm/src/tests/compare_vm_state_dyn.sh

This file was deleted.

0 comments on commit dfa84ac

Please sign in to comment.