2025-10-07 21:20:00 +08:00
|
|
|
|
# Nonce 使用指南
|
2025-09-19 00:49:45 +08:00
|
|
|
|
|
2025-10-07 21:20:00 +08:00
|
|
|
|
本指南介绍如何在 Sol Trade SDK 中使用 Durable Nonce 来实现交易重放保护和优化交易处理。
|
2025-09-19 00:49:45 +08:00
|
|
|
|
|
2025-10-07 21:20:00 +08:00
|
|
|
|
## 📋 什么是 Durable Nonce?
|
2025-09-19 00:49:45 +08:00
|
|
|
|
|
2025-10-07 21:20:00 +08:00
|
|
|
|
Durable Nonce 是 Solana 的一项功能,允许您创建在较长时间内有效的交易,而不受最近区块哈希的 150 个区块限制。
|
2025-09-19 00:49:45 +08:00
|
|
|
|
|
|
|
|
|
|
## 🚀 核心优势
|
|
|
|
|
|
|
|
|
|
|
|
- **交易重放保护**: 防止相同交易被重复执行
|
|
|
|
|
|
- **时间窗口扩展**: 交易可在更长时间内保持有效
|
|
|
|
|
|
- **网络性能优化**: 减少对最新区块哈希的依赖
|
|
|
|
|
|
- **交易确定性**: 提供一致的交易处理体验
|
|
|
|
|
|
- **离线交易支持**: 支持预签名交易的离线处理
|
|
|
|
|
|
|
|
|
|
|
|
## 🛠️ 实现方法
|
|
|
|
|
|
|
|
|
|
|
|
### 前提:
|
|
|
|
|
|
|
|
|
|
|
|
需要先创建你 payer 账号使用的 nonce 账户。
|
|
|
|
|
|
参考资料: https://solana.com/zh/developers/guides/advanced/introduction-to-durable-nonces
|
|
|
|
|
|
|
2025-10-07 21:20:00 +08:00
|
|
|
|
### 1. 获取 Nonce 信息
|
2025-09-19 00:49:45 +08:00
|
|
|
|
|
2025-10-07 21:20:00 +08:00
|
|
|
|
从 RPC 直接获取 nonce 信息:
|
2025-09-19 00:49:45 +08:00
|
|
|
|
|
|
|
|
|
|
```rust
|
2025-10-07 21:20:00 +08:00
|
|
|
|
use sol_trade_sdk::common::nonce_cache::fetch_nonce_info;
|
|
|
|
|
|
use solana_sdk::pubkey::Pubkey;
|
|
|
|
|
|
use std::str::FromStr;
|
2025-09-19 00:49:45 +08:00
|
|
|
|
|
|
|
|
|
|
// 设置 nonce 账户
|
2025-10-07 21:20:00 +08:00
|
|
|
|
let nonce_account = Pubkey::from_str("your_nonce_account_address_here")?;
|
|
|
|
|
|
|
|
|
|
|
|
// 获取 nonce 信息
|
|
|
|
|
|
let durable_nonce = fetch_nonce_info(&client.rpc, nonce_account).await;
|
2025-09-19 00:49:45 +08:00
|
|
|
|
```
|
|
|
|
|
|
|
2025-10-07 21:20:00 +08:00
|
|
|
|
### 2. 在交易中使用 Nonce
|
2025-09-19 00:49:45 +08:00
|
|
|
|
|
2025-09-21 21:56:17 +08:00
|
|
|
|
设置 nonce 参数:durable_nonce
|
2025-09-19 00:49:45 +08:00
|
|
|
|
|
|
|
|
|
|
```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-21 21:56:17 +08:00
|
|
|
|
recent_blockhash: Some(recent_blockhash),
|
2025-09-19 00:49:45 +08:00
|
|
|
|
extension_params: Box::new(PumpFunParams::from_trade(&trade_info, None)),
|
|
|
|
|
|
wait_transaction_confirmed: true,
|
|
|
|
|
|
create_wsol_ata: false,
|
|
|
|
|
|
close_wsol_ata: false,
|
|
|
|
|
|
create_mint_ata: true,
|
|
|
|
|
|
open_seed_optimize: false,
|
2025-10-07 21:20:00 +08:00
|
|
|
|
durable_nonce: durable_nonce, // 设置 durable nonce
|
2025-09-19 00:49:45 +08:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
// 执行交易
|
|
|
|
|
|
client.buy(buy_params).await?;
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2025-10-07 21:20:00 +08:00
|
|
|
|
## 🔄 Nonce 使用流程
|
2025-09-19 00:49:45 +08:00
|
|
|
|
|
2025-10-07 21:20:00 +08:00
|
|
|
|
1. **获取**: 从 RPC 获取最新 nonce 值
|
|
|
|
|
|
2. **使用**: 在交易中设置 nonce 参数
|
|
|
|
|
|
3. **刷新**: 下次使用前重新调用 `fetch_nonce_info` 获取新的 nonce 值
|
2025-09-19 00:49:45 +08:00
|
|
|
|
|
|
|
|
|
|
## 🔗 相关文档
|
|
|
|
|
|
|
2025-10-07 21:20:00 +08:00
|
|
|
|
- [示例:Durable Nonce](../examples/nonce_cache/)
|