登录 后可观看高清视频
用 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
- 关键逻辑不只依赖自动生成代码