当前位置: 首页 > news >正文

从 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这样子的一键发币平台,只需简单填写相关信息就可以实现发币。

相关文章:

从 0 开始上手 Solana 智能合约

Solana CLI 基础知识 Solana CLI 是一个命令行界面工具&#xff0c;提供了一系列用于与 Solana Cluster 交互的命令。 我们将介绍一些最常见的命令&#xff0c;但你始终可以通过运行 solana --help 查看所有可能的 Solana CLI 命令列表。 Solana CLI 配置 Solana CLI 存储了…...

(六)CAN总线通讯

文章目录 CAN总线回环测试第一种基于板载CAN测试第一步确认板载是否支持第二步关闭 CAN 接口将 CAN 接口置于非活动状态第三步 配置 CAN 接口第一步 设置 CAN 接口比特率第二步 设置 CAN 启用回环模式第三步 启用 CAN 接口 第四步 测试CAN总线回环捕获 CAN 消息发送 CAN 消息 第…...

新一代智能工控系统网络安全合规解决方案

01.新一代智能工控系统概述 新一代智能工控系统是工业自动化的核心&#xff0c;它通过集成人工智能、工业大模型、物联网、5G等技术&#xff0c;实现生产过程的智能化管理和控制。这些系统具备实时监控、自动化优化、灵活调整等特点&#xff0c;能够提升生产效率、保证产品质量…...

Vivado中Tri_mode_ethernet_mac的时序约束、分析、调整——(一)时序约束的基本概念

1、基本概念 推荐阅读&#xff0c;Ally Zhou编写的《Vivado使用误区与进阶》系列文章&#xff0c;熟悉基本概念、tcl语句的使用。 《Vivado使用误区与进阶》电子书开放下载&#xff01;&#xff01; 2、Vivado中的语法例程 1&#xff09;语法例程 约束的语句可以参考vivado…...

车载网络:现代汽车的数字心跳

在汽车领域&#xff0c;“智能汽车”一词毫不夸张。如今的汽车已不再是原始的机械工程&#xff0c;而是通过先进的车载网络无缝连接的精密数字生态系统。这些滚动计算机由复杂的电子控制单元(ECU)网络提供动力&#xff0c;ECU是负责管理从发动机性能到信息娱乐系统等一切事务的…...

python基础和redis

1. Map函数 2. filter函数 numbers generate_numbers() filtered_numbers filter(lambda x: x % 2 0, numbers) for _ in range(5):print(next(filtered_numbers)) # 输出: 0 2 4 6 83. filter map 和 reduce 4. picking and unpicking 5. python 没有函数的重载&#xff0…...

w~自动驾驶~合集16

我自己的原文哦~ https://blog.51cto.com/whaosoft/12765612 #SIMPL 用于自动驾驶的简单高效的多智能体运动预测基准 原标题&#xff1a;SIMPL: A Simple and Efficient Multi-agent Motion Prediction Baseline for Autonomous Driving 论文链接&#xff1a;https://ar…...

最长的指定瑕疵度的元音子串

一、题目 最长的指定瑕疵度的元音子串 定义&#xff1a;开头和结尾都是元音字母&#xff08;aeiouAEIOU&#xff09;的字符串为 元音字符串 &#xff0c;其中混杂的非元音字母数量为其 瑕疵度 。比如: “a” 、 "aa"是元音字符串&#xff0c;其瑕疵度都为0 "aiu…...

每日算法Day15【组合、组合总和III、电话号码的字母组合】

77. 组合 算法链接: 77. 组合 - 力扣&#xff08;LeetCode&#xff09; 类型: 回溯 难度: 中等 回溯三步法&#xff1a; 1、确定参数返回值 2、确定终止条件 3、单层搜索逻辑 剪枝操作&#xff1a; 当path容量超过k时的数据可以不用遍历&#xff0c;故遍历边界条件判断: …...

C语言教程——指针进阶(2)

目录 一、函数指针数组 1.1函数指针数组写法 1.2函数指针用途 二、指向函数指针数组的指针 2.1概念 三、回调函数 3.1用法 3.2qsort排序 总结 前言 我们接着上一篇的函数指针往下学习。 一、函数指针数组 1.1函数指针数组写法 我们都知道指针数组&#xff0c;里面可以…...

调和级数不为整数的证明

文章目录 1. 问题引入2. 证明2.1 引理12.2 引理22.3 引理3&#xff1a;2.4 核心证明&#xff1a; 3. 参考 1. 问题引入 s ( n ) 1 1 2 1 3 ⋯ 1 n , n ∈ N ∗ , n ≥ 2 s(n) 1\frac{1}{2}\frac{1}{3}\cdots\frac{1}{n}, \quad \\n \in N^*, n \ge2 s(n)121​31​⋯n1​,…...

基于微信小程序的在线学习系统springboot+论文源码调试讲解

第4章 系统设计 一个成功设计的系统在内容上必定是丰富的&#xff0c;在系统外观或系统功能上必定是对用户友好的。所以为了提升系统的价值&#xff0c;吸引更多的访问者访问系统&#xff0c;以及让来访用户可以花费更多时间停留在系统上&#xff0c;则表明该系统设计得比较专…...

基于 Boost.Asio 和 Boost.Beast 的异步 HTTP 服务器(学习记录)

已完成功能&#xff1a; 支持 GET 和 POST 请求的路由与回调处理。 解析URL请求。 单例模式 管理核心业务逻辑。 异步 I/O 技术和 定时器 控制超时。 通过回调函数注册机制&#xff0c;可以灵活地为不同的 URL 路由注册处理函数。 1. 项目背景 1.1 项目简介 本项目是一个基于…...

有机物谱图信息的速查技巧有哪些?

谱图信息是化学家解读分子世界的“语言”&#xff0c;它们在化学研究的各个领域都发挥着不可或缺的作用。它们是理解和确定分子结构的关键&#xff0c;对化学家来说极为重要&#xff0c;每一种谱学技术都提供了不同的视角来观察分子&#xff0c;从而揭示其独特的化学和物理特性…...

Eureka缓存机制

一、Eureka的CAP特性 Eureka是一个AP系统&#xff0c;它优先保证可用性&#xff08;A&#xff09;和分区容错性&#xff08;P&#xff09;&#xff0c;而不保证强一致性&#xff08;C&#xff09;。这种设计使得Eureka在分布式系统中能够应对各种故障和分区情况&#xff0c;保…...

【LC】78. 子集

题目描述&#xff1a; 给你一个整数数组 nums &#xff0c;数组中的元素 互不相同 。返回该数组所有可能的子集&#xff08;幂集&#xff09;。 解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,3] 输出&#xff1…...

协同过滤算法私人诊所系统|Java|SpringBoot|VUE|

【技术栈】 1⃣️&#xff1a;架构: B/S、MVC 2⃣️&#xff1a;系统环境&#xff1a;Windowsh/Mac 3⃣️&#xff1a;开发环境&#xff1a;IDEA、JDK1.8、Maven、Mysql5.7 4⃣️&#xff1a;技术栈&#xff1a;Java、Mysql、SpringBoot、Mybatis-Plus、VUE、jquery,html 5⃣️…...

Docker部署Naocs-- 超细教程

Docker 拉取镜像 docker pull nacos/nacos-server:v2.2.0 挂载目录 如果不是root账号 前面加sudo 或者 切换root账号 su root&#xff08;命令&#xff09; mkdir -p /mydata/nacos/logs/ #新建logs目录 mkdir -p /mydata/nacos/conf/ #新建conf目录 启动容器…...

[java基础-集合篇]优先队列PriorityQueue结构与源码解析

优先队列PriorityQueue 优先级队列表示为平衡二进制堆&#xff1a; queue[n] 的两个子级是 queue[2*n1] 和 queue[2*&#xff08;n1&#xff09;]。 注&#xff1a;左子节点index2*parentIndex1,右子节点index2*parentIndex2,源码中计算parent位置时就是这样反过来计算的 优…...

12. C语言 数组与指针(深入理解)

本章目录: 前言1. 什么是数组&#xff1f;2. 数组的声明与初始化声明数组初始化数组 3. 访问数组元素遍历数组 4. 获取数组长度使用 sizeof 获取长度使用宏定义简化 5. 数组与指针数组名与指针的区别使用指针操作数组 6. 多维数组遍历多维数组 7. 数组作为函数参数8. 高级技巧与…...

别再只看功率了!用LRS-200-24开关电源给电机供电,我踩过的这个坑你得知道

电机供电实战&#xff1a;LRS-200-24电源选型中那些教科书不会告诉你的细节 深夜的厂房里&#xff0c;两台24V直流电机突然像哮喘发作般间歇性抽搐&#xff0c;伴随开关电源指示灯疯狂闪烁——这个场景让现场工程师血压飙升。当教科书上的功率计算公式遭遇真实世界的电机启动电…...

新手避坑指南:你的FPGA按键消抖仿真为什么和板子对不上?

FPGA按键消抖实战&#xff1a;从仿真完美到真实失效的深度排查手册 刚接触FPGA开发的工程师常会遇到一个诡异现象&#xff1a;按键消抖模块在ModelSim里跑得风生水起&#xff0c;波形干净漂亮&#xff0c;可一旦下载到开发板就各种失灵——要么按键没反应&#xff0c;要么按一次…...

KUKA机器人FSoE安全地址丢了别慌!手把手教你用WorkVisual 6.0找回(附KRC4标准柜地址表)

KUKA机器人FSoE安全地址丢失应急修复指南&#xff1a;WorkVisual 6.0实战全解析 当产线突然报警停机&#xff0c;示教器闪烁"FSoE安全地址丢失"的红色警告时&#xff0c;经验丰富的维护工程师都知道——这往往是EtherCAT网络拓扑结构异常引发的紧急故障。尤其在采用K…...

告别树莓派5?手把手教你用OrangePi 5搭建家庭媒体中心(基于RK3588)

告别树莓派5&#xff1f;手把手教你用OrangePi 5搭建家庭媒体中心&#xff08;基于RK3588&#xff09; 在智能家居日益普及的今天&#xff0c;家庭媒体中心已成为许多科技爱好者的必备设备。传统的解决方案往往依赖于昂贵的商业NAS或性能有限的树莓派&#xff0c;而基于RK3588芯…...

Claude Code + OpenCode + OpenSpec 规范驱动开发实战:AI 驱动智能客服管理系统开发

当 AI 编程从“凭感觉聊天”升级为“按规范执行的流水线” 一、引言&#xff1a;AI 编程的“效率悖论” 2024 年 Google DORA 报告揭示了一个令人困惑的数据&#xff1a;AI 编码助手采用率每提升 25%&#xff0c;软件交付稳定性反而下降 7.2%。主观上开发者觉得用 AI 写代码速…...

Commit Mono版本管理指南:如何优雅地升级和回滚字体版本

Commit Mono版本管理指南&#xff1a;如何优雅地升级和回滚字体版本 【免费下载链接】commit-mono Commit Mono is an anonymous and neutral programming typeface. 项目地址: https://gitcode.com/gh_mirrors/co/commit-mono Commit Mono是一款匿名且中性的编程字体&a…...

LinkSwift网盘直链助手:让你的下载体验更简单高效

LinkSwift网盘直链助手&#xff1a;让你的下载体验更简单高效 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 &#xff0c;支持 百度网盘 / 阿里云盘 / 中国移动云盘 / 天翼云盘…...

AzurLaneAutoScript:解放双手的碧蓝航线智能自动化脚本

AzurLaneAutoScript&#xff1a;解放双手的碧蓝航线智能自动化脚本 【免费下载链接】AzurLaneAutoScript Azur Lane bot (CN/EN/JP/TW) 碧蓝航线脚本 | 无缝委托科研&#xff0c;全自动大世界 项目地址: https://gitcode.com/gh_mirrors/az/AzurLaneAutoScript 还在为《…...

从黑盒到白盒:Testbench验证机制与FPGA/ASIC开发实践

1. 从“黑盒”到“白盒”&#xff1a;理解Testbench的本质在数字电路设计&#xff0c;尤其是FPGA和ASIC开发领域&#xff0c;我们常常把设计好的硬件描述语言&#xff08;HDL&#xff09;模块&#xff0c;比如一个Verilog写的加法器或者一个VHDL写的状态机&#xff0c;称为“待…...

C#从零开始学习笔记---第七天

不是同样的时间&#xff0c;不是同样的笔记&#xff0c;但是同样的作者。新的一天&#xff0c;欢迎收看我的学习笔记吼吼~我们昨天最后留了两道题&#xff0c;不知道大家做的怎么样&#xff0c;我现在来公布一下答案&#xff0c;但因为1000个人心里有1000个哈姆雷特&#xff0c…...