Solana/程序开发入门/一个允许用户自由存储数据的链上程序
在 solana 上写程序, 可不只是写代码这么简单. 您需要理解账户模型, 租赁机制, 权限控制, 还有数据存储的经济成本. 这套项目教程, 正是为了带您一步步理解并实现一个真实又不复杂的链上应用.
我们要做的, 是一个链上数据存储器.
背景动机
假设您是某个去中心化应用或工具平台的用户, 您希望能把一段数据(比如一份文档, 一个配置文件, 一份合同或者一个游戏存档)存在链上.
- 您希望数据是您的, 不能被别人覆盖.
- 您希望以后可以随时更新这份数据.
- 您不希望因为数据长度变化, 导致程序崩掉或账户被清除.
- 您也不想付出不必要的存储费.
这时候, 我们就可以做一个用户托管数据仓库, 每个用户的数据单独保存在自己的一个 pda 中, 按需付费, 灵活更新.
项目目标
我们要实现的是一个支持任意用户创建, 更新, 扩容和缩容数据账户的 solana 程序, 具体包括两个功能:
- 用户可以初始化自己的数据账户. 程序会为用户创建一个 pad 作为数据存储账户; 用户可以指定初始内容, 系统会根据长度自动分配所需的存储空间; 数据账户的所有 lamport 和权限归用户所有, 程序只负责校验并初始化账户.
- 用户可以随时更新数据内容. 用户可以把数据换成新的内容; 如果新数据更长, 程序会检查用户是否附带了足够的 lamport 以保持租赁豁免; 如果新数据更短, 程序允许把多余的 lamport 从数据账户中提取出来, 退还给用户.
技术细节
程序根据用户主钱包地址生成 pda 账户, 保证每个用户有且仅有一个对应的数据账户. 整个 pda 账户的 data 区域用于存储用户输入的原始字节流. 同时需要处理 solana 的租赁机制, 程序使用系统程序接口, 计算给定长度数据所需的最小租金, 检查当前 pda 账户的余额是否满足租赁豁免要求, 如果不够, 用户必须补 lamport; 如果超额, 允许用户提取差额. 最终, 程序将把用户提交的任意数据写入 pda 账户的 data 字段里.
小结
这个程序看似简单, 但它涉及了 solana 开发中几乎所有关键知识点: pda 账户, 账户创建, lamport 管理, 系统调用, 权限校验, 动态数据处理…… 是一个非常理想的实战练习项目.
如果您已经安装好开发环境, 让我们从下一章开始, 一步步把这个链上数据存储器构建起来!