diff --git a/CHANGELOG.md b/CHANGELOG.md index 79f5cb99b9..84f10e6eba 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,9 @@ #### Upcoming Changes +* Optimizations for hash builtin [#1029](https://github.com/lambdaclass/cairo-rs/pull/1029): + * Track the verified addresses by offset in a `Vec` rather than storing the address in a `Vec` + * Add missing hint on vrf.json lib [#1000](https://github.com/lambdaclass/cairo-rs/pull/1000): `BuiltinHintProcessor` now supports the following hint: diff --git a/src/vm/runners/builtin_runner/hash.rs b/src/vm/runners/builtin_runner/hash.rs index 0d75f4e12f..639a9568e3 100644 --- a/src/vm/runners/builtin_runner/hash.rs +++ b/src/vm/runners/builtin_runner/hash.rs @@ -24,7 +24,9 @@ pub struct HashBuiltinRunner { pub(crate) instances_per_component: u32, // This act as a cache to optimize calls to deduce_memory_cell // Therefore need interior mutability - pub(self) verified_addresses: RefCell>, + // 1 at position 'n' means offset 'n' relative to base pointer + // has been verified + pub(self) verified_addresses: RefCell>, } impl HashBuiltinRunner { @@ -72,7 +74,11 @@ impl HashBuiltinRunner { .offset .mod_floor(&(self.cells_per_instance as usize)) != 2 - || self.verified_addresses.borrow().contains(&address) + || *self + .verified_addresses + .borrow() + .get(address.offset) + .unwrap_or(&false) { return Ok(None); }; @@ -89,7 +95,12 @@ impl HashBuiltinRunner { num_a.as_ref().map(|x| x.as_ref()), num_b.as_ref().map(|x| x.as_ref()), ) { - self.verified_addresses.borrow_mut().push(address); + if self.verified_addresses.borrow().len() <= address.offset { + self.verified_addresses + .borrow_mut() + .resize(address.offset + 1, false); + } + self.verified_addresses.borrow_mut()[address.offset] = true; //Convert MaybeRelocatable to FieldElement let a_string = num_a.to_str_radix(10); @@ -404,7 +415,7 @@ mod tests { ); assert_eq!( builtin.verified_addresses.into_inner(), - vec![Relocatable::from((0, 5))] + vec![false, false, false, false, false, true], ); } @@ -431,7 +442,7 @@ mod tests { fn deduce_memory_cell_pedersen_for_preset_memory_already_computed() { let memory = memory![((0, 3), 32), ((0, 4), 72), ((0, 5), 0)]; let mut builtin = HashBuiltinRunner::new(Some(8), true); - builtin.verified_addresses = RefCell::new(vec![Relocatable::from((0, 5))]); + builtin.verified_addresses = RefCell::new(vec![false, false, false, false, false, true]); let result = builtin.deduce_memory_cell(Relocatable::from((0, 5)), &memory); assert_eq!(result, Ok(None)); }