Skip to main content
Agave 4.2 führt Transaktion v1 ein (SIMD-0385). Sobald das Feature-Gate im Mainnet aktiviert ist, beginnen Wallets und Programme mit der Einreichung von v1-Transaktionen, und jede Anfrage, die vollständige Transaktionsdaten abruft, muss sich dafür entscheiden, sie zu empfangen. Diese Seite behandelt, was sich ändert, welche Helius-Endpunkte betroffen sind und wie Sie Ihren Code aktualisieren. Für die vollständige Agave 4.2-Checkliste, einschließlich Belohnungstypen, Kontenaktualisierungssemantik und Slot-Timing, siehe die Agave 4.2-Migrations-Checkliste.

Was ändert sich in Transaktion v1

Legacy- und v0-Transaktionen bleiben unverändert. Für die meisten Integrationen sind zwei Dinge bei Transaktion v1 wichtig:
  • Sie müssen sich dafür entscheiden, sie zu empfangen. Anfragen für vollständige Transaktionsdaten benötigen maxSupportedTransactionVersion: 1, und Ihre Client-Bibliothek benötigt eine Version, die v1 deserialisieren kann.
  • Das Berechnungsbudget verschiebt sich in den Nachrichten-Header. Eine v1-Nachricht enthält ein transactionConfig-Objekt mit computeUnitLimit, heapSize, loadedAccountsDataSizeLimit und priorityFee. Es gibt keine CalculateBudget-Programmanweisungen in einer v1-Transaktion.
Das Kabel-Format ändert sich ebenfalls (ein neues Versionsbyte und Signaturen am Ende der Transaktion), aber das betrifft nur Code, der rohe Transaktionsbytes dekodiert. Siehe Dekomprimieren von rohen Transaktionsbytes unten. In JSON-Antworten meldet eine v1-Transaktion "version": 1 und ihr message enthält transactionConfig:
"priorityFee": 50000 bedeutet, dass diese Transaktion insgesamt 50.000 Lamports zahlt. Ein null-Feld bedeutet, dass der Absender es nicht gesetzt hat. Legacy- und v0-Nachrichten lassen transactionConfig vollständig aus.

Setzen Sie maxSupportedTransactionVersion auf 1

Jede Anfrage, die vollständige Transaktionsdaten zurückgibt, muss die höchste Transaktionsversion deklarieren, die sie verarbeiten kann. Setzen Sie maxSupportedTransactionVersion: 1 auf: Eine Anfrage, die den Parameter auslässt oder auf 0 setzt, schlägt mit JSON-RPC-Fehler -32015 fehl, sobald sie eine v1-Transaktion berührt:
Für getBlock schlägt eine v1-Transaktion im Block die gesamte Anfrage fehl. Wenn Sie -32015 in Ihren Protokollen sehen, schlägt das Projekt bereits bei versionierten Transaktionen fehl.

Aktualisieren Sie Ihr SDK, bevor Sie den Wert erhöhen

Das Setzen von maxSupportedTransactionVersion: 1 teilt dem Knoten mit, v1-Transaktionen zurückzugeben. Ihre Client-Bibliothek muss sie dennoch deserialisieren. Aktualisieren Sie zuerst und ändern Sie dann den Parameter: Ältere VersionedTransaction.deserialize-Implementierungen in JavaScript verarbeiten nur Legacy und v0 und werfen bei einem führenden 0x81-Byte einen Fehler. Ältere Yellowstone-Protos sind vor den v1-Nachrichtenfeldern, daher sehen gRPC-Verbraucher in diesen Versionen nie transactionConfig. Für Go gRPC-Clients, regenerieren Sie von den neuesten Yellowstone-Protos und solana-storage-proto.

Lesen Sie prioritäre Gebühren aus transactionConfig

Code, der die Prioritätsgebühr einer Transaktion schätzt, indem er nach ComputeBudget-Programmanweisungen sucht (ComputeBudget111111111111111111111111111111, setComputeUnitPrice, setComputeUnitLimit), liest jede v1-Transaktion als zahlen null. In v1 befinden sich die Werte in message.transactionConfig, und die Einheiten unterscheiden sich: Portieren Sie nicht die Legacy price × computeUnitLimit ÷ 1e6-Mathematik auf priorityFee. Es ist bereits die Summe.
priority-fee.ts
Verzweigen Sie auf transactionConfig (oder auf version === 1), anstatt auf das Vorhandensein von ComputeBudget-Anweisungen zu achten, da eine Legacy-Transaktion ohne Prioritätsgebühr ebenfalls keine hat.

Dekodieren Sie rohe Transaktionsbytes mit einem v1-fähigen Parser

Dieser Abschnitt gilt nur, wenn Sie rohe Transaktionsbytes konsumieren, zum Beispiel von preconfSubscribe, preprocessedSubscribe oder einer base64-kodierten RPC-Antwort. Wenn Sie mit json- oder jsonParsed-Antworten arbeiten, überspringen Sie es. Transaktion v1 ändert das Drahtlayout auf zwei Arten:
  • Versionsbyte. Eine v1-Transaktion beginnt mit 0x81 (dezimal 129). Eine v0-Transaktion beginnt mit 0x80.
  • Signaturen verschieben sich ans Ende. Legacy und v0 platzieren Signaturen zuerst, dann die Nachricht. Transaktion v1 platziert die Nachricht zuerst und die Signaturen zuletzt, so dass bincode-Decoder, die ein führendes Signaturfeld erwarten, bei v1-Bytes fehlschlagen.
Byte-für-Byte-Layout einer Solana-Transaktion v1: Versionsbyte, Header, Konfigurationsmaske, Lebenszeit-Spezifizierer, Adress- und Anweisungszählungen, drei 32-Byte-Adresse, Compute-Unit-Konfiguration, Anweisungs-Header, Indices, Discriminatoren, Lamports und eine 64-Byte-Signatur am Ende

Byte-Layout einer Transaktion v1 mit drei Adressen und einer Anweisung. Die Signatur befindet sich am Ende, nach der Nachricht.

Für eine Schritt-für-Schritt-Walkthrough des v1-Drahtformats siehe Transaktion v1 im Solana-Transaktionsversionsartikel. Verwenden Sie einen Decoder, der das v1-Layout versteht:
  • Rust: agave-transaction-view analysiert Legacy, v0 und v1 vor Ort. wincode, der bincode-kompatible Serializer, der von aktuellen Solana-SDKs verwendet wird, dekodiert auch v1 in VersionedTransaction.
  • JavaScript / TypeScript: @solana/kit 8.0+ oder @solana/web3.js v3.
Benutzerdefinierte Decoder müssen das erste Byte überprüfen: 0x81 bedeutet v1 und die Signaturen folgen der Nachricht anstatt sie voranzustellen.

Checkliste

  1. Durchsuchen Sie getBlock, getTransaction, getTransactionsForAddress, transactionSubscribe und blockSubscribe, einschließlich roher JSON-RPC-Körperschaften und SDK-Wrapper wie connection.getParsedTransaction.
  2. Aktualisieren Sie auf ein v1-fähiges SDK.
  3. Setzen Sie maxSupportedTransactionVersion: 1 bei jedem in Schritt 1 gefundenen Aufruf.
  4. Ersetzen Sie das Scannen von ComputeBudget-Anweisungen durch eine transactionConfig-Prüfung, und behandeln Sie priorityFee als Gesamtlaports.
  5. Ersetzen Sie bincode-Style-Rohdecoder durch agave-transaction-view oder ein aktualisiertes SDK.
  6. Aktualisieren Sie Streaming-Abhängigkeiten auf die Versionen in der Tabelle oben.
  7. Durchsuchen Sie Protokolle nach -32015 nach der Änderung, um sicherzustellen, dass nichts mehr fehlschlägt.
Für einen technischen Deep Dive in die Solana-Transaktionsversionsspezifikationen, Drahtformate und Beispiele, lesen Sie unseren Artikel, Solana Transaction Versioning: Legacy, v0 und v1.

Verwandt

getTransaction guide

Parameter, Antwortform und Beispiele zum Abrufen einer einzelnen Transaktion.

getBlock guide

Laden Sie einen vollständigen Block, einschließlich jeder darin enthaltenen Transaktion.

getTransactionsForAddress

Gefilterte, paginierte Transaktionshistorie für jede Adresse in einem Aufruf.

Agave 4.2 Migrations-Checkliste

Jede Agave 4.2-breaking changes mit Maßnahmen zur Behebung.