Was sich mit Transaktion v1 ändert
Legacy- und v0-Transaktionen bleiben unverändert. Für die meisten Integrationen sind zwei Aspekte von Transaktion v1 relevant:- Du musst den Empfang explizit aktivieren. Requests für vollständige Transaktionsdaten benötigen
maxSupportedTransactionVersion: 1. Außerdem muss deine Clientbibliothek eine Version verwenden, die v1 deserialisieren kann. - Das Compute-Budget wird in den Nachrichten-Header verschoben. Eine v1-Nachricht enthält ein
transactionConfig-Objekt mitcomputeUnitLimit,heapSize,loadedAccountsDataSizeLimitundpriorityFee. Eine v1-Transaktion enthält keine Anweisungen des ComputeBudget-Programms.
"version": 1. Ihr message enthält transactionConfig:
"priorityFee": 50000 bedeutet, dass diese Transaktion insgesamt 50.000 Lamports zahlt. Ein null-Feld bedeutet, dass der Absender den Wert nicht festgelegt hat. Bei Legacy- und v0-Nachrichten fehlt transactionConfig vollständig.
maxSupportedTransactionVersion auf 1 setzen
Jeder request, der vollständige Transaktionsdaten zurückgibt, muss die höchste unterstützte Transaktionsversion angeben. SetzemaxSupportedTransactionVersion: 1 für:
getTransactiongetBlockgetTransactionsForAddressmittransactionDetails: "full"transactionSubscribemittransactionDetails: "accounts"oder"full"blockSubscribe
0 setzt, schlägt mit dem JSON-RPC-Fehler -32015 fehl, sobald er auf eine v1-Transaktion trifft:
getBlock führt bereits eine einzige v1-Transaktion im Block dazu, dass der gesamte request fehlschlägt. Wenn du -32015 in deinen Logs siehst, schlägt das Projekt bereits bei versionierten Transaktionen fehl.
Aktualisiere dein SDK, bevor du den Wert erhöhst
MitmaxSupportedTransactionVersion: 1 weist du den node an, v1-Transaktionen zurückzugeben. Deine Clientbibliothek muss sie trotzdem deserialisieren können. Aktualisiere zuerst die Bibliothek und ändere dann den Parameter:
Ältere
VersionedTransaction.deserialize-Implementierungen in JavaScript unterstützen nur Legacy und v0. Bei einem führenden 0x81-Byte lösen sie einen Fehler aus. Ältere Yellowstone-Protos stammen aus der Zeit vor den v1-Nachrichtenfeldern. Daher sehen gRPC-Clients mit diesen Versionen transactionConfig nie. Generiere Go-gRPC-Clients aus den neuesten Yellowstone-Protos und solana-storage-proto neu.
Prioritätsgebühren aus transactionConfig lesen
Code, der die Prioritätsgebühr einer Transaktion durch Durchsuchen der Anweisungen des ComputeBudget-Programms schätzt (ComputeBudget111111111111111111111111111111, setComputeUnitPrice, setComputeUnitLimit), interpretiert jede v1-Transaktion so, als würde sie keine Gebühr zahlen. Bei v1 stehen die Werte in message.transactionConfig. Außerdem unterscheiden sich die Einheiten:
Übertrage die bisherige
price × computeUnitLimit ÷ 1e6-Berechnung nicht auf priorityFee. Dieser Wert ist bereits die Gesamtsumme.
priority-fee.ts
transactionConfig oder version === 1 statt anhand vorhandener ComputeBudget-Anweisungen. Auch eine Legacy-Transaktion ohne Prioritätsgebühr enthält keine solchen Anweisungen.
Rohe Transaktionsbytes mit einem v1-kompatiblen Parser decodieren
Dieser Abschnitt gilt nur, wenn du rohe Transaktionsbytes verarbeitest, zum Beispiel von preconfSubscribe, preprocessedSubscribe oder aus einer mitbase64 codierten RPC-response. Wenn du mit json- oder jsonParsed-responses arbeitest, kannst du diesen Abschnitt überspringen.
Transaktion v1 ändert das Wire-Layout auf zwei Arten:
- Versionsbyte. Eine v1-Transaktion beginnt mit
0x81(dezimal 129). Eine v0-Transaktion beginnt mit0x80. - Signaturen werden ans Ende verschoben. Bei Legacy und v0 stehen zuerst die Signaturen und dann die Nachricht. Bei Transaktion v1 steht zuerst die Nachricht und danach die Signaturen. Decoder im Stil von
bincode, die am Anfang ein Signatur-Array erwarten, schlagen daher bei v1-Bytes fehl.

Byte layout of a transaction v1 with three addresses and one instruction. The signature sits at the end, after the message.
- Rust:
agave-transaction-viewparst Legacy, v0 und v1 direkt.wincode, der von aktuellen Solana-SDKs verwendete bincode-kompatible Serializer, decodiert v1 ebenfalls inVersionedTransaction. - JavaScript / TypeScript:
@solana/kit8.0+ oder@solana/web3.jsv3.
0x81 steht für v1. Die Signaturen folgen auf die Nachricht, statt ihr vorauszugehen.
Checkliste
- Suche mit Grep nach
getBlock,getTransaction,getTransactionsForAddress,transactionSubscribeundblockSubscribe. Berücksichtige dabei auch rohe JSON-RPC-Bodys und SDK-Wrapper wieconnection.getParsedTransaction. - Aktualisiere auf ein v1-kompatibles SDK.
- Setze
maxSupportedTransactionVersion: 1bei jedem in Schritt 1 gefundenen Aufruf. - Ersetze das Durchsuchen von ComputeBudget-Anweisungen durch eine Prüfung von
transactionConfigund behandlepriorityFeeals Gesamtzahl der Lamports. - Ersetze rohe Decoder im Stil von
bincodedurchagave-transaction-viewoder ein aktualisiertes SDK. - Aktualisiere die Streaming-Abhängigkeiten auf die Versionen aus der obigen Tabelle.
- Suche nach der Änderung mit Grep in den Logs nach
-32015. So stellst du sicher, dass nichts mehr fehlschlägt.
Verwandte Themen
getTransaction guide
Parameter, response-Struktur und Beispiele zum Abrufen einer einzelnen Transaktion.
getBlock guide
Rufe einen vollständigen Block mit allen darin enthaltenen Transaktionen ab.
getTransactionsForAddress
Gefilterter, paginierter Transaktionsverlauf für eine beliebige Adresse in einem einzigen Aufruf.
Agave 4.2 migration checklist
Alle Breaking Changes in Agave 4.2 mit den erforderlichen Schritten zur Behebung.