privora-sdk-client crate provides a complete Rust interface for interacting with Privora.
Installation
Copy
[dependencies]
privora-sdk-client = { git = "https://github.com/privora-xyz/privora" }
tokio = { version = "1", features = ["full"] }
solana-sdk = "2.0"
PrivoraClient
Copy
use privora_sdk_client::prelude::*;
// Connect to sequencer
let privora = PrivoraClient::new("http://localhost:8899").await?;
// Get encryptor
let encryptor = privora.encryptor();
// Create user crypto
let user_crypto = privora.user_crypto(&keypair)?;
FheEncryptor
Copy
// Type-safe encryption
let encrypted_u8: ClientEncrypted<u8> = encryptor.encrypt(100u8)?;
let encrypted_u64: ClientEncrypted<u64> = encryptor.encrypt(1000000u64)?;
// Batch encryption
let encrypted_batch = encryptor.encrypt_batch(&[1u8, 2, 3, 4, 5])?;
UserCrypto
Copy
// From Solana keypair
let user_crypto = UserCrypto::from_keypair(&keypair)?;
// Add recovery
let with_recovery = user_crypto.add_recovery(encrypted, &plaintext_bytes)?;
// Decrypt recovery
let plaintext = user_crypto.decrypt_recovery(recovery)?;
Data Submission
Copy
// Submit single value
let hash: [u8; 32] = privora.submit(&encrypted).await?;
// Submit batch
let hashes = privora.submit_batch(&encrypted_values).await?;
Transaction Building
Copy
let signature = privora
.transaction()
.instruction(instruction)
.with_fhe_data(&[hash])
.sign(&payer)
.send()
.await?;
Complete Example
Copy
use privora_sdk_client::prelude::*;
use solana_sdk::signature::Keypair;
#[tokio::main]
async fn main() -> Result<()> {
let privora = PrivoraClient::new("http://localhost:8899").await?;
let payer = Keypair::new();
let user_crypto = privora.user_crypto(&payer)?;
// Encrypt with recovery
let value = 100u8;
let encrypted = privora.encryptor().encrypt(value)?;
let with_recovery = user_crypto.add_recovery(encrypted, &value.to_le_bytes())?;
// Submit
let hash = privora.submit(&with_recovery).await?;
// Build instruction
let mut data = vec![0u8];
data.extend_from_slice(&hash);
let instruction = Instruction {
program_id: PROGRAM_ID,
accounts: vec![AccountMeta::new(payer.pubkey(), true)],
data,
};
// Send transaction
let signature = privora
.transaction()
.instruction(instruction)
.with_fhe_data(&[hash])
.sign(&payer)
.send()
.await?;
println!("Transaction: {}", signature);
Ok(())
}