使用Anchor构建Solana程序
什么是 Anchor?
Rust 通常被描述为 Solana 程序开发的通用语言。但更准确地说,Anchor 才是真正的通用框架,因为大多数 Rust 开发都使用这个框架。Anchor 是一个有主见且强大的框架,旨在快速构建安全的 Solana 程序。它通过减少账户(反)序列化和指令数据等领域的样板代码,进行必要的安全检查,自动生成客户端库,并提供广泛的测试环境,从而简化开发过程。
本文将探讨如何开发 Anchor 程序。它涵盖了安装 Anchor、使用 Solana Playground 以及创建、构建和部署一个简单的 Hello, World! 程序。然后,我们将深入探讨 Anchor 如何通过检查 IDL、宏、Anchor 程序的结构、账户类型和约束条件以及错误处理来简化开发过程。我们还将简要介绍跨程序调用和程序派生地址。本文将提供你开始使用 Anchor 所需的一切知识。
前提知识
本文假设你已了解 Solana 的编程模型。如果你是 Solana 开发新手,我建议阅读我之前的博客文章《Solana 编程模型:Solana 开发入门》。如果你是 Rust 新手,不必担心 - 开始 Anchor 开发不需要高级知识。Anchor 文档指出,开发者只需熟悉 Rust 的基础知识(即 Rust 书籍的前九章)。我建议观看《Rust 生存指南》,了解 Rust 编程概念的基本要点。了解 Rust 的内存、所有权和借用规则也至关重要。
为了减轻学习曲线,我建议新接触低级编程语言的开发者复习 Rust 资源往往跳过的不同系统编程特定概念。例如,我建议了解变量大小、指针和内存泄漏等主题。我还推荐《通过示例学 Rust》和我的仓库,其中包含用 Rust 编写的各种数据结构和算法示例。
想使用 TypeScript 代替吗?了解如何使用 Poseidon 框架用 TypeScript 编写 Solana 程序,将 TypeScript 转译为 Rust 并生成有效的 Anchor 程序。
本文专注于 Anchor 开发,仅限于 Anchor 开发。我们不会介绍如何用原生 Rust 开发程序,本文也不假设你了解这方面的知识。此外,本文不会涵盖 Anchor 的客户端开发 - 我们将在未来的文章中介绍如何通过 TypeScript 测试和与 Anchor 程序交互。
话不多说,让我们开始使用 Anchor 吧!
安装 Anchor
设置 Anchor 涉及几个简单的步骤,安装必要的工具和包。本节介绍如何安装这些工具和包(即 Rust、Solana 工具套件、Yarn 和 Anchor 版本管理器)。
安装 Rust
Rust 可以从官方 Rust 网站安装,或通过命令行安装:
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
安装 Solana 工具套件
Anchor 还需要 Solana 工具套件。最新版本可以使用以下命令为 macOS 和 Linux 安装:
sh -c "$(curl -sSfL https://release.anza.xyz/stable/install)"
可以将 stable 替换为与您所需版本的软件版本匹配的发布标签(例如 v2.0.3),或者使用以下三个符号通道名称之一: stable、 beta 或 edge。安装后,运行solana --version
确认已安装所需版本的 solana。
安装 AVM
Anchor 版本管理器 (AVM) 允许您在系统上安装和管理不同的 Anchor 版本,并在未来轻松更新 Anchor 版本。使用以下命令安装 AVM:
cargo install --git https://github.com/coral-xyz/anchor avm --force
使用 AVM 安装 Anchor
Anchor 文档建议通过 Anchor 版本管理器(AVM)安装 Anchor。AVM 简化了管理和选择 anchor-cli 二进制文件的多个安装。这可能是生成可验证构建或在不同程序之间使用替代版本所必需的。
使用 Solana Playground
Solana Playground 是一个基于 Web 的 IDE,允许开发者在浏览器中编写、构建和部署 Solana 程序。它是一个强大的工具,特别是对于那些不想在本地设置开发环境的开发者。
创建、构建和部署 Hello, World! 程序
这是因为它们的简单性,各种技能水平的开发者都能理解它们。这些程序还阐明了新编程模型的基本结构和语法,而不引入复杂的逻辑或函数。它已经迅速成为编码中相当标准的初学者程序,所以我们自然要为 Anchor 编写一个。本节介绍如何使用本地 Anchor 设置以及 Solana Playground 构建和部署 Hello, World! 程序。
declare_id!
宏为程序设置公钥。对于本地开发,用于设置程序的anchor init
命令将在 target/deploy 目录中生成一个密钥对,并填充此宏。Solana Playground 也会自动为我们完成这项工作。
恭喜!你刚刚通过 Solana Playground 将第一个 Solana 程序部署到 devnet!
Anchor 如何简化开发过程
Anchor 通过有效抽象简化程序开发。也就是说,Anchor 简化了复杂的区块链编程概念,使它们更容易访问和使用。
IDL(接口描述语言)
开发者可以像通常使用任何典型的 Rust 数据结构那样定义状态,然后 Anchor 处理底层序列化和存储到账户中。在链上发布 IDL 也非常简单。开发者可以使用以下命令发布 IDL:
anchor idl publish --provider.cluster devnet --provider.wallet ~/.config/solana/id.json <program-id>
确保提供的钱包是程序的权限,并且有足够的 SOL 用于交易。开发者现在可以在区块浏览器(如 XRAY 或 Solana Explorer)上查看他们的 IDL。
宏
Anchor 的宏是最重要的抽象之一。它们允许开发者编写类似于 match 表达式的内容,通过macro_rules!
构造。过程宏更像是一个函数,接受一些代码作为输入,对该代码进行操作,并产生一些输出。在 Anchor 中,例如,#[account]
宏定义并强制执行 Solana 账户的约束条件。
Anchor 程序结构
Anchor 的程序结构旨在利用宏和特性的组合来生成样板代码并强制执行程序逻辑。这种设计理念在简化开发过程和确保程序行为的一致性和可靠性方面发挥着重要作用。
账户类型和约束条件
在未来的文章中,我们将更深入地介绍 Solana 程序安全性和黑客攻击 Anchor 程序。然而,在这里介绍约束条件很重要。约束条件允许开发者验证某些账户或它们持有的数据是否符合一些预定义的要求。可以使用#[account(...)]
属性应用几种不同类型的约束条件,该属性也可以引用其他数据结构。
程序派生地址(PDA)
来源:一个基本的 Ping 计数器程序示例,由 Solana 基金会提供。记住,PDA 是曲线外的,没有关联的私钥。它们允许程序签署指令,并允许开发者在链上构建类似哈希映射的结构。PDA 是使用可选种子列表、碰撞种子和程序 ID 派生的。重申一下,以下约束条件用于检查给定账户是否是从当前执行的程序、种子以及(如果提供)碰撞派生的 PDA:
错误处理
Anchor 还将尝试在可能的情况下解析程序错误堆栈,以追溯到程序错误的原始原因。ProgramError 作为基础错误类型,其实用性通过 Anchor 的日志记录和解析机制得到增强,以提供详细的错误信息。
跨程序调用(CPI)
跨程序调用(CPI)在整篇文章中都有提及,所以我们有一个专门的章节来讨论它们是合适的。CPI 对 Solana 的可组合性至关重要,因为它们促进了程序直接调用其他程序。这将 Solana 生态系统变成了一个庞大的、相互连接的 API,供开发者使用。为了简洁起见,我建议阅读 Anchor 关于 CPI 的文档,因为它们提供了一个有用的 CPI 实际应用示例,包括傀儡和傀儡主人程序。
总结
Anchor 是一个强大的框架,一点也不为过。我们探索了 Anchor 用于减少代码量的各种宏和特性,它简化开发流程的能力显而易见。它拥有完善的文档和强大的相关教程及 crate 生态系统。Anchor 深受绝大多数 Solana 开发者的喜爱和使用。