Skip to content

Commit 31a05d9

Browse files
authored
perf: verified addresses for Pedersen as Vec<bool> (#1029)
The use of a `Vec<Relocatable>` was the major bottleneck for that builtin.
1 parent 0155288 commit 31a05d9

File tree

2 files changed

+19
-5
lines changed

2 files changed

+19
-5
lines changed

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@
22

33
#### Upcoming Changes
44

5+
* Optimizations for hash builtin [#1029](https://github.com/lambdaclass/cairo-rs/pull/1029):
6+
* Track the verified addresses by offset in a `Vec<bool>` rather than storing the address in a `Vec<Relocatable>`
7+
58
* Add missing hint on vrf.json lib [#1000](https://github.com/lambdaclass/cairo-rs/pull/1000):
69

710
`BuiltinHintProcessor` now supports the following hint:

src/vm/runners/builtin_runner/hash.rs

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,9 @@ pub struct HashBuiltinRunner {
2424
pub(crate) instances_per_component: u32,
2525
// This act as a cache to optimize calls to deduce_memory_cell
2626
// Therefore need interior mutability
27-
pub(self) verified_addresses: RefCell<Vec<Relocatable>>,
27+
// 1 at position 'n' means offset 'n' relative to base pointer
28+
// has been verified
29+
pub(self) verified_addresses: RefCell<Vec<bool>>,
2830
}
2931

3032
impl HashBuiltinRunner {
@@ -72,7 +74,11 @@ impl HashBuiltinRunner {
7274
.offset
7375
.mod_floor(&(self.cells_per_instance as usize))
7476
!= 2
75-
|| self.verified_addresses.borrow().contains(&address)
77+
|| *self
78+
.verified_addresses
79+
.borrow()
80+
.get(address.offset)
81+
.unwrap_or(&false)
7682
{
7783
return Ok(None);
7884
};
@@ -89,7 +95,12 @@ impl HashBuiltinRunner {
8995
num_a.as_ref().map(|x| x.as_ref()),
9096
num_b.as_ref().map(|x| x.as_ref()),
9197
) {
92-
self.verified_addresses.borrow_mut().push(address);
98+
if self.verified_addresses.borrow().len() <= address.offset {
99+
self.verified_addresses
100+
.borrow_mut()
101+
.resize(address.offset + 1, false);
102+
}
103+
self.verified_addresses.borrow_mut()[address.offset] = true;
93104

94105
//Convert MaybeRelocatable to FieldElement
95106
let a_string = num_a.to_str_radix(10);
@@ -404,7 +415,7 @@ mod tests {
404415
);
405416
assert_eq!(
406417
builtin.verified_addresses.into_inner(),
407-
vec![Relocatable::from((0, 5))]
418+
vec![false, false, false, false, false, true],
408419
);
409420
}
410421

@@ -431,7 +442,7 @@ mod tests {
431442
fn deduce_memory_cell_pedersen_for_preset_memory_already_computed() {
432443
let memory = memory![((0, 3), 32), ((0, 4), 72), ((0, 5), 0)];
433444
let mut builtin = HashBuiltinRunner::new(Some(8), true);
434-
builtin.verified_addresses = RefCell::new(vec![Relocatable::from((0, 5))]);
445+
builtin.verified_addresses = RefCell::new(vec![false, false, false, false, false, true]);
435446
let result = builtin.deduce_memory_cell(Relocatable::from((0, 5)), &memory);
436447
assert_eq!(result, Ok(None));
437448
}

0 commit comments

Comments
 (0)