Skip to content

Commit

Permalink
build: blockifier regression test compile class (#980)
Browse files Browse the repository at this point in the history
<!-- Reviewable:start -->
This change is [<img src="https://reviewable.io/review_button.svg" height="34" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/starkware-libs/sequencer/980)
<!-- Reviewable:end -->
  • Loading branch information
AvivYossef-starkware authored Oct 1, 2024
1 parent 7427d48 commit 7131378
Show file tree
Hide file tree
Showing 8 changed files with 317 additions and 4 deletions.
6 changes: 6 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 6 additions & 0 deletions crates/blockifier_regression_test/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,14 @@ blockifier_regression_https_testing = []

[dependencies]
blockifier.workspace = true
cairo-lang-starknet-classes.workspace = true
cairo-lang-utils.workspace = true
cairo-vm.workspace = true
flate2.workspace = true
papyrus_execution.workspace = true
serde.workspace = true
serde_json.workspace = true
starknet-core.workspace = true
starknet-types-core.workspace = true
starknet_api.workspace = true
starknet_gateway.workspace = true
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,122 @@
{
"abi": [
{
"data": [
{
"name": "implementation",
"type": "felt"
}
],
"keys": [],
"name": "Upgraded",
"type": "event"
},
{
"inputs": [
{
"name": "implementation_address",
"type": "felt"
},
{
"name": "initializer_selector",
"type": "felt"
},
{
"name": "calldata_len",
"type": "felt"
},
{
"name": "calldata",
"type": "felt*"
}
],
"name": "constructor",
"outputs": [],
"type": "constructor"
},
{
"inputs": [],
"name": "get_implementation",
"outputs": [
{
"name": "implementation",
"type": "felt"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"name": "selector",
"type": "felt"
},
{
"name": "calldata_size",
"type": "felt"
},
{
"name": "calldata",
"type": "felt*"
}
],
"name": "__default__",
"outputs": [
{
"name": "retdata_size",
"type": "felt"
},
{
"name": "retdata",
"type": "felt*"
}
],
"type": "function"
},
{
"inputs": [
{
"name": "selector",
"type": "felt"
},
{
"name": "calldata_size",
"type": "felt"
},
{
"name": "calldata",
"type": "felt*"
}
],
"name": "__l1_default__",
"outputs": [],
"type": "l1_handler"
}
],
"entry_points_by_type": {
"CONSTRUCTOR": [
{
"offset": "0x91",
"selector": "0x28ffe4ff0f226a9107253e17a904099aa4f63a02a5621de0576e5aa71bc5194"
}
],
"EXTERNAL": [
{
"offset": "0xde",
"selector": "0x0"
},
{
"offset": "0xbd",
"selector": "0x21691762da057c1b71f851f9b709e0c143628acf6e0cbc9735411a65663d747"
}
],
"L1_HANDLER": [
{
"offset": "0xf7",
"selector": "0x0"
}
]
},
"program": "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"
}
20 changes: 20 additions & 0 deletions crates/blockifier_regression_test/src/json_test.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,23 @@ use pretty_assertions::assert_eq;
use rstest::{fixture, rstest};
use starknet_api::block::BlockNumber;
use starknet_api::test_utils::read_json_file;
use starknet_core::types::ContractClass;
use starknet_gateway::rpc_objects::BlockHeader;

use crate::state_reader::compile::legacy_to_contract_class_v0;

#[fixture]
fn block_header() -> BlockHeader {
serde_json::from_value(read_json_file("json_objects/block_header.json"))
.expect("Failed to deserialize block header")
}

#[fixture]
fn deprecated_contract_class() -> ContractClass {
serde_json::from_value(read_json_file("json_objects/deprecated_contract_class.json"))
.expect("Failed to deserialize deprecated contact class")
}

/// Test that deserialize block header from JSON file works(in the fixture).
#[rstest]
fn test_deserialize_block_header(block_header: BlockHeader) {
Expand All @@ -25,3 +34,14 @@ fn test_block_header_to_block_info(block_header: BlockHeader) {
// Sanity check.
assert_eq!(block_info.block_number, BlockNumber(700000));
}

#[rstest]
fn test_compile_deprecated_contract_class(deprecated_contract_class: ContractClass) {
match deprecated_contract_class {
ContractClass::Legacy(legacy) => {
// Compile the contract class.
assert!(legacy_to_contract_class_v0(legacy).is_ok());
}
_ => panic!("Expected a legacy contract class"),
}
}
1 change: 1 addition & 0 deletions crates/blockifier_regression_test/src/state_reader.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
pub mod compile;
#[cfg(test)]
#[cfg(feature = "blockifier_regression_https_testing")]
pub mod rpc_test;
Expand Down
105 changes: 105 additions & 0 deletions crates/blockifier_regression_test/src/state_reader/compile.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,105 @@
// This module contains code taken from starknet-replay.
// For more information, see the original repository at:
// `<starknet-replay: https://github.com/lambdaclass/starknet-replay>`

use std::collections::HashMap;
use std::io::{self, Read};
use std::sync::Arc;

use blockifier::execution::contract_class::{ContractClass, ContractClassV0, ContractClassV0Inner};
use blockifier::state::state_api::StateResult;
use cairo_lang_starknet_classes::contract_class::ContractEntryPoints;
use cairo_lang_utils::bigint::BigUintAsHex;
use cairo_vm::types::program::Program;
use flate2::bufread;
use serde::Deserialize;
use starknet_api::core::EntryPointSelector;
use starknet_api::deprecated_contract_class::{EntryPoint, EntryPointOffset, EntryPointType};
use starknet_api::hash::StarkHash;
use starknet_core::types::{
CompressedLegacyContractClass,
FlattenedSierraClass,
LegacyContractEntryPoint,
LegacyEntryPointsByType,
};
use starknet_gateway::errors::serde_err_to_state_err;

#[derive(Debug, Deserialize)]
pub struct MiddleSierraContractClass {
pub sierra_program: Vec<BigUintAsHex>,
pub contract_class_version: String,
pub entry_points_by_type: ContractEntryPoints,
}

/// Maps `LegacyEntryPointsByType` to a `HashMap` where each `EntryPointType`
/// is associated with a vector of `EntryPoint`. Converts selectors and offsets
/// from legacy format to new `EntryPoint` struct.
pub fn map_entry_points_by_type_legacy(
entry_points_by_type: LegacyEntryPointsByType,
) -> HashMap<EntryPointType, Vec<EntryPoint>> {
let entry_types_to_points = HashMap::from([
(EntryPointType::Constructor, entry_points_by_type.constructor),
(EntryPointType::External, entry_points_by_type.external),
(EntryPointType::L1Handler, entry_points_by_type.l1_handler),
]);

let to_contract_entry_point = |entrypoint: &LegacyContractEntryPoint| -> EntryPoint {
let felt: StarkHash = StarkHash::from_bytes_be(&entrypoint.selector.to_bytes_be());
EntryPoint {
offset: EntryPointOffset(usize::try_from(entrypoint.offset).unwrap()),
selector: EntryPointSelector(felt),
}
};

let mut entry_points_by_type_map = HashMap::new();
for (entry_point_type, entry_points) in entry_types_to_points.into_iter() {
let values = entry_points.iter().map(to_contract_entry_point).collect::<Vec<_>>();
entry_points_by_type_map.insert(entry_point_type, values);
}

entry_points_by_type_map
}

/// Uncompresses a Gz Encoded vector of bytes and returns a string or error
/// Here &[u8] implements BufRead
pub fn decode_reader(bytes: Vec<u8>) -> io::Result<String> {
let mut gz = bufread::GzDecoder::new(&bytes[..]);
let mut s = String::new();
gz.read_to_string(&mut s)?;
Ok(s)
}

/// Compile a FlattenedSierraClass to a ContractClass V1 (casm) using cairo_lang_starknet_classes.
pub fn sierra_to_contact_class_v1(sierra: FlattenedSierraClass) -> StateResult<ContractClass> {
let middle_sierra: MiddleSierraContractClass = {
let v = serde_json::to_value(sierra).map_err(serde_err_to_state_err);
serde_json::from_value(v?).map_err(serde_err_to_state_err)?
};
let sierra = cairo_lang_starknet_classes::contract_class::ContractClass {
sierra_program: middle_sierra.sierra_program,
contract_class_version: middle_sierra.contract_class_version,
entry_points_by_type: middle_sierra.entry_points_by_type,
sierra_program_debug_info: None,
abi: None,
};

let casm =
cairo_lang_starknet_classes::casm_contract_class::CasmContractClass::from_contract_class(
sierra,
false,
usize::MAX,
)
.unwrap();
Ok(ContractClass::V1(casm.try_into().unwrap()))
}

/// Compile a CompressedLegacyContractClass to a ContractClass V0 using cairo_lang_starknet_classes.
pub fn legacy_to_contract_class_v0(
legacy: CompressedLegacyContractClass,
) -> StateResult<ContractClass> {
let as_str = decode_reader(legacy.program).unwrap();
let program = Program::from_bytes(as_str.as_bytes(), None).unwrap();
let entry_points_by_type = map_entry_points_by_type_legacy(legacy.entry_points_by_type);
let inner = Arc::new(ContractClassV0Inner { program, entry_points_by_type });
Ok(ContractClass::V0(ContractClassV0(inner)))
}
31 changes: 31 additions & 0 deletions crates/blockifier_regression_test/src/state_reader/rpc_test.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,11 @@ use blockifier::versioned_constants::StarknetVersion;
use pretty_assertions::assert_eq;
use rstest::{fixture, rstest};
use starknet_api::block::BlockNumber;
use starknet_api::core::ClassHash;
use starknet_api::{class_hash, felt};
use starknet_core::types::ContractClass::{Legacy, Sierra};

use crate::state_reader::compile::legacy_to_contract_class_v0;
use crate::state_reader::test_state_reader::TestStateReader;

#[fixture]
Expand All @@ -29,3 +33,30 @@ pub fn test_get_block_info(test_state_reader: TestStateReader, test_block_number
pub fn test_get_starknet_version(test_state_reader: TestStateReader) {
assert_eq!(test_state_reader.get_starknet_version().unwrap(), StarknetVersion::V0_13_2_1)
}

#[rstest]
pub fn test_get_contract_class(test_state_reader: TestStateReader, test_block_number: BlockNumber) {
// An example of existing class hash in Mainnet.
let class_hash =
class_hash!("0x3131fa018d520a037686ce3efddeab8f28895662f019ca3ca18a626650f7d1e");

// Test getting the contract class using RPC request.
let deprecated_contract_class =
test_state_reader.get_contract_class(&class_hash).unwrap_or_else(|err| {
panic!(
"Error retrieving deprecated contract class for class hash {}: {}
This class hash exist in Mainnet Block Number: {}",
class_hash, test_block_number, err
);
});

// Test compiling the contract class.
match deprecated_contract_class {
Legacy(legacy) => {
// Test compiling the contract class.
assert!(legacy_to_contract_class_v0(legacy).is_ok());
}
// This contract class is deprecated.
Sierra(_) => panic!("Expected a legacy contract class"),
}
}
Loading

0 comments on commit 7131378

Please sign in to comment.