Skip to content

Commit

Permalink
feat(hints): Implement NewHint#38 (lambdaclass#1036)
Browse files Browse the repository at this point in the history
* Add test

* Ignore builtin segments in get_memory_holes

* Improve test

* Add memory holes check for cairo_run_test tests

* Fix broken condition

* Make memory_holes check optional & customizable

* Fix bounds

* Add a test with deliberately created memory holes

* Fix test value

* Remove duplicated tests + add memory hole value to some tests

* Add memory holes value + remove duplicated tests + fix typo

* Fix test values

* Add changelog entry

* Link PR in Changelog

* Mark breaking change in changelog

* fmt

* Fix test value

* Fix codecov-patch diff

* Add hint code

* Add integration test

* Add untracked file

* Add changelog entry

* Rename hint

* Fix test

* Fix test

* Add hint code + hint impl + unit test

* fmt

* Add integration test

* Add changelog entry

* Remove indent from hint string

* Add wasm import
  • Loading branch information
fmoletta authored and kariy committed Jun 23, 2023
1 parent d806457 commit f103bc4
Show file tree
Hide file tree
Showing 5 changed files with 111 additions and 1 deletion.
17 changes: 17 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,23 @@

#### Upcoming Changes

* Implement hint on ec_recover.json whitelist [#1036](https://github.com/lambdaclass/cairo-rs/pull/1036):

`BuiltinHintProcessor` now supports the following hint:

```python

%{
from starkware.cairo.common.cairo_secp.secp_utils import pack
from starkware.python.math_utils import div_mod, safe_div

a = pack(ids.a, PRIME)
b = pack(ids.b, PRIME)
value = res = a - b
%}

```

* Implement hint on ec_recover.json whitelist [#1032](https://github.com/lambdaclass/cairo-rs/pull/1032):

`BuiltinHintProcessor` now supports the following hint:
Expand Down
23 changes: 23 additions & 0 deletions cairo_programs/ec_recover.cairo
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ func test_div_mod_n_packed_hint{range_check_ptr: felt}() {
tempvar n = BigInt3(177, 0, 0);
tempvar x = BigInt3(25, 0, 0);
tempvar s = BigInt3(5, 0, 0);

%{
from starkware.cairo.common.cairo_secp.secp_utils import pack
from starkware.python.math_utils import div_mod, safe_div
Expand All @@ -18,10 +19,32 @@ func test_div_mod_n_packed_hint{range_check_ptr: felt}() {

let (res) = nondet_bigint3();
assert res = BigInt3(5,0,0);

return();
}

func test_sub_a_b_hint{range_check_ptr: felt}() {

tempvar a = BigInt3(100, 0, 0);
tempvar b = BigInt3(25, 0, 0);

%{
from starkware.cairo.common.cairo_secp.secp_utils import pack
from starkware.python.math_utils import div_mod, safe_div

a = pack(ids.a, PRIME)
b = pack(ids.b, PRIME)
value = res = a - b
%}

let (res) = nondet_bigint3();
assert res = BigInt3(75,0,0);

return();
}

func main{range_check_ptr: felt}() {
test_div_mod_n_packed_hint();
test_sub_a_b_hint();
return();
}
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,7 @@ use felt::Felt252;
#[cfg(feature = "skip_next_instruction_hint")]
use crate::hint_processor::builtin_hint_processor::skip_next_instruction::skip_next_instruction;

use super::ec_recover::ec_recover_divmod_n_packed;
use super::ec_recover::{ec_recover_divmod_n_packed, ec_recover_sub_a_b};
use super::field_arithmetic::uint384_div;
use super::vrf::inv_mod_p_uint512::inv_mod_p_uint512;

Expand Down Expand Up @@ -592,6 +592,9 @@ impl HintProcessor for BuiltinHintProcessor {
&hint_data.ids_data,
&hint_data.ap_tracking,
),
hint_code::EC_RECOVER_SUB_A_B => {
ec_recover_sub_a_b(vm, exec_scopes, &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
59 changes: 59 additions & 0 deletions src/hint_processor/builtin_hint_processor/ec_recover.rs
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,31 @@ pub fn ec_recover_divmod_n_packed(
Ok(())
}

/* Implements Hint:
%{
from starkware.cairo.common.cairo_secp.secp_utils import pack
from starkware.python.math_utils import div_mod, safe_div
a = pack(ids.x, PRIME)
b = pack(ids.s, PRIME)
value = res = a - b
%}
*/
pub fn ec_recover_sub_a_b(
vm: &mut VirtualMachine,
exec_scopes: &mut ExecutionScopes,
ids_data: &HashMap<String, HintReference>,
ap_tracking: &ApTracking,
) -> Result<(), HintError> {
let a = pack(BigInt3::from_var_name("a", vm, ids_data, ap_tracking)?);
let b = pack(BigInt3::from_var_name("b", vm, ids_data, ap_tracking)?);

let value = a - b;
exec_scopes.insert_value("value", value.clone());
exec_scopes.insert_value("res", value);
Ok(())
}

#[cfg(test)]
mod tests {
use num_bigint::BigInt;
Expand Down Expand Up @@ -99,4 +124,38 @@ mod tests {
[("value", BigInt::from(5)), ("res", BigInt::from(5))]
);
}

#[test]
#[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)]
fn run_ec_recover_sub_a_b_ok() {
let mut vm = vm!();
let mut exec_scopes = ExecutionScopes::new();

vm.run_context.fp = 8;
let ids_data = non_continuous_ids_data![("a", -8), ("b", -5)];

vm.segments = segments![
//a
((1, 0), 100),
((1, 1), 0),
((1, 2), 0),
//b
((1, 3), 25),
((1, 4), 0),
((1, 5), 0),
];

assert!(run_hint!(
vm,
ids_data,
hint_code::EC_RECOVER_SUB_A_B,
&mut exec_scopes
)
.is_ok());

check_scope!(
&exec_scopes,
[("value", BigInt::from(75)), ("res", BigInt::from(75))]
);
}
}
8 changes: 8 additions & 0 deletions src/hint_processor/builtin_hint_processor/hint_code.rs
Original file line number Diff line number Diff line change
Expand Up @@ -987,5 +987,13 @@ N = pack(ids.n, PRIME)
x = pack(ids.x, PRIME) % N
s = pack(ids.s, PRIME) % N
value = res = div_mod(x, s, N)"#;

pub const EC_RECOVER_SUB_A_B: &str = r#"from starkware.cairo.common.cairo_secp.secp_utils import pack
from starkware.python.math_utils import div_mod, safe_div
a = pack(ids.a, PRIME)
b = pack(ids.b, PRIME)
value = res = a - b"#;

#[cfg(feature = "skip_next_instruction_hint")]
pub const SKIP_NEXT_INSTRUCTION: &str = "skip_next_instruction()";

0 comments on commit f103bc4

Please sign in to comment.