refactor program

This commit is contained in:
Sergio Chouhy 2025-08-09 20:16:18 -03:00
parent 55e241dc97
commit 51d8ac47cf
6 changed files with 47 additions and 68 deletions

View File

@ -31,7 +31,7 @@ pub fn produce_dummy_block(
} }
pub fn produce_dummy_empty_transaction() -> nssa::PublicTransaction { pub fn produce_dummy_empty_transaction() -> nssa::PublicTransaction {
let program_id = nssa::AUTHENTICATED_TRANSFER_PROGRAM.id; let program_id = nssa::AUTHENTICATED_TRANSFER_PROGRAM.id();
let addresses = vec![]; let addresses = vec![];
let nonces = vec![]; let nonces = vec![];
let instruction_data = 0; let instruction_data = 0;
@ -42,31 +42,6 @@ pub fn produce_dummy_empty_transaction() -> nssa::PublicTransaction {
nssa::PublicTransaction::new(message, witness_set) nssa::PublicTransaction::new(message, witness_set)
} }
// pub fn create_dummy_private_transaction_random_signer(
// nullifier_created_hashes: Vec<[u8; 32]>,
// utxo_commitments_spent_hashes: Vec<[u8; 32]>,
// utxo_commitments_created_hashes: Vec<[u8; 32]>,
// ) -> Transaction {
// let mut rng = rand::thread_rng();
//
// let body = TransactionBody {
// tx_kind: TxKind::Private,
// execution_input: vec![],
// execution_output: vec![],
// utxo_commitments_spent_hashes,
// utxo_commitments_created_hashes,
// nullifier_created_hashes,
// execution_proof_private: "dummy_proof".to_string(),
// encoded_data: vec![],
// ephemeral_pub_key: vec![10, 11, 12],
// commitment: vec![],
// tweak: Tweak::new(&mut rng),
// secret_r: [0; 32],
// sc_addr: "sc_addr".to_string(),
// };
// Transaction::new(body, SignaturePrivateKey::random(&mut rng))
// }
pub fn create_dummy_transaction_native_token_transfer( pub fn create_dummy_transaction_native_token_transfer(
from: [u8; 32], from: [u8; 32],
nonce: u128, nonce: u128,
@ -76,7 +51,7 @@ pub fn create_dummy_transaction_native_token_transfer(
) -> nssa::PublicTransaction { ) -> nssa::PublicTransaction {
let addresses = vec![nssa::Address::new(from), nssa::Address::new(to)]; let addresses = vec![nssa::Address::new(from), nssa::Address::new(to)];
let nonces = vec![nonce]; let nonces = vec![nonce];
let program_id = nssa::AUTHENTICATED_TRANSFER_PROGRAM.id; let program_id = nssa::AUTHENTICATED_TRANSFER_PROGRAM.id();
let message = let message =
nssa::public_transaction::Message::new(program_id, addresses, nonces, balance_to_move); nssa::public_transaction::Message::new(program_id, addresses, nonces, balance_to_move);
let witness_set = nssa::public_transaction::WitnessSet::for_message(&message, &[&signing_key]); let witness_set = nssa::public_transaction::WitnessSet::for_message(&message, &[&signing_key]);

View File

@ -3,11 +3,6 @@ use crate::account::{Account, AccountWithMetadata};
pub type ProgramId = [u32; 8]; pub type ProgramId = [u32; 8];
pub const DEFAULT_PROGRAM_ID: ProgramId = [0; 8]; pub const DEFAULT_PROGRAM_ID: ProgramId = [0; 8];
pub struct Program {
pub id: ProgramId,
pub elf: &'static [u8],
}
/// Validates well-behaved program execution /// Validates well-behaved program execution
/// ///
/// # Parameters /// # Parameters

View File

@ -1,6 +1,6 @@
use nssa_core::{ use nssa_core::{
account::{Account, AccountWithMetadata}, account::{Account, AccountWithMetadata},
program::DEFAULT_PROGRAM_ID, program::{DEFAULT_PROGRAM_ID, ProgramId},
}; };
use program_methods::{AUTHENTICATED_TRANSFER_ELF, AUTHENTICATED_TRANSFER_ID}; use program_methods::{AUTHENTICATED_TRANSFER_ELF, AUTHENTICATED_TRANSFER_ID};
use risc0_zkvm::{ExecutorEnv, ExecutorEnvBuilder, default_executor}; use risc0_zkvm::{ExecutorEnv, ExecutorEnvBuilder, default_executor};
@ -12,7 +12,6 @@ mod signature;
mod state; mod state;
pub use address::Address; pub use address::Address;
pub use nssa_core::program::Program;
pub use public_transaction::PublicTransaction; pub use public_transaction::PublicTransaction;
pub use signature::PrivateKey; pub use signature::PrivateKey;
pub use signature::PublicKey; pub use signature::PublicKey;
@ -26,6 +25,11 @@ pub const AUTHENTICATED_TRANSFER_PROGRAM: Program = Program {
elf: AUTHENTICATED_TRANSFER_ELF, elf: AUTHENTICATED_TRANSFER_ELF,
}; };
pub struct Program {
id: ProgramId,
elf: &'static [u8],
}
/// Writes inputs to `env_builder` in the order expected by the programs /// Writes inputs to `env_builder` in the order expected by the programs
fn write_inputs( fn write_inputs(
pre_states: &[AccountWithMetadata], pre_states: &[AccountWithMetadata],
@ -42,34 +46,39 @@ fn write_inputs(
Ok(()) Ok(())
} }
fn execute_public( impl Program {
pre_states: &[AccountWithMetadata], pub fn id(&self) -> ProgramId {
instruction_data: u128, self.id
program: &Program,
) -> Result<Vec<Account>, NssaError> {
// Write inputs to the program
let mut env_builder = ExecutorEnv::builder();
write_inputs(pre_states, instruction_data, &mut env_builder)?;
let env = env_builder.build().unwrap();
// Execute the program (without proving)
let executor = default_executor();
let session_info = executor
.execute(env, program.elf)
.map_err(|e| NssaError::ProgramExecutionFailed(e.to_string()))?;
// Get outputs
let mut post_states: Vec<Account> = session_info
.journal
.decode()
.map_err(|e| NssaError::ProgramExecutionFailed(e.to_string()))?;
// Claim any output account with default program owner field
for account in post_states.iter_mut() {
if account.program_owner == DEFAULT_PROGRAM_ID {
account.program_owner = program.id;
}
} }
pub(crate) fn execute(
&self,
pre_states: &[AccountWithMetadata],
instruction_data: u128,
) -> Result<Vec<Account>, NssaError> {
// Write inputs to the program
let mut env_builder = ExecutorEnv::builder();
write_inputs(pre_states, instruction_data, &mut env_builder)?;
let env = env_builder.build().unwrap();
Ok(post_states) // Execute the program (without proving)
let executor = default_executor();
let session_info = executor
.execute(env, self.elf)
.map_err(|e| NssaError::ProgramExecutionFailed(e.to_string()))?;
// Get outputs
let mut post_states: Vec<Account> = session_info
.journal
.decode()
.map_err(|e| NssaError::ProgramExecutionFailed(e.to_string()))?;
// Claim any output account with default program owner field
for account in post_states.iter_mut() {
if account.program_owner == DEFAULT_PROGRAM_ID {
account.program_owner = self.id;
}
}
Ok(post_states)
}
} }

View File

@ -1,10 +1,10 @@
use crate::{ use crate::{
AUTHENTICATED_TRANSFER_PROGRAM, address::Address, error::NssaError, execute_public, AUTHENTICATED_TRANSFER_PROGRAM, Program, address::Address, error::NssaError,
public_transaction::PublicTransaction, public_transaction::PublicTransaction,
}; };
use nssa_core::{ use nssa_core::{
account::{Account, AccountWithMetadata}, account::{Account, AccountWithMetadata},
program::{Program, ProgramId, validate_constraints}, program::{ProgramId, validate_constraints},
}; };
use std::collections::{HashMap, HashSet}; use std::collections::{HashMap, HashSet};
@ -129,7 +129,7 @@ impl V01State {
}; };
// // Execute program // // Execute program
let post_states = execute_public(&pre_states, message.instruction_data, program)?; let post_states = program.execute(&pre_states, message.instruction_data)?;
// Verify execution corresponds to a well-behaved program. // Verify execution corresponds to a well-behaved program.
// See the # Programs section for the definition of the `validate_constraints` method. // See the # Programs section for the definition of the `validate_constraints` method.

View File

@ -267,7 +267,7 @@ mod tests {
let addresses = vec![from, to]; let addresses = vec![from, to];
let nonces = vec![0]; let nonces = vec![0];
let program_id = nssa::AUTHENTICATED_TRANSFER_PROGRAM.id; let program_id = nssa::AUTHENTICATED_TRANSFER_PROGRAM.id();
let message = let message =
nssa::public_transaction::Message::new(program_id, addresses, nonces, balance_to_move); nssa::public_transaction::Message::new(program_id, addresses, nonces, balance_to_move);
let witness_set = let witness_set =
@ -501,7 +501,7 @@ mod tests {
], ],
"instruction_data": 10, "instruction_data": 10,
"nonces": [0], "nonces": [0],
"program_id": nssa::AUTHENTICATED_TRANSFER_PROGRAM.id, "program_id": nssa::AUTHENTICATED_TRANSFER_PROGRAM.id(),
}, },
"witness_set": { "witness_set": {
"signatures_and_public_keys": [ "signatures_and_public_keys": [

View File

@ -86,7 +86,7 @@ impl NodeCore {
if let Some(account) = account { if let Some(account) = account {
let addresses = vec![nssa::Address::new(from), nssa::Address::new(to)]; let addresses = vec![nssa::Address::new(from), nssa::Address::new(to)];
let nonces = vec![nonce]; let nonces = vec![nonce];
let program_id = nssa::AUTHENTICATED_TRANSFER_PROGRAM.id; let program_id = nssa::AUTHENTICATED_TRANSFER_PROGRAM.id();
let message = nssa::public_transaction::Message::new( let message = nssa::public_transaction::Message::new(
program_id, program_id,
addresses, addresses,