Skip to main content
The privora-sdk-client crate provides a complete Rust interface for interacting with Privora.

Installation

[dependencies]
privora-sdk-client = { git = "https://github.com/privora-xyz/privora" }
tokio = { version = "1", features = ["full"] }
solana-sdk = "2.0"

PrivoraClient

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

// 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

// 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

// Submit single value
let hash: [u8; 32] = privora.submit(&encrypted).await?;

// Submit batch
let hashes = privora.submit_batch(&encrypted_values).await?;

Transaction Building

let signature = privora
    .transaction()
    .instruction(instruction)
    .with_fhe_data(&[hash])
    .sign(&payer)
    .send()
    .await?;

Complete Example

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(())
}