Web3开发:用Rust实现Solana SOL转账教程

Web3开发:用Rust实现SolanaSOL转账教程Web3浪潮席卷全球,Solana作为高性能区块链的代表,以其高效、低成本的交易能力深受开发者喜爱。本文通过一个Rust实现的SOL转账示例,带你一步步完成Solana区块链开发。从项目搭建到交易执行,手把手教你快速上手Web3开发,适合区块

Web3开发:用Rust实现Solana SOL转账教程

Web3浪潮席卷全球,Solana作为高性能区块链的代表,以其高效、低成本的交易能力深受开发者喜爱。本文通过一个Rust实现的SOL转账示例,带你一步步完成Solana区块链开发。从项目搭建到交易执行,手把手教你快速上手Web3开发,适合区块链新手和Rust爱好者!

本文基于Solana官方文档,展示了一个Rust实现的SOL转账项目。内容涵盖项目初始化、依赖配置、代码实现、测试节点启动及交易执行。代码使用solana-sdk和solana-client库,通过异步RPC客户端与本地Solana节点交互,实现账户空投和1 SOL转账。本教程步骤清晰、代码详尽,助你快速掌握Solana开发技能。

实操

How to Send SOL

创建项目

cargo new send-sol-demo
    Creating binary (application) `send-sol-demo` package
note: see more `Cargo.toml` keys and their definitions at *******************************************************
cd send-sol-demo

cc

查看项目目录结构

SolanaSandbox/send-sol-demo on  main [?] is 📦 0.1.0 via 🦀 1.86.0 took 2.6s 
➜ tree . -L 6 -I "target|test-ledger"
.
├── Cargo.lock
├── Cargo.toml
└── src
    └── main.rs

2 directories, 3 files

安装依赖

SolanaSandbox/send-sol-demo on  main [?] is 📦 0.1.0 via 🦀 1.86.0 
➜ cargo add tokio --features full

SolanaSandbox/send-sol-demo on  main [?] is 📦 0.1.0 via 🦀 1.86.0 
➜ cargo add anyhow               

SolanaSandbox/send-sol-demo on  main [?] is 📦 0.1.0 via 🦀 1.86.0 took 2.9s 
➜ cargo add solana-client

SolanaSandbox/send-sol-demo on  main [?] is 📦 0.1.0 via 🦀 1.86.0 took 6.7s 
➜ cargo add solana-sdk

代码实现

use solana_client::nonblocking::rpc_client::RpcClient;
use solana_sdk::{
    commitment_config::CommitmentConfig, native_token::LAMPORTS_PER_SOL, signature::Keypair,
    signer::Signer, system_instruction::transfer, transaction::Transaction,
};

#[tokio::main]
async fn main() -> anyhow::Result<()> {
    let client = RpcClient::new_with_commitment(
        String::from("http://127.0.0.1:8899"),
        CommitmentConfig::confirmed(),
    );

    let from_keypair = Keypair::new();
    let to_keypair = Keypair::new();

    let transfer_ix = transfer(
        &from_keypair.pubkey(),
        &to_keypair.pubkey(),
        LAMPORTS_PER_SOL,
    );

    let transaction_signature = client
        .request_airdrop(&from_keypair.pubkey(), 5 * LAMPORTS_PER_SOL)
        .await?;
    loop {
        if client.confirm_transaction(&transaction_signature).await? {
            break;
        }
    }

    let mut transaction = Transaction::new_with_payer(&[transfer_ix], Some(&from_keypair.pubkey()));
    transaction.sign(&[&from_keypair], client.get_latest_blockhash().await?);

    match client.send_and_confirm_transaction(&transaction).await {
        Ok(signature) => println!("Transaction Signature: {}", signature),
        Err(err) => eprintln!("Error sending transaction: {}", err),
    }

    Ok(())
}

这段代码是一个用 Rust 编写的 Solana 区块链转账示例,主要流程如下:

1. 导入依赖

  • solana_client::nonblocking::rpc_client::RpcClient:异步 RPC 客户端,用于与 Solana 节点通信。
  • solana_sdk 相关模块:用于密钥对、签名、系统指令、交易等。

2. 主函数入口

  • 使用 #[tokio::main] 宏,表示主函数是异步的,基于 Tokio 异步运行时。

3. 创建 RPC 客户端

let client = RpcClient::new_with_commitment(
    String::from("http://127.0.0.1:8899"),
    CommitmentConfig::confirmed(),
);
  • 连接本地的 Solana 节点(假设本地已启动 solana-test-validator)。
  • 使用“confirmed”确认级别。

4. 生成密钥对

let from_keypair = Keypair::new();
let to_keypair = Keypair::new();
  • 随机生成两个密钥对,分别作为转账的发送方和接收方。

5. 构造转账指令

let transfer_ix = transfer(
    &from_keypair.pubkey(),
    &to_keypair.pubkey(),
    LAMPORTS_PER_SOL,
);
  • 构造一个系统转账指令,从发送方向接收方转 1 SOL(1 SOL = 1_000_000_000 lamports)。

6. 请求空投

let transaction_signature = client
    .request_airdrop(&from_keypair.pubkey(), 5 * LAMPORTS_PER_SOL)
    .await?;
  • 向本地节点请求给发送方账户空投 5 SOL,便于后续转账。

7. 等待空投确认

loop {
    if client.confirm_transaction(&transaction_signature).await? {
        break;
    }
}
  • 循环等待,直到空投交易被确认。

8. 构造并签名交易

let mut transaction = Transaction::new_with_payer(&[transfer_ix], Some(&from_keypair.pubkey()));
transaction.sign(&[&from_keypair], client.get_latest_blockhash().await?);
  • 构造一个包含转账指令的交易,并由发送方签名。

9. 发送并确认交易

match client.send_and_confirm_transaction(&transaction).await {
    Ok(signature) => println!("Transaction Signature: {}", signature),
    Err(err) => eprintln!("Error sending transaction: {}", err),
}
  • 发送交易到链上,并等待确认。
  • 成功则打印交易签名,失败则打印错误信息。

10. 结束

Ok(())
  • 程序正常结束。

总结
这段代码演示了如何用 Rust 通过 Solana RPC 客户端实现账户空投和转账的完整流程,适合本地测试和学习 Solana 开发。

构建项目

SolanaSandbox/send-sol-demo on  main [?] is 📦 0.1.0 via 🦀 1.86.0 took 25.9s 
➜ cargo build
    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.64s

启动Solana 本地测试验证节点

SolanaSandbox/send-sol-demo on  main [?] is 📦 0.1.0 via 🦀 1.86.0 
➜ solana-test-validator                                                                           
Ledger location: test-ledger
Log: test-ledger/validator.log
⠠ Initializing...                                                                                             Waiting for fees to stabilize 1...
Identity: CJ33uerr1nx5XhjUyb2imjWtTvXHWiRgxYGf5a1geSrE
Genesis Hash: ECWYjSfSYx4j3RNPHke7UEjVi1TJeP81HqtgtzbKLSMZ
Version: 2.1.21
Shred Version: 57143
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:00:14 | Processed Slot: 29 | Confirmed Slot: 29 | Finalized Slot: 0 | Full Snapshot Slot: - | Incremental S

运行

SolanaSandbox/send-sol-demo on  main [?] is 📦 0.1.0 via 🦀 1.86.0 
➜ cargo run  
    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.75s
     Running `target/debug/send-sol-demo`
Transaction Signature: 5vipgKKTHhN6RpZi65RLFHN31id3EfWpifxcMWic5DjCcWWP8DHg5y5hb8w5sCTwV2xsQR9M6CGJSQQfJkjhqgJy

总结

通过一个简洁的Rust示例,本文详细讲解了在Solana区块链上实现SOL转账的完整流程。代码利用solana-sdk和solana-client库,通过异步编程实现空投和转账操作,开发者可借助本地测试节点快速验证效果。本教程为Web3开发提供了实用入门指引,适合初学者学习Solana生态,也为进阶开发者提供可扩展的代码基础。想深入探索Web3?快来动手实践吧!

参考

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

0 条评论

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