Jacky Gu

Solana开发笔记: Solana开发随想

01 Jan 2025 Share to

Solana开发随想

一、如何入门Solana开发

我整理如下:

1- 学习rust语言基础。

据说rust语言是世界上看难也是最安全的语言,这种夸张的说法让很多人望而却步。有个教程由浅入深,很适合入门:Rust book中文版,个人认为不用全部看,只要看前面十章,对付solana程序开发足够了。

2- Solana的基础操作

如钱包,Dex,Solana与anchor开发环境安装,Solana cli,spl-token cli工具等。有过链上开发经验的程序猿,通过官方教程,学会不难。

3- solana程序开发基础

看官方文档,从Quick start开始。

重点需要理解Account,Program与Data分离,PDA账户,CPI调用,ATA账户,Instruction指令,seeds与signer,序列化/反序列化等重要理念,从以太坊的理解模式切换到solana的理解模式。

4- 学样敲代码

跟着Solana的Playground上的示例程序学着写链上程序,熟悉anchor开发框架,程序部署,测试等。

5- 熟悉Solana/web3前端sdk

包括:@solana/spl-token,@solana/web3.js,@coral-xyz/anchor,以及@metaplex-foundation/* 等库。

6- 熟悉Spl-token及Spl-token2022扩展与开发

重点是知道两者的区别,以及Token2022的各个扩展(extension)的用法。

7- 熟悉rust库(柳条箱crates)

包括:anchor-lang,anchor-sql, spl-token,mpl-token-metadata等常用crates。

8- 掌握subgraphsubstream

subgraphsubstream用于同步solana链上数据,用于前端应用通过graphql查询链上数据。

9- 图片及metadata数据存储

熟悉IPFSArweaveirys等,这些是solana开发离不开的东西。

10- 掌握与DEX相关的知识

AMM原理以及几个版本的变化,Raydium的流动性管理与交易,熟悉ammV4(截止发文时的版本)、clmmcpmm三个版本的原理,使用Raydium-sdk-v2调用链上程序,使用raydium-cpi跨程序调用,实现交易功能。

11- 掌握Solana程序的账户安全机制

这是开发一个商用应用必须具备的,非常重要。

二、时间

对于熟悉以太坊Dapp的高级程序员,如果计算机语言学习能力很强,完整学习上述内容一般需要80-100小时。普通的以太坊开发者大概需要150-200小时,甚至更多(坎在rust)。

如果不具备上述条件,建议放弃学习solana应用开发,或者只学前端应用开发部分,放弃链上程序开发,这样学习难度和量会降低90%。

三、方法

方法只有一条:干中学

四、solana的编程思想

1- 账户即一切

Solana有个非常重要的理念:账户即一切

对这个概念的理解会有一定难度,往往被“账户”一词误导。就像一开始接触以太坊的人不明白合约是怎么回事,会把合约和法律合同或者交易所的杠杆产品混淆,其实合约全称是智能合约,就是链上程序。

Solana链上的一个账户(Account)就是存储一组键值(key-value)的单元,用一个Hash地址表示存储位置,所有数据,程序都保存在Solana网络上某一个存储区域中。

2- 从有状态到无状态程序

习惯了以太坊智能合约开发的,需要转变思路。 以太坊智能合约是有状态的,在一个合约中包括数据(合约状态)和程序;solana程序是无状态的,数据和程序分离,一般这种架构的并发性能很高,因为不需要考虑状态更新。

以太坊的这种有状态程序开发很容易理解,因为绝大多数程序都是有状态的。虽然以太坊也可以通过去delegate call实现数据与程序分离,但是非主流。

打个比方,以太坊合约相当于一家公司,业务、记账、数据等都在一个智能合约中。solana程序相当于业务外包或记账外包机构,业务和账本属于公司,但由这些专业机构负责管理。以代币为例,以太坊上每个代币都有自己的合约,而solana上只有官方一两个代币合约,所有代币只是数据,不包含逻辑程序。

Solana的这种设计的好处是,杜绝了代币合约中的逻辑滥用。比如:以太坊上曾经很猖獗的”貔貅币“、”冻结币“等。

3- 从Solidity到Rust

以太坊合约的开发语言是Solidity,属于脚本语言JavaScript家族,语法并不严谨,会有安全漏洞。近十年来,以太坊上的安全事故频出。Solana用据称是最安全的语言之一Rust写,这门静态类型语言,通过严格的所有权借用和类型约束等机制,在编译阶段,就可发现存在的安全隐患,且规避了绝大多数语言的数据竞争和内存泄漏问题,并且在并发处理上具有天然优势。用在区块链上,则表现在安全性和TPS极高。

4- 从不可篡改到可升级

以太坊的不可篡改性比solana高,严格讲solana更像分布式计算机,以太坊的区块链属性更强。两者的设计思想是不一样的,solana的设计,更像“程序”,升级维护方便,适合更广的应用场景,而以太坊主打不可篡改,一般情况下,合约无法升级。

但是,Solana链上对资产的标准做了非常严格的限制,比如Spl token,如果要在solana生态的钱包和DEFI应用中兼容,就必须符合Spl token标准,在该标准中“插入”其他代码的随意性比以太坊上的ERC20代币低很多。这也是尽管Solana程序可随时升级,但其生态中的代币资产却比较“纯”,并不像以太坊生态中有大量的“貔貅币”。

5- 开发上,难度终点不同

以太坊合约的逻辑设计部分的难度比较高,尤其是安全和性能优化方面,solana的指令与账户数据结构(#[derive(Accounts)])设计要求和难度比较大。

原因是solana合约是无状态的,在处理请求时不依赖于任何程序内部的状态信息,每个指令请求都是独立的,所以在指令数据中要包含所有必要的外部账户来完成该请求的验证和处理。

总的来说,solana这种数据与程序分离的开发模式更体现当代程序开发哲学,更能提升效率和安全性,类似的还有AptosSUI等区块链用的MOVE语言。而solidity属于传统JavaScript脚本型语言,简单但性能和安全上有问题,虽然入门很容易,但非成熟的程序猿很难写出高质量且安全的智能合约。