Solana/程序开发入门/一个允许用户自由存储数据的链上程序

在 solana 上写程序, 可不只是写代码这么简单. 您需要理解账户模型, 租赁机制, 权限控制, 还有数据存储的经济成本. 这套项目教程, 正是为了带您一步步理解并实现一个真实又不复杂的链上应用.

我们要做的, 是一个链上数据存储器.

背景动机

假设您是某个去中心化应用或工具平台的用户, 您希望能把一段数据(比如一份文档, 一个配置文件, 一份合同或者一个游戏存档)存在链上.

  1. 您希望数据是您的, 不能被别人覆盖.
  2. 您希望以后可以随时更新这份数据.
  3. 您不希望因为数据长度变化, 导致程序崩掉或账户被清除.
  4. 您也不想付出不必要的存储费.

这时候, 我们就可以做一个用户托管数据仓库, 每个用户的数据单独保存在自己的一个 pda 中, 按需付费, 灵活更新.

项目目标

我们要实现的是一个支持任意用户创建, 更新, 扩容和缩容数据账户的 solana 程序, 具体包括两个功能:

  1. 用户可以初始化自己的数据账户. 程序会为用户创建一个 pad 作为数据存储账户; 用户可以指定初始内容, 系统会根据长度自动分配所需的存储空间; 数据账户的所有 lamport 和权限归用户所有, 程序只负责校验并初始化账户.
  2. 用户可以随时更新数据内容. 用户可以把数据换成新的内容; 如果新数据更长, 程序会检查用户是否附带了足够的 lamport 以保持租赁豁免; 如果新数据更短, 程序允许把多余的 lamport 从数据账户中提取出来, 退还给用户.

技术细节

程序根据用户主钱包地址生成 pda 账户, 保证每个用户有且仅有一个对应的数据账户. 整个 pda 账户的 data 区域用于存储用户输入的原始字节流. 同时需要处理 solana 的租赁机制, 程序使用系统程序接口, 计算给定长度数据所需的最小租金, 检查当前 pda 账户的余额是否满足租赁豁免要求, 如果不够, 用户必须补 lamport; 如果超额, 允许用户提取差额. 最终, 程序将把用户提交的任意数据写入 pda 账户的 data 字段里.

小结

这个程序看似简单, 但它涉及了 solana 开发中几乎所有关键知识点: pda 账户, 账户创建, lamport 管理, 系统调用, 权限校验, 动态数据处理…… 是一个非常理想的实战练习项目.

如果您已经安装好开发环境, 让我们从下一章开始, 一步步把这个链上数据存储器构建起来!