Skip to content
This repository was archived by the owner on Jul 22, 2024. It is now read-only.

Commit 5b9db9c

Browse files
authored
Save SierraProgram + ContractEntryPoints instead of SierraContractClass in CompiledProgram (#1112)
* Save Program + EntryPoints instead of ContractClass * clippy
1 parent 2112429 commit 5b9db9c

File tree

5 files changed

+66
-39
lines changed

5 files changed

+66
-39
lines changed

src/execution/execution_entry_point.rs

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,9 @@ use crate::{
2626
validate_contract_deployed, Address,
2727
},
2828
};
29+
use cairo_lang_sierra::program::Program as SierraProgram;
2930
use cairo_lang_starknet::casm_contract_class::{CasmContractClass, CasmContractEntryPoint};
31+
use cairo_lang_starknet::contract_class::ContractEntryPoints;
3032
use cairo_vm::{
3133
felt::Felt252,
3234
types::{
@@ -164,12 +166,12 @@ impl ExecutionEntryPoint {
164166
}
165167
}
166168
}
167-
CompiledClass::Sierra(sierra_contract_class) => {
169+
CompiledClass::Sierra(sierra_program_and_entrypoints) => {
168170
let mut transactional_state = state.create_transactional();
169171

170172
match self.native_execute(
171173
&mut transactional_state,
172-
sierra_contract_class,
174+
sierra_program_and_entrypoints,
173175
tx_execution_context,
174176
block_context,
175177
) {
@@ -622,7 +624,7 @@ impl ExecutionEntryPoint {
622624
fn native_execute<S: StateReader>(
623625
&self,
624626
_state: &mut CachedState<S>,
625-
_contract_class: Arc<cairo_lang_starknet::contract_class::ContractClass>,
627+
_sierra_program_and_entrypoints: Arc<(SierraProgram, ContractEntryPoints)>,
626628
_tx_execution_context: &mut TransactionExecutionContext,
627629
_block_context: &BlockContext,
628630
) -> Result<CallInfo, TransactionError> {
@@ -636,7 +638,7 @@ impl ExecutionEntryPoint {
636638
fn native_execute<S: StateReader>(
637639
&self,
638640
state: &mut CachedState<S>,
639-
contract_class: Arc<cairo_lang_starknet::contract_class::ContractClass>,
641+
sierra_program_and_entrypoints: Arc<(SierraProgram, ContractEntryPoints)>,
640642
tx_execution_context: &TransactionExecutionContext,
641643
block_context: &BlockContext,
642644
) -> Result<CallInfo, TransactionError> {
@@ -647,34 +649,32 @@ impl ExecutionEntryPoint {
647649
use serde_json::json;
648650

649651
use crate::syscalls::business_logic_syscall_handler::SYSCALL_BASE;
652+
let sierra_program = &sierra_program_and_entrypoints.0;
653+
let contract_entrypoints = &sierra_program_and_entrypoints.1;
650654

651655
let entry_point = match self.entry_point_type {
652-
EntryPointType::External => contract_class
653-
.entry_points_by_type
656+
EntryPointType::External => contract_entrypoints
654657
.external
655658
.iter()
656659
.find(|entry_point| entry_point.selector == self.entry_point_selector.to_biguint())
657660
.unwrap(),
658-
EntryPointType::Constructor => contract_class
659-
.entry_points_by_type
661+
EntryPointType::Constructor => contract_entrypoints
660662
.constructor
661663
.iter()
662664
.find(|entry_point| entry_point.selector == self.entry_point_selector.to_biguint())
663665
.unwrap(),
664-
EntryPointType::L1Handler => contract_class
665-
.entry_points_by_type
666+
EntryPointType::L1Handler => contract_entrypoints
666667
.l1_handler
667668
.iter()
668669
.find(|entry_point| entry_point.selector == self.entry_point_selector.to_biguint())
669670
.unwrap(),
670671
};
671672

672-
let sierra_program = contract_class.extract_sierra_program().unwrap();
673673
let program_registry: ProgramRegistry<CoreType, CoreLibfunc> =
674-
ProgramRegistry::new(&sierra_program).unwrap();
674+
ProgramRegistry::new(sierra_program).unwrap();
675675

676676
let native_context = NativeContext::new();
677-
let mut native_program = native_context.compile(&sierra_program).unwrap();
677+
let mut native_program = native_context.compile(sierra_program).unwrap();
678678
let contract_storage_state =
679679
ContractStorageState::new(state, self.contract_address.clone());
680680

src/services/api/contract_classes/compiled_class.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ use crate::services::api::contract_classes::deprecated_contract_class::AbiType;
88
use crate::{ContractEntryPoint, EntryPointType};
99

1010
use super::deprecated_contract_class::ContractClass;
11+
use cairo_lang_sierra::program::Program as SierraProgram;
1112
use cairo_lang_starknet::abi::Contract;
1213
use cairo_lang_starknet::casm_contract_class::CasmContractClass;
1314
use cairo_lang_starknet::contract_class::{
@@ -24,7 +25,7 @@ use starknet::core::types::ContractClass::{Legacy, Sierra};
2425
pub enum CompiledClass {
2526
Deprecated(Arc<ContractClass>),
2627
Casm(Arc<CasmContractClass>),
27-
Sierra(Arc<SierraContractClass>),
28+
Sierra(Arc<(SierraProgram, ContractEntryPoints)>),
2829
}
2930

3031
impl TryInto<CasmContractClass> for CompiledClass {

src/state/cached_state.rs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,6 @@ use std::{
2020
sync::Arc,
2121
};
2222

23-
pub type SierraProgramCache =
24-
HashMap<ClassHash, cairo_lang_starknet::contract_class::ContractClass>;
2523
pub type ContractClassCache = HashMap<ClassHash, CompiledClass>;
2624

2725
pub const UNINITIALIZED_CLASS_HASH: &ClassHash = &[0u8; 32];

src/syscalls/native_syscall_handler.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -565,7 +565,9 @@ where
565565
.ok_or(ContractClassError::NoneEntryPointType)?
566566
.is_empty()),
567567
CompiledClass::Casm(class) => Ok(class.entry_points_by_type.constructor.is_empty()),
568-
CompiledClass::Sierra(class) => Ok(class.entry_points_by_type.constructor.is_empty()),
568+
CompiledClass::Sierra(sierra_program_and_entrypoints) => {
569+
Ok(sierra_program_and_entrypoints.1.constructor.is_empty())
570+
}
569571
}
570572
}
571573
}

tests/cairo_native.rs

Lines changed: 48 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
use crate::CallType::Call;
44
use cairo_lang_starknet::casm_contract_class::CasmContractEntryPoints;
5+
use cairo_lang_starknet::contract_class::ContractClass;
56
use cairo_lang_starknet::contract_class::ContractEntryPoints;
67
use cairo_vm::felt::Felt252;
78
use num_bigint::BigUint;
@@ -27,6 +28,19 @@ use std::collections::HashMap;
2728
use std::collections::HashSet;
2829
use std::sync::Arc;
2930

31+
fn insert_sierra_class_into_cache(
32+
contract_class_cache: &mut HashMap<ClassHash, CompiledClass>,
33+
class_hash: ClassHash,
34+
sierra_class: ContractClass,
35+
) {
36+
let sierra_program = sierra_class.extract_sierra_program().unwrap();
37+
let entry_points = sierra_class.entry_points_by_type;
38+
contract_class_cache.insert(
39+
class_hash,
40+
CompiledClass::Sierra(Arc::new((sierra_program, entry_points))),
41+
);
42+
}
43+
3044
#[test]
3145
fn integration_test_erc20() {
3246
let sierra_contract_class: cairo_lang_starknet::contract_class::ContractClass =
@@ -54,9 +68,10 @@ fn integration_test_erc20() {
5468

5569
let caller_address = Address(123456789.into());
5670

57-
contract_class_cache.insert(
71+
insert_sierra_class_into_cache(
72+
&mut contract_class_cache,
5873
NATIVE_CLASS_HASH,
59-
CompiledClass::Sierra(Arc::new(sierra_contract_class)),
74+
sierra_contract_class,
6075
);
6176
contract_class_cache.insert(
6277
CASM_CLASS_HASH,
@@ -449,13 +464,16 @@ fn call_contract_test() {
449464
let callee_class_hash: ClassHash = [2; 32];
450465
let callee_nonce = Felt252::zero();
451466

452-
contract_class_cache.insert(
467+
insert_sierra_class_into_cache(
468+
&mut contract_class_cache,
453469
caller_class_hash,
454-
CompiledClass::Sierra(Arc::new(caller_contract_class)),
470+
caller_contract_class,
455471
);
456-
contract_class_cache.insert(
472+
473+
insert_sierra_class_into_cache(
474+
&mut contract_class_cache,
457475
callee_class_hash,
458-
CompiledClass::Sierra(Arc::new(callee_contract_class)),
476+
callee_contract_class,
459477
);
460478

461479
let mut state_reader = InMemoryStateReader::default();
@@ -534,14 +552,16 @@ fn call_echo_contract_test() {
534552
let callee_class_hash: ClassHash = [2; 32];
535553
let callee_nonce = Felt252::zero();
536554

537-
contract_class_cache.insert(
555+
insert_sierra_class_into_cache(
556+
&mut contract_class_cache,
538557
caller_class_hash,
539-
CompiledClass::Sierra(Arc::new(caller_contract_class)),
558+
caller_contract_class,
540559
);
541560

542-
contract_class_cache.insert(
561+
insert_sierra_class_into_cache(
562+
&mut contract_class_cache,
543563
callee_class_hash,
544-
CompiledClass::Sierra(Arc::new(callee_contract_class)),
564+
callee_contract_class,
545565
);
546566

547567
let mut state_reader = InMemoryStateReader::default();
@@ -622,14 +642,16 @@ fn call_events_contract_test() {
622642
let callee_class_hash: ClassHash = [2; 32];
623643
let callee_nonce = Felt252::zero();
624644

625-
contract_class_cache.insert(
645+
insert_sierra_class_into_cache(
646+
&mut contract_class_cache,
626647
caller_class_hash,
627-
CompiledClass::Sierra(Arc::new(caller_contract_class)),
648+
caller_contract_class,
628649
);
629650

630-
contract_class_cache.insert(
651+
insert_sierra_class_into_cache(
652+
&mut contract_class_cache,
631653
callee_class_hash,
632-
CompiledClass::Sierra(Arc::new(callee_contract_class)),
654+
callee_contract_class,
633655
);
634656

635657
let mut state_reader = InMemoryStateReader::default();
@@ -840,14 +862,16 @@ fn deploy_syscall_test() {
840862
let deployee_class_hash: ClassHash = Felt252::one().to_be_bytes();
841863
let _deployee_nonce = Felt252::zero();
842864

843-
contract_class_cache.insert(
865+
insert_sierra_class_into_cache(
866+
&mut contract_class_cache,
844867
deployer_class_hash,
845-
CompiledClass::Sierra(Arc::new(deployer_contract_class)),
868+
deployer_contract_class,
846869
);
847870

848-
contract_class_cache.insert(
871+
insert_sierra_class_into_cache(
872+
&mut contract_class_cache,
849873
deployee_class_hash,
850-
CompiledClass::Sierra(Arc::new(deployee_contract_class)),
874+
deployee_contract_class,
851875
);
852876

853877
let mut state_reader = InMemoryStateReader::default();
@@ -945,14 +969,16 @@ fn deploy_syscall_address_unavailable_test() {
945969
// Insert contract to be deployed so that its address is taken
946970
let deployee_address = expected_deployed_contract_address;
947971

948-
contract_class_cache.insert(
972+
insert_sierra_class_into_cache(
973+
&mut contract_class_cache,
949974
deployer_class_hash,
950-
CompiledClass::Sierra(Arc::new(deployer_contract_class)),
975+
deployer_contract_class,
951976
);
952977

953-
contract_class_cache.insert(
978+
insert_sierra_class_into_cache(
979+
&mut contract_class_cache,
954980
deployee_class_hash,
955-
CompiledClass::Sierra(Arc::new(deployee_contract_class)),
981+
deployee_contract_class,
956982
);
957983

958984
let mut state_reader = InMemoryStateReader::default();

0 commit comments

Comments
 (0)