本文解答了Solana初学者最常遇到的十个问题,包括指令处理、命名规范、公钥概念、失败处理、交易位置、账户指定、ID选择、参数缺失、所有者与权限、多层嵌套等概念,旨在帮助开发者理解Solana链上开发的关键概念和术语。
本指南解决了初学者在开始使用 Solana 时遇到的十个最常见的问题。它旨在阐明关键概念和术语,帮助新的开发者更好地理解链上开发的复杂性。
解锁 Solana 的奥秘!与 Mike 一起探索前 10 个初学者问题,并清楚了解链上开发和 Rust 编程。
订阅我们的 YouTube 频道以获取更多视频!订阅
好的,这就是通常开始感到困惑的地方。在 Solana 中,我们一直在谈论指令。但是文档又说你的程序也有“指令”。等等 - 这是什么意思?
事情是这样的:
可以把它想象成一个 Web 服务器:请求进来,处理程序处理它们。概念是一样的。在你的 Anchor 程序的 lib.rs 中,在 #[program] 结构体内部,那些顶层函数就是你的指令处理程序。
do_thing 和 DoThing – 为什么两者都有?你经常会看到一个名为 do_thing 的函数和一个名为 DoThing 的结构体。相同的名称,不同的大小写。 令人非常困惑,对吧?
模式是:
do_thing (snake_case) 是运行的函数。DoThing (PascalCase) 是描述函数需要哪些账户的账户结构体。解决方法? 将结构体重命名为类似 DoThingAccounts 的名称。 这样你就可以立即知道一个是代码逻辑,另一个是数据结构。
好的,又一个命名噩梦。 Solana 的 Pubkey 类型听起来像是表示一个真实的密码学公钥,但事实并非如此。
实际上,Pubkey 仅仅意味着地址。 就这样。 这些地址中的一些属于真实的密钥对(带有匹配的私钥),但其他地址(例如 PDA(程序派生地址))则不然。
PDA 是从种子(例如 "order")和一个 ID 号生成的。 它们是确定性的,并且没有私钥。 因此将 Pubkey 视为“地址”。
这一个很重要。 如果你的指令处理程序内部发生任何错误,则整个指令都会失败。
假设你的处理程序首先将 Token 从金库转移到 taker,然后尝试将 Token 从 taker 发送到 maker。 如果第二步失败,Solana 会回滚所有内容。
没有半完成的状态。 区块链要么记录所有更改,要么不记录任何更改。 每个处理程序都必须返回 Ok(()) 才能使交易成功。
你可能想知道,“等等,我一直在听说交易,但是我从未在我的程序中编写过交易。”
那是因为交易存在于客户端。 交易只是一个或多个指令的集合,有时甚至适用于不同的程序。
例如:
如果任何程序中的任何指令处理程序失败,则整个交易都会失败。 因此,链始终保持一致,不会半途而废。
你可能会注意到,当你进行类似 make_offer 的操作时,即使金库和 offer 账户尚未存在,你仍然需要指定它们。
这是因为 Solana 仅仅需要预先提供地址,而不是账户本身。 这有助于运行时安全地并行处理交易。
因此,当你提供这些地址时,你实际上是在说,“嘿,我将要使用这些地址,请确保在我使用时没有人会接触它们。”
你经常会看到客户端为 offer 之类的东西提供自己的 ID,这让人感到奇怪,为什么不让程序生成它们呢?
好吧,随机性和确定性在区块链上很难融合。 每个验证者都需要产生相同的结果。
因此,客户端选择 ID,程序会检查它是否有效或已被占用(感谢 init 之类的约束)。 如果该地址已经存在,则指令将失败。 简单又安全。
有时,你会看一个处理程序然后想,“等等,ID 参数在哪里?”
答案是:它已经在账户中了。 例如,make_offer 在交换程序中采用显式 ID,因为它需要创建一个新的 offer。 但是 take_offer 不仅仅读取现有的 offer 账户,该账户已经包含该 ID 及其所有数据。
因此,当一个参数看起来丢失时,它可能来自账户而不是函数参数。
这个问题会让很多人绊倒。
如果你检查一个 Token 账户,你将看到一个 Owner,并且可能还会看到一个 Authority。 Owner 通常是 Token 程序,它是管理规则的程序。 Authority 是实际可以签名进行更改的人,通常是 PDA。
因此,可以这样认为:
Owner → 你与之交互的系统
Authority → 发号施令的老板
有些浏览器甚至会混淆这些术语,因此不要过分依赖它们的标签。
&[&[&[u8]]] 的奥秘最后,最大的一个 – 三层野兽。
Anchor 称其为 signer_seeds,但是 Andrew Fancong 曾经建议一个更好的名称:signer_seeds_bytes,他是对的。
事情是这样的:
因此,如果你要从 PDA(称为 offer)拥有的账户转移 Token,则你可能有一个签名者(offer),两个种子("offer" 和 offer_id),以及每个种子的字节。
签名者 → 种子 → 字节。 一旦你这样看待它,它实际上并没有那么可怕。
就是这样。 十个最令人困惑但最重要的 Solana 概念已经揭开神秘面纱。 如果你只记住一件事:Solana 的命名约定很有创意。 但是一旦你掌握了窍门,该系统背后的逻辑实际上就很有意义。
通过遵循本指南,你应该对 Solana 开发中的基本概念有更清晰的了解,从而使你能够在该平台上更有效地构建。
如果你对新主题有任何反馈或要求,请告诉我们。 我们很乐意听取你的意见。
- 原文链接: quicknode.com/guides/sol...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!