Skip to main content

Overview

The account_compress syscall compresses an account by setting the COMPRESSED flag and providing a state proof. This allows the account data to be stored more efficiently while maintaining verifiability.

Syscall Code

Code: 0x08 (TN_SYSCALL_CODE_ACCOUNT_COMPRESS)

C SDK Function

ulong tsys_account_compress(ulong account_idx, void const* proof, ulong proof_sz);

Arguments

account_idx
ulong
required
Index of the account to compress. Must be writable in the transaction.
proof
void const*
required
Pointer to the state proof data.
proof_sz
ulong
required
Size of the state proof data in bytes.

Return Value

Returns a syscall result code:
Success
ulong
  • TN_VM_SYSCALL_SUCCESS (0) - Account compressed successfully
  • 0 (special case) - Ephemeral account deleted instead of compressed
Error Codes
ulong
  • TN_VM_ERR_SYSCALL_INVALID_ACCOUNT_INDEX (-7) - Account index out of bounds
  • TN_VM_ERR_SYSCALL_ACCOUNT_DOES_NOT_EXIST (-8) - Account does not exist
  • TN_VM_ERR_SYSCALL_ACCOUNT_NOT_WRITABLE (-26) - Account not writable in transaction
  • TN_VM_ERR_SYSCALL_TXN_HAS_COMPRESSED_ACCOUNT (-36) - Transaction already has a compressed account
  • TN_VM_ERR_SYSCALL_INVALID_PROOF_LEN (-31) - Proof size mismatch
  • TN_VM_ERR_SYSCALL_INVALID_PROOF_SLOT (-32) - Proof references invalid block slot
  • TN_VM_ERR_SYSCALL_INVALID_STATE_PROOF (-22) - State proof verification failed

Resource Consumption

Compute Units

  • Base cost: TN_VM_SYSCALL_BASE_COST (512 units)
  • Proof cost: Additional units equal to proof size in bytes
  • Data cost: Additional units equal to account data size in bytes
  • Metadata cost: Additional units equal to sizeof(tn_account_meta_t)
  • Total formula: base_cost + proof_sz + account_data_sz + sizeof(tn_account_meta_t)

Memory Pages

  • Page usage: No immediate page deallocation (compression is logical)
  • Proof storage: Temporary memory for proof verification
  • Metadata impact: Account metadata becomes writable if not already

Side Effects

  • Account state: Sets COMPRESSED flag and updates state counter
  • Transaction state: Records compression proof for transaction
  • Special handling: Ephemeral and deleted accounts are deleted instead

Special Cases

  • Ephemeral Accounts
  • Deleted Accounts
  • New Accounts
Ephemeral accounts are simply deleted when “compressed” - they cannot be truly compressed since they don’t persist beyond the transaction.

State Proof Requirements

  • New accounts: Must use TN_STATE_PROOF_TYPE_CREATION proof type
  • Existing accounts: Must use TN_STATE_PROOF_TYPE_EXISTING proof type
  • Proof verification: Must reference valid block slot and verify against state root
  • Account hash: Proof must match the computed hash of the account’s current state

Transaction Limitations

  • Only one account can be compressed per transaction
  • The transaction records the compression proof and account details
  • Compression state is tracked to prevent multiple compressions

Usage Notes

  • Account must be writable in the transaction (signer approval)
  • State proof ensures the account state is correctly recorded
  • Compressed accounts can later be decompressed with valid proofs
  • The account’s state counter is updated to the proof block’s counter

Example

#include "tn_sdk_syscall.h"

// Compress an account with state proof
ulong account_idx = 2;
uchar proof_data[2048];
ulong proof_size = prepare_compression_proof(account_idx, proof_data);

ulong result = tsys_account_compress(account_idx, proof_data, proof_size);

if (result == TN_VM_SYSCALL_SUCCESS) {
    // Account compressed successfully
    // COMPRESSED flag set
    // State counter updated
    // Compression proof recorded in transaction
}