Solana开发学习笔记(一)——从Hello World出发

时间:2024-06-18  分类:电子


笔者注:因近期笔者工作需要,开始接触Solana链上程序开发。本系列文章是笔者的学习笔记,既是为了备忘,也是希望得到Solana开发者的指点与交流。本系列文章将默认读者已经掌握Rust的基础语法,故不涉及对Rust语法细节的解释。如果读者对Rust基础语法还不熟练的话,本文下方推荐的Rust入门书籍《Rust编程入门、实战与进阶》学习。


1.1Solana简介


Solana是一个高性能、无许可的底层公链,专注于在不牺牲去中心化或安全性的前提下提供可扩展性。Solana主网于2020年一季度上线,目前主网的全球节点超过800个,TPS最高可达6.5万,出块时间约400毫秒。


Solana的共识算法采用PoH(历史证明),其核心是一个去中心化时钟,该时钟旨在解决缺乏单个可信赖时间源在分布式网络中的时间问题。PoH免除了在节点网络中广播时间戳的需求,从而提高整个网络的效率。


1.1.1链上程序


Solana的智能合约叫做链上程序(On-chainProgram),Solana官方提供了Rust和C的SDK来支持开发链上程序。链上程序的开发工作流如图1-1所示,开发者可以使用工具将程序编译成BerkleyPacketFilter(BPF)字节码(文件以.so为扩展名),再部署到Solana链上,通过Sealevel并行智能合约运行时去执行智能合约的逻辑。此外,基于SolanaJSONRPCAPI,官方提供了诸多SDK用于客户端与Solana链上数据交互。


图1-1链上程序开发工作流


1.1.2账户模型


与以太坊类似,Solana也是基于账户模型的区块链。通过将任意状态存储于链上账户并同步复制给集群中的所有节点,可以创建复杂而强大的去中心化应用程序。


Solana提供了一套不同于以太坊的账户模型,账户定义的字段如表1-1所示。Solana的账户可以分为可执行账户和不可执行账户。



表1-1账户定义字段


字段描述
lamports账户余额
owner账户所有者
executable是否为可执行账户
data账户存储的数据
rent_epochSolana链上程序的部署是按其账户大小进行定期收费的,如果账户无法支付租金,系统将清除该账号

我们知道以太坊上每个智能合约的代码和状态都存储在同一个账户中,而Solana链上程序是只读或无状态的,即程序的账户(可执行账户)只存储BPF字节码,不存储任何状态,程序会把状态存储在其他独立的账户(不可执行账户)中。为了区分某个账户是用作哪个程序的状态存储,每个账户都指定了一个程序作为其所有者。程序可以读取其不作为所有者的账户中的状态,但只有作为所有者的程序才能修改账户中的状态,任何其他程序所做的修改都会被还原并导致交易失败。


更多关于账户模型的资料可以参见官方文档:https://solana.wiki/zh-cn/docs/account-model/


1.2搭建编程环境


在开始Solana链上程序开发之前,需要先安装和配置相关的编程环境。首先请正确安装Node、NPM和Rust的最新稳定版本,下面来安装SolanaCLI并配置相关环境。


1.2.1安装SolanaCLI


SolanaCLI是与Solana集群进行交互的命令行管理工具,包含节点程序solana-validator、密钥对生成工具solana-keygen,以及合约开发工具cargo-build-bpf、cargo-test-bpf等。


在终端运行以下命令,可完成SolanaCLI最新稳定版的下载与安装。


sh-c"$(curl-sSfLhttps://release.solana.net/stable/install)"

如果安装成功,会出现以下内容。


downloadingstableinstaller
✨stablecommite9bef425initialized
AddingexportPATH="~/.local/share/solana/install/active_release/bin:$PATH"to~/.profile
AddingexportPATH="~/.local/share/solana/install/active_release/bin:$PATH"to~/.bash_profile
CloseandreopenyourterminaltoapplythePATHchangesorrunthefollowinginyourexistingshell:
exportPATH="~/.local/share/solana/install/active_release/bin:$PATH"

SolanaCLI的所有命令行工具都安装在~/.local/share/solana/install/active_release/bin中,并会自动将该路径加入~/.profile和~/.bash_profile文件的PATH环境变量。


运行以下命令,检查PATH环境变量是否已正确设置。


solana--version
//solana-cli1.7.18(src:e9bef425;feat:140464022)

如果能显示solana-cli的版本号、版本哈希等信息,代表环境变量设置成功。如果未看到这些信息,请检查相关文件中PATH环境变量设置的路径是否正确。


如果已安装过SolanaCLI,想升级到最新版本,可在终端运行以下命令。


solana-installupdate

1.2.2配置SolanaCLI


1.连接到集群


Solana的集群有本地集群(localhost)和公开集群。根据不同的用途,公开集群又分为开发者网络(devnet)、测试网(testnet)和主网(mainnet-beta)。



运行以下命令,根据实际需要来选择集群。


//选择localhost集群
solanaconfigset--urllocalhost
//选择devnet集群
solanaconfigset--urldevnet

2.创建账户


如果是第一次使用SolanaCLI,需要先创建一个账户。运行以下命令,根据操作提示可以设置一个BIP39规范的密码,此密码用来增强助记词的安全性,当然也可以为空。生成新的账户后,密钥对会被自动写入~/.config/solana/id.json文件中。需要注意的是,这种存储密钥对的方式是不安全的,仅限开发测试使用。


solana-keygennew

要查看当前这个账户的公钥,运行以下命令。


solana-keygenpubkey

当前如果是在devnet集群,该账户的余额为0SOL,可以运行以下命令查询余额。


solanabalance

在devnet上申请SOL空投,运行以下命令后再次查询当前账户的余额,会发现余额为2SOL。


solanaairdrop2

1.3第一个Solana项目HelloWorld


HelloWorld是一个官方演示项目,展示了如何使用Rust和C开发链上程序,并使用SolanaCLI来构建与部署,以及使用SolanaJavaScriptSDK与链上程序进行交互。


1.3.1HelloWorld源码解读


example-helloworld项目的目录结构如下所示,其中program-rust目录下是Rust开发的程序源代码,client目录下是客户端的源代码。


example-helloworld
|
+--src
||
|+--client
|||

-->> 1/3 文章未完,请继续阅读

以上就是Solana开发学习笔记(一)——从Hello World出发的全部内容,望能这篇Solana开发学习笔记(一)——从Hello World出发可以帮助您解决问题,能够解决大家的实际问题是非常好学习网一直努力的方向和目标。