Zum Hauptinhalt springen
Agave 4.2 führt Transaktion v1 ein (SIMD-0385). Sobald das Feature Gate im mainnet aktiviert ist, senden Wallets und Programme v1-Transaktionen. Jeder request, der vollständige Transaktionsdaten abruft, muss den Empfang dieser Transaktionen explizit aktivieren. Diese Seite erklärt, was sich ändert, welche Helius endpoints betroffen sind und wie du deinen Code aktualisierst. Die vollständige Checkliste für Agave 4.2, einschließlich Belohnungstypen, Semantik von Kontoaktualisierungen und slot-Timing, findest du in der Migrationscheckliste für Agave 4.2.

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 mit computeUnitLimit, heapSize, loadedAccountsDataSizeLimit und priorityFee. Eine v1-Transaktion enthält keine Anweisungen des ComputeBudget-Programms.
Auch das Wire-Format ändert sich: Es gibt ein neues Versionsbyte und die Signaturen stehen am Ende der Transaktion. Das betrifft jedoch nur Code, der rohe Transaktionsbytes decodiert. Siehe unten Rohe Transaktionsbytes decodieren. In JSON-responses meldet eine v1-Transaktion "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. Setze maxSupportedTransactionVersion: 1 für: Ein request, der den Parameter auslässt oder ihn auf 0 setzt, schlägt mit dem JSON-RPC-Fehler -32015 fehl, sobald er auf eine v1-Transaktion trifft:
Bei 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

Mit maxSupportedTransactionVersion: 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
Verzweige anhand von 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 mit base64 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 mit 0x80.
  • 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-by-byte layout of a Solana transaction v1: version byte, header, config mask, lifetime specifier, address and instruction counts, three 32-byte addresses, compute unit config, instruction header, indices, discriminators, lamports, and a 64-byte signature at the end

Byte layout of a transaction v1 with three addresses and one instruction. The signature sits at the end, after the message.

Eine schrittweise Erläuterung aller Felder des v1-Wire-Formats findest du unter Transaktion v1 im Artikel zu Solana-Transaktionsversionen. Verwende einen Decoder, der das v1-Layout versteht:
  • Rust: agave-transaction-view parst Legacy, v0 und v1 direkt. wincode, der von aktuellen Solana-SDKs verwendete bincode-kompatible Serializer, decodiert v1 ebenfalls in VersionedTransaction.
  • JavaScript / TypeScript: @solana/kit 8.0+ oder @solana/web3.js v3.
Eigene Decoder müssen das erste Byte prüfen: 0x81 steht für v1. Die Signaturen folgen auf die Nachricht, statt ihr vorauszugehen.

Checkliste

  1. Suche mit Grep nach getBlock, getTransaction, getTransactionsForAddress, transactionSubscribe und blockSubscribe. Berücksichtige dabei auch rohe JSON-RPC-Bodys und SDK-Wrapper wie connection.getParsedTransaction.
  2. Aktualisiere auf ein v1-kompatibles SDK.
  3. Setze maxSupportedTransactionVersion: 1 bei jedem in Schritt 1 gefundenen Aufruf.
  4. Ersetze das Durchsuchen von ComputeBudget-Anweisungen durch eine Prüfung von transactionConfig und behandle priorityFee als Gesamtzahl der Lamports.
  5. Ersetze rohe Decoder im Stil von bincode durch agave-transaction-view oder ein aktualisiertes SDK.
  6. Aktualisiere die Streaming-Abhängigkeiten auf die Versionen aus der obigen Tabelle.
  7. Suche nach der Änderung mit Grep in den Logs nach -32015. So stellst du sicher, dass nichts mehr fehlschlägt.
Eine technische Vertiefung zu Spezifikationen von Solana-Transaktionsversionen, Wire-Formaten und Beispielen findest du in unserem Artikel Solana-Transaktionsversionierung: Legacy, v0 und v1.

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.