• solana上使用Rust进行合约开发


    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)"
    
    • 1

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

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

    安装成功后,可以使用 命令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
    
    • 1
    • 2
    • 3

    但也必须包括:

    /Xargo.toml
    
    • 1

    其必须包含

    [target.bpfel-unknown-unknown.dependencies.std]
    features = []
    
    • 1
    • 2

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

    [dependencies]
    borsh = "0.7.1"
    borsh-derive = "0.8.1"
    solana-program = "=1.7.1"
    
    • 1
    • 2
    • 3
    • 4

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

    例如:

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

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

    1) 配置命令列

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

    $ solana config set --url localhost
    
    • 1

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

    solana-keygen new
    
    • 1
    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:~#
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    2) 启动本地 Solana 集群

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

    solana-test-validator
    
    • 1

    查看交易日志:

    $ solana logs
    
    • 1

    3) 安装 npm 套件

    在example-helloworld目录下,执行

    npm install
    
    • 1

    4) 构建

    npm run build:program-rust
    
    • 1

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

    5) 部署链上程序

    $ solana program deploy dist/program/helloworld.so
    
    • 1

    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#
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    代码

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

    部署

    在这里插入图片描述

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

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

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

    调试

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

  • 相关阅读:
    C++奇淫巧技 可继承单例
    初识 Linux 文件系统
    2022.8.15-8.21 AI行业周刊(第111期):AI行业定位
    算法中的变形金刚——单纯形算法学习笔记
    C# 实战-三种类型的Timer
    CFD模拟仿真理论知识:流体仿真应用
    java毕业设计软件S2SH学生会/社团活动管理系统[包运行成功]
    深度学习实战:用Keras搭建深度学习网络做手写数字识别
    ES6模块导入与导出的方式
    【数据结构】模拟实现双向链表
  • 原文地址:https://blog.csdn.net/inthat/article/details/118657454