閱讀時間 3 分鐘
概覽
2022 年 10 月 10 日(Epoch 358),Solana 透過一項稱為「版本化交易」(Versioned Transactions)的概念,新增了對新交易版本類型的支援。 此變更後,Solana 執行環境現支援兩種交易類型:「傳統型」(舊版交易)與「0 型」(包含地址查詢表的交易)。儘管鏈上程式無需採用此變更,但許多客戶端應用程式仍需進行更新,以避免因交易類型不同而導致的錯誤。
在本指南中,您將了解 Solana 推出「版本化交易」所帶來的技術變更,以及如何更新您的客戶端程式碼以因應這些變更。
您需要準備的物品
- 已安裝Node.js(版本 16.15 或更高)
- 使用Solana Web3 JSON RPC API的經驗
客戶端程式碼變更:支援的最高交易版本
對於 Solana JSON RPC 請求,若其回傳交易,現在會包含一個可選參數:maxSupportedTransactionVersion。此參數告知執行環境,應用程式應預期支援的最高交易版本。截至本文撰寫之時(2022 年 10 月 11 日),可傳入的值有兩種:
- 舊版:較舊的交易格式,沒有額外好處
- 0:新增對位址查詢表(Address Lookup Tables)的支援
如果請求回傳的交易版本高於 `maxSupportedTransactionVersion` 中設定的值(例如,當選取「legacy」時卻回傳版本0的交易),執行環境將會拋出錯誤。
如何避免現有應用程式中的錯誤
目前,有兩個原生的 Solana JSON RPC 方法受到此變更影響,應包含maxSupportedTransactionVersion參數:
- getBlock
- getTransaction
(註:非原生方法 getParsedTransaction 和 getParsedBlock 亦接受此參數)
雖然在兩種方法中,maxSupportedTransactionVersion參數皆為可選,但最佳做法是將maxSupportedTransactionVersion設定為0,以涵蓋所有交易類型並避免發生錯誤。
getBlock()
getBlock 方法呼叫應加入 { maxSupportedTransactionVersion: 0 } 在所需的 插槽 要搜尋:
const web3 = require("@solana/web3.js");
(async () => {
const solana = new web3.Connection("https://example.solana-mainnet.quiknode.pro/0123456/");
console.log(
await solana.getBlock(
94101948,
//ADD THIS 👇
{ maxSupportedTransactionVersion: 0 })
);
})();
回傳的類別VersionedBlockResponse與BlockResponse 非常相似,但有一項關鍵差異。其 Transactions 陣列中將包含MessageV0類別而非Message,這使您能夠存取addressTableLookups。有關MessageV0類別的更多詳細資訊,請參閱solana-labs.github.io/。
getTransaction()
getTransaction 方法呼叫應加入 { maxSupportedTransactionVersion: 0 } 在所需的 交易編號 要搜尋:
const web3 = require("@solana/web3.js");
(async () => {
const solana = new web3.Connection("https://example.solana-mainnet.quiknode.pro/0123456/");
console.log(
await solana.getTransaction(
"D13jTJYXoQBcRY9AfT5xRtsew7ENgCkNs6mwwwAcUCp4ZZCEM7YwZ7en4tVsoDa7Gu75Jjj2FgLXNUz8Zmgedff",
//ADD THIS 👇
{ maxSupportedTransactionVersion: 0 }
)
);
})();
參考資料:edge.docs.solana.com/.../versioned-transactions
JSON 解析結果
Solana 基金會目前建議使用 JSON Parsed 編碼,因為它會在訊息的「accountKeys」清單中包含所有交易帳戶金鑰(包括來自查閱表的金鑰)。這使得解析 preBalances / postBalances 以及 preTokenBalances / postTokenBalances 中詳列的餘額變動變得十分直觀。 若改用「json」編碼,則 preBalances / postBalances 以及 preTokenBalances / postTokenBalances 中的條目可能會引用未包含在「accountKeys」清單中的帳戶金鑰,此時需透過交易元資料中的「loadedAddresses」條目來解析。(來源:Solana 基金會)。
對於您的 JavaScript 應用程式而言,這僅僅意味著需要變更
- 將getTransaction()改為getParsedTransaction(),並
- 從getBlock()到getParsedBlock()
對於 cURL/CURL 請求,請將編碼設定為 jsonParsed:
{"encoding": "Parsed"}
參考資料:docs.solana.com/...versioned-transaction-migration
重點回顧
如果您正在執行現有的客戶端程式碼,並且使用了getBlock或getTransaction,那麼您只需這樣做即可!如果您使用的是 Python 或 cURL/CURL requests,請點此查閱我們的文件中的程式碼範例。
版本化交易已成常態,隨著新版本的推出,您需要隨時掌握網路更新動態,以確保您的 dApp 能支援最新版本。若想掌握 Solana 的最新消息與資訊,請訂閱我們的電子報或在Twitter 上追蹤我們。
如果您有任何疑問,或想討論您的專案,歡迎在Discord 上與我們聯絡。
我們 ❤️ 您的回饋!
如果您對這份指南有任何意見或疑問,請告訴我們。我們非常樂意聽取您的意見!
