Özet
@solana/transaction-introspection, bir getTransaction RPC yanıtını gerçek
adreslerle birlikte bir talimat listesine dönüştürür. Hesap indekslerini
(arama tablosu adresleri dahil) çözer, iç Cross Program Invocation
talimatlarını çözümler ve tam talimat ağacını gezgin sırasıyla dolaşır.
Bir programın çalışma zamanında zincir üzerinde kardeş talimatları nasıl incelediğini mi arıyorsunuz? Bu, Instructions sysvar'dır - bkz. Talimat İntrospeksiyonu. Bu sayfa bir RPC yanıtından zincir dışında bir işlemin çözümlenmesiyle ilgilidir.
Bir getTransaction yanıtı size kullanıma
hazır bir talimat listesi sunmaz. Hesaplar sayısal indeksler olarak saklanır,
sürümlü işlemler bu hesapları
statik anahtarlara ve
Adres Arama Tabloları'ndan
yüklenen adreslere böler; Cross Program Invocation (CPI) kaynaklı iç talimatlar
ise işlem meta verisinde kodlanmış veri parçaları olarak gelir.
@solana/transaction-introspection bu çözümlemeyi sizin için yapar. Kablo
işlemini çözümler, her hesap indeksini kendi Address'sine geri eşler, iç
talimatları normalleştirir ve talimatları bir blok gezgininin gösterdiği
dış-önce-iç sırasıyla döndürür. Döndürülen talimatlar, codama tarafından
oluşturulan istemcilerin (örn. @solana-program/*) parseXInstruction
yardımcılarına doğrudan bağlanır.
npm install @solana/transaction-introspection @solana/kit @solana/instructions @solana-program/token
Yanıtı Çözümleyin
İşlemi kablo biçimi kodlamasıyla alın ve yanıtı
decodeTransactionFromRpcResponse'ye iletin.
import { createSolanaRpc, signature } from "@solana/kit";import { decodeTransactionFromRpcResponse } from "@solana/transaction-introspection";const rpc = createSolanaRpc("https://api.mainnet-beta.solana.com");const txid ="3jUKrQp1UGq5ih6FTDUUt2kkqUfoG2o4kY5T1DoVHK2tXXDLdxJSXzuJGY4JPoRivgbi45U2bc7LZfMa6C4R3szX";const rpcTx = await rpc.getTransaction(signature(txid), {commitment: "confirmed",encoding: "base64",maxSupportedTransactionVersion: 0}).send();if (!rpcTx) throw new Error(`Transaction ${txid} not found`);const { compiledMessage, loadedAddresses } =decodeTransactionFromRpcResponse(rpcTx);
Kalan kod parçacıkları bu adımdaki rpcTx, compiledMessage ve
loadedAddresses'yi yeniden kullanır.
base64, base58 veya json kodlamasıyla alın.
decodeTransactionFromRpcResponse, jsonParsed yanıtlarını reddeder - bu
kodlama, RPC düğümünden talimatları sunucu tarafında ayrıştırmasını ister;
dolayısıyla istemci tarafında çözümlenecek bir şey kalmaz.
Talimatları dolaşın
walkInstructions, bir blok gezgininin gösterdiği sırayla — her dış talimatın
hemen ardından o talimatın CPI'ları aracılığıyla ürettiği iç talimatlar gelecek
şekilde — tüm talimatları (dış ve iç) bir dizi olarak döndürür. Her talimat,
çağrı hiyerarşisindeki konumunu açıklayan bir trace alanı taşır.
import { walkInstructions } from "@solana/transaction-introspection";for (const ix of walkInstructions({compiledMessage,loadedAddresses,meta: rpcTx.meta})) {const location =ix.trace.kind === "outer"? `outer[${ix.trace.index}]`: `inner[${ix.trace.outerIndex}/${ix.trace.innerIndex}]`;console.log(location, ix.programAddress, ix.accounts?.length ?? 0);}
trace ayrıştırılmış bir birleşimdir: üst düzey bir talimat için
{ kind: "outer", index }, bir dış talimatın altında iç içe geçmiş bir CPI
talimatı için ise { kind: "inner", outerIndex, innerIndex, stackHeight? }.
meta isteğe bağlıdır — null olsa bile rpcTx.meta değerini doğrudan
geçirin. Meta veri olmadığında walkInstructions yalnızca dış talimatları
döndürür.
Bir program istemcisiyle ayrıştırın
walkInstructions'den gelen her talimat bir ResolvedInstruction türündedir;
dolayısıyla @solana/instructions'den gelen koşullarla ve @solana-program/*
istemcileri tarafından üretilen identifyXInstruction / parseXInstruction
yardımcılarıyla herhangi bir dönüştürme adımı olmaksızın doğrudan çalışır.
Bu örnek, bir işlemdeki her Token Program SyncNative talimatını — ister üst
düzeyde çalışmış olsun ister bir CPI içinde — denetler.
import {isInstructionForProgram,isInstructionWithAccounts,isInstructionWithData} from "@solana/instructions";import { walkInstructions } from "@solana/transaction-introspection";import {identifyTokenInstruction,parseSyncNativeInstruction,TOKEN_PROGRAM_ADDRESS,TokenInstruction} from "@solana-program/token";for (const ix of walkInstructions({compiledMessage,loadedAddresses,meta: rpcTx.meta})) {if (!isInstructionForProgram(ix, TOKEN_PROGRAM_ADDRESS)) continue;if (!isInstructionWithData(ix) || !isInstructionWithAccounts(ix)) continue;if (identifyTokenInstruction(ix) !== TokenInstruction.SyncNative) continue;const parsed = parseSyncNativeInstruction(ix);console.log(ix.trace, parsed);}
Alt düzey yardımcılar
walkInstructions çoğu ihtiyacı karşılar; ancak paket, üzerine inşa edildiği
bileşenleri de açığa çıkarır:
getInstructionsFromCompiledTransactionMessage(compiledMessage, loadedAddresses?)yalnızca dış talimatları, çözümlenmiş hesaplar ve kod çözülmüş verilerle birlikte döndürür.getInnerInstructionsFromMeta(meta, accountMetas), işlem meta verilerinden iç CPI talimatlarının kodunu çözer.getAccountMetasFromCompiledTransactionMessage(compiledMessage, loadedAddresses?)işlem sırasına göre tam hesap listesini döndürür — bu liste, bir önceki yardımcının iç talimat hesap indislerini çözümlemek için ihtiyaç duyduğu girdidir.
import {getAccountMetasFromCompiledTransactionMessage,getInnerInstructionsFromMeta,getInstructionsFromCompiledTransactionMessage} from "@solana/transaction-introspection";const outer = getInstructionsFromCompiledTransactionMessage(compiledMessage,loadedAddresses);const accountMetas = getAccountMetasFromCompiledTransactionMessage(compiledMessage,loadedAddresses);if (!rpcTx.meta) throw new Error("Transaction metadata missing");const inner = getInnerInstructionsFromMeta(rpcTx.meta, accountMetas);
Rust kullanıyor musunuz?
Bu paketin Rust karşılığı yoktur. Rust'tan ayrıştırılmış talimatlar almak için
getTransaction üzerinden
UiTransactionEncoding::JsonParsed talep edin ve hesapları ile iç talimatları
RPC düğümünün sizin için çözümlemesine izin verin.
Ayrıca bakınız
- İşlem Yapısı - bu paketin çözümlediği yanıtın anatomisi
- Sürümlü İşlemler - Adres Arama Tablolarının hesapları statik ve yüklü gruplara nasıl ayırdığı
getTransaction- işlemi döndüren RPC yöntemi
Is this page helpful?