Documentation Index
Fetch the complete documentation index at: https://docs.orbitflare.com/llms.txt
Use this file to discover all available pages before exploring further.
包含以下内容的配置对象:Commitment 级别(processed、confirmed、finalized)
交易数据的编码格式(base58、base64、jsonParsed)
maxSupportedTransactionVersion
支持的最大交易版本
包含以下内容的对象:numReadonlySignedAccounts
只读已签名账户的数量
numReadonlyUnsignedAccounts
只读未签名账户的数量
代码示例
基本请求
curl https://fra.rpc.orbitflare.com?api_key=YOUR-API-KEY -X POST -H "Content-Type: application/json" -d '{
"jsonrpc": "2.0",
"id": 1,
"method": "getTransaction",
"params": [
"5VERv8NMvzbJMEkV8xnrLkUaQwJJ9C9zV5uZ6cKf7Kq9",
{
"encoding": "jsonParsed"
}
]
}'
使用 web3.js
import { Connection, Transaction } from '@solana/web3.js';
const connection = new Connection('https://fra.rpc.orbitflare.com?api_key=YOUR-API-KEY');
// Get transaction
const signature = '5VERv8NMvzbJMEkV8xnrLkUaQwJJ9C9zV5uZ6cKf7Kq9';
const transaction = await connection.getTransaction(signature, {
encoding: 'jsonParsed'
});
console.log('Transaction:', transaction);
// Get transaction with analysis
async function getTransactionWithAnalysis(
signature: string,
config: { commitment?: string; encoding?: string }
) {
const transaction = await connection.getTransaction(signature, config);
return {
transaction,
analysis: {
success: !transaction.meta.err,
fee: transaction.meta.fee,
balanceChanges: transaction.meta.postBalances.map((post, index) => ({
account: transaction.transaction.message.accountKeys[index],
change: post - transaction.meta.preBalances[index]
})),
tokenBalanceChanges: transaction.meta.postTokenBalances?.map((post, index) => ({
account: post.account,
mint: post.mint,
change: BigInt(post.uiTokenAmount.amount) - BigInt(transaction.meta.preTokenBalances![index].uiTokenAmount.amount)
})),
metadata: {
timestamp: Date.now(),
commitment: config.commitment
}
}
};
}
注意事项
- 返回给定签名的交易详情
- 交易必须已确认才会返回
- 响应包含交易的详细信息
- 可以使用不同的编码格式解析交易
- 签名必须是有效的交易签名
最佳实践
- 根据需求使用适当的 commitment 级别
- 在适当时缓存结果以减少 RPC 负载
- 监控交易状态变化
- 考虑使用 WebSocket 订阅获取实时更新
- 适当处理网络错误并重试
常见错误
| 错误码 | 消息 | 解决方案 |
|---|
| -32601 | Method not found | 验证是否连接到 Solana RPC 节点 |
| -32602 | Invalid params | 检查签名和配置 |
| -32007 | Transaction not found | 验证交易是否存在 |
| -32008 | Invalid encoding | 确保编码格式有效 |
-
交易分析
interface TransactionAnalysis {
signature: string;
transaction: {
success: boolean;
fee: number;
balanceChanges: Array<{ account: string; change: number; }>;
tokenBalanceChanges?: Array<{ account: string; mint: string; change: bigint; }>;
instructions: Array<{ programId: string; accounts: string[]; data: string; }>;
};
metrics: {
totalBalanceChange: number;
instructionCount: number;
accountCount: number;
};
metadata: { timestamp: number; commitment?: string; };
}
class TransactionAnalyzer {
async analyzeTransaction(
signature: string,
config: { commitment?: string; encoding?: string }
): Promise<TransactionAnalysis> {
const transaction = await connection.getTransaction(signature, config);
return {
signature,
transaction: {
success: !transaction.meta.err,
fee: transaction.meta.fee,
balanceChanges: transaction.meta.postBalances.map((post, index) => ({
account: transaction.transaction.message.accountKeys[index],
change: post - transaction.meta.preBalances[index]
})),
instructions: transaction.transaction.message.instructions.map(ix => ({
programId: transaction.transaction.message.accountKeys[ix.programIdIndex],
accounts: ix.accounts.map(index => transaction.transaction.message.accountKeys[index]),
data: ix.data
}))
},
metrics: {
totalBalanceChange: transaction.meta.postBalances.reduce((sum, post, index) =>
sum + (post - transaction.meta.preBalances[index]), 0),
instructionCount: transaction.transaction.message.instructions.length,
accountCount: transaction.transaction.message.accountKeys.length
},
metadata: {
timestamp: Date.now(),
commitment: config.commitment
}
};
}
}
-
交易监控
interface TransactionChange {
signature: string;
changes: {
status: 'confirmed' | 'failed' | 'dropped';
previousStatus?: 'confirmed' | 'failed' | 'dropped';
error?: any;
};
metadata: { timestamp: number; };
}
class TransactionMonitor {
private previousTransactions: Map<string, {
status: 'confirmed' | 'failed' | 'dropped';
error?: any;
}> = new Map();
async monitorTransaction(
signature: string,
config: { commitment?: string; encoding?: string }
): Promise<TransactionChange | null> {
const transaction = await connection.getTransaction(signature, config);
const currentStatus = transaction ? (transaction.meta.err ? 'failed' : 'confirmed') : 'dropped';
const previous = this.previousTransactions.get(signature);
if (previous && (previous.status !== currentStatus || previous.error !== transaction?.meta.err)) {
this.previousTransactions.set(signature, { status: currentStatus, error: transaction?.meta.err });
return {
signature,
changes: { status: currentStatus, previousStatus: previous.status, error: transaction?.meta.err },
metadata: { timestamp: Date.now() }
};
}
this.previousTransactions.set(signature, { status: currentStatus, error: transaction?.meta.err });
return null;
}
}