lssa/nssa/src/lib.rs

85 lines
2.4 KiB
Rust
Raw Normal View History

2025-08-06 20:05:04 -03:00
use nssa_core::{
account::{Account, AccountWithMetadata},
2025-08-09 20:16:18 -03:00
program::{DEFAULT_PROGRAM_ID, ProgramId},
2025-08-06 20:05:04 -03:00
};
use program_methods::{AUTHENTICATED_TRANSFER_ELF, AUTHENTICATED_TRANSFER_ID};
use risc0_zkvm::{ExecutorEnv, ExecutorEnvBuilder, default_executor};
mod address;
2025-08-09 19:49:07 -03:00
pub mod error;
2025-08-07 15:19:06 -03:00
pub mod public_transaction;
2025-08-06 20:05:04 -03:00
mod signature;
2025-08-07 15:19:06 -03:00
mod state;
2025-08-06 20:05:04 -03:00
2025-08-07 15:19:06 -03:00
pub use address::Address;
pub use public_transaction::PublicTransaction;
pub use signature::PrivateKey;
pub use signature::PublicKey;
2025-08-09 19:05:49 -03:00
pub use signature::Signature;
2025-08-07 15:19:06 -03:00
pub use state::V01State;
2025-08-09 19:49:07 -03:00
use crate::error::NssaError;
pub const AUTHENTICATED_TRANSFER_PROGRAM: Program = Program {
id: AUTHENTICATED_TRANSFER_ID,
elf: AUTHENTICATED_TRANSFER_ELF,
};
2025-08-06 13:39:09 -03:00
2025-08-09 20:16:18 -03:00
pub struct Program {
id: ProgramId,
elf: &'static [u8],
}
2025-08-06 20:05:04 -03:00
/// Writes inputs to `env_builder` in the order expected by the programs
fn write_inputs(
2025-08-06 20:05:04 -03:00
pre_states: &[AccountWithMetadata],
instruction_data: u128,
2025-08-06 20:05:04 -03:00
env_builder: &mut ExecutorEnvBuilder,
2025-08-09 19:49:07 -03:00
) -> Result<(), NssaError> {
2025-08-06 20:05:04 -03:00
let pre_states = pre_states.to_vec();
2025-08-09 19:49:07 -03:00
env_builder
.write(&pre_states)
.map_err(|e| NssaError::ProgramExecutionFailed(e.to_string()))?;
env_builder
.write(&instruction_data)
.map_err(|e| NssaError::ProgramExecutionFailed(e.to_string()))?;
2025-08-06 20:05:04 -03:00
Ok(())
}
2025-08-09 20:16:18 -03:00
impl Program {
pub fn id(&self) -> ProgramId {
self.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();
2025-08-06 20:05:04 -03:00
2025-08-09 20:16:18 -03:00
// 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()))?;
2025-08-09 20:16:18 -03:00
// Get outputs
let mut post_states: Vec<Account> = session_info
.journal
.decode()
.map_err(|e| NssaError::ProgramExecutionFailed(e.to_string()))?;
2025-08-09 20:16:18 -03:00
// 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;
}
}
2025-08-06 13:39:09 -03:00
2025-08-09 20:16:18 -03:00
Ok(post_states)
}
2025-08-06 13:39:09 -03:00
}