> ## 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.

# getTransaction

> 返回给定签名的交易详情

## 参数

<ResponseField name="signature" type="string" required>
  交易签名（base-58 编码）
</ResponseField>

<ResponseField name="config" type="object" optional>
  包含以下内容的配置对象：

  <ResponseField name="commitment" type="string" optional>
    Commitment 级别（processed、confirmed、finalized）
  </ResponseField>

  <ResponseField name="encoding" type="string" optional>
    交易数据的编码格式（base58、base64、jsonParsed）
  </ResponseField>

  <ResponseField name="maxSupportedTransactionVersion" type="number" optional>
    支持的最大交易版本
  </ResponseField>
</ResponseField>

## 响应

<ResponseField name="result" type="object">
  包含以下内容的对象：

  <ResponseField name="slot" type="number">
    处理交易的 slot
  </ResponseField>

  <ResponseField name="transaction" type="object">
    <ResponseField name="message" type="object">
      <ResponseField name="header" type="object">
        <ResponseField name="numRequiredSignatures" type="number">
          所需签名的数量
        </ResponseField>

        <ResponseField name="numReadonlySignedAccounts" type="number">
          只读已签名账户的数量
        </ResponseField>

        <ResponseField name="numReadonlyUnsignedAccounts" type="number">
          只读未签名账户的数量
        </ResponseField>
      </ResponseField>

      <ResponseField name="accountKeys" type="array">
        账户公钥数组（base-58 编码）
      </ResponseField>

      <ResponseField name="recentBlockhash" type="string">
        交易使用的近期 blockhash
      </ResponseField>

      <ResponseField name="instructions" type="array">
        指令对象数组，包含：

        <ResponseField name="programId" type="string">
          程序 ID（base-58 编码）
        </ResponseField>

        <ResponseField name="accounts" type="array">
          账户索引数组
        </ResponseField>

        <ResponseField name="data" type="string">
          指令数据（base-58 编码）
        </ResponseField>
      </ResponseField>
    </ResponseField>

    <ResponseField name="signatures" type="array">
      交易签名数组（base-58 编码）
    </ResponseField>
  </ResponseField>

  <ResponseField name="meta" type="object">
    <ResponseField name="err" type="object" optional>
      如果交易失败则为错误对象
    </ResponseField>

    <ResponseField name="fee" type="number">
      交易支付的手续费
    </ResponseField>

    <ResponseField name="preBalances" type="array">
      交易前的账户余额数组
    </ResponseField>

    <ResponseField name="postBalances" type="array">
      交易后的账户余额数组
    </ResponseField>

    <ResponseField name="innerInstructions" type="array" optional>
      内部指令对象数组
    </ResponseField>

    <ResponseField name="logMessages" type="array" optional>
      日志消息数组
    </ResponseField>

    <ResponseField name="preTokenBalances" type="array" optional>
      交易前的代币余额数组
    </ResponseField>

    <ResponseField name="postTokenBalances" type="array" optional>
      交易后的代币余额数组
    </ResponseField>

    <ResponseField name="rewards" type="array" optional>
      奖励对象数组
    </ResponseField>
  </ResponseField>
</ResponseField>

## 代码示例

### 基本请求

```bash theme={null}
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

```typescript theme={null}
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. 适当处理网络错误并重试

## 常见错误

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

## 用例

1. **交易分析**
   ```typescript theme={null}
   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. **交易监控**
   ```typescript theme={null}
   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;
     }
   }
   ```
