本文介绍了 Solana 在 2022 年 10 月 10 日引入的版本化交易(Versioned Transactions)功能,并详细说明了如何更新客户端代码以处理新版本的交易类型,特别是介绍了 maxSupportedTransactionVersion
参数的使用和如何避免错误。
在2022年10月10日(Epoch 358),Solana 通过一个名为“Versioned Transactions”的概念增加了对新交易版本类型的支持。在此变化之后,Solana 运行时现在支持两种类型的交易:“legacy”(旧交易)和“0”(包含地址查找表的交易)。虽然链上程序不必采纳此变化,但许多客户端应用程序需要更新以防止因不同交易类型而导致的错误。
在本指南中,你将了解到由于 Solana 的 Versioned Transactions 发布而带来的技术变更,以及如何更新你的客户端代码以处理这些变更。
对于返回 Transaction 的 Solana JSON RPC 请求,现在包括一个可选参数 maxSupportedTransactionVersion。此参数告知运行时应用程序应期望的最高交易版本。在撰写本文时(2022年10月11日),可以传递两个值:
legacy:旧的交易格式,没有额外好处
0:新增对地址查找表的支持
如果请求返回的版本化交易高于 maxSupportedTransactionVersion 中设置的版本(即,选择 legacy 时返回 0 版本的交易),运行时将返回错误。
目前,有两个原生 Solana JSON RPC 方法受到此变化的影响,应该包括 maxSupportedTransactionVersion 参数:
(注意:非原生方法,getParsedTransaction 和 getParsedBlock,也接受此参数)
尽管在这两个方法中 maxSupportedTransactionVersion 参数是可选的,最佳实践是将 maxSupportedTransactionVersion 设置为 0 以捕获所有交易类型并避免错误。
getBlock 方法调用应该在所需的 slot 后添加 { 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,
//添加这一行 👇
{ maxSupportedTransactionVersion: 0 })
);
})();
简化调试的日志
你现在可以访问 RPC 端点的日志,帮助你更有效地排除问题。如果你在 RPC 调用中遇到问题,可以在 QuickNode 仪表板中检查日志,以快速识别和解决问题。了解更多关于日志历史限制的信息,请访问 我们的定价页面。
返回的类 VersionedBlockResponse 与 BlockResponse 非常相似,但有一个主要区别。交易数组将包含 MessageV0 类,而不是 Message,允许你访问 addressTableLookups。有关 MessageV0 类的更多详细信息,请查看 solana-labs.github.io/。
getTransaction 方法调用应该在所需的 transaction ID 后添加 { 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",
//添加这一行 👇
{ maxSupportedTransactionVersion: 0 }
)
);
})();
参考: edge.docs.solana.com/.../versioned-transactions
Solana 基金会现在建议使用 JSON 解析编码,因为它在消息的 "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 请求,请查看我们的文档以获取代码示例 这里。
Versioned Transactions 将持续存在,随着新版本的实施,你需要跟上网络更新,以确保你的 dApp 能支持最新版本。要保持最新的 Solana 新闻和信息,请订阅我们的 新闻通讯 或关注我们的 Twitter。
- 原文链接: quicknode.com/guides/sol...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!