搭建 Rust 开发环境

搭建 Rust 开发环境

在区块链的世界里, solana 一直以快和高并发闻名. 如果您有点 web3 的背景, 大概也听说过它的一些不同: 它不用 evm, 不用 solidity, 合约用 rust 写, 部署成 bpf 字节码.

我们已经有太多 evm 项目了!

刚听上去可能有点劝退, 但其实一旦上手, 您会发现 solana 合约系统非常清爽, 性能极高, 而且资源管理也非常工程化和模板化. 只要您成功编写了第一个能正常运行的程序, 您几乎就能编写 solana 生态系统里的所有种类的程序.

本篇文章就带你一步步搭建 solana 智能合约的开发环境, 为后续学习和动手实验做好准备.

为什么用 Rust 写 Solana 合约

Solana 的运行时不是基于 evm, 而是基于 berkeley packet filter(bpf), 它是一种经过验证的适合在内核或沙盒中运行的字节码格式.

Berkeley packet filter, 诞生于上世纪 90 年代初(是的, 它的年纪比许多年轻黑客还大), 最初是为 unix 系统上的网络数据包捕获而生的. 简单来说, 它是一种高效的网络数据包过滤机制, 让内核能够决定哪些数据包该被扔掉, 哪些该传给用户态程序, 好比门卫大叔判断谁能进小区. 它的核心就是一个小巧玲珑的虚拟机, 这台虚拟机能运行一套简单的指令集(和 x86, arm 这些庞然大物比, bpf 的指令集简直像个袖珍机器人). 之后的时间里, 开发者们渐渐发现可以依赖 bpf 的指令集做更多事情, 于是 bpf 演化成了一个超级沙盒执行环境.

Rust 是目前社区最成熟的用来编写 solana bpf 合约的语言, 原因有几个:

  • Rust 编译器对内存和类型检查非常严格, 能减少低级错误.
  • Rust 的性能接近 c/c++, 但更安全.
  • 最重要的: solana 官方 sdk 用 rust 编写, 生态完善.

所以, 不管你是 web 开发者, 链上合约老手还是系统程序员, 只要你想写 solana 合约, rust 是唯一且最佳选择.

安装 Rust 工具链

如果你已经是 rust 用户, 可以跳过这一步. 否则, 前往 rust 安装页面 根据提示安装 rust. 对于 linux, macos 以及 windows 上的 linux 子系统而言, 其安装命令都是一样的:

$ curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

安装后, 运行:

$ rustup --version
$ cargo --version

确认一切就绪.

Anchor 开发框架(可选但目前不推荐)

Anchor 是 solana 合约的一个开发框架. 它有一些优点, 例如自带合约模板, 自动处理 pda 账户权限, 支持集成测试等. 但是对于新手来说, 过早使用框架进行合约开发, 可能无法真正掌握 solana 合约的底层逻辑.

鉴于多数 solana 合约开发教程或文档, 均习惯基于框架进行教学, 因此我特地在这里告诉您, 本章节后续的内容不会依赖 anchor 框架, 您现在也没有必要安装 anchor.

实现一个允许用户自由存储数据的链上程序

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

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

背景动机

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

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

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

项目目标

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

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

技术细节

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

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

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

点赞 2
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论