Files
sol-trade-sdk/docs/NONCE_CACHE.md
T

87 lines
2.9 KiB
Markdown
Raw Normal View History

# Nonce Cache Guide
This guide explains how to use Nonce Cache in Sol Trade SDK to implement transaction replay protection and optimize transaction processing.
## 📋 What is Nonce Cache?
2025-09-19 18:02:11 +08:00
Nonce Cache is a global singleton cache system for managing durable nonce accounts in the Solana network. Durable nonce is a Solana feature that allows you to create transactions that remain valid for extended periods, beyond the 150-block limitation of recent block hashes.
## 🚀 Core Benefits
2025-09-19 18:02:11 +08:00
- **Transaction Replay Protection**: Prevents identical transactions from being executed multiple times
- **Extended Time Window**: Transactions can remain valid for longer periods
2025-09-19 18:02:11 +08:00
- **Network Performance Optimization**: Reduces dependency on the latest block hash
- **Transaction Determinism**: Provides consistent transaction processing experience
- **Offline Transaction Support**: Supports offline processing of pre-signed transactions
## 🛠️ Implementation
### Prerequisites:
You need to create a nonce account for your payer account first.
Reference: https://solana.com/developers/guides/advanced/introduction-to-durable-nonces
### 1. Initialize Nonce Cache
First, set up the nonce account and initialize the cache:
```rust
use sol_trade_sdk::common::nonce_cache::NonceCache;
2025-09-19 18:02:11 +08:00
// Set up nonce account
let nonce_account_str = "your_nonce_account_address_here";
NonceCache::get_instance().init(Some(nonce_account_str.to_string()));
```
### 2. Fetch Nonce Information
Get the latest nonce information from RPC:
```rust
// Fetch and update nonce information
NonceCache::get_instance().fetch_nonce_info_use_rpc(&client.rpc).await?;
2025-09-19 18:02:11 +08:00
// Or manually manage nonce
// NonceCache::get_instance().update_nonce_info_partial(nonce_account, current_nonce, used);
let nonce_info = NonceCache::get_instance().get_nonce_info();
let current_nonce = nonce_info.current_nonce;
2025-09-19 18:02:11 +08:00
let nonce_account = nonce_info.nonce_account;
println!("Current nonce: {}", current_nonce);
```
### 3. Use Nonce in Transactions
2025-09-19 18:02:11 +08:00
Set nonce parameters: nonce_account and current_nonce
```rust
let buy_params = sol_trade_sdk::TradeBuyParams {
dex_type: DexType::PumpFun,
mint: mint_pubkey,
sol_amount: buy_sol_amount,
slippage_basis_points: Some(100),
2025-09-19 18:02:11 +08:00
recent_blockhash: recent_blockhash,
extension_params: Box::new(PumpFunParams::from_trade(&trade_info, None)),
lookup_table_key: None,
wait_transaction_confirmed: true,
create_wsol_ata: false,
close_wsol_ata: false,
create_mint_ata: true,
open_seed_optimize: false,
2025-09-19 18:02:11 +08:00
nonce_account: nonce_account, // Set nonce account
current_nonce: Some(current_nonce), // Set nonce value
};
// Execute transaction
client.buy(buy_params).await?;
```
## 🔄 Nonce Lifecycle
1. **Initialize**: Set nonce account address
2. **Fetch**: Get the latest nonce value from RPC
2025-09-19 18:02:11 +08:00
3. **Use**: Set nonce parameters in transactions
4. **Refresh**: Fetch new nonce value before next use
## 🔗 Related Documentation
2025-09-19 18:02:11 +08:00
- [Example: Nonce Cache](../examples/nonce_cache/)