add happy paths

This commit is contained in:
Sergio Chouhy 2025-07-17 16:05:24 -03:00
parent 1bcb3a05e7
commit bdea1a2137
7 changed files with 32 additions and 22 deletions

View File

@ -53,7 +53,7 @@ fn main() {
let (receipt, _) = nssa::invoke_privacy_execution::<TransferMultipleProgram>( let (receipt, _) = nssa::invoke_privacy_execution::<TransferMultipleProgram>(
&[sender, receiver_1, receiver_2], &[sender, receiver_1, receiver_2],
&vec![30, 40], vec![30, 40],
&visibilities, &visibilities,
root, root,
) )

View File

@ -33,7 +33,7 @@ pub fn main() {
let inputs_outputs = nssa::execute::<TransferMultipleProgram>( let inputs_outputs = nssa::execute::<TransferMultipleProgram>(
&[sender, receiver_1, receiver_2], &[sender, receiver_1, receiver_2],
&balance_to_move, balance_to_move,
) )
.unwrap(); .unwrap();

View File

@ -5,7 +5,7 @@ use core::{
types::{Address, Commitment, Key, Nullifier}, types::{Address, Commitment, Key, Nullifier},
}; };
use nssa::program::TransferProgram; use nssa::program::{PinataProgram, TransferProgram};
use risc0_zkvm::Receipt; use risc0_zkvm::Receipt;
use crate::sequencer_mock::{MockedSequencer, ACCOUNTS_PRIVATE_KEYS}; use crate::sequencer_mock::{MockedSequencer, ACCOUNTS_PRIVATE_KEYS};
@ -52,9 +52,16 @@ fn main() {
1, 1,
&mut sequencer, &mut sequencer,
); );
println!("Balances after deshielded execution"); println!("Balances after deshielded execution");
sequencer.print(); sequencer.print();
// A public execution of the Pinata program
let preimage = bytes_to_words(b"NSSA Selective privacy is great!").to_vec();
sequencer
.invoke_public::<PinataProgram>(&[addresses[0], addresses[3]], preimage)
.unwrap();
println!("Balances after public piñata execution");
sequencer.print();
} }
fn mint_fresh_account(address: Address) -> Account { fn mint_fresh_account(address: Address) -> Account {
@ -77,7 +84,7 @@ fn send_shielded(
let visibilities = vec![InputVisibiility::Public, InputVisibiility::Private(None)]; let visibilities = vec![InputVisibiility::Public, InputVisibiility::Private(None)];
let (receipt, nonces) = nssa::invoke_privacy_execution::<TransferProgram>( let (receipt, nonces) = nssa::invoke_privacy_execution::<TransferProgram>(
&[sender_account, receiver_account.clone()], &[sender_account, receiver_account.clone()],
&balance_to_move, balance_to_move,
&visibilities, &visibilities,
commitment_tree_root, commitment_tree_root,
) )
@ -116,7 +123,7 @@ fn send_private(
]; ];
let (receipt, nonces) = nssa::invoke_privacy_execution::<TransferProgram>( let (receipt, nonces) = nssa::invoke_privacy_execution::<TransferProgram>(
&[from_account.clone(), receiver_account.clone()], &[from_account.clone(), receiver_account.clone()],
&balance_to_move, balance_to_move,
&visibilities, &visibilities,
commitment_tree_root, commitment_tree_root,
) )
@ -154,7 +161,7 @@ fn send_deshielded(
]; ];
let (receipt, nonces) = nssa::invoke_privacy_execution::<TransferProgram>( let (receipt, nonces) = nssa::invoke_privacy_execution::<TransferProgram>(
&[from_account.clone(), to_account], &[from_account.clone(), to_account],
&balance_to_move, balance_to_move,
&visibilities, &visibilities,
commitment_tree_root, commitment_tree_root,
) )

View File

@ -134,7 +134,7 @@ impl MockedSequencer {
.collect::<Result<_, _>>()?; .collect::<Result<_, _>>()?;
// Execute // Execute
let inputs_outputs = nssa::execute::<P>(&input_accounts, &instruction_data)?; let inputs_outputs = nssa::execute::<P>(&input_accounts, instruction_data)?;
// Consistency checks // Consistency checks
self.inputs_outputs_are_consistent(&input_accounts, &inputs_outputs)?; self.inputs_outputs_are_consistent(&input_accounts, &inputs_outputs)?;

View File

@ -1,7 +1,10 @@
use core::{account::Account, hash}; use core::{account::Account, hash};
use risc0_zkvm::guest::env; use risc0_zkvm::guest::env;
const TARGET_HASH: [u32; 8] = [1, 2, 3, 4, 5, 6, 7, 8]; // preimage is b"NSSA Selective privacy is great!"
const TARGET_HASH: [u32; 8] = [
1363824975, 720119575, 717909014, 2043925380, 717793160, 1495780600, 1253022833, 116132328,
];
const PINATA_ACCOUNT_ADDR: [u32; 8] = [0xcafe; 8]; const PINATA_ACCOUNT_ADDR: [u32; 8] = [0xcafe; 8];
const PINATA_PRICE: u128 = 100; const PINATA_PRICE: u128 = 100;
@ -12,11 +15,11 @@ fn main() {
let preimage: Vec<u32> = env::read(); let preimage: Vec<u32> = env::read();
assert_eq!(input_accounts.len(), 2); assert_eq!(input_accounts.len(), 2);
let [pinata_account] = input_accounts.split_off(1).try_into().unwrap(); let [winner_account] = input_accounts.split_off(1).try_into().unwrap();
let [winner_account] = input_accounts.try_into().unwrap(); let [pinata_account] = input_accounts.try_into().unwrap();
assert_eq!(pinata_account.address, PINATA_ACCOUNT_ADDR); assert_eq!(pinata_account.address, PINATA_ACCOUNT_ADDR);
assert_eq!(pinata_account.balance, PINATA_PRICE); assert!(pinata_account.balance >= PINATA_PRICE);
assert_eq!(hash(&preimage), TARGET_HASH); assert_eq!(hash(&preimage), TARGET_HASH);
let mut winner_account_post = winner_account.clone(); let mut winner_account_post = winner_account.clone();
@ -25,9 +28,9 @@ fn main() {
winner_account_post.balance += PINATA_PRICE; winner_account_post.balance += PINATA_PRICE;
env::commit(&vec![ env::commit(&vec![
winner_account,
pinata_account, pinata_account,
winner_account_post, winner_account,
pinata_account_post, pinata_account_post,
winner_account_post,
]); ]);
} }

View File

@ -18,7 +18,7 @@ pub fn new_random_nonce() -> Nonce {
fn write_inputs<P: Program>( fn write_inputs<P: Program>(
input_accounts: &[Account], input_accounts: &[Account],
instruction_data: &P::InstructionData, instruction_data: P::InstructionData,
env_builder: &mut ExecutorEnvBuilder, env_builder: &mut ExecutorEnvBuilder,
) -> Result<(), ()> { ) -> Result<(), ()> {
let input_accounts = input_accounts.to_vec(); let input_accounts = input_accounts.to_vec();
@ -29,7 +29,7 @@ fn write_inputs<P: Program>(
fn execute_and_prove_inner<P: Program>( fn execute_and_prove_inner<P: Program>(
input_accounts: &[Account], input_accounts: &[Account],
instruction_data: &P::InstructionData, instruction_data: P::InstructionData,
) -> Result<(Receipt, Vec<Account>), ()> { ) -> Result<(Receipt, Vec<Account>), ()> {
// Write inputs to the program // Write inputs to the program
let mut env_builder = ExecutorEnv::builder(); let mut env_builder = ExecutorEnv::builder();
@ -49,7 +49,7 @@ fn execute_and_prove_inner<P: Program>(
pub fn execute<P: Program>( pub fn execute<P: Program>(
input_accounts: &[Account], input_accounts: &[Account],
instruction_data: &P::InstructionData, instruction_data: P::InstructionData,
) -> Result<Vec<Account>, ()> { ) -> Result<Vec<Account>, ()> {
// Write inputs to the program // Write inputs to the program
let mut env_builder = ExecutorEnv::builder(); let mut env_builder = ExecutorEnv::builder();
@ -60,7 +60,7 @@ pub fn execute<P: Program>(
let executor = default_executor(); let executor = default_executor();
let session_info = executor.execute(env, P::PROGRAM_ELF).map_err(|_| ())?; let session_info = executor.execute(env, P::PROGRAM_ELF).map_err(|_| ())?;
// Get proof and (inputs and) outputs // Get (inputs and) outputs
let inputs_outputs: Vec<Account> = session_info.journal.decode().map_err(|_| ())?; let inputs_outputs: Vec<Account> = session_info.journal.decode().map_err(|_| ())?;
Ok(inputs_outputs) Ok(inputs_outputs)
@ -68,7 +68,7 @@ pub fn execute<P: Program>(
pub fn invoke_privacy_execution<P: Program>( pub fn invoke_privacy_execution<P: Program>(
inputs: &[Account], inputs: &[Account],
instruction_data: &P::InstructionData, instruction_data: P::InstructionData,
visibilities: &[InputVisibiility], visibilities: &[InputVisibiility],
commitment_tree_root: [u32; 8], commitment_tree_root: [u32; 8],
) -> Result<(Receipt, Vec<Nonce>), ()> { ) -> Result<(Receipt, Vec<Nonce>), ()> {

View File

@ -29,8 +29,8 @@ impl Program for TransferMultipleProgram {
pub struct PinataProgram; pub struct PinataProgram;
impl Program for PinataProgram { impl Program for PinataProgram {
const PROGRAM_ID: ProgramId = TRANSFER_MULTIPLE_ID; const PROGRAM_ID: ProgramId = PINATA_ID;
const PROGRAM_ELF: &[u8] = TRANSFER_MULTIPLE_ELF; const PROGRAM_ELF: &[u8] = PINATA_ELF;
/// Preimage of target hash to win price /// Preimage of target hash to win price
type InstructionData = [u32; 8]; type InstructionData = Vec<u32>;
} }