本文介绍了如何在本地集群上测试Solana程序,确保本地配置与主网的功能集匹配,以避免在生产环境中出现意外行为。内容涵盖了Solana的特性、检查集群的特性集以及如何配置本地集群,使之与主网一致的步骤。
在本地集群上测试是快速迭代和原型设计新 Solana 程序的关键。然而,你的本地集群的默认配置可能与主网(mainnet)或开发网(devnet)集群当前的特性集不匹配。这可能导致在将应用程序部署到生产环境时发生意外行为。
在本指南中,我们将了解 Solana 的特性、如何检查集群的当前特性集,以及如何配置本地集群以匹配主网集群的特性集。让我们开始吧!
Solana 是一个快速发展的区块链,定期添加新特性和改进,以回应开发者和用户的需求。通过特性提案和门控程序(Feature Proposal 和 Gate Programs)的引入和激活,验证者获得了各种新功能(有关更多信息,请参见 资源)。这些特性可以在特定集群(例如测试网)中激活,而在其他集群(如主网)中则可能不激活,从而导致不同环境之间的功能差异。在使用默认的 solana-test-validator
本地设置时,与本地安装的 Solana 版本兼容的所有特性自动被激活。这种自动激活可能导致当应用程序部署到不同集群时,测试结果出现不一致。了解特性激活及其对应用程序性能的影响对于适当测试至关重要。
例如,我最近测试了一个 NFT 程序,该程序依赖于通过传递非常大的(约 3kb)数据负载向一个铭文程序发起跨程序调用(CPI)。该程序在 devnet 上失败,而在相同条件下的本地集群上工作正常。我收到这个错误:> Program returned error: "Instruction passed to inner instruction is too large (3284 > 1280)"
。
经过一些调查,我发现我的本地集群启用了一个特性,该特性放宽了对 CPI 数据负载大小的限制,而 devnet 集群则没有。这可能是一个难以调试的问题,因此了解如何检查集群的特性集以及如何配置本地集群以匹配主网集群的特性集是必不可少的。
要检查集群的特性集,可以使用 solana feature status
命令。该命令允许你查询集群当前的特性集并检查各个特性的状态。让我们在主网中试一下。在你的终端中,输入:
solana feature status -um
这将获取主网中所有特性的状态(激活、未激活或待处理)(你可以使用 -ud
获取 devnet 状态,使用 -ut
获取测试网状态,或使用 -ul
获取本地集群状态)。
你应该看到特性及其状态的列表:
请注意,每个特性都有一个唯一的公钥。在提议时,每个特性有:
如果你仔细查看,可以看到导致我 CPI 数据负载大小问题的特性:GDH5TVdbTPUpRnXaRyQqiKUa7uZAbZ28Q2N9bhbKoMLm: loosen cpi size restrictions
。在撰写本文时,此特性在主网和 devnet 上均被禁用,但在我的本地 Solana 版本上是激活的。你还可以看到有关 GitHub 问题 (26641) 的参考,我们可以在这里了解更多关于该特性及其状态的信息。如果你有特定特性想要查询,可以将该特性的公钥添加到你的命令中,如下所示:
solana feature status -um GDH5TVdbTPUpRnXaRyQqiKUa7uZAbZ28Q2N9bhbKoMLm
这将返回与之前相同的表格,但只有你指定的特性 🙌。
我们可以在本地集群上运行相同的命令以查看差异。在另一个终端中,启动你的本地集群:
solana-test-validator
然后,在你的原始终端中运行 solana feature status -ul
命令。你应该看到你本地集群中的特性及其状态的列表。将这些特性和状态与主网的进行比较,以识别任何差异。
在我的情况下,我可以发现相同的特性在我的本地集群中是激活的:
这解释了为什么我的程序在本地集群中工作但在 devnet 上失败!
注意:特性集将随时间变化,因此你的结果可能会有所不同,但概念仍然相同。
现在我们了解了问题,让我们学习如何配置本地集群以匹配主网集群的特性集。请按 Ctrl + C
在运行它的终端中终止本地验证器,然后继续进行下一部分。
Solana CLI 具有一个简单的标志,你可以将其添加到 solana-test-validator
命令中,以配置本地集群禁用特定特性。该标志是 --deactivate-feature
。你可以使用此标志指定你希望在本地集群上激活的特性集。因此,在我的情况下,我将运行:
solana-test-validator --deactivate-feature GDH5TVdbTPUpRnXaRyQqiKUa7uZAbZ28Q2N9bhbKoMLm -r
注意:要使用 --deactivate-feature
标志,我们还必须使用 -r
标志,将本地验证器重置为创世状态。这将清除分类账并使用新的特性集重新启动集群。
你的本地集群应该像往常一样启动。你现在可以运行 solana feature status GDH5TVdbTPUpRnXaRyQqiKUa7uZAbZ28Q2N9bhbKoMLm -ul
命令以验证该特性已被禁用。你应该看到该特性现在在本地集群中处于未激活状态:
GDH5TVdbTPUpRnXaRyQqiKUa7uZAbZ28Q2N9bhbKoMLm | inactive | NA | loosen cpi size restrictions #26641
就这样。在我的例子中,我现在可以在本地集群上运行我的程序,并期待在将其部署到 devnet 时遇到相同的错误!...现在,我只需修复这个错误 😅。
如果你正在使用 Anchor 创建程序,你可能会使用 anchor test
启动你的本地验证器。在撰写本文时,若要在 Anchor 中使用 --deactivate-feature
标志,你需要手动使用 solana-test-validator
命令启动你的本地验证器,正如我们上面所做的那样。然后,确保在你的 anchor test
命令中添加 --skip-local-validator
标志。这将告诉 Anchor 使用你手动启动的本地验证器,而不是启动一个新的。
最近有一个 新特性 已被添加(但尚未在 v. 0.29 中发布),允许你在 Anchor.toml
文件中包含 deactivate-feature
。这将使你能够在不需要手动启动本地验证器的情况下运行 anchor test
。请关注 Anchor GitHub 以获取新版本的更新。
虽然看似微小的细节,但确保你的本地集群与主网集群表现相同可以节省你在部署应用程序时的许多时间和麻烦。通过了解 Solana 特性以及如何检查和配置你本地集群的特性集,你可以确保你的应用程序在不同集群之间可靠地运行。
我们希望了解更多关于你构建的内容。请在 Discord 或 Twitter 上与我们联系!
告诉我们 如果你有任何反馈或新主题的请求。我们期待聆听你的声音。
- 原文链接: quicknode.com/guides/sol...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!