diff --git a/risc0-selective-privacy-poc/src/program/mod.rs b/risc0-selective-privacy-poc/src/program/mod.rs index aafe0c7..bc0d6a0 100644 --- a/risc0-selective-privacy-poc/src/program/mod.rs +++ b/risc0-selective-privacy-poc/src/program/mod.rs @@ -1,5 +1,5 @@ use serde::{Deserialize, Serialize}; -use transfer_methods::{TRANSFER_ELF, TRANSFER_ID}; +use transfer_methods::{PINATA_ELF, PINATA_ID, TRANSFER_ELF, TRANSFER_ID}; use transfer_multiple_methods::{TRANSFER_MULTIPLE_ELF, TRANSFER_MULTIPLE_ID}; pub trait Program { @@ -12,7 +12,7 @@ pub struct TransferProgram; impl Program for TransferProgram { const PROGRAM_ID: [u32; 8] = TRANSFER_ID; const PROGRAM_ELF: &[u8] = TRANSFER_ELF; - // Amount to transfer + /// Amount to transfer type InstructionData = u128; } @@ -20,6 +20,14 @@ pub struct TransferMultipleProgram; impl Program for TransferMultipleProgram { const PROGRAM_ID: [u32; 8] = TRANSFER_MULTIPLE_ID; const PROGRAM_ELF: &[u8] = TRANSFER_MULTIPLE_ELF; - // Amounts to transfer + /// Amounts to transfer type InstructionData = Vec; } + +pub struct PinataProgram; +impl Program for PinataProgram { + const PROGRAM_ID: [u32; 8] = TRANSFER_MULTIPLE_ID; + const PROGRAM_ELF: &[u8] = TRANSFER_MULTIPLE_ELF; + /// Preimage of target hash to win price + type InstructionData = [u32; 8]; +} diff --git a/risc0-selective-privacy-poc/transfer_methods/guest/src/bin/pinata.rs b/risc0-selective-privacy-poc/transfer_methods/guest/src/bin/pinata.rs new file mode 100644 index 0000000..95c1f55 --- /dev/null +++ b/risc0-selective-privacy-poc/transfer_methods/guest/src/bin/pinata.rs @@ -0,0 +1,33 @@ +use core::{account::Account, hash}; +use risc0_zkvm::guest::env; + +const TARGET_HASH: [u32; 8] = [1, 2, 3, 4, 5, 6, 7, 8]; +const PINATA_ACCOUNT_ADDR: [u32; 8] = [0xcafe; 8]; +const PINATA_PRICE: u128 = 100; + +/// A PiƱata program +/// To be used both in public and private contexts. +fn main() { + let mut input_accounts: Vec = env::read(); + let preimage: Vec = env::read(); + + assert_eq!(input_accounts.len(), 2); + let [pinata_account] = input_accounts.split_off(1).try_into().unwrap(); + let [winner_account] = input_accounts.try_into().unwrap(); + + assert_eq!(pinata_account.address, PINATA_ACCOUNT_ADDR); + assert_eq!(pinata_account.balance, PINATA_PRICE); + assert_eq!(hash(&preimage), TARGET_HASH); + + let mut winner_account_post = winner_account.clone(); + let mut pinata_account_post = pinata_account.clone(); + pinata_account_post.balance -= PINATA_PRICE; + winner_account_post.balance += PINATA_PRICE; + + env::commit(&vec![ + winner_account, + pinata_account, + winner_account_post, + pinata_account_post, + ]); +} diff --git a/risc0-selective-privacy-poc/transfer_methods/guest/src/bin/transfer.rs b/risc0-selective-privacy-poc/transfer_methods/guest/src/bin/transfer.rs index 1d786ee..26b3d1e 100644 --- a/risc0-selective-privacy-poc/transfer_methods/guest/src/bin/transfer.rs +++ b/risc0-selective-privacy-poc/transfer_methods/guest/src/bin/transfer.rs @@ -1,14 +1,10 @@ use core::account::Account; -use risc0_zkvm::{ - guest::env, - serde::to_vec, - sha::{Impl, Sha256}, -}; +use risc0_zkvm::guest::env; /// A transfer of balance program. /// To be used both in public and private contexts. fn main() { - let mut input_accounts: Vec = env::read(); + let input_accounts: Vec = env::read(); let balance_to_move: u128 = env::read(); assert_eq!(input_accounts.len(), 2);