Параметры
Адрес счёта (в кодировке base-58)
Показать поля конфигурации
Максимальное количество возвращаемых подписей (по умолчанию: 1000)
Начать поиск в обратном направлении с этой подписи
Уровень подтверждения (processed, confirmed, finalized)
Ответ
Массив объектов информации о подписяхПодпись транзакции (в кодировке base-58)
Слот, в котором была обработана транзакция
Ошибка, если транзакция не удалась, null если транзакция прошла успешно
Заметка, связанная с транзакцией
Метка времени Unix, когда транзакция была обработана
Статус подтверждения транзакции
Примеры кода
Базовый запрос
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
}));
}
Примечания
- Возвращает подтверждённые подписи транзакций для адреса
- Результаты возвращаются в обратном хронологическом порядке
- Пагинация достигается с помощью параметра
before
- Ответ приходит немедленно, так как читается из текущего состояния
- Можно указать разные уровни подтверждения
Рекомендации
- Используйте подходящий лимит в зависимости от ваших потребностей
- Реализуйте пагинацию для больших наборов результатов
- Кэшируйте результаты там, где это уместно, для снижения нагрузки на RPC
- Рассмотрите использование подписки на websocket для обновлений в реальном времени
- Обрабатывайте сетевые ошибки и выполняйте повторные попытки при необходимости
Распространённые ошибки
| Код | Сообщение | Решение |
|---|
| -32601 | Method not found | Убедитесь, что вы подключены к узлу Solana RPC |
| -32602 | Invalid params | Проверьте адрес и параметры конфигурации |
| -32007 | Signature information unavailable | Узел может выполнять начальную загрузку или синхронизацию |
Сценарии использования
-
История транзакций
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
}
};
}
-
Мониторинг транзакций
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;
}
}
-
Анализ транзакций
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
}
};
}