Solana 初学者最常问的十个问题

本文解答了Solana初学者最常遇到的十个问题,包括指令处理、命名规范、公钥概念、失败处理、交易位置、账户指定、ID选择、参数缺失、所有者与权限、多层嵌套等概念,旨在帮助开发者理解Solana链上开发的关键概念和术语。

概述

本指南解决了初学者在开始使用 Solana 时遇到的十个最常见的问题。它旨在阐明关键概念和术语,帮助新的开发者更好地理解链上开发的复杂性。

解锁 Solana 的奥秘!与 Mike 一起探索前 10 个初学者问题,并清楚了解链上开发和 Rust 编程。

订阅我们的 YouTube 频道以获取更多视频!订阅

前提条件

  • 对区块链技术有基本的了解
  • 熟悉编程概念,特别是 Rust 和 TypeScript

常见问题

1. 处理指令的指令?

好的,这就是通常开始感到困惑的地方。在 Solana 中,我们一直在谈论指令。但是文档又说你的程序也有“指令”。等等 - 这是什么意思?

事情是这样的:

  • 指令是被发送到你的程序的网络数据。
  • 指令处理程序是你程序中处理指令的 Rust 函数。

可以把它想象成一个 Web 服务器:请求进来,处理程序处理它们。概念是一样的。在你的 Anchor 程序的 lib.rs 中,在 #[program] 结构体内部,那些顶层函数就是你的指令处理程序。

2. do_thingDoThing – 为什么两者都有?

你经常会看到一个名为 do_thing 的函数和一个名为 DoThing 的结构体。相同的名称,不同的大小写。 令人非常困惑,对吧?

模式是:

  • do_thing (snake_case) 是运行的函数。
  • DoThing (PascalCase) 是描述函数需要哪些账户的账户结构体。

解决方法? 将结构体重命名为类似 DoThingAccounts 的名称。 这样你就可以立即知道一个是代码逻辑,另一个是数据结构。

3. 实际上不是公钥的 Pubkey

好的,又一个命名噩梦。 Solana 的 Pubkey 类型听起来像是表示一个真实的密码学公钥,但事实并非如此。

实际上,Pubkey 仅仅意味着地址。 就这样。 这些地址中的一些属于真实的密钥对(带有匹配的私钥),但其他地址(例如 PDA(程序派生地址))则不然。

PDA 是从种子(例如 "order")和一个 ID 号生成的。 它们是确定性的,并且没有私钥。 因此将 Pubkey 视为“地址”。

4. 指令处理程序中发生错误时会发生什么?

这一个很重要。 如果你的指令处理程序内部发生任何错误,则整个指令都会失败。

假设你的处理程序首先将 Token 从金库转移到 taker,然后尝试将 Token 从 taker 发送到 maker。 如果第二步失败,Solana 会回滚所有内容。

没有半完成的状态。 区块链要么记录所有更改,要么不记录任何更改。 每个处理程序都必须返回 Ok(()) 才能使交易成功。

5. 我的程序中的交易在哪里?

你可能想知道,“等等,我一直在听说交易,但是我从未在我的程序中编写过交易。”

那是因为交易存在于客户端。 交易只是一个或多个指令的集合,有时甚至适用于不同的程序。

例如:

  1. 获取闪电贷(指令 1,闪电贷程序)
  2. 执行交换(指令 2-4)
  3. 编写备忘录(指令 5)
  4. 返还贷款(指令 6)

如果任何程序中的任何指令处理程序失败,则整个交易都会失败。 因此,链始终保持一致,不会半途而废。

6. 如何指定一个尚不存在的账户?

你可能会注意到,当你进行类似 make_offer 的操作时,即使金库和 offer 账户尚未存在,你仍然需要指定它们。

这是因为 Solana 仅仅需要预先提供地址,而不是账户本身。 这有助于运行时安全地并行处理交易。

因此,当你提供这些地址时,你实际上是在说,“嘿,我将要使用这些地址,请确保在我使用时没有人会接触它们。”

7. 为什么客户端可以选择 ID?

你经常会看到客户端为 offer 之类的东西提供自己的 ID,这让人感到奇怪,为什么不让程序生成它们呢?

好吧,随机性和确定性在区块链上很难融合。 每个验证者都需要产生相同的结果。

因此,客户端选择 ID,程序会检查它是否有效或已被占用(感谢 init 之类的约束)。 如果该地址已经存在,则指令将失败。 简单又安全。

8. 为什么此处理程序不需要特定的参数?

有时,你会看一个处理程序然后想,“等等,ID 参数在哪里?”

答案是:它已经在账户中了。 例如,make_offer 在交换程序中采用显式 ID,因为它需要创建一个新的 offer。 但是 take_offer 不仅仅读取现有的 offer 账户,该账户已经包含该 ID 及其所有数据。

因此,当一个参数看起来丢失时,它可能来自账户而不是函数参数。

9. Owner vs. Authority

这个问题会让很多人绊倒。

如果你检查一个 Token 账户,你将看到一个 Owner,并且可能还会看到一个 Authority。 Owner 通常是 Token 程序,它是管理规则的程序。 Authority 是实际可以签名进行更改的人,通常是 PDA。

因此,可以这样认为:

  • Owner → 你与之交互的系统

  • Authority → 发号施令的老板

有些浏览器甚至会混淆这些术语,因此不要过分依赖它们的标签。

10. &[&[&[u8]]] 的奥秘

最后,最大的一个 – 三层野兽。

Anchor 称其为 signer_seeds,但是 Andrew Fancong 曾经建议一个更好的名称:signer_seeds_bytes,他是对的。

事情是这样的:

  • 外部数组是所有签名者的列表。
  • 每个内部数组都是一个签名者的种子集。
  • 最里面的数组是构成每个种子的字节。

因此,如果你要从 PDA(称为 offer)拥有的账户转移 Token,则你可能有一个签名者(offer),两个种子("offer"offer_id),以及每个种子的字节。

签名者 → 种子 → 字节。 一旦你这样看待它,它实际上并没有那么可怕。

就是这样。 十个最令人困惑但最重要的 Solana 概念已经揭开神秘面纱。 如果你只记住一件事:Solana 的命名约定很有创意。 但是一旦你掌握了窍门,该系统背后的逻辑实际上就很有意义。

下一步

  • 探索 Solana 开发中更高级的主题,例如优化交易处理和实现复杂的业务逻辑。
  • 与 Solana 社区互动,以获得支持和更多学习资源。

通过遵循本指南,你应该对 Solana 开发中的基本概念有更清晰的了解,从而使你能够在该平台上更有效地构建。

我们❤️反馈!

如果你对新主题有任何反馈或要求,请告诉我们。 我们很乐意听取你的意见。

  • 原文链接: quicknode.com/guides/sol...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
QuickNode
QuickNode
江湖只有他的大名,没有他的介绍。