3 秒后将继续下一节内容
下一节
重播
学习下一节
登录 后可观看高清视频

用 Anchor 重写简单链上数据存储程序

41次播放
9小时前

本节课程围绕 Anchor 的基础使用方式 展开,通过将一个“简单链上数据存储程序”从原生 Solana 写法迁移至 Anchor,实现对 Solana 账户模型、PDA 使用方式以及 Anchor 标准开发流程的系统理解,为后续 Vault 与更复杂合约内容打下基础。

一、核心学习目标

通过本节课程,学员需要掌握以下能力:

  • 理解 Solana 与 EVM 在数据存储模型上的本质差异
  • 熟悉 Anchor 项目的基础结构与开发流程
  • 能够使用 PDA 为用户创建并管理专属数据账户
  • 掌握账户空间分配与动态扩容的基本规则
  • 能够独立排查 Anchor 开发中的常见报错

二、Anchor 开发的基本流程

Anchor 提供了一套高度标准化的 Solana 开发体验,本次课程覆盖了完整闭环。

1. 本地开发与测试流程

典型流程包括:

  • 安装依赖并初始化环境
  • 使用 anchor build 编译程序
  • 使用 anchor test
    • 自动启动本地 validator
    • 部署程序
    • 执行测试脚本

在开发早期阶段,anchor test 是验证逻辑正确性的首选方式。

三、Solana 账户模型与 PDA 的使用

1. Solana 与 EVM 的关键差异

在 EVM 体系中,数据通常直接存储在合约内部。

而在 Solana 中:

  • 程序本身不存储业务数据
  • 数据存储在独立的 账户(Account)
  • 程序通过读写账户来完成状态更新

2. PDA 在本次课程中的角色

本次“用户金库”示例中:

  • 每个用户对应一个 PDA 账户
  • PDA 通过 seeds + program_id 派生
  • PDA 用来存储用户的金库数据或余额信息
  • 用户签名 + PDA 规则共同保证数据归属的安全性

3. 是否需要 Auth 校验

课程中强调了一个常见误区:

  • PDA 的 owner 通常是 system program
  • 如果不做额外校验,逻辑层面的“数据归属”并不直观

因此,在真实项目中,建议通过:

  • 用户 signer
  • PDA seeds
  • 明确的字段校验

来确保账户只能被对应用户操作。

四、账户空间(space)分配与计算

账户空间是 Anchor 开发中最容易出错、但必须理解的一部分。

1. 基本原则

  • Solana 账户在创建时必须一次性声明空间大小
  • Anchor 账户默认需要额外 8 bytes 用于 discriminator

2. 常见写法

课程中对比了两种写法:

  • space = 8 + Struct::INIT_SPACE
  • 使用辅助函数动态计算空间

3. 动态字段的注意事项

当账户结构体中包含以下字段时:

  • Vec<T>
  • String

必须:

  • 显式声明最大长度(如 max_len
  • 否则 Anchor 无法正确计算所需空间

这是初学者最容易忽略、也最常导致运行时报错的点。

五、realloc 与 realloc::zero 的理解

当账户需要扩容时,可以使用 realloc

1. realloc 的作用

  • 在已有账户基础上增加空间
  • 常用于列表增长、数据追加等场景

2. realloc::zero 的含义

  • realloc::zero = true
    • 新增空间会被初始化为 0
    • 更安全、更可预测
  • false
    • 新空间内容不确定
    • 可能带来逻辑或安全风险

在涉及用户资产或关键状态时,推荐开启 zero。

六、常见报错与排查方向

1. Program ID 不匹配(最常见)

错误类型

DeclaredProgramIdMismatch (4100)

排查思路

  • 确认 Anchor.toml 中的 program id
  • 使用以下命令获取真实部署 id
solana-keygen pubkey target/deploy/<program>-keypair.json
  • 确保以下三处完全一致
    • declare_id!
    • Anchor.toml
    • 实际部署的 program id

2. 找不到 .so 文件

错误表现

  • deploy 阶段提示找不到 program 文件

解决思路

  • 确认 anchor build 成功执行
  • 检查 target/deploy 目录下是否生成 .so 文件

3. 工具链或 Solana CLI 版本问题

典型现象

  • toolchain 名称无效
  • 编译阶段直接失败

解决思路

  • 检查本地 solana-cli 版本
  • 按课程推荐版本重新安装或切换
  • 保证 Anchor 与 Solana 版本兼容

4. 测试脚本依赖缺失

错误表现

  • ts-mocha 找不到

解决思路

  • 先执行 yarn install
  • 确保测试相关依赖已正确安装

七、课后实践建议

  • 独立完整跑通一次项目流程
    • build
    • test
    • deploy
  • 把以下内容整理成自己的 checklist
    • PDA 设计
    • 权限校验
    • space 计算
    • realloc 使用场景
  • 为毕业设计提前养成习惯
    • 每次 deploy 前检查 program id
    • 关键逻辑不只依赖自动生成代码