solana合约学习
本文是对 solan相关问题介绍,主要用于记录solana合约的学习过程。因为现阶段还没有十分深入的学习 solana的细节,所以目标限定在 solana的简单合约编写,环境搭建,测试。
基础
因为是学习指南,所以会先强调学习的基础。本文的基础建立在会 rust基础上,明白 rust的语法,可以达到 rust编写简单代码的基础之上。因为 solana 合约是直接使用 rust编写的。如果不具备简单的 rust基础,请先学习 rust book,至少了解 rust的基本语法。
solana环境
因为 solana有自己的介绍文档,不再重复介绍solana概念。下面主要讲剩余部分。
- 开发环境
- 主要就是 rust环境,可以去 rust官网上直接安装 rust环境。因为 rust已经比较成熟,没有特别的问题,直接安装最新环境。
- 编辑器,因为是直接使用 rust开发solana 合约的,所以主流的 VSCODE Rustrover vim zed emacs都可以。选择自己喜欢的就好。
- solana cli工具。https://solana.com/developers/guides/getstarted/local-rust-hello-world
- cli工具是生成地址,链接 solana节点,部署合约的基础。后面会继续提到一些注意事项,请务必参考安装的的注意事项。
- anchor anchor是 solana 的“框架”,可以去 anchor官网安装 solana框架。后面也有注意事项。
- 以上的套件理论上是全部需要的。如果你只是使用solana native开发,可以不使用 anchor。也就可以不用安装 anchor 套件。
环境安装中的特殊问题
- 根据目前 2024年06月08日20:17:14 时间 solana 是 v1.18.15。 solana 本身并不是直接安装最新版本就好了。最新版本可能出现编译不过,获取有一些更加具体的字节超量的编译问题。这时候就需要回退到历史版本。可以看下面的链接。当然如果你非常幸运,安装之后完全没有问题就不必折腾。事实是,我安装了最新版之后一直无法通过编译,然后不得不安装下面的方案回退。
- https://www.notion.so/alvinvip/cd22ecfe315d4acbb83c68ca8a3d7b30?pvs=4#14fa26df7432402ebf18529fecf20e40
- anchor也存在以上问题,最新版无法运行。这样采用上面的办法即可,直接退版本。
- https://book.anchor-lang.com/getting_started/installation.html
- 注意查看版本关系 anchor 0.30需要使用最新的 solana v1.18.15(务必注意时间,后续升级必须兼顾 solana版本和 anchor版本)
测试问题
- solana是使用 rust写的合约,完全可以使用 rust代码来测试。但是,务必记住,如果你使用 anchor的话,直接使用 TS测试。TS包提供了完整的测试环境和方法,非常方便。在 solana的世界中,使用 TS测试是常态。使用 rust测试反而是异类。应该还是 TS程序员更加普遍的原因,优先支持更流行的语言。
- 所以在会 rust的基础上可以,快速学习一下 js语法,然后学一点 TS即可。
- https://www.youtube.com/watch?v=vDNw0FWL8zw&ab_channel=走歪的工程師James
- 在 youtube上随意找到一个 js教学视频,大概两小时可以了解 js用法。然后再花 20 分钟学习一点 TS和 js的不同之处即可。所以没错,这个学习过程中包括两个半小时的 js/ts基础的学习。学习到可以写代码即可。
- 如果一定要用 rust测试也没有问题
1 | anchor init —test-template rust <xxxxx> |
- 使用以上命令可以生成 带rust测试模板的 anchor 代码。
- https://github.com/coral-xyz/anchor/pull/2805
- 上面的 PR也是关于 rust测试的,可以看出来anchor对于 rust测试支持也是最近才有一定的进展。所以建议还是现学TS测试比较快。
节点
大部分时候节点使用不应该成为一个问题,但是 solana的 devnet似乎很不稳定,所以最好使用本地网络部署的和测试
1 | solana-test-validator |
上面的两个命令是启动本地节点和 重启本地节点。如果你在启动节点的时候 7 遇到问题可以考虑这个。主要的症状是再次重启,节点状态不对。
和同等类型合约的差别
众所周知,使用 rust编写的区块链还有 sui和 aptos。在 solana合约之前,我还学习了 move合约
https://github.com/TigerInYourDream/letsmove
上面是我参与 sui 合约的代码。sui的合约使用 move编写。和 anchor不一样,move的环境安装没有上面的特殊问题。直接安装最新就可以。move是一个简易版本的 rust,学习难度显著降低。
另外 sui的主要交互可以使用命令行实现,主要参数就是部署时刻生成的各种 hash id。可能对于后端程序员这这种方式更加直接。
但是 sui move目前支持的功能相对少一点。所以两种合约各有优缺点。
solana的抽象层次
和所有的区块链编程模型一样 solana划分为下面的结构
solana使用合约直接使用 rust编写。写好的合约可以直接部署到 solana的节点上。这个过程称之为发布合约。solana因为使用 rust,和其他区块链稍有不同,把编程部分成为 program。他也确实是个完备的 program。为了和其他区块链中的概念统一,也可以把它称为智能合约。
部署节点上的合约,就相当于给 solana节点增加了新的“接口”。可以调用 solana client sdk直接调用合约实现交互。最直接的使用 solana js sdk就可以实现前端网页与合约交互。使用 sdk与节点交互的这个应用就是 dapp。
和金融里面合约不一样,区块链世界的“合约”就是一段可以执行的代码。所以有的区块链也把自己称之为“互联网计算机”。能执行代码,也能被调用,的确是是一个“计算机”。
此外,让链上数据发生变化的操作叫做交易。无论是通过 dapps 或者 rust js 客户端或者其他方式和链上信息进行交互的过程都叫做交易。
anchor和 solana的关系
在 solana链上实现编程主要有两种方法
- native program
- anchor
https://solana.com/developers/guides/getstarted/local-rust-hello-world
使用以上代码, 引入 solana-program crates就可以进行 native solana program。如果你仔细查看代码, 你会发现指令 Instration是个 u8数组,也就是说进行网路传输的数据,你需要在合约段解码u8,相应的你需要在客户端进行编码。没错,你还需要了解编解码和 rust的 layout 的细节。否则无法解析出正确的数据。
anchor在solana-program的基础上套了一层,最主要的就是解决数据编解码的问题。这个就是原生编码和 anchor 编码的差别。anchor 也是 solana官网推荐的写合约的方式。当然,如果你无畏 layout细节,native 合约也是可以的。
一些其他的推荐
可以使用 just工具,预先写好合约编译,发布和测试命令。然后使用just运行。生成自己的流水线,是我个人推荐的方式。如果有一些其他复杂的命令行,可以再花 20 分钟学习 amber。可以设计出一些比较复杂的合约部署流程。丰俭由人。
教学视频
solana已经有较多的编程实践了,课程很多。可以看上面的视频进行学习。也是一个比较不错路径。