diff --git a/Cargo.lock b/Cargo.lock index bece7f4a6..5c0a9cec0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5595,8 +5595,8 @@ dependencies = [ "hex-literal 1.1.0", "k256 0.13.4", "lee_core", - "loader_core", "log", + "program_loader_core", "rand 0.8.6", "risc0-binfmt", "risc0-zkvm", @@ -5617,6 +5617,7 @@ dependencies = [ "bytemuck", "bytesize", "chacha20", + "hex-literal 1.1.0", "ml-kem", "risc0-zkvm", "serde", @@ -6366,18 +6367,6 @@ version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "92daf443525c4cce67b150400bc2316076100ce0b3686209eb8cf3c31612e6f0" -[[package]] -name = "loader_core" -version = "0.1.0" -dependencies = [ - "borsh", - "bytemuck", - "lee_core", - "risc0-binfmt", - "risc0-zkvm", - "serde", -] - [[package]] name = "lock_api" version = "0.4.14" @@ -9415,6 +9404,18 @@ dependencies = [ "wallet", ] +[[package]] +name = "program_loader_core" +version = "0.1.0" +dependencies = [ + "borsh", + "bytemuck", + "lee_core", + "risc0-binfmt", + "risc0-zkvm", + "serde", +] + [[package]] name = "programs" version = "0.1.0" @@ -10987,7 +10988,6 @@ dependencies = [ "lee", "lee_core", "libp2p", - "loader_core", "log", "logos-blockchain-core", "logos-blockchain-http-api-common", @@ -10996,6 +10996,7 @@ dependencies = [ "mempool", "num-bigint 0.4.6", "ping_core", + "program_loader_core", "programs", "rand 0.8.6", "risc0-binfmt", diff --git a/Cargo.toml b/Cargo.toml index 4f96add98..fba8fc8fe 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -57,7 +57,7 @@ members = [ "lez/programs/ping_sender", "lez/programs/ping_receiver", "lez/programs/sequencer_stake", - "lez/programs/loader/core", + "lez/programs/program_loader/core", "lez/cross_zone", "test_programs", @@ -125,7 +125,7 @@ bridge_lock_core = { path = "lez/programs/bridge_lock/core" } wrapped_token_core = { path = "lez/programs/wrapped_token/core" } ping_core = { path = "lez/programs/ping_core" } sequencer_stake_core = { path = "lez/programs/sequencer_stake/core" } -loader_core = { path = "lez/programs/loader/core" } +program_loader_core = { path = "lez/programs/program_loader/core" } cross_zone = { path = "lez/cross_zone" } build_utils = { path = "build_utils" } test_programs = { path = "test_programs" } diff --git a/lee/state_machine/Cargo.toml b/lee/state_machine/Cargo.toml index ac6b4c090..9d60253d5 100644 --- a/lee/state_machine/Cargo.toml +++ b/lee/state_machine/Cargo.toml @@ -22,7 +22,7 @@ hex.workspace = true k256.workspace = true risc0-binfmt = "3.0.2" log.workspace = true -loader_core.workspace = true +program_loader_core.workspace = true [build-dependencies] build_utils.workspace = true diff --git a/lee/state_machine/core/Cargo.toml b/lee/state_machine/core/Cargo.toml index 585637aed..a7a505828 100644 --- a/lee/state_machine/core/Cargo.toml +++ b/lee/state_machine/core/Cargo.toml @@ -18,6 +18,7 @@ bytesize.workspace = true base58.workspace = true ml-kem = { workspace = true } chacha20 = { version = "0.10" } +hex-literal = "1.0.0" [dev-dependencies] serde_json.workspace = true diff --git a/lee/state_machine/core/src/program/mod.rs b/lee/state_machine/core/src/program/mod.rs index aeab6597b..dd6d46090 100644 --- a/lee/state_machine/core/src/program/mod.rs +++ b/lee/state_machine/core/src/program/mod.rs @@ -1,6 +1,7 @@ use std::collections::HashSet; use borsh::{BorshDeserialize, BorshSerialize}; +use hex_literal::hex; use risc0_zkvm::{DeserializeOwned, guest::env, serde::Deserializer}; use serde::{Deserialize, Serialize}; @@ -19,10 +20,12 @@ pub const DEFAULT_PROGRAM_OWNER: AccountId = AccountId::new([0; 32]); /// `program_owner` for program `Account`s. pub const PROGRAM_STORAGE_OWNER: AccountId = AccountId::new([0xFF; 32]); -pub const RESERVED_DEPLOYMENT_PROGRAM_ACCOUNT_ID: AccountId = AccountId::new([ - 89, 158, 44, 108, 43, 137, 255, 57, 188, 48, 148, 179, 39, 111, 31, 202, 167, 23, 56, 0, 167, - 29, 152, 150, 161, 186, 155, 209, 69, 138, 145, 201, -]); +/// Reserved `AccountId` for the native "Deploy" dispatch shortcut. +/// +/// `SHA256("/LEE/v0.3/AccountId/State/" || "DeploymentProgram")`, each padded to 32 bytes. +pub const RESERVED_DEPLOYMENT_PROGRAM_ACCOUNT_ID: AccountId = AccountId::new(hex!( + "599e2c6c2b89ff39bc3094b3276f1fcaa7173800a71d9896a1ba9bd1458a91c9" +)); pub const MAX_NUMBER_CHAINED_CALLS: usize = 10; diff --git a/lee/state_machine/src/validated_state_diff/mod.rs b/lee/state_machine/src/validated_state_diff/mod.rs index bb174b82a..70312f774 100644 --- a/lee/state_machine/src/validated_state_diff/mod.rs +++ b/lee/state_machine/src/validated_state_diff/mod.rs @@ -129,13 +129,13 @@ impl ValidatedStateDiff { == RESERVED_DEPLOYMENT_PROGRAM_ACCOUNT_ID { // Runs `Deploy` as native Rust instead of interpreting a guest ELF. - let loader_core::Instruction::Deploy { bytecode } = + let program_loader_core::Instruction::Deploy { bytecode } = risc0_zkvm::serde::from_slice(&chained_call.instruction_data).map_err(|e| { LeeError::InvalidInput(format!("invalid Deploy instruction: {e}")) })?; let deploy_pre_states = chained_call.pre_states.clone(); let post_states = std::panic::catch_unwind(|| { - loader_core::execute_deploy(program_id, deploy_pre_states, bytecode) + program_loader_core::execute_deploy(program_id, deploy_pre_states, bytecode) }) .map_err(|_panic_payload| { LeeError::ProgramExecutionFailed("Deploy rejected the given input".into()) diff --git a/lez/programs/loader/core/Cargo.toml b/lez/programs/program_loader/core/Cargo.toml similarity index 91% rename from lez/programs/loader/core/Cargo.toml rename to lez/programs/program_loader/core/Cargo.toml index bb4479997..ec5353ce9 100644 --- a/lez/programs/loader/core/Cargo.toml +++ b/lez/programs/program_loader/core/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "loader_core" +name = "program_loader_core" version = "0.1.0" edition = "2024" license = { workspace = true } diff --git a/lez/programs/loader/core/src/lib.rs b/lez/programs/program_loader/core/src/lib.rs similarity index 100% rename from lez/programs/loader/core/src/lib.rs rename to lez/programs/program_loader/core/src/lib.rs diff --git a/lez/sequencer/core/Cargo.toml b/lez/sequencer/core/Cargo.toml index e9350250b..c828a4a19 100644 --- a/lez/sequencer/core/Cargo.toml +++ b/lez/sequencer/core/Cargo.toml @@ -70,5 +70,5 @@ lee = { workspace = true, features = ["test-utils"] } key_protocol.workspace = true token_core.workspace = true ping_core.workspace = true -loader_core.workspace = true +program_loader_core.workspace = true risc0-binfmt.workspace = true diff --git a/lez/sequencer/core/src/tests.rs b/lez/sequencer/core/src/tests.rs index 2673682fa..8f33ad52a 100644 --- a/lez/sequencer/core/src/tests.rs +++ b/lez/sequencer/core/src/tests.rs @@ -3672,7 +3672,7 @@ fn deploy_transaction(target: AccountId, bytecode: Vec) -> PublicTransaction loader_id.into(), vec![target], vec![], - loader_core::Instruction::Deploy { bytecode }, + program_loader_core::Instruction::Deploy { bytecode }, ) .unwrap(); let witness_set = lee::public_transaction::WitnessSet::for_message(&message, &[]); @@ -3686,7 +3686,8 @@ fn loader_deploys_program() { let bytecode = test_programs::claimer().elf().to_vec(); let image_id: ProgramId = risc0_binfmt::compute_image_id(&bytecode).unwrap().into(); - let target = loader_core::deploy_account_id(loader_id, image_id, 0, AccountId::default()); + let target = + program_loader_core::deploy_account_id(loader_id, image_id, 0, AccountId::default()); assert_eq!(state.get_account_by_id(target), Account::default()); @@ -3701,7 +3702,7 @@ fn loader_deploys_program() { RESERVED_DEPLOYMENT_PROGRAM_ACCOUNT_ID ); - let program_data = loader_core::ProgramData::try_from(&deployed.data) + let program_data = program_loader_core::ProgramData::try_from(&deployed.data) .expect("deployed account data should decode as ProgramData"); assert_eq!(program_data.image_id, image_id); assert_eq!(program_data.segment_number, 0); @@ -3716,7 +3717,8 @@ fn loader_rejects_redeploying_an_already_deployed_program() { let bytecode = test_programs::claimer().elf().to_vec(); let image_id: ProgramId = risc0_binfmt::compute_image_id(&bytecode).unwrap().into(); - let target = loader_core::deploy_account_id(loader_id, image_id, 0, AccountId::default()); + let target = + program_loader_core::deploy_account_id(loader_id, image_id, 0, AccountId::default()); let tx = deploy_transaction(target, bytecode.clone()); state @@ -3774,14 +3776,15 @@ fn loader_rejects_wrong_number_of_accounts() { let bytecode = test_programs::claimer().elf().to_vec(); let image_id: ProgramId = risc0_binfmt::compute_image_id(&bytecode).unwrap().into(); - let target = loader_core::deploy_account_id(loader_id, image_id, 0, AccountId::default()); + let target = + program_loader_core::deploy_account_id(loader_id, image_id, 0, AccountId::default()); let extra = AccountId::new([9; 32]); let message = lee::public_transaction::Message::try_new( loader_id.into(), vec![target, extra], vec![], - loader_core::Instruction::Deploy { bytecode }, + program_loader_core::Instruction::Deploy { bytecode }, ) .unwrap(); let witness_set = lee::public_transaction::WitnessSet::for_message(&message, &[]); @@ -3818,10 +3821,11 @@ fn loader_deploys_program_via_chained_call() { let bytecode = test_programs::claimer().elf().to_vec(); let image_id: ProgramId = risc0_binfmt::compute_image_id(&bytecode).unwrap().into(); - let target = loader_core::deploy_account_id(loader_id, image_id, 0, AccountId::default()); + let target = + program_loader_core::deploy_account_id(loader_id, image_id, 0, AccountId::default()); let inner_instruction_data = - lee::program::Program::serialize_instruction(loader_core::Instruction::Deploy { + lee::program::Program::serialize_instruction(program_loader_core::Instruction::Deploy { bytecode: bytecode.clone(), }) .unwrap(); @@ -3846,7 +3850,7 @@ fn loader_deploys_program_via_chained_call() { RESERVED_DEPLOYMENT_PROGRAM_ACCOUNT_ID ); - let program_data = loader_core::ProgramData::try_from(&deployed.data) + let program_data = program_loader_core::ProgramData::try_from(&deployed.data) .expect("deployed account data should decode as ProgramData"); assert_eq!(program_data.image_id, image_id); assert_eq!(program_data.elf_segment, bytecode);