Optimize Compute Requested
Learn how to optimize compute unit requests for Solana transactions to reduce costs and improve efficiency.
Code Example
#!/usr/bin/env python3
"""
Solana Cookbook - How to Optimize Compute Requested
"""
import asyncio
from solana.rpc.async_api import AsyncClient
from solders.keypair import Keypair
from solders.system_program import transfer, TransferParams
from solders.transaction import VersionedTransaction
from solders.message import MessageV0
from solders.compute_budget import set_compute_unit_limit, set_compute_unit_price
async def get_simulation_compute_units(rpc, instructions, payer_pubkey, lookup_tables=[]):
"""Simulate transaction to get actual compute units needed"""
try:
recent_blockhash = await rpc.get_latest_blockhash()
message = MessageV0.try_compile(
payer=payer_pubkey,
instructions=instructions,
address_lookup_table_accounts=lookup_tables,
recent_blockhash=recent_blockhash.value.blockhash
)
transaction = VersionedTransaction(message, [])
simulation_result = await rpc.simulate_transaction(transaction)
if simulation_result.value.err:
print(f"Simulation error: {simulation_result.value.err}")
return 200000 # Fallback value
units_consumed = simulation_result.value.units_consumed
if units_consumed:
return units_consumed
else:
return 200000 # Fallback value
except Exception as e:
print(f"Error during simulation: {e}")
return 200000 # Fallback value
async def build_optimal_transaction(rpc, instructions, signer, lookup_tables=[]):
"""Build optimal transaction with precise compute unit limits"""
micro_lamports = 100 # Priority fee per compute unit
units = await get_simulation_compute_units(rpc, instructions, signer.pubkey(), lookup_tables)
recent_blockhash = await rpc.get_latest_blockhash()
# Add compute budget instructions
compute_budget_instructions = [
set_compute_unit_limit(units),
set_compute_unit_price(micro_lamports)
]
all_instructions = compute_budget_instructions + instructions
message = MessageV0.try_compile(
payer=signer.pubkey(),
instructions=all_instructions,
address_lookup_table_accounts=lookup_tables,
recent_blockhash=recent_blockhash.value.blockhash
)
return VersionedTransaction(message, [signer])
async def main():
rpc = AsyncClient("https://api.devnet.solana.com")
sender = Keypair()
recipient = Keypair()
amount = 1_000_000_000 # 1 SOL
async with rpc:
# Create transfer instruction
transfer_instruction = transfer(
TransferParams(
from_pubkey=sender.pubkey(),
to_pubkey=recipient.pubkey(),
lamports=amount
)
)
# Build optimized transaction
optimized_transaction = await build_optimal_transaction(
rpc,
[transfer_instruction],
sender
)
print(f"Sender: {sender.pubkey()}")
print(f"Recipient: {recipient.pubkey()}")
print(f"Transfer Amount: {amount / 1_000_000_000} SOL")
print(f"Optimized transaction created successfully")
if __name__ == "__main__":
asyncio.run(main())
Explanation
This example demonstrates how to optimize compute unit requests:
- Simulate Transaction: Use
simulate_transaction()
to get actual compute units needed - Get Optimal Units: Determine the precise compute units required
- Set Compute Limits: Use
set_compute_unit_limit()
to avoid overpaying - Add Priority Fees: Set compute unit price for priority processing
- Build Optimal Transaction: Combine all instructions efficiently
Key Concepts
- Compute Units: Measure of computational resources needed for transaction processing
- Compute Budget Program: System program for managing compute unit limits and pricing
- Transaction Simulation: Testing transaction execution without actually submitting it
- Compute Unit Limit: Maximum compute units a transaction can consume
- Compute Unit Price: Price per compute unit in micro-lamports
Usage
To run this example:
-
Install required dependencies:
pip install solana-py solders
-
Run the script:
python optimize_compute_requested.py
Benefits
- Cost Reduction: Pay only for actual compute units used
- Efficiency: Avoid over-allocating compute resources
- Faster Processing: Optimal compute budgets can improve transaction processing
- Network Health: Better resource utilization for the network
Best Practices
- Always Simulate: Use transaction simulation before submission
- Add Buffer: Add small buffer (10-20%) to simulation results
- Monitor Usage: Track compute unit consumption patterns
- Update Regularly: Recheck compute requirements as programs change
Note: Compute unit optimization is especially important for complex transactions and during network congestion.