Індексування

RPC-методи на кшталт getSignaturesForAddress та getTransaction підходять для перевірки невеликих обсягів, але промислові платіжні системи потребують надійнішої інфраструктури. Цей посібник охоплює основні інструменти та патерни для потокової передачі транзакцій у реальному часі, доступу до історичних даних та парсингу на рівні інструкцій.

Чому індексування важливе

Стандартний RPC має обмеження для обробки платежів у масштабі:

  • Обмеження швидкості: публічні та навіть платні RPC-ендпоінти мають ліміти запитів
  • Відсутність збереження: RPC надає лише поточний стан, а не історичну аналітику
  • Накладні витрати на опитування: повторні виклики getSignaturesForAddress неефективні
  • Груба деталізація: баланси до/після не розкривають окремі перекази у складних транзакціях

Рішення для індексування вирішують це, поглинаючи дані блокчейну з джерела та надаючи їх через спеціалізовані API.

Необроблені та парсені дані транзакцій

Перш ніж обирати підхід до індексування, зрозумійте, що містять транзакції Solana. Необробленні дані транзакцій використовують компактне бінарне кодування — акаунти посилаються за індексами, а instruction data з'являються як непрозорі байти, закодовані в Base58:

// Raw: Requires manual decoding
{ "programIdIndex": 6, "accounts": [2, 3, 4], "data": "3DfbZhE3qCnV" }
// Parsed: Ready for business logic
{
"type": "TRANSFER",
"tokenTransfers": [{
"fromUserAccount": "8PLd...9Nt8w3",
"toUserAccount": "7GLg...k487Ma",
"tokenAmount": 100.50,
"mint": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v" // USDC
}]
}

Парсинг є обов'язковим для платіжних систем — вам потрібні суми з десятковим коригуванням, розв'язані адреси гаманців та витягнуті поля memo.

Yellowstone gRPC

Geyser — це інтерфейс плагінів Solana для потокової передачі даних акаунтів та транзакцій у реальному часі безпосередньо з валідаторів. Замість опитування RPC ви підписуєтесь на потік, який надсилає оновлення під час їх обробки — забезпечуючи затримку менше 100 мс порівняно з ~200-400 мс для WebSocket-підписок. Yellowstone gRPC — одна з найпоширеніших реалізацій інтерфейсу плагінів Geyser. Yellowstone — рішення для потокової передачі в реальному часі для:

  • оновлень акаунтів
  • транзакцій
  • записів
  • сповіщень про блоки
  • сповіщень про слоти

Щоб використовувати Yellowstone, вам знадобиться gRPC ендпоінт від провайдера RPC-сервісів. Деякі варіанти включають:

use yellowstone_grpc_client::GeyserGrpcClient;
use yellowstone_grpc_proto::prelude::*;
let mut client = GeyserGrpcClient::build_from_shared("https://grpc-endpoint:10000")?
.x_token(Some("YOUR_TOKEN".to_string()))?
.connect()
.await?;
let (mut tx, mut rx) = client.subscribe().await?;
let mut filter = HashMap::new();
filter.insert("payments".to_string(), SubscribeRequestFilterTransactions {
account_include: vec!["TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA".to_string()],
vote: Some(false),
failed: Some(false),
..Default::default()
});
tx.send(SubscribeRequest {
transactions: filter,
commitment: Some(CommitmentLevel::Confirmed as i32),
..Default::default()
}).await?;
while let Some(msg) = rx.next().await {
if let Some(UpdateOneof::Transaction(tx)) = msg?.update_oneof {
// Raw protobuf data - requires parsing
println!("Transaction: {:?}", tx.transaction);
}
}

Yellowstone повертає необроблені дані Protocol Buffer, а не JSON. Вам потрібно буде декодувати бінарні дані інструкцій за допомогою IDL програм або бібліотек парсингу. Давайте розглянемо деякі варіанти для парсингу даних Yellowstone.

Ресурси:

Carbon

Carbon — це Rust-фреймворк для побудови продакшн-індексерів на основі Yellowstone gRPC. Його конвеєрна архітектура з'єднує джерела даних з декодерами та кастомними процесорами:

use carbon_core::pipeline::Pipeline;
Pipeline::builder()
.datasource(yellowstone_grpc_source)
.instruction(TokenProgramDecoder, PaymentProcessor)
.metrics(Arc::new(PrometheusMetrics::new()))
.build()?
.run()
.await?;

Carbon включає понад 40 готових декодерів для популярних програм. Для платіжних систем декодер Token Program обробляє всі варіанти трансферів, тоді як ваш процесор реалізує бізнес-логіку:

#[async_trait]
impl Processor for PaymentProcessor {
type InputType = (InstructionMetadata, DecodedInstruction<TokenInstruction>);
async fn process(
&mut self,
(meta, ix): Self::InputType,
_metrics: Arc<MetricsCollection>,
) -> CarbonResult<()> {
if let TokenInstruction::Transfer { amount } = ix.data {
let accounts = Transfer::arrange_accounts(&ix.accounts)?;
if self.watched_wallets.contains(&accounts.destination) {
notify_payment(meta.signature, accounts.destination, amount).await;
}
}
Ok(())
}
}

Ресурси:

Vixen

Yellowstone Vixen — це опенсорсний Rust-фреймворк для перетворення необроблених подій Yellowstone у структуровані, типізовані дані. Він використовує архітектуру Parser + Handler:

  • Парсери десеріалізують необроблені події Solana у типізовані структури
  • Обробники виконують вашу бізнес-логіку на оброблених даних
  • Конвеєри з'єднують парсери з обробниками у конфігурованих потоках
use yellowstone_vixen::Runtime;
use yellowstone_vixen_parser::token_program::{TokenProgramParser, TokenProgramState};
// Build a pipeline that parses Token Program events
Runtime::<YellowstoneGrpcSource>::builder()
.account(Pipeline::new(TokenProgramParser, [PaymentHandler]))
.build(config)?
.run()
.await;

Vixen включає вбудовані парсери для SPL Token та Token-2022, з підтримкою генерації парсерів з будь-якого Solana IDL. Для моніторингу платежів токен-парсер надає вам типізований доступ до трансферів, мінтингу та станів акаунтів:

impl Handler<TokenProgramState> for PaymentHandler {
async fn handle(&self, state: &TokenProgramState) -> Result<()> {
match state {
TokenProgramState::TokenAccount(account) => {
if self.watched_wallets.contains(&account.owner) {
process_balance_change(account).await;
}
}
_ => {}
}
Ok(())
}
}

Ресурси:

Початок роботи

Декілька RPC-провайдерів пропонують хостинг інфраструктури індексації. Перевірте solana.com/rpc для актуального списку провайдерів, які пропонують вебхуки, розширені API та gRPC-стримінг.

Is this page helpful?

Зміст

Редагувати сторінку

Керується

© 2026 Фонд Solana.
Всі права захищені.
Залишайтеся на зв'язку