@@ -442,16 +442,21 @@ pub fn estimate_casm_poseidon_hash_computation_resources(
442
442
}
443
443
444
444
/// Cost to hash a single flat segment of `len` felts.
445
- fn leaf_cost ( len : usize ) -> ( ExecutionResources , usize ) {
445
+ fn leaf_cost ( len : usize , resources : & mut ExecutionResources , blake_opcodes : & mut usize ) {
446
446
// All `len` inputs treated as “big” felts; no small-felt optimization here.
447
- cost_of_encode_felt252_data_and_calc_blake_hash ( len, 0 )
447
+ let ( added_resources, added_blake_opcode_count) =
448
+ cost_of_encode_felt252_data_and_calc_blake_hash ( len, 0 ) ;
449
+ * resources += & added_resources;
450
+ * blake_opcodes += added_blake_opcode_count;
448
451
}
449
452
450
453
/// Cost to hash a multi-segment contract:
451
- fn node_cost ( segs : & [ NestedIntList ] ) -> ( ExecutionResources , usize ) {
454
+ fn node_cost (
455
+ segs : & [ NestedIntList ] ,
456
+ resources : & mut ExecutionResources ,
457
+ blake_opcodes : & mut usize ,
458
+ ) {
452
459
// TODO(AvivG): Add base estimation for node.
453
- let mut resources = ExecutionResources :: default ( ) ;
454
- let mut blake_opcodes = 0 ;
455
460
456
461
// TODO(AvivG): Add base estimation of each segment. Could this be part of 'leaf_cost'?
457
462
let segment_overhead = ExecutionResources :: default ( ) ;
@@ -460,10 +465,8 @@ fn node_cost(segs: &[NestedIntList]) -> (ExecutionResources, usize) {
460
465
for seg in segs {
461
466
match seg {
462
467
NestedIntList :: Leaf ( len) => {
463
- let ( leaf_resources, blake_opcode_count) = leaf_cost ( * len) ;
464
- resources += & leaf_resources;
465
- resources += & segment_overhead;
466
- blake_opcodes += blake_opcode_count;
468
+ leaf_cost ( * len, resources, blake_opcodes) ;
469
+ * resources += & segment_overhead;
467
470
}
468
471
_ => panic ! ( "Estimating hash cost only supports at most one level of segmentation." ) ,
469
472
}
@@ -473,10 +476,8 @@ fn node_cost(segs: &[NestedIntList]) -> (ExecutionResources, usize) {
473
476
// and one segment length (“small” felt) per segment.
474
477
let ( node_hash_resources, node_blake_opcode_count) =
475
478
cost_of_encode_felt252_data_and_calc_blake_hash ( segs. len ( ) , segs. len ( ) ) ;
476
- resources += & node_hash_resources;
477
- blake_opcodes += node_blake_opcode_count;
478
-
479
- ( resources, blake_opcodes)
479
+ * resources += & node_hash_resources;
480
+ * blake_opcodes += node_blake_opcode_count;
480
481
}
481
482
482
483
/// Estimates the VM resources to compute the CASM Blake hash for a Cairo-1 contract.
@@ -530,15 +531,12 @@ pub fn estimate_casm_blake_hash_computation_resources_inner(
530
531
let mut blake_opcodes = 0 ;
531
532
532
533
// Add leaf vs node cost
533
- let ( bytecode_resources , bytecode_blake_opcode_count ) = match bytecode_segment_lengths {
534
+ match bytecode_segment_lengths {
534
535
// Single-segment contract (e.g., older Sierra contracts).
535
- NestedIntList :: Leaf ( len) => leaf_cost ( * len) ,
536
- NestedIntList :: Node ( segs) => node_cost ( segs) ,
536
+ NestedIntList :: Leaf ( len) => leaf_cost ( * len, & mut resources , & mut blake_opcodes ) ,
537
+ NestedIntList :: Node ( segs) => node_cost ( segs, & mut resources , & mut blake_opcodes ) ,
537
538
} ;
538
539
539
- resources += & bytecode_resources;
540
- blake_opcodes += bytecode_blake_opcode_count;
541
-
542
540
( resources, blake_opcodes)
543
541
}
544
542
0 commit comments