飞道的博客

solana上使用Rust进行合约开发

386人阅读  评论(0)

solana上使用Rust进行合约开发

官方:用Rust开发
参考URL: https://docs.solana.com/developing/on-chain-programs/overview

客户端

请参阅doc.rs Solana发布的文档文件。
solana-sdk:访问通用数据结构 (https://docs.rs/solana-sdk/1.7.4/solana_sdk/)
solana-client :查询JSON RPC API (https://docs.solana.com/zh/developing/clients/jsonrpc-api)

开发前准备工作

准备工作
要创建和运行此范例,请确认并安装以下套件:

  • 安装node
  • 安装npm
  • 从https://rustup.rs/安装最新的Rust稳定版本
  • 从https://docs.solana.com/cli/install-solana-cli-tools 安装v1.6.6的Solana命令列管理工具

Install the Solana Tool Suite

MacOS & Linux#
安装 solana 最新稳定版stable

sh -c "$(curl -sSfL https://release.solana.com/stable/install)"

然后执行 solana --version 确认是否安装成功

root@VM-0-2-ubuntu:~# solana --version
solana-cli 1.6.17 (src:84f02341; feat:3416714594)

安装成功后,可以使用 命令solana-install update 方便的升级到最新版本。

官方示例demo

官方链接:https://docs.solana.com/developing/on-chain-programs/examples#helloworld

此教程包含以下内容:

  • 链上的 Hello World 编程
  • 向某个帐户发送 hello 并获取发送次数。

如上,版本实现,一个c,一个rust。

我们主要研究rust。

Solana Rust程序遵循典型的Rust项目布局:

/inc/
/src/
/Cargo.toml

但也必须包括:

/Xargo.toml

其必须包含

[target.bpfel-unknown-unknown.dependencies.std]
features = []

项目依赖关系#
Solana Rust程序必须引入solana-program

[dependencies]
borsh = "0.7.1"
borsh-derive = "0.8.1"
solana-program = "=1.7.1"

Solana BPF程序具有某些限制,可能会阻止将某些箱体作为依赖项包含进来或需要特殊处理。

例如:

要求架构的箱体(Crates)是官方工具链支持箱体的子集。 除非解决了这个问题,并且没有将BPF添加到那些体系结构检查中,否则没有解决方法。
箱体可能取决于Solana确定性程序环境中不支持的rand。 要包含rand相关的箱体,请参考在 Rand 开发。
即使程序本身未包含堆栈溢出代码,箱体也可能会使堆栈溢出。 有关的更多信息,请参见Stack

$ git clone https://github.com/solana-labs/example-helloworld.git
$ cd example-helloworld

1) 配置命令列

将命令列配置的 url 设置成 localhost 集群

$ solana config set --url localhost

创建命令列使用的密钥对
如果这是你第一次使用 solana 命令列,你先得生成一个新的密钥对

solana-keygen new
root@VM-0-2-ubuntu:~# solana-keygen new
Generating a new keypair

For added security, enter a BIP39 passphrase

NOTE! This passphrase improves security of the recovery seed phrase NOT the
keypair file itself, which is stored as insecure plain text

BIP39 Passphrase (empty for none):

Wrote new keypair to /root/.config/solana/id.json
=========================================================================
pubkey: CpahsNjoSf5VoaVVyLya8XtyBVHuthHzdpJGzLoXBZU6
=========================================================================
Save this seed phrase and your BIP39 passphrase to recover your new keypair:
car early because cross scale jewel fish artefact honey quick embrace ask
=========================================================================
root@VM-0-2-ubuntu:~#

 

2) 启动本地 Solana 集群

默认情况下,此范例连接到本地 Solana 集群。
启动本地 Solana 集群:

solana-test-validator

查看交易日志:

$ solana logs

3) 安装 npm 套件

在example-helloworld目录下,执行

npm install

4) 构建

npm run build:program-rust

最终编译出来一个 helloworld.so 文件
/root/example-helloworld/dist/program/helloworld.so

5) 部署链上程序

$ solana program deploy dist/program/helloworld.so

6) 启动客户端

$ npm run start


root@VM-0-2-ubuntu:~/example-helloworld# npm run start

> helloworld@0.0.1 start /root/example-helloworld
> ts-node src/client/main.ts

Let's say hello to a Solana account...
Connection to cluster established: http://localhost:8899 { 'feature-set': 3416714594, 'solana-core': '1.6.17' }
Using account CpahsNjoSf5VoaVVyLya8XtyBVHuthHzdpJGzLoXBZU6 containing 499999999.12944824 SOL to pay for fees
Using program BtPjSxJNk1nPXMtt8UdZF3Mt8ajMkQAEMueMcKv8ZcAG
Creating account CSiEuPZDgsedTNXtDCXUdw3nKbWskchmGdb7mEzgWQDK to say hello to
Saying hello to CSiEuPZDgsedTNXtDCXUdw3nKbWskchmGdb7mEzgWQDK
CSiEuPZDgsedTNXtDCXUdw3nKbWskchmGdb7mEzgWQDK has been greeted 1 time(s)
Success
root@VM-0-2-ubuntu:~/example-helloworld#


 

代码

使用了官方sdk库:https://docs.rs/solana-sdk/1.7.4/solana_sdk/

部署

如上图所示,程序作者创建了一个程序,将它编译成包含 BFF 字节代码的 ELF 共享对象,然后包含一笔特殊的 deploy 交易,将其上传到 Solana 集群。 群集通过一个 program ID 将其提供给客户端。 程序 ID 是部署时指定的 地址,用于在后续交易中引用程序。

一旦部署成功,持有程序的账户将被标记为可执行,并且其账户数据变得永久不可篡改。 如果程序需要更改(功能、补丁等…),新程序必须部署到一个新程序 ID。

Solana 命令行接口支持部署程序,更多信息请见 deploy 命令行使用 文档。

调试

Solana程序在链上运行,因此在链外调试可能会很困难。 为了使调试程序更容易,开发人员可以编写单元测试以通过Solana运行时直接测试其程序的执行情况,或者运行允许RPC客户端与其程序进行交互的本地集群。


转载:https://blog.csdn.net/inthat/article/details/118657454
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场