本文将展示如何在 Solana 区块链使用 Solana Javascript API 进行编程交互。
此教程包含以下内容:
- 链上的 Hello World 编程
- 向某个帐户发送 hello 并获取发送次数。
如果需要在 Gitpod 中打开,请参考 README-gitpod.md,否则请继续阅读。
要创建和运行此范例,请确认并安装以下套件:
- 安装 node
- 安装 npm
- 从 https://rustup.rs/ 安装最新的 Rust(v1.56.1+)稳定版本
- 从 https://docs.solana.com/cli/install-solana-cli-tools 安装 v1.8.2+ 的 Solana 命令列管理工具
如果这是您第一次使用 Docker 或 Rust,这些 安装笔记 可能对您有帮助。
- 将命令列配置的 url 设置成 localhost 集群
$ solana config set --url localhost
- 创建命令列使用的密钥对
如果这是你第一次使用 solana 命令列,你先得生成一个新的密钥对
$ solana-keygen new
默认情况下,此范例连接到本地 Solana 集群。
启动本地 Solana 集群:
$ solana-test-validator
注意: 如果使用 Windows 系统,则需要先设置 WSL,才能用 solana-test-validator
工具
$ solana logs
$ npm install
链上程序有 Rust 版本和 C 版本,最新的版本是运行范例时使用的版本。
$ npm run build:program-rust
$ npm run build:program-c
$ solana program deploy dist/program/helloworld.so
$ npm run start
输出的公钥和示例不同:
Let's say hello to a Solana account...
Connection to cluster established: http://localhost:8899 { 'feature-set': 2045430982, 'solana-core': '1.7.8' }
Using account AiT1QgeYaK86Lf9kudqKthQPCWwpG8vFA1bAAioBoF4X containing 0.00141872 SOL to pay for fees
Using program Dro9uk45fxMcKWGb1eWALujbTssh6DW8mb4x8x3Eq5h6
Creating account 8MBmHtJvxpKdYhdw6yPpedp6X6y2U9dCpdYaZJdmwV3A to say hello to
Saying hello to 8MBmHtJvxpKdYhdw6yPpedp6X6y2U9dCpdYaZJdmwV3A
8MBmHtJvxpKdYhdw6yPpedp6X6y2U9dCpdYaZJdmwV3A has been greeted 1 times
Success
- 确认您已经启动了本地 Solana 集群,构建 并 部署好了 链上程序。
- 集群的输出日志应包括程序日志消息以及程序失败的原因
- program log:
- 运行 solana logs 检查程序日志找出程序失败的原因。
-
Transaction executed in slot 5621: Signature: 4pya5iyvNfAZj9sVWHzByrxdKB84uA5sCxLceBwr9UyuETX2QwnKg56MgBKWSM4breVRzHmpb1EZQXFPPmJnEtsJ Status: Error processing Instruction 0: Program failed to complete Log Messages: Program G5bbS1ipWzqQhekkiCLn6u7Y1jJdnGK85ceSYLx2kKbA invoke [1] Program log: Hello World Rust program entrypoint Program G5bbS1ipWzqQhekkiCLn6u7Y1jJdnGK85ceSYLx2kKbA consumed 200000 of 200000 compute units Program failed to complete: exceeded maximum number of instructions allowed (200000) at instruction #334 Program G5bbS1ipWzqQhekkiCLn6u7Y1jJdnGK85ceSYLx2kKbA failed: Program failed to complete
-
要自定义示例,请更改 /src
目录的文件。如果更改了 /src/program-rust
或 /src/program-c
下的任何文件,您需要重新构建链上程序 并 重新部署链上程序。
现在,重新运行 npm run start
时,您应该看到更改的结果。
Solana 开发文档提供了有关 Solana 的更多资料,并且所有的源代码都在 github 上。
遇到更多的问题?在 Discord 告诉我们。
此范例中的客户端使用 JavaScript 语言撰写:
- Solana web3.js SDK
- Solana web3 API
客户端入口点做了四件事:
客户端通过调用 establishConnection 与客户端建立连接.
客户端从 ./dist/program/helloworld-keypair.json
加载已部署程序的密钥对,并使用密钥的公共密钥来获取程序帐户。如果该程序不存在,则客户端会因错误而暂停。如果程序确实存在,它将创建一个新帐户,并以该程序作为其所有者来存储程序状态(已处理的 hello 数量)。
客户端将通过调用 sayHello 并向程序发送 Hello 交易。此交易包含一条非常简单的指令,此指令主要呼叫 helloworld 程序的帐户公钥希望向 greeter 帐户说 Hello。
客户端每次对帐户说 Hello 时,程序都会在 greeter 帐户的数据中增加一个计数。客户端查询 greeter 帐户的数据,并透过 reportHellos 查询此帐户当前被访问的次数。
链上 HelloWorld 编程 是一个 Rust 编程编译成 Berkley Packet Filter (BPF) 并储存为可执行和可链接格式(ELF)共享对象. Solana 链上程序存储的可执行字节码都是 Berkley Packet Filter (BPF) 字节码。 Solana 命令列工具可以把 Rust 和 C 代码编译成 BPF 字节码。
所有 Rust 的链上程序都是使用以下程序套件编写:
- Solana Rust SDK
要了解 Solana 程序设计模型的更多信息,请参阅程序设计模型概述。 要了解在 Solana 上开发程序的更多信息,请参阅已部署程序概述。
Solana 有三个公开集群:
devnet
- 启用空投的开发者集群testnet
- Tour De Sol 没有空投的测试集群mainnet-beta
- 主网集群
使用 Solana CLI 的 solana 指令去选择集群
选择 devnet
集群:
$ solana config set --url devnet
选择 local 集群:
$ solana config set --url localhost
然后我们还需要学习更多的内容。以下范例展示了更多高级功能,例如自定义错误、高级帐户处理、数据序列化建议、基准测试...等。