从 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 或 MainnetWebSocket 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(())
}
- 运行本地测试验证节点
在编写好程序之后,让我们确保我们的 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这样子的一键发币平台,只需简单填写相关信息就可以实现发币。
相关文章:
![](https://www.ngui.cc/images/no-images.jpg)
从 0 开始上手 Solana 智能合约
Solana CLI 基础知识 Solana CLI 是一个命令行界面工具,提供了一系列用于与 Solana Cluster 交互的命令。 我们将介绍一些最常见的命令,但你始终可以通过运行 solana --help 查看所有可能的 Solana CLI 命令列表。 Solana CLI 配置 Solana CLI 存储了…...
![](https://i-blog.csdnimg.cn/direct/ff60ece241ca43de86c102e414e62121.png)
(六)CAN总线通讯
文章目录 CAN总线回环测试第一种基于板载CAN测试第一步确认板载是否支持第二步关闭 CAN 接口将 CAN 接口置于非活动状态第三步 配置 CAN 接口第一步 设置 CAN 接口比特率第二步 设置 CAN 启用回环模式第三步 启用 CAN 接口 第四步 测试CAN总线回环捕获 CAN 消息发送 CAN 消息 第…...
![](https://i-blog.csdnimg.cn/img_convert/090ddef66350395f68bf5d2240e57803.jpeg)
新一代智能工控系统网络安全合规解决方案
01.新一代智能工控系统概述 新一代智能工控系统是工业自动化的核心,它通过集成人工智能、工业大模型、物联网、5G等技术,实现生产过程的智能化管理和控制。这些系统具备实时监控、自动化优化、灵活调整等特点,能够提升生产效率、保证产品质量…...
![](https://i-blog.csdnimg.cn/direct/488fe627b0204475995ab0f89d9950bc.png)
Vivado中Tri_mode_ethernet_mac的时序约束、分析、调整——(一)时序约束的基本概念
1、基本概念 推荐阅读,Ally Zhou编写的《Vivado使用误区与进阶》系列文章,熟悉基本概念、tcl语句的使用。 《Vivado使用误区与进阶》电子书开放下载!! 2、Vivado中的语法例程 1)语法例程 约束的语句可以参考vivado…...
![](https://i-blog.csdnimg.cn/img_convert/5be6efba75d988ccd39dd8680841e3d9.png)
车载网络:现代汽车的数字心跳
在汽车领域,“智能汽车”一词毫不夸张。如今的汽车已不再是原始的机械工程,而是通过先进的车载网络无缝连接的精密数字生态系统。这些滚动计算机由复杂的电子控制单元(ECU)网络提供动力,ECU是负责管理从发动机性能到信息娱乐系统等一切事务的…...
![](https://i-blog.csdnimg.cn/direct/8a1f427f2c624567805645ed8a31ebfb.png)
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 没有函数的重载࿰…...
![](https://i-blog.csdnimg.cn/img_convert/49150784165ba9ef502963dcb282256c.png)
w~自动驾驶~合集16
我自己的原文哦~ https://blog.51cto.com/whaosoft/12765612 #SIMPL 用于自动驾驶的简单高效的多智能体运动预测基准 原标题:SIMPL: A Simple and Efficient Multi-agent Motion Prediction Baseline for Autonomous Driving 论文链接:https://ar…...
![](https://www.ngui.cc/images/no-images.jpg)
最长的指定瑕疵度的元音子串
一、题目 最长的指定瑕疵度的元音子串 定义:开头和结尾都是元音字母(aeiouAEIOU)的字符串为 元音字符串 ,其中混杂的非元音字母数量为其 瑕疵度 。比如: “a” 、 "aa"是元音字符串,其瑕疵度都为0 "aiu…...
![](https://i-blog.csdnimg.cn/direct/d6f50f44528a4805a79e4a4ee80b2403.png)
每日算法Day15【组合、组合总和III、电话号码的字母组合】
77. 组合 算法链接: 77. 组合 - 力扣(LeetCode) 类型: 回溯 难度: 中等 回溯三步法: 1、确定参数返回值 2、确定终止条件 3、单层搜索逻辑 剪枝操作: 当path容量超过k时的数据可以不用遍历,故遍历边界条件判断: …...
![](https://i-blog.csdnimg.cn/direct/c30eb28c00ac4cfabdad12a5399c34e7.png)
C语言教程——指针进阶(2)
目录 一、函数指针数组 1.1函数指针数组写法 1.2函数指针用途 二、指向函数指针数组的指针 2.1概念 三、回调函数 3.1用法 3.2qsort排序 总结 前言 我们接着上一篇的函数指针往下学习。 一、函数指针数组 1.1函数指针数组写法 我们都知道指针数组,里面可以…...
![](https://www.ngui.cc/images/no-images.jpg)
调和级数不为整数的证明
文章目录 1. 问题引入2. 证明2.1 引理12.2 引理22.3 引理3:2.4 核心证明: 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)12131⋯n1,…...
![](https://i-blog.csdnimg.cn/img_convert/bb182e637f36dc6ffe146dac958727bd.png)
基于微信小程序的在线学习系统springboot+论文源码调试讲解
第4章 系统设计 一个成功设计的系统在内容上必定是丰富的,在系统外观或系统功能上必定是对用户友好的。所以为了提升系统的价值,吸引更多的访问者访问系统,以及让来访用户可以花费更多时间停留在系统上,则表明该系统设计得比较专…...
![](https://csdnimg.cn/release/blog_editor_html/release2.3.7/ckeditor/plugins/CsdnLink/icons/icon-default.png?t=O83A)
基于 Boost.Asio 和 Boost.Beast 的异步 HTTP 服务器(学习记录)
已完成功能: 支持 GET 和 POST 请求的路由与回调处理。 解析URL请求。 单例模式 管理核心业务逻辑。 异步 I/O 技术和 定时器 控制超时。 通过回调函数注册机制,可以灵活地为不同的 URL 路由注册处理函数。 1. 项目背景 1.1 项目简介 本项目是一个基于…...
![](https://i-blog.csdnimg.cn/img_convert/ff95ee4eb6e4507b6389f70a5122935e.png)
有机物谱图信息的速查技巧有哪些?
谱图信息是化学家解读分子世界的“语言”,它们在化学研究的各个领域都发挥着不可或缺的作用。它们是理解和确定分子结构的关键,对化学家来说极为重要,每一种谱学技术都提供了不同的视角来观察分子,从而揭示其独特的化学和物理特性…...
![](https://www.ngui.cc/images/no-images.jpg)
Eureka缓存机制
一、Eureka的CAP特性 Eureka是一个AP系统,它优先保证可用性(A)和分区容错性(P),而不保证强一致性(C)。这种设计使得Eureka在分布式系统中能够应对各种故障和分区情况,保…...
![](https://www.ngui.cc/images/no-images.jpg)
【LC】78. 子集
题目描述: 给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。 解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。 示例 1: 输入:nums [1,2,3] 输出࿱…...
![](https://i-blog.csdnimg.cn/direct/6884a4b3f1de459982f1398e55849020.jpg)
协同过滤算法私人诊所系统|Java|SpringBoot|VUE|
【技术栈】 1⃣️:架构: B/S、MVC 2⃣️:系统环境:Windowsh/Mac 3⃣️:开发环境:IDEA、JDK1.8、Maven、Mysql5.7 4⃣️:技术栈:Java、Mysql、SpringBoot、Mybatis-Plus、VUE、jquery,html 5⃣️…...
![](https://www.ngui.cc/images/no-images.jpg)
Docker部署Naocs-- 超细教程
Docker 拉取镜像 docker pull nacos/nacos-server:v2.2.0 挂载目录 如果不是root账号 前面加sudo 或者 切换root账号 su root(命令) mkdir -p /mydata/nacos/logs/ #新建logs目录 mkdir -p /mydata/nacos/conf/ #新建conf目录 启动容器…...
![](https://i-blog.csdnimg.cn/direct/b57302f0a2dc46a0955107d953125a78.png)
[java基础-集合篇]优先队列PriorityQueue结构与源码解析
优先队列PriorityQueue 优先级队列表示为平衡二进制堆: queue[n] 的两个子级是 queue[2*n1] 和 queue[2*(n1)]。 注:左子节点index2*parentIndex1,右子节点index2*parentIndex2,源码中计算parent位置时就是这样反过来计算的 优…...
![](https://www.ngui.cc/images/no-images.jpg)
12. C语言 数组与指针(深入理解)
本章目录: 前言1. 什么是数组?2. 数组的声明与初始化声明数组初始化数组 3. 访问数组元素遍历数组 4. 获取数组长度使用 sizeof 获取长度使用宏定义简化 5. 数组与指针数组名与指针的区别使用指针操作数组 6. 多维数组遍历多维数组 7. 数组作为函数参数8. 高级技巧与…...
![](https://i-blog.csdnimg.cn/direct/12b869b9ca8347d9a084a48c43c44feb.jpeg)
Postman接口测试基本操作
🍅 点击文末小卡片 ,免费获取软件测试全套资料,资料在手,涨薪更快 Postman-获取验证码 需求:使用Postman访问验证码接口,并查看响应结果。 地址:http://kdtx-test.itheima.net/api/captchaIm…...
![](https://img-blog.csdnimg.cn/direct/67c64049147741939b85489caefbb597.png)
MySQL--2.1MySQL的六种日志文件
大家好,我们来说一下MySQL的6中日志文件。 1.查询日志 查询日志主要记录mysql的select查询的,改配置是默认关闭的。不推荐开启,因为会导致大量查询日志文件储存占用你的空间。 举例查询一下 select * from class; 开启查询日志的命…...
![](https://www.ngui.cc/images/no-images.jpg)
spring task使用
Spring Task 简介 Spring Task 是 Spring 框架原生自带的任务调度框架,它犹如一把瑞士军刀,为开发者提供了丰富多样的功能,助力轻松创建和管理定时任务。相较于其他一些第三方任务调度框架,Spring Task 最大的优势在于其与 Sprin…...
![](https://i-blog.csdnimg.cn/direct/0420b3c4b9e44b759b06eafb13e02603.png)
【FPGA】时序约束与分析
设计约束 设计约束所处环节: 约束输入 分析实现结果 设计优化 设计约束分类: 物理约束:I/O接口约束(例如引脚分配、电平标准设定等物理属性的约束)、布局约束、布线约束以及配置约束 时序约束:设计FP…...
![](https://www.ngui.cc/images/no-images.jpg)
LLM的MoE由什么构成:门控网络,专家网络
LLM的MoE由什么构成:门控网络,专家网络 目录 LLM的MoE由什么构成:门控网络,专家网络专家网络门控网络MoE在联邦学习中的使用及原理专家网络 定义与特点:是一组独立的模型,每个模型都负责处理某个特定的子任务或学习输入空间的特定部分。这些专家可以是简单的线性回归模型…...
![](https://www.ngui.cc/images/no-images.jpg)
HTML-多媒体标签
除了图像,网页还可以放置视频和音频。 1.<video> <video>标签是一个块级元素,用于放置视频。如果浏览器支持加载的视频格式,就会显示一个播放器,否则显示<video>内部的子元素。 <video src"example.…...
![](https://i-blog.csdnimg.cn/direct/ff9a172faa054cfeb334b75bf7ba870c.png)
MySQL笔记大总结20250108
Day2 1.where (1)关系运算符 select * from info where id>1; select * from info where id1; select * from info where id>1; select * from info where id!1;(2)逻辑运算符 select * from info where name"吴佩奇" and age19; select * from info wh…...
![](https://i-blog.csdnimg.cn/direct/a5c5039a429d40818d5797b8bc276d2c.png)
stm32week3
stm32学习 二.外设 8.TIM输出比较 OC(output compare)输出比较 输出比较可以通过比较CNT与CCR寄存器值的关系,来对输出电平进行置1、置0、翻转操作,用于输出一定频率和占空比的PWM波形 每个高级定时器和通用定时器都拥有4个输出比较通道 高级定时器的…...
![](https://i-blog.csdnimg.cn/direct/68b308d3e05c44c3a857a6305467a69c.png)
uniapp 的uni.getRecorderManager() 录音功能小记
官网上明确说的是全局唯一并且只是获取对象,所以会导致一个问题就是,当你多个页面要用到这个对象的时候,会发现 onStop 方法会被覆盖,导致调用结果不是自己想要的 解决办法也简单粗暴,在需要用到的界面重新覆盖onStop…...
![](https://i-blog.csdnimg.cn/direct/54ae0a0f4a3949c58de3aa9f55f7ddd5.png)
【面试题】技术场景 4、负责项目时遇到的棘手问题及解决方法
工作经验一年以上程序员必问问题 面试题概述 问题为在负责项目时遇到的棘手问题及解决方法,主要考察开发经验与技术水平,回答不佳会影响面试印象。提供四个回答方向,准备其中一个方向即可。 1、设计模式应用方向 以登录为例,未…...
![](/images/no-images.jpg)
京东商城企业网站建设分析/百度统计
一、TCP 1、建立连接 2、发送的会检测是否成功,有重发机制 TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议 TCP把数据流分区成适当长度的报文段, 之后TCP把结果包传给I…...
![](https://quant.la/attachment/article/20180815/1534313977347365432.jpg)
松岗专业做网站公司/郑州厉害的seo顾问公司
2019独角兽企业重金招聘Python工程师标准>>> 一. 写在前面的话 有人认为价格围绕价值上下波动,研究投资标的内在价值,于是就出现了基本面派; 有人为价格反映了一切,所有的信息(包括基本面)都反映…...
![](/images/no-images.jpg)
做一个app需要多少钱一个/博客seo怎么做
#include <stdio.h> #include <stdlib.h> #include<time.h> #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0#define MAXSIZE 20 /* 存储空间初始分配量 */ typedef int ElemType; /* ElemType类型根据实际情况而定,这里假设为in…...
![](/images/no-images.jpg)
做NBA网站目的/交换友链平台
Python的很多代码中,都能看到,在import模块的时候,模块前面有个点(.),这是什么意思? 以下说明来自Python官方教材,https://docs.python.org/3/tutorial/modules.html。 假设有一个so…...
![](/images/no-images.jpg)
一个企业为什么要建设网站/网络营销活动策划方案
最简单的局域网(LAN)通常由一台集线器(或交换机)和若干台微机组成。随着计算机数量的增加、网络规模的扩大,在越来越多的局域网环境中,交换机取代了集线器,多台交换机互连取代了单台交换机。在多交换机的局域网环境中,交换机的级联…...
![](https://img-blog.csdnimg.cn/1b1f47899e294aa39ed5d90dccc3106c.png)
淄博北京网站建设/怎样做好服务营销
从0到1用PyG创建异构图异构图创建异构图电影评分数据集MovieLens建立二分图数据集转换为可训练的数据集建立异构图神经网络以OGB数据集为例HeteroData中常用的函数将简单图神经网络转换为异质图神经网络GraphGym的使用PyG中常用的卷积层参考资料在现实中需要对 多种类型的节点以…...