Crate light_sdk

Crate light_sdk 

Source
Expand description

The base library to use Compressed Accounts in Solana on-chain Rust and Anchor programs.

Compressed Accounts stores state as account hashes in State Merkle trees. and unique addresses in Address Merkle trees. Validity proofs (zero-knowledge proofs) verify that compressed account state exists and new addresses do not exist yet.

  • No rent exemption payment required.
  • Constant 128-byte validity proof per transaction for one or multiple compressed accounts and addresses.
  • Compressed account data is sent as instruction data when accessed.
  • State and address trees are managed by the protocol.

For full program examples, see the Program Examples. For detailed documentation, visit zkcompression.com. For pinocchio solana program development see light-sdk-pinocchio. For rust client developement see light-client. For rust program testing see light-program-test. For local test validator with light system programs see Light CLI.

ยงUsing Compressed Accounts in Solana Programs

  1. Instruction
    • CompressedAccountMeta - Compressed account metadata structs for instruction data.
    • PackedAccounts - Abstraction to prepare accounts offchain for instructions with compressed accounts.
    • ValidityProof - Proves that new addresses donโ€™t exist yet, and compressed account state exists.
  2. Compressed Account in Program
  3. Cpi
 โ”œโ”€ ๐‚๐ฅ๐ข๐ž๐ง๐ญ
 โ”‚  โ”œโ”€ Get ValidityProof from RPC.
 โ”‚  โ”œโ”€ pack accounts with PackedAccounts into PackedAddressTreeInfo and PackedStateTreeInfo.
 โ”‚  โ”œโ”€ pack CompressedAccountMeta.
 โ”‚  โ”œโ”€ Build Instruction from PackedAccounts and CompressedAccountMetas.
 โ”‚  โ””โ”€ Send transaction.
 โ”‚
 โ””โ”€ ๐‚๐ฎ๐ฌ๐ญ๐จ๐ฆ ๐๐ซ๐จ๐ ๐ซ๐š๐ฆ
    โ”œโ”€ CpiAccounts parse accounts consistent with PackedAccounts.
    โ”œโ”€ LightAccount instantiates from CompressedAccountMeta.
    โ”‚
    โ””โ”€ ๐‹๐ข๐ ๐ก๐ญ ๐’๐ฒ๐ฌ๐ญ๐ž๐ฆ ๐๐ซ๐จ๐ ๐ซ๐š๐ฆ ๐‚๐๐ˆ
       โ”œโ”€ Verify ValidityProof.
       โ”œโ”€ Update State Merkle tree.
       โ”œโ”€ Update Address Merkle tree.
       โ””โ”€ Complete atomic state transition.

ยงFeatures

  1. anchor - Derives AnchorSerialize, AnchorDeserialize instead of BorshSerialize, BorshDeserialize.

  2. v2

    • available on devnet, localnet, and light-program-test.
    • Support for optimized v2 light system program instructions.
  3. cpi-context - Enables CPI context operations for batched compressed account operations.

    • available on devnet, localnet, and light-program-test.
    • Enables the use of one validity proof across multiple cpis from different programs in one instruction.
    • For example spending compressed tokens (owned by the ctoken program) and updating a compressed pda (owned by a custom program) with one validity proof.
    • An instruction should not use more than one validity proof.
    • Requires the v2 feature.

ยงExample Solana program code to create a compressed account

โ“˜
use anchor_lang::{prelude::*, Discriminator};
use light_sdk::{
    account::LightAccount,
    address::v1::derive_address,
    cpi::{v1::LightSystemProgramCpi, CpiAccounts, InvokeLightSystemProgram, LightCpiInstruction},
    derive_light_cpi_signer,
    instruction::{account_meta::CompressedAccountMeta, PackedAddressTreeInfo},
    CpiSigner, LightDiscriminator, LightHasher, ValidityProof,
};

declare_id!("2tzfijPBGbrR5PboyFUFKzfEoLTwdDSHUjANCw929wyt");

pub const LIGHT_CPI_SIGNER: CpiSigner =
    derive_light_cpi_signer!("2tzfijPBGbrR5PboyFUFKzfEoLTwdDSHUjANCw929wyt");

#[program]
pub mod counter {

    use super::*;

    pub fn create_compressed_account<'info>(
        ctx: Context<'_, '_, '_, 'info, CreateCompressedAccount<'info>>,
        proof: ValidityProof,
        address_tree_info: PackedAddressTreeInfo,
        output_tree_index: u8,
    ) -> Result<()> {
        let light_cpi_accounts = CpiAccounts::new(
            ctx.accounts.fee_payer.as_ref(),
            ctx.remaining_accounts,
            crate::LIGHT_CPI_SIGNER,
        )?;

        let (address, address_seed) = derive_address(
            &[b"counter", ctx.accounts.fee_payer.key().as_ref()],
            &address_tree_info.get_tree_pubkey(&light_cpi_accounts)?,
            &crate::ID,
        );
        let new_address_params = address_tree_info
            .into_new_address_params_packed(address_seed);

        let mut my_compressed_account = LightAccount::<CounterAccount>::new_init(
            &crate::ID,
            Some(address),
            output_tree_index,
        );

        my_compressed_account.owner = ctx.accounts.fee_payer.key();

        LightSystemProgramCpi::new_cpi(crate::LIGHT_CPI_SIGNER, proof)
            .with_light_account(my_compressed_account)?
            .with_new_addresses(&[new_address_params])
            .invoke(light_cpi_accounts)
    }
}

#[derive(Accounts)]
pub struct CreateCompressedAccount<'info> {
   #[account(mut)]
   pub fee_payer: Signer<'info>,
}

#[derive(Clone, Debug, Default, LightDiscriminator)]
pub struct CounterAccount {
   pub owner: Pubkey,
   pub counter: u64
}

Re-exportsยง

pub use account::sha::LightAccount;
pub use light_account_checks;
pub use light_hasher;

Modulesยง

account
Compressed account abstraction similar to anchor Account.
address
Functions to derive compressed account addresses.
constants
cpi
Utilities to invoke the light-system-program via cpi.
error
instruction
Utilities to build instructions for programs with compressed accounts.
legacy
Legacy types re-imported from programs which should be removed as soon as possible.
token
transfer
Transfer compressed sol between compressed accounts.
utils

Macrosยง

derive_light_cpi_signer
Derives a complete Light Protocol CPI configuration at runtime
derive_light_cpi_signer_pda
Derives a Light Protocol CPI signer PDA at compile time
find_cpi_signer_macro

Structsยง

CpiSigner
Configuration struct containing program ID, CPI signer, and bump for Light Protocol

Traitsยง

LightDiscriminator
PubkeyTrait

Attribute Macrosยง

light_system_accounts
Adds required fields to your anchor instruction for applying a zk-compressed state transition.

Derive Macrosยง

LightDiscriminator
LightHasher
Makes the annotated struct hashable by implementing the following traits:
LightHasherSha
SHA256 variant of the LightHasher derive macro.
LightTraits
Implements traits on the given struct required for invoking The Light system program via CPI.