跳转到主要内容

参数

address
string
必填
账户地址(base-58 编码)
config
object

响应

result
array
签名信息对象数组
signature
string
交易签名(base-58 编码)
slot
number
处理交易的 slot
err
object
如果交易失败则为错误信息,成功则为 null
memo
string
与交易关联的备忘录
blockTime
number
交易处理的 Unix 时间戳
confirmationStatus
string
交易确认状态

代码示例

基本请求

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": "getSignaturesForAddress",
  "params": [
    "ADDRESS"
  ]
}'

带配置的请求

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": "getSignaturesForAddress",
  "params": [
    "ADDRESS",
    {
      "limit": 100,
      "before": "SIGNATURE",
      "commitment": "confirmed"
    }
  ]
}'

使用 web3.js

import { Connection, PublicKey } from '@solana/web3.js';

const connection = new Connection('https://fra.rpc.orbitflare.com?api_key=YOUR-API-KEY');

// Get signatures for address
const signatures = await connection.getSignaturesForAddress(
  new PublicKey('ADDRESS')
);
console.log('Signatures:', signatures);

// Get paginated signatures
async function getPaginatedSignatures(
  address: PublicKey,
  limit: number = 100,
  before?: string
) {
  const signatures = await connection.getSignaturesForAddress(address, {
    limit,
    before
  });
  
  return signatures.map(signature => ({
    signature: signature.signature,
    slot: signature.slot,
    success: !signature.err,
    timestamp: signature.blockTime,
    status: signature.confirmationStatus
  }));
}

注意事项

  1. 返回地址的已确认交易签名
  2. 结果按时间倒序返回
  3. 可以使用 before 参数实现分页
  4. 响应是即时的,因为它从当前状态读取
  5. 可以指定不同的 commitment 级别

最佳实践

  1. 根据需求使用适当的限制数量
  2. 对大型结果集实现分页
  3. 在适当时缓存结果以减少 RPC 负载
  4. 考虑使用 WebSocket 订阅获取实时更新
  5. 适当处理网络错误并重试

常见错误

错误码消息解决方案
-32601Method not found验证是否连接到 Solana RPC 节点
-32602Invalid params检查地址和配置参数
-32007Signature information unavailable节点可能正在启动或同步中

用例

  1. 交易历史
    interface TransactionHistory {
      transactions: Array<{
        signature: string;
        slot: number;
        success: boolean;
        timestamp: number;
        status: string;
      }>;
      metadata: {
        total: number;
        startTime: number;
        endTime: number;
      };
    }
    
    async function getTransactionHistory(
      address: PublicKey,
      limit: number = 100
    ): Promise<TransactionHistory> {
      const signatures = await connection.getSignaturesForAddress(address, { limit });
      
      return {
        transactions: signatures.map(signature => ({
          signature: signature.signature,
          slot: signature.slot,
          success: !signature.err,
          timestamp: signature.blockTime || 0,
          status: signature.confirmationStatus || 'unknown'
        })),
        metadata: {
          total: signatures.length,
          startTime: signatures[0]?.blockTime || 0,
          endTime: signatures[signatures.length - 1]?.blockTime || 0
        }
      };
    }
    
  2. 交易监控
    interface TransactionAlert {
      type: 'new' | 'failed' | 'status_change';
      signature: string;
      previousStatus: string | null;
      currentStatus: string;
      metadata: { timestamp: number; slot: number; };
    }
    
    class TransactionMonitor {
      private previousSignatures: Map<string, any> = new Map();
      
      async monitorTransactions(
        address: PublicKey,
        interval: number = 5000
      ): Promise<TransactionAlert[]> {
        const signatures = await connection.getSignaturesForAddress(address, { limit: 10 });
        const alerts: TransactionAlert[] = [];
        
        signatures.forEach(signature => {
          const previous = this.previousSignatures.get(signature.signature);
          
          if (!previous) {
            alerts.push({
              type: 'new',
              signature: signature.signature,
              previousStatus: null,
              currentStatus: signature.confirmationStatus || 'unknown',
              metadata: { timestamp: Date.now(), slot: signature.slot }
            });
          } else if (previous.confirmationStatus !== signature.confirmationStatus) {
            alerts.push({
              type: 'status_change',
              signature: signature.signature,
              previousStatus: previous.confirmationStatus,
              currentStatus: signature.confirmationStatus || 'unknown',
              metadata: { timestamp: Date.now(), slot: signature.slot }
            });
          }
          
          this.previousSignatures.set(signature.signature, signature);
        });
        
        return alerts;
      }
    }
    
  3. 交易分析
    interface TransactionAnalysis {
      total: number;
      successful: number;
      failed: number;
      statusDistribution: Record<string, number>;
      timeDistribution: {
        hourly: Record<number, number>;
        daily: Record<number, number>;
      };
      metadata: { startTime: number; endTime: number; duration: number; };
    }
    
    async function analyzeTransactions(
      address: PublicKey,
      limit: number = 1000
    ): Promise<TransactionAnalysis> {
      const signatures = await connection.getSignaturesForAddress(address, { limit });
      
      const statusDistribution: Record<string, number> = {};
      const hourlyDistribution: Record<number, number> = {};
      const dailyDistribution: Record<number, number> = {};
      let successful = 0;
      let failed = 0;
      
      signatures.forEach(signature => {
        const status = signature.confirmationStatus || 'unknown';
        statusDistribution[status] = (statusDistribution[status] || 0) + 1;
        
        if (signature.err) { failed++; } else { successful++; }
        
        if (signature.blockTime) {
          const date = new Date(signature.blockTime * 1000);
          const hour = date.getHours();
          const day = date.getDay();
          hourlyDistribution[hour] = (hourlyDistribution[hour] || 0) + 1;
          dailyDistribution[day] = (dailyDistribution[day] || 0) + 1;
        }
      });
      
      return {
        total: signatures.length, successful, failed, statusDistribution,
        timeDistribution: { hourly: hourlyDistribution, daily: dailyDistribution },
        metadata: {
          startTime: signatures[0]?.blockTime || 0,
          endTime: signatures[signatures.length - 1]?.blockTime || 0,
          duration: signatures.length > 1
            ? (signatures[0]?.blockTime || 0) - (signatures[signatures.length - 1]?.blockTime || 0) : 0
        }
      };
    }