跳转到主要内容

参数

signature
string
必填
交易签名(base-58 编码)
config
object
包含以下内容的配置对象:
commitment
string
Commitment 级别(processed、confirmed、finalized)
encoding
string
交易数据的编码格式(base58、base64、jsonParsed)
maxSupportedTransactionVersion
number
支持的最大交易版本

响应

result
object
包含以下内容的对象:
slot
number
处理交易的 slot
transaction
object
message
object
header
object
numRequiredSignatures
number
所需签名的数量
numReadonlySignedAccounts
number
只读已签名账户的数量
numReadonlyUnsignedAccounts
number
只读未签名账户的数量
accountKeys
array
账户公钥数组(base-58 编码)
recentBlockhash
string
交易使用的近期 blockhash
instructions
array
指令对象数组,包含:
programId
string
程序 ID(base-58 编码)
accounts
array
账户索引数组
data
string
指令数据(base-58 编码)
signatures
array
交易签名数组(base-58 编码)
meta
object
err
object
如果交易失败则为错误对象
fee
number
交易支付的手续费
preBalances
array
交易前的账户余额数组
postBalances
array
交易后的账户余额数组
innerInstructions
array
内部指令对象数组
logMessages
array
日志消息数组
preTokenBalances
array
交易前的代币余额数组
postTokenBalances
array
交易后的代币余额数组
rewards
array
奖励对象数组

代码示例

基本请求

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
      }
    }
  };
}

注意事项

  1. 返回给定签名的交易详情
  2. 交易必须已确认才会返回
  3. 响应包含交易的详细信息
  4. 可以使用不同的编码格式解析交易
  5. 签名必须是有效的交易签名

最佳实践

  1. 根据需求使用适当的 commitment 级别
  2. 在适当时缓存结果以减少 RPC 负载
  3. 监控交易状态变化
  4. 考虑使用 WebSocket 订阅获取实时更新
  5. 适当处理网络错误并重试

常见错误

错误码消息解决方案
-32601Method not found验证是否连接到 Solana RPC 节点
-32602Invalid params检查签名和配置
-32007Transaction not found验证交易是否存在
-32008Invalid encoding确保编码格式有效

用例

  1. 交易分析
    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
          }
        };
      }
    }
    
  2. 交易监控
    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;
      }
    }