fix(lee): address PR #733 review comments

- RESERVED_DEPLOYMENT_PROGRAM_ACCOUNT_ID: restore the SHA256 derivation
  docstring that explains the constant instead of leaving it as an opaque
  byte array, and switch the array itself to a hex literal (hex-literal,
  already a workspace dependency) for readability.
- Rename the loader/loader_core crate to program_loader/program_loader_core
  to disambiguate it, across the directory, package name, workspace
  members/dependency alias, both dependent crates, and every call site.
This commit is contained in:
Marvin Jones
2026-08-22 17:39:23 -04:00
parent f9fe3f0d5c
commit 6b1f016aee
10 changed files with 43 additions and 34 deletions
Generated
+15 -14
View File
@@ -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",
+2 -2
View File
@@ -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" }
+1 -1
View File
@@ -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
+1
View File
@@ -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
+7 -4
View File
@@ -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;
@@ -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())
@@ -1,5 +1,5 @@
[package]
name = "loader_core"
name = "program_loader_core"
version = "0.1.0"
edition = "2024"
license = { workspace = true }
+1 -1
View File
@@ -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
+13 -9
View File
@@ -3672,7 +3672,7 @@ fn deploy_transaction(target: AccountId, bytecode: Vec<u8>) -> 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);