Solana是年兴起的一条明星公链,目前是排名前列的主流公链之一,常被称为“以太坊杀手”。其智能合约被称为program,是用rust语言开发,今天演示一下如何在solana上开发一个计算器program,并编写测试代码对其进行测试。
-1.安装环境
首先安装rust,我已经安装过了,就不演示了,查看一下rust的版本
还需要安装nodejs,已经安装过了,查一下版本
安装solana(注意是全局安装,并不是安装在某个目录中)
安装solana之后,注销然后重新登录用户,或者执行
exportPATH="/home/linke/.local/share/solana/install/active_release/bin:$PATH"
全局安装mocha
sudonpminstall-gmocha
全局安装Anchor,这是solana目前最好的开发工具,类似于hardhat对于以太坊的地位。它提供了一个RustDSL(基本上是一个更简单的Rust),可以与IDL、CLI和workspace管理一起使用。Anchor从传统的Solanaprogram中抽象出了许多潜在的安全漏洞,负责序列化和反序列化,将大量繁琐的代码变成宏和许多其他好的特性。
sudonpmi-g
project-serum/anchor-cli查看anchor的版本
anchor--version
-2.通过solana命令行运行命令
首先执行solanaconfigget,获取solana当前的配置
在开发program时环境最好设置为本地环境,上图中显式RPCURL是mainnet,需要运行以下命令设置为本地环境
solanaconfigset--urllocalhost
接下来需要知道我们的帐户/钱包地址,并空投一些SOLtokens到这个地址,以处理与Solanaprogram交互所带来的所有部署、交易等成本。
执行solanaaddress,获取地址
如果之前没有设置过密钥对,那么将不会在结果中有密钥对路径。需要新建一个密钥对。
目前/home/linke/.config/solana/id.json是不存在的。
执行以下命令新建一个密钥对
solana-keygennew-o/home/linke/.config/solana/id.json
BIP39Passphrase我没有设置,直接按enter键跳过。这个新建的密钥被放在/home/linke/.config/solana/id.json文件中,查看一下这个文件
公钥为
BaY1crJzunHUUQBGiQGYHEQM2yGS6VYNYE4oN9cES83R
助记词如下
nephewreasonmutualidleslushflatdefineorientdreamantennanextpanther
现在有了密钥对,再次执行solanaaddress
BaY1crJzunHUUQBGiQGYHEQM2yGS6VYNYE4oN9cES83R
执行以下命令获取账户详情
solanaaccountBaY1crJzunHUUQBGiQGYHEQM2yGS6VYNYE4oN9cES83R
报错,原因应该是还没启动本地网络。接下来先启动本地网络。可以将这个本地网络看作运行在操作系统上的模拟Solana区块链。开发和测试我们的program都需要这个网络。
要在一个单独的terminal中启动本地网络,使用以下命令
solana-test-validator
在不做任何操作的情况下,ProcessedSlot,ConfirmedSlot,FinalizedSlot一直在递增。
现在再次执行
solanaaccountBaY1crJzunHUUQBGiQGYHEQM2yGS6VYNYE4oN9cES83R
就成功了
可以看到,余额是SOL,owner是
接下来可以请求给当前账号空投SOL,执行
solanaairdrop
可以看到,余额增加了
-3.搭建Anchor项目
初始化一个Anchor项目,然后继续做我们自己的修改。进入自己新建的一个目录/home/linke/solana/solana_calculator_program,然后执行
anchorinitmycalculatordapp
cdmycalculatordapp
进入目录,目录结构如下图
首先,我们检查是否可以看到programs,app,migrations目录等。
如果有这些目录,我们可以去programs/mycalculatordapp/src/lib.rs查看Anchor提供给我们的默认program。这是在Anchor上最基本的例子,只是一个用户定义的函数Initialize无论何时被调用都会成功退出程序,没什么特别的。现在,让我们使用以下命令编译这个program
anchorbuild
发生这个错是因为没有使用nightly版本,把rust从稳定版本切换到nightly版本,执行命令
rustupdefaultnightly
切换到nightly版本之后,发现还是报同样的错,然后根据stackoverflow的一个链接