solana/web3.js 2.0:Solana 转账全流程解析
Solana 区块链以高吞吐量和低交易成本,已成为开发者的热门选择。而 @solana
/web3.js 2.0 作为最新一代 JavaScript 库,为与 Solana 网络交互提供了更高效、模块化的工具。本文将深入剖析如何使用 @solana
/web3.js 2.0 实现 Solana 区块链上的转账操作,从环境配置到代码实现,再到本地测试验证,旨在为开发者提供一个实用的全流程指南。无论你是 Solana 新手还是资深开发者,都能从中获得丰富的实践洞察。
本文通过一个完整的转账示例,系统解析了 @solana
/web3.js 2.0 在 Solana 开发中的核心应用。内容涵盖:环境变量与密钥配置、RPC 客户端连接、签名者生成、交易消息构建,以及 0.5 SOL 的转账逻辑,并在本地测试验证器上验证结果。代码实现基于 TypeScript 的 solana_transfer.ts,配合 package.json 配置,展示了从开发到验证的全流程最佳实践。文章旨在为开发者提供可复现的参考,助力高效掌握 Solana 开发。
实操
代码实现与解析
以下是实现 Solana 转账的核心代码,我们将逐步拆解其功能和作用。这段代码展示了如何利用 @solana
/web3.js 2.0 从一个账户向另一个账户转账 0.5 SOL。
solann_transfer 文件
import {createKeyPairSignerFromBytes,createSolanaRpc,createSolanaRpcSubscriptions,lamports,getBase58Encoder,sendAndConfirmTransactionFactory,pipe,createTransactionMessage,setTransactionMessageFeePayer,setTransactionMessageLifetimeUsingBlockhash,appendTransactionMessageInstruction,signTransactionMessageWithSigners,getSignatureFromTransaction,address,
} from "@solana/web3.js";
import { getTransferSolInstruction } from "@solana-program/system";
// 导入 dotenv
import dotenv from "dotenv";// 加载 .env 文件中的变量
dotenv.config();
import fs from "fs";// 访问环境变量
const encoded_data = process.env.ENCODED_DATA;
const private_key = process.env.PRIVATE_KEY;
const user1 = process.env.SOL_ADDRESS1;
const user2 = process.env.SOL_ADDRESS2;
const httpProvider = process.env.SOL_RPC_URL;
const wssProvider = process.env.WSS_PROVIDER;console.log(`encoded_data: ${encoded_data}`);
if (!private_key ||!wssProvider ||!encoded_data ||!user1 ||!user2 ||!httpProvider
) {console.error("Missing environment variables.");process.exit(1);
}const user1Address = address(user1);
const user2Address = address(user2);// 1 - 创建一个 Solana RPC 客户端
const rpc = createSolanaRpc(httpProvider);
const rpcSubscriptions = createSolanaRpcSubscriptions(wssProvider);
console.log(`✅ - 已建立与 ${httpProvider} 的连接`);const LAMPORTS_PER_SOL = BigInt(1_000_000_000);async function main() {const encoded_data = [4, 230, 246];// const keypairBytes = JSON.parse(fs.readFileSync("../keys/KeykETTNzif4hHZ8dzqM3xNigyAQ4Z3XXyU9yBbM3y9.json").toString())// const signer = await createKeyPairSignerFromBytes(new Uint8Array(keypairBytes as number[]));const secretKey = private_key as string;const signer = await createKeyPairSignerFromBytes(getBase58Encoder().encode(secretKey));// const seed = new Uint8Array(encoded_data);// const signer = await createKeyPairSignerFromBytes(seed);// 创建转账交易const { value: latestBlockhash } = await rpc.getLatestBlockhash().send();const transactionMessage = pipe(createTransactionMessage({ version: 0 }), // 初始化新的交易消息。版本为 0(tx) => setTransactionMessageFeePayer(user1Address, tx), // 设置交易的手续费支付者(tx) => setTransactionMessageLifetimeUsingBlockhash(latestBlockhash, tx), // 设置交易的生命周期 使用最近的区块哈希设置交易的生命周期(tx) =>appendTransactionMessageInstruction(// 添加转账指令 将转账指令添加到交易中getTransferSolInstruction({amount: lamports(LAMPORTS_PER_SOL / BigInt(2)),destination: user2Address,source: signer,}),tx));// 5 - 签名并发送交易const signedTransaction = await signTransactionMessageWithSigners(transactionMessage);const sendAndConfirmTransaction = sendAndConfirmTransactionFactory({rpc,rpcSubscriptions,});try {await sendAndConfirmTransaction(signedTransaction, {commitment: "confirmed",skipPreflight: true,});const signature = getSignatureFromTransaction(signedTransaction);console.log("✅ - 转账交易:", signature);} catch (e) {console.error("转账失败:", e);}
}main();/***
Web3_wallet/solana-demo on master [✘?] is 📦 1.0.0 via ⬢ v22.1.0 via 🅒 base
➜ ts-node solana_transfer.ts
✅ - 已建立与 https://solana-devnet.g.alchemy.com/v2/YLgbp9I-spejSR_9EHp_-UYDrIYdrwE1 的连接
(node:65790) ExperimentalWarning: The Ed25519 Web Crypto API algorithm is an experimental feature and might change at any time
(Use `node --trace-warnings ...` to show where the warning was created)
(node:65790) [UNDICI-WS] Warning: WebSockets are experimental, expect them to change at any time.
✅ - 转账交易: 5BZMYyU1a7ZHtf6q62nkrvrRfc7ee4pLHyiuUk6sPWHkurpNy4obvD4hGmTwFQpjyhtbstConhXbf4EdUQhba6fu➜ ts-node solana_transfer.ts
✅ - 已建立与 https://solana-devnet.g.alchemy.com/v2/YLgbp9I-spejSR_9EHp_-UYDrIYdrwE1 的连接
(node:75521) ExperimentalWarning: The Ed25519 Web Crypto API algorithm is an experimental feature and might change at any time
(Use `node --trace-warnings ...` to show where the warning was created)
(node:75521) [UNDICI-WS] Warning: WebSockets are experimental, expect them to change at any time.
✅ - 转账交易: 5TX6QHZz9BoXdAourteREavDM2q6ZuSc7FyAE69KemrjZZrfJqhML4YqgHeayMAGQEDNJ68HwDymo7D1miHZqcQX// https://github.com/anamansari062/test-2.0/blob/main/src/index.js*/
代码解析
- 导入模块
从 @solana/web3.js 导入了一系列核心函数,用于构建和发送交易:
- createKeyPairSignerFromBytes:从私钥生成签名者。
- createSolanaRpc 和 createSolanaRpcSubscriptions:创建与 Solana 网络交互的 HTTP 和 WebSocket 客户端。
- lamports:将 SOL 转换为最小单位 Lamports(1 SOL = 10亿 Lamports)。
- pipe:函数式编程工具,用于链式处理交易消息。
- createTransactionMessage、setTransactionMessageFeePayer 等:构建交易的步骤。
- getTransferSolInstruction:从 @solana-program/system 获取转账指令。
- 环境配置
使用 dotenv 加载 .env 文件中的变量(如私钥、地址、RPC URL),并进行校验。如果缺少关键变量,程序会退出,确保安全性。
- RPC 客户端初始化
const rpc = createSolanaRpc(httpProvider);
const rpcSubscriptions = createSolanaRpcSubscriptions(wssProvider);
通过 HTTP 和 WebSocket 协议连接 Solana 网络,分别用于发送请求和订阅事件。
- 签名者生成
const signer = await createKeyPairSignerFromBytes(getBase58Encoder().encode(secretKey));
使用 Base58 编码的私钥生成签名者,用于签署交易。
- 构建交易消息
使用 pipe 函数链式处理:
- 初始化交易(版本 0)。
- 设置手续费支付者(user1Address)。
- 使用最新区块哈希(latestBlockhash)设置交易有效期。
- 添加转账指令,转账金额为 0.5 SOL(LAMPORTS_PER_SOL / BigInt(2))。
- 签名与发送
const signedTransaction = await signTransactionMessageWithSigners(transactionMessage);
await sendAndConfirmTransaction(signedTransaction, { commitment: "confirmed", skipPreflight: true });
使用签名者签署交易,并通过工厂函数发送到网络,等待确认。skipPreflight: true 跳过预检查以加快速度。
- 运行结果
示例输出表明交易成功:
✅ - 转账交易: 5BZMYyU1a7ZHtf6q62nkrvrRfc7ee4pLHyiuUk6sPWHkurpNy4obvD4hGmTwFQpjyhtbstConhXbf4EdUQhba6fu
执行与验证
运行 ts-node solana_transfer.ts,完成 0.5 SOL 的转账,并返回交易签名,可通过 Solana Explorer 查看详情。
package.json 文件
{"name": "solana-demo","version": "1.0.0","description": "","main": "index.js","scripts": {"test": "echo \"Error: no test specified\" && exit 1"},"keywords": [],"author": "","license": "ISC","dependencies": {"@solana-program/system": "^0.6.2","@solana/web3.js": "2","dotenv": "^16.4.7","ed25519-hd-key": "^1.3.0","bs58": "^6.0.0","bip39": "3.1.0"},"devDependencies": {"@types/node": "^22.13.4"}
}
本地测试
# Solana```bash
➜ solana-test-validator -rLedger location: test-ledger
Log: test-ledger/validator.log
⠄ Initializing... Waiting for fees to stabilize 1...
Identity: AvV5zuhWHPCNRhq8qyPrfA4yjLqiFPySFxyYt7NuHicE
Genesis Hash: EQ6H4aqK3RbAP2eYtvrMFHK3SrbKT9NHJ4MtT2hrVCKB
Version: 2.0.15
Shred Version: 290
Gossip Address: 127.0.0.1:1024
TPU Address: 127.0.0.1:1027
JSON RPC URL: http://127.0.0.1:8899
WebSocket PubSub URL: ws://127.0.0.1:8900
⠁ 00:03:00 | Processed Slot: 382 | Confirmed Slot: 382 | Finalized Slot: 351➜ ts-node transfer.ts✅ - 已建立与 http://127.0.0.1:8899 的连接
(node:4171) ExperimentalWarning: The Ed25519 Web Crypto API algorithm is an experimental feature and might change at any time
(Use `node --trace-warnings ...` to show where the warning was created)
✅ - 新的 user1 地址已创建:3ziUaeQ1zZwbQf1FYHGYrKQkifEWSG5K47WKPQFzXVpp
✅ - 从文件生成 user2 地址:Sq7vmiewuLGcQArLUhny1iXtXPqrnC1EWGt5SJ89aS5
✅ - user1 使用 RPC 方法空投 1 SOL
✅ - tx1: 36RRUnQQbPYrXjSTcpw5Aqf9KYW1aBEp8GH9akBAgqfypeyxtWSLx9Ss3e7tqQ83sgwpdhtfaUTXbHBspk58z6dP
(node:4171) [UNDICI-WS] Warning: WebSockets are experimental, expect them to change at any time.
✅ - user2 使用工厂函数空投 1 SOL
✅ - tx2: 2YFtea2ez4XuDdgKn6Zj9L6ogdt9eFwu4CfSb4Ekgd7kbmUQJEU6frkvVKvCBjBL1fZWM3yaxoKetQyTLZjzsCnj
✅ - 转账交易: 3Wqnj7Whghqyg9xVXEBkFbTJvCjBJ83eHQ91FPoJ69KzBmWSSppYnvuz7kC9n2uJotVg4eB1ARBbgUQt6SbiHfxe
```
总结
通过对 @solana
/web3.js 2.0 的全流程解析,我们成功实现了 Solana 区块链上的转账功能。从环境搭建到交易签名,再到本地测试验证,整个过程展示了该库在性能和易用性上的优势。借助 @solana
/web3.js 2.0 的模块化设计,开发者可以极大简化开发复杂度,专注于业务逻辑而非底层细节。本文提供的示例可作为起点,开发者还可进一步扩展到更复杂的应用场景(如批量交易或跨程序调用),解锁 Solana 生态的更多可能,更多信息,,https://t.me/gtokentool 。
相关文章:
solana/web3.js 2.0:Solana 转账全流程解析
Solana 区块链以高吞吐量和低交易成本,已成为开发者的热门选择。而 solana /web3.js 2.0 作为最新一代 JavaScript 库,为与 Solana 网络交互提供了更高效、模块化的工具。本文将深入剖析如何使用 solana /web3.js 2.0 实现 Solana 区块链上的转账操作&am…...
数模转换电路(D/A转换器)
将数字信号转换成模拟信号称为数/模转换, 简称D/A(Digital to Analog)转换,实现 D/A 转换的器件称为D/A转换器,简称 DAC(Digital-Analog Converter)。 将模拟信号转换成数字信号称为模/数转换, 简称A/D&a…...
网络基础-路由器和交换机工作配置
三、路由器和交换机的工作原理配置以及华为体系下的小型网络的搭建 3.1路由基础 3.1.1数据转发 通过链路层交换机和网络层路由器进行数据转发 交换机(链路层)mac地址表的数据转发路由器(网络层) ip路由表的数据转发 隔离广播域…...
uv包简单使用案例
uv由Charlie Marsh开发,是Astral Tool的一个快速Python包安装器和解析器。它类似于pip和pip-tools,但速度更快。此外,uv还支持虚拟环境管理,替代venv和virtualenv。 参考:https://github.com/astral-sh/uv 安装&#x…...
PHP接口开发:从基础到高级的全面指南
一、接口基础与核心概念(约800字) 1.1 接口的本质定义 在PHP中,接口(Interface)是一种特殊的抽象结构,它通过interface关键字定义一组方法的契约规范,不包含具体实现。这种设计强制实现类必须遵循统一的调用标准,如: interface PaymentGateway {public function proc…...
JAVA学习*String类
String类 基本知识 String类的构造方法 String类的构造方法有很多,我们需要掌握常见的构造方法,来赋初识值。 1、new一个String类的对象 String name new String("张三");2、使用字符串常量进行赋值 String name "张三";相当…...
Java IO框架体系深度解析:从四基类到设计模式实践
Java IO框架体系深度解析:从四基类到设计模式实践 一、IO流体系架构总览 1.1 四基类设计哲学 Java IO框架以InputStream、OutputStream、Reader、Writer四个抽象类为根基,构建了完整的流式IO体系。这种设计体现了以下核心原则: 抽象分层&a…...
【读书笔记】华为《从偶然到必然》
note 华为的成功并非偶然,而是通过IPD体系、投资组合管理、平台战略等系统性工具,将研发投资转化为可持续的商业竞争力。书中强调的“管理即内部因素”理念,揭示了企业规模扩张与管理能力匹配的深层规律,为高科技企业提供了可借鉴…...
failed to load steamui.dll”错误:Steam用户的高频崩溃问题解析
当你满心欢喜地双击 Steam 图标,准备进入游戏世界时,屏幕上突然弹出 “failed to load steamui.dll” 的刺眼提示——这是全球数百万 Steam 用户最不愿见到的错误之一。作为 Steam 客户端的核心界面动态链接库文件,steamui.dll 的缺失或损坏会…...
Linux多线程详解
Linux多线程详解 一、Linux多线程概念1.1 什么是线程1.2 进程和线程1.3 进程的多个线程共享1.4 进程和线程的关系 二、Linux线程控制2.1 POSIX线程库2.2 线程创建2.3 获取线程ID pthread_self2.4 线程等待pthread_join2.5 线程终止2.6 线程栈 && pthread_t2.7 线程的局…...
权限提升—Windows权限提升土豆家族溢出漏洞通杀全系
前言 OK,Java安全更新不下去了,实在是太难啦啊,想起来提权这一块没怎么更新过,接下来都主要是更新提权这一块的文章了,Java安全的话以后有耐心再搞了。 手动提权 今天主要是讲这个手动的提权,手动提权相…...
JVM(基础篇)
一.初识JVM 1.什么是JVM JVM全称Java Virtyal Machine,中文译名 Java虚拟机 。JVM本质上是一个运行在计算机上的程序,他的职责是运行Java字节码文件(将字节码解释成机器码)。 2.JVM的功能 解释和运行:对字节码文件中的指令号,实时…...
cf1007-D
__builtin_ctzll(x)可以用((int)log2(x&-x))代替 void solve() {int n;i64 l, r;std::cin >> n >> l >> r;std::vector<int> a(n 1);for (int i 1; i < n; i) {std::cin >> a[i];}std::vector<int> pre(n 1);for (int i 1; i …...
【Unity网络编程知识】使用Socket实现简单TCP通讯
1、Socket的常用属性和方法 创建Socket TCP流套接字 Socket socketTcp new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 1.1 常用属性 1)套接字的连接状态 socketTcp.Connected 2)获取套接字的类型 socketTcp.So…...
深入解析SSL/TLS证书:构建现代网络安全的密码学基石1.1 TLS 1.3握手流程优化
一、协议层深度解析:TLS握手全流程拆解 1.1 TLS 1.3握手流程优化 (此处展示TLS 1.3握手流程图,使用Mermaid语法) Client Server ClientHello (supported_versions, cipher_suites, key_share) ServerHello (selected_version, ci…...
【深度学习】GAN生成对抗网络:原理、应用与发展
GAN生成对抗网络:原理、应用与发展 文章目录 GAN生成对抗网络:原理、应用与发展1. 引言2. GAN的基本原理2.1 核心思想2.2 数学表达2.3 训练过程 3. GAN的主要变体3.1 DCGAN (Deep Convolutional GAN)3.2 CGAN (Conditional GAN)3.3 CycleGAN3.4 StyleGAN…...
Live555+Windows+MSys2 编译Androidso库和运行使用(二,实验篇)
文章目录 实验下载推流服务端版本运行 摘要:书接上回 https://blog.csdn.net/qq_20330595/article/details/146412411?spm1001.2014.3001.5502 我们先做几个试验,方便我们理解rtsp推流,先把采集和播放体验一下,我们最后回到代码…...
树莓派ollama docker报错尝试网上方法
ollama ps运行bash:ollama:未找到命令 sudo curl -sSL https://get.docker.com | sh 显示“连接被对方重置” sudo docker run hello-world测试 sudo: docker找不到命令 ollama pull qwen2:7b push:ollama 未找到命令 安装 docker sudo apt update sudo apt …...
工作杂谈(十七)——研发阶段术语
EVT/DVT/PVT/MP是指在制造行业一个产品研发导入从试产到量产的不同阶段: EVT:Engineering Verification Test工程验证测试阶段 DVT:Design Verification Test设计验证测试 PVT:Production Verification Test 小批量生…...
Spring MVC:从历史演变到实战入门
1. Java Web的发展历史与MVC模式 1.1 Model I与Model II的演进 Model I(JSPJavaBean) 作为早期Java Web开发的主流模式,其核心架构如下: graph LR A[客户端] --> B[JSP页面] B --> C{业务逻辑} C --> D[JavaBean] D -…...
C++中的std::move函数详解:移动语义与资源管理
在C中,std::move 是一个用于将对象转换为右值引用的函数模板,通常用于实现资源的转移(如动态内存、文件句柄等),从而避免不必要的拷贝操作。std::move 是C11引入的一个重要特性,主要用于支持移动语义。 目录…...
2025 polarctf春季个人挑战赛web方向wp
来个弹窗 先用最基础的xss弹窗试一下 <script>alert("xss")</script>没有内容,猜测过滤了script,双写绕过一下 <scrscriptipt>alert("xss")</scscriptript>background 查看网页源代码 查看一下js文件 类…...
RabbitMQ 学习整理1 - 基础使用
项目代码:RabbitMQDemo: 学习RabbitMQ的一些整理 基本概念 RabbitMQ是一种基于AMQP协议的消息队列实现框架RabbitMQ可以用于在系统与系统之间或者微服务节点之间,进行消息缓存,消息广播,消息分配以及限流消峰处理RabbitMQ-Serve…...
分布式渲染与云渲染:技术与应用的黄金搭档
一、核心概念:先区分再关联 分布式渲染是通过多台设备并行计算拆分渲染任务的技术(如将一帧拆分为 64 个小块,64 台电脑同时渲染); 云渲染是基于云计算的渲染服务,本质是分布式渲染的商业化落地—— 用户无…...
【实战ES】实战 Elasticsearch:快速上手与深度实践-5.2.1 多字段权重控制(标题、品牌、类目)
👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 电商商品搜索实战:多字段权重控制策略1. 业务场景与核心挑战1.1 典型搜索问题1.2 权重失衡的影响数据 2. 权重控制核心方案2.1 字段权重分配矩阵2.2 多策略组合方…...
如何避免测试数据准备不充分或不可复用
避免测试数据准备不充分或不可复用的关键方法包括明确数据需求、统一数据管理工具、建立数据复用机制、定期维护更新测试数据以及加强团队沟通与协作。 其中,统一数据管理工具对确保数据质量和复用性尤为重要。例如,许多团队采用专门的测试数据管理工具以…...
使用AI一步一步实现若依(23)
功能23:从后端获取路由/菜单数据 功能22:用户管理 功能21:使用axios发送请求 功能20:使用分页插件 功能19:集成MyBatis-Plus 功能18:创建后端工程 功能17:菜单管理 功能16:角色管理…...
C语言的内存模型 (堆区,栈区,静态区,常量区,代码区 )概念讲解
C语言的内存模型分为5个区: 堆区,栈区,静态区,常量区,代码区 。 1、栈区 存放函数的参数值,局部变量等。 由编译器自动分配和释放。通常在函数执行完了就释放了。其操作方式类似于数据结构中的栈。栈内存…...
Vue3 知识点总结
Vue3 知识点总结 1. 核心概念 1.1 Composition API 1.1.1 setup 函数 setup是Vue3中的新的配置项,是组件内使用Composition API的入口在setup中定义的变量和方法需要return才能在模板中使用setup执行时机在beforeCreate之前,this不可用 export defa…...
第一天学爬虫
阅读提示:我今天才开始尝试爬虫,写的不好请见谅。 一、准备工具 requests库:发送HTTP请求并获取网页内容。BeautifulSoup库:解析HTML页面并提取数据。pandas库:保存抓取到的数据到CSV文件中。 二、爬取步骤 发送请求…...
