İşlem İntrospeksiyonu

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

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

Decode a transaction
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.

Walk every instruction
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.

Find and parse SyncNative instructions
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.
Resolve outer and inner instructions separately
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

Is this page helpful?

İçindekiler

Sayfayı Düzenle
© 2026 Solana Vakfı. Tüm hakları saklıdır.