@solana/web3.js 2.0:Solana 转账全流程解析

@solana/web3.js2.0:Solana转账全流程解析Solana区块链以高吞吐量和低交易成本,已成为开发者的热门选择。而@solana/web3.js2.0作为最新一代JavaScript库,为与Solana网络交互提供了更高效、模块化的工具。本文将深入剖析如何使

@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 i...

剩余50%的内容订阅专栏后可查看

点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
寻月隐君
寻月隐君
0x89EE...a439
不要放弃,如果你喜欢这件事,就不要放弃。如果你不喜欢,那这也不好,因为一个人不应该做自己不喜欢的事。