从 0 开始上手 Solana 智能合约

Solana CLI 基础知识

Solana CLI 是一个命令行界面工具,提供了一系列用于与 Solana Cluster 交互的命令。

我们将介绍一些最常见的命令,但你始终可以通过运行 solana --help 查看所有可能的 Solana CLI 命令列表。

Solana CLI 配置

Solana CLI 存储了一些配置设置,这些设置会影响某些命令的行为。你可以使用以下命令查看当前的配置:

solana config get

solana config get 命令将返回以下信息:

  • Config File - Solana CLI 文件在计算机上的位置
  • RPC URL - 你使用的节点,将你连接到 localhost、Devnet 或 Mainnet
  • WebSocket URL - 用于监听你所针对的 Cluster 事件的 WebSocket(在设置 RPC URL 时计算)
  • Keypair Path - 运行 Solana CLI 子命令时使用的密钥对路径
  • Commitment - 提供网络确认(confirmation)的度量,并描述区块在某一时刻已最终确认(finalized)的程度

你可以随时使用 solana config set 命令,后跟你想要更新的设置,更改 Solana CLI 的配置。

最常见的更改将是针对的 Cluster。使用 solana config set --url 命令更改 RPC URL

solana config set --url localhost 
solana config set --url devnet 
solana config set --url mainnet-beta

类似地,你可以使用 solana config set --keypair 命令更改 Keypair Path。然后,当运行命令时,Solana CLI 将使用指定路径上的密钥对。

solana config set --keypair ~/<FILE_PATH>

测试验证节点

通常,为了进行测试和调试,你会发现运行本地验证节点比部署到 Devnet 更有帮助。

你可以使用 solana-test-validator 命令运行本地测试验证器。此命令创建一个持续运行的进程,需要在其自己的命令行窗口中运行。

流式程序日志

通常,同时打开一个新控制台并运行 solana logs 命令,可以帮助你观察测试验证节点相关的日志。这将创建另一个持续运行的进程,会流式传输与你配置的 Cluster 相关的日志。

如果 CLI 配置指向 localhost,则日志将始终与你创建的测试验证器相关联,但你也可以从其他 Cluster(如 Devnet 和 Mainnet Beta)中流式传输日志。当从其他 Cluster 流式传输日志时,你需要在命令中包含一个程序 ID,以限制你看到的日志仅为特定程序的日志。

密钥对

你可以使用 solana-keygen new --outfile 命令生成新的密钥对,后跟存储密钥对的文件路径。

solana-keygen new --outfile \~/\<FILE_PATH>

有时,你可能需要检查配置指向的是哪个密钥对。要查看在 solana config 中设置的当前密钥对的 publickey,请使用 solana address 命令。

solana address

要查看在 solana config 中设置的当前密钥对的 SOL 余额,请使用 solana balance 命令。

solana balance

要在 Devnet 或 localhost 上空投 SOL,请使用 solana airdrop 命令。请注意,在 Devnet 上,每次空投限制为 5 SOL。

solana airdrop 5

在本地环境中开发和测试程序时,你可能会遇到以下原因导致的错误:

  • 使用错误的密钥对
  • 没有足够的 SOL 来部署程序或执行交易
  • 指向错误的 Cluster

到目前为止,我们介绍的 CLI 命令应该可以帮助你迅速解决这些问题。

在本地环境中开发 Solana 程序

尽管 Solana Playground 非常有帮助,但很难超越你自己的本地开发环境的灵活性。随着你构建更复杂的程序,你可能最终会将它们与在本地环境中同样在开发中的一个或多个客户端集成。当你在本地编写、构建和部署程序时,程序和客户端之间的测试通常更简单。

创建新项目

要创建一个用于编写 Solana 程序的新 Rust 包,你可以使用 cargo new --lib 命令,后跟你想要创建的新目录的名称。

cargo new --lib <PROJECT_DIRECTORY_NAME>

此命令将创建一个新目录,其名称为你在命令末尾指定的名称。这个新目录将包含一个描述该包的 Cargo.toml 清单文件(manifest file)。

清单文件包含元数据,如名称、版本和依赖项(crates)。要编写 Solana 程序,你需要更新 Cargo.toml 文件,将 solana-program 添加为依赖项。你可能还需要添加下面显示的 [lib] 和 crate-type 行。

[package] 
name = "<PROJECT_DIRECTORY_NAME>" 
version = "0.1.0" 
edition = "2021" 
[features] 
no-entrypoint = [] 
[dependencies] solana-program = "~1.8.14"
[lib] 
crate-type = ["cdylib", "lib"]

在这一点上,你可以开始在 src 文件夹中编写程序。

构建和部署

当需要构建 Solana 程序时,可以使用 cargo build-bpf 命令。

cargo build-bpf

该命令的输出将包含部署程序的说明,看起来类似于:

To deploy this program: $ solana program deploy /Users/James/Dev/Work/solana-hello-world-local/target/deploy/solana_hello_world_local.so The program address will default to this keypair (override with --program-id): /Users/James/Dev/Work/solana-hello-world-local/target/deploy/solana_hello_world_local-keypair.json

当你准备部署程序时,使用 cargo build-bpf 输出的 solana program deploy 命令。这将把你的程序部署到你 CLI 配置中指定的 Cluster。

solana program deploy <PATH>

实验

让我们通过构建和部署我们在[Hello World 课程]中创建的 "Hello World!" 程序来进行实践。

我们将全部在本地进行,包括部署到本地测试验证节点。在开始之前,请确保你已安装了 Rust 和 Solana CLI。如果尚未设置,请参考概述中的说明。

1. 创建一个新的 Rust 项目

让我们从创建一个新的 Rust 项目开始。运行下面的 cargo new --lib 命令。随意用你自己的目录名称替换。

cargo new --lib solana-hello-world-local

记得更新 Cargo.toml 文件,将 solana-program 添加为依赖项,并确保 crate-type 行已经存在。

[package]
name = "solana-hello-world-local"
version = "0.1.0"
edition = "2021"[dependencies]
solana-program = "~1.8.14"[lib]
crate-type = ["cdylib", "lib"]

2. 编写程序

接下来,使用下面的“Hello World!”程序更新 lib.rs。当调用程序时,该程序将简单地打印“Hello, world!”到程序日志。

use solana_program::{account_info::AccountInfo,entrypoint,entrypoint::ProgramResult,pubkey::Pubkey,msg
};entrypoint!(process_instruction);pub fn process_instruction(program_id: &Pubkey,accounts: &[AccountInfo],instruction_data: &[u8]
) -> ProgramResult{msg!("Hello, world!");Ok(())
}
  1. 运行本地测试验证节点

在编写好程序之后,让我们确保我们的 Solana CLI 配置指向 localhost,使用 solana config set --url 命令。

solana config set --url localhost

接下来,使用 solana config get 命令检查 Solana CLI 配置是否已更新。

solana config get

最后,在一个单独的终端窗口中运行本地测试验证器。运行 solana-test-validator 命令。只有当我们的 RPC URL 设置为 localhost 时,才需要执行此操作。

solana-test-validator

4. 构建和部署

现在我们准备好构建和部署我们的程序了。通过运行 cargo build-bpf 命令来构建程序。

cargo build-bpf

现在让我们部署程序。运行 cargo build-bpf 输出的 solana program deploy 命令。

solana program deploy <PATH>

solana program deploy 将输出程序的 Program ID。你现在可以在[Solana Explorer]上查找已部署的程序(对于 localhost,请选择“Custom RPC URL”作为 Cluster)。

5. 查看程序日志

在调用我们的程序之前,打开一个单独的终端,并运行 solana logs 命令。这将允许我们在终端中查看程序的日志。

solana logs <PROGRAM_ID>

在测试验证节点仍在运行的情况下,尝试使用此客户端脚本调用程序。

在 index.ts 中用刚刚部署的程序的程序 ID 替换原有的程序 ID,然后运行 npm install,接着运行 npm start。这将返回一个 Solana Explorer URL。将该 URL 复制到浏览器中以在 Solana Explorer 上查找交易,并检查是否将“Hello, world!”打印到程序日志中。或者,你也可以在运行 solana logs 命令的终端中查看程序日志。

恭喜!你刚刚从本地开发环境中创建并部署了你的第一个 Solana 程序。

挑战

尝试创建一个新程序,将自己的消息打印到程序日志中。这次将程序部署到 Devnet,而不是 localhost。

记得使用 solana config set --url 命令将 RPC URL 更新到 Devnet。

你可以使用与实验相同的客户端脚本调用程序,只要将 connection 和 Solana Explorer URL 都更新为指向 Devnet 而不是 localhost。

let connection = new web3.Connection(web3.clusterApiUrl("devnet"));
console.log(`Transaction: https://explorer.solana.com/tx/${transactionSignature}?cluster=devnet`
);

你还可以打开一个单独的命令行窗口,并使用 solana logs | grep "<PROGRAM_ID> invoke" -A <NUMBER_OF_LINES_TO_RETURN>。在 Devnet 上使用 solana logs 时,必须指定程序 ID。否则,solana logs 命令将从 Devnet 返回一系列恒定的日志流。例如,你可以执行以下操作来监视对 Token 程序的调用,并显示每次调用的前 5 行日志:

solana logs | grep "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA invoke" -A 5

还可以使用像GTokenTool这样子的一键发币平台,只需简单填写相关信息就可以实现发币。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/66859.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【杂谈】-50+个生成式人工智能面试问题(四)

7、生成式AI面试问题与微调相关 Q23. LLMs中的微调是什么&#xff1f; 答案&#xff1a;虽然预训练语言模型非常强大&#xff0c;但它们并不是任何特定任务的专家。它们可能对语言有惊人的理解能力&#xff0c;但仍需要一些LLMs微调过程&#xff0c;开发者通过这个过程提升它…

spring boot 多数据源集成mysql、postgresql、phoenix、doris等

如何搭建多数据源项目只要以下简单几步; 一. 创建核心在config.datasource文件夹里 二. 引入相对应的jar包 三. 创建数据库连接配置 四. 写逻辑代码进行验证 1.DataSource package com.irootech.config.datasource;import java.lang.annotation.*;Target({ElementType.MET…

01-51单片机LED与独立按键

一、单片机概述 注意&#xff1a;个人学习笔记&#xff0c;里面涉及到的C语言和进程转换相关的知识在C语言部分已经写了&#xff0c;这里是默认都会的状态学习单片机。 1.什么是单片机 单片机&#xff0c;英文Micro Controller Unit&#xff0c;简称MCU。其内部集成了CPU、R…

音视频入门基础:MPEG2-PS专题(6)——FFmpeg源码中,获取PS流的视频信息的实现

音视频入门基础&#xff1a;MPEG2-PS专题系列文章&#xff1a; 音视频入门基础&#xff1a;MPEG2-PS专题&#xff08;1&#xff09;——MPEG2-PS官方文档下载 音视频入门基础&#xff1a;MPEG2-PS专题&#xff08;2&#xff09;——使用FFmpeg命令生成ps文件 音视频入门基础…

对当前日期进行按年、按月、按日的取值

对当前日期进行按年、按月、按日的取值。 其规则为&#xff1a; 按年 为当前日期到来年同一日期的前一天&#xff08;2024-12-01到2025-11-30&#xff09;。 按月 为当前日期到下个月的同一日期的前一天 &#xff08;2024-12-01 到 2024-12-31&#xff09;。 按日 为当前日…

.NET体系架构

引言 .NET是由微软开发的一个广泛应用的开发平台&#xff0c;旨在帮助开发者构建各种类型的应用程序&#xff0c;包括桌面应用、Web应用、移动应用和云服务。最初&#xff0c;.NET平台的构建主要集中在Windows环境上&#xff0c;但随着.NET Core和随后.NET 5及以上版本的推出&…

HTML5 加载动画(Loading Animation)

加载动画&#xff08;Loading Animation&#xff09;详解 概述 加载动画是指在数据加载过程中&#xff0c;向用户展示的一种视觉效果&#xff0c;旨在提升用户体验&#xff0c;告知用户系统正在处理请求。它可以减少用户的等待焦虑感&#xff0c;提高界面的互动性。 常见的加…

【Apache Paimon】-- 13 -- 利用 paimon-flink-action 同步 mysql 表数据

利用 Paimon Schema Evolution 核心特性同步变更的 mysql 表结构和数据 1、背景信息 在Paimon 诞生以前,若 mysql/pg 等数据源的表结构发生变化时,我们有几种处理方式 (1)人工通知(比如常规的使用邮件),然后运维人员手动同步到数据仓库中 (2)使用 flink 消费 DDL bi…

【网络协议】静态路由详解

网络中的路由器通过以下两种方式之一发现远程网络&#xff1a; 静态配置路由动态路由协议 在本文&#xff0c;我们将学习关于静态路由的各种概念&#xff0c;例如如何配置静态路由、路由表如何进行决策、路由接口等相关知识。 文章目录 引言直连网络静态路由路由表原则原则1原…

华为C语言编程规范总结

1.头文件更改会导致所有直接或间接包含该头文件的的C文件重新编译&#xff0c;会增加大量编译工作量&#xff0c;延长编译时间&#xff0c;因此&#xff1a; 1.1 头文件里尽量少包含头文件 1.2 头文件应向稳定的方向包含 2.每一个.c文件应有一个同名.h文件&#xff0c…

python 生成24bit音频数据实例解析

一 概念 24 bit 是指音频文件的 采样深度 &#xff08;bit depth&#xff09;。 它代表了每个采样点的数据精度&#xff0c;也就是音频每个样本所使用的比特数。 24 bit 的采样深度相较于 16 bit 提供了更高的动态范围和更精确的音频信息表示。 动态范围&#xff1a;24 bit 的…

PyTorch:.max(1)和.max(0)的使用

目录 1&#xff09;.max(1)的使用&#xff1a; 2&#xff09;.max(0)的使用&#xff1a; 1&#xff09;.max(1)的使用&#xff1a; 假设有一个形状为 ( m , n ) 的 Tensor x &#xff0c;其中m表示行数&#xff0c;n表示列数。 x.max(1) &#xff0c;相当于x.max(dim1) 。作…

Vue 3 Diff 算法过程及基本实现方式

Vue 3 的 Diff 算法 Vue 3 使用的是一种高效的 DOM Diff 算法&#xff0c;主要用于在虚拟 DOM 树发生变化时&#xff0c;计算最小的操作以更新真实 DOM。相比 Vue 2&#xff0c;Vue 3 的 Diff 算法做了很多优化。 Diff 算法的背景与目的 虚拟 DOM 树的对比&#xff1a;在 Vue…

任务调度系统Quartz.net详解2-Scheduler、Calendar及Listener

任务调度系统Quartz.net详解2-Scheduler、Calendar及Listener Scheduler 调度器scheduler是Quartz中的独立工作容器&#xff0c;所有的Trigger和Job都需要注册到scheduler中才能工作。我们可以通过SchedulerFactory来获取scheduler实例。如下&#xff1a; //1.获取默认的标准…

解锁 C# 与 LiteDB 嵌入式 NoSQL 数据库

一、开篇&#xff1a;邂逅 C# 与 LiteDB 新世界 在当今的软件开发领域&#xff0c;数据管理如同建筑的基石&#xff0c;而选择一款合适的数据库则是项目成功与否的关键因素之一。对于 C# 开发者来说&#xff0c;面对琳琅满目的数据库选项&#xff0c;如何抉择常常令人头疼。今…

Dependency check 通过Maven构建时,配置Mysql数据库遇到的三个坑

使用过Dependency check的同学&#xff0c;一定会遇到这个问题—— 每次执行依赖扫描时&#xff0c;由于网络问题会导致NVD下载种子数据的过程中的种种失败&#xff0c;不仅浪费了大量时间&#xff0c;还会因为下载文件的不完整性直接导致依赖检测的失败。所以我在使用Dependen…

Ubuntu中批量重命名,rename

你可以使用下面的命令批量重命名这些文件&#xff0c;在文件名中插入 _1&#xff1a; 方式一 使用 mv 命令批量重命名 如果你已经在终端中&#xff0c;且当前目录包含这些文件&#xff0c;可以执行以下命令&#xff1a; mv ai.c ai_1.c mv ai.h ai_1.h mv ao.c ao_1.c mv a…

JVM 优化指南

JVM 优化指南 1. JVM 参数配置 1.1 基础参数配置 设置堆内存大小 -Xms2048m -Xmx2048m 设置新生代大小 -Xmn1024m 设置元空间大小 -XX:MetaspaceSize256m -XX:MaxMetaspaceSize256m 设置线程栈大小 -Xss512k1.2 垃圾回收器配置 使用 G1 垃圾回收器 -XX:UseG1GC 设置期望停顿…

【面试题】技术场景 5、日志采集ELK

日志采集的重要性与采集方式 重要性&#xff1a;在项目开发、测试及生产环境中&#xff0c;日志是定位系统问题的关键手段&#xff0c;对系统维护与问题排查至关重要。采集方式 常规采集&#xff1a;按天保存日志文件至专门目录&#xff0c;文件名包含项目名、端口及日期&…

【数据库】三、SQL语言

文章目录 三、SQL语言1 概述2 数据定义(DDL)2.1 定义数据库2.2 定义基本表2.3 修改基本表2.4 删除基本表 3 数据操作(DML)3.1 数据查询3.1.1 单表查询3.1.2 连接查询3.1.3 嵌套查询3.1.4 集合查询 3.2 数据更新3.2.1 插入数据3.2.2 修改数据3.2.3 删除数据 4 数据控制(DCL)5 视…