Web3开发:用Rust实现Solana SOL转账教程
·
4min
·
Paxon Qiao
Table of Contents
Web3开发:用Rust实现Solana SOL转账教程
Web3浪潮席卷全球,Solana作为高性能区块链的代表,以其高效、低成本的交易能力深受开发者喜爱。本文通过一个Rust实现的SOL转账示例,带你一步步完成Solana区块链开发。从项目搭建到交易执行,手把手教你快速上手Web3开发,适合区块链新手和Rust爱好者!
本文基于Solana官方文档,展示了一个Rust实现的SOL转账项目。内容涵盖项目初始化、依赖配置、代码实现、测试节点启动及交易执行。代码使用solana-sdk和solana-client库,通过异步RPC客户端与本地Solana节点交互,实现账户空投和1 SOL转账。本教程步骤清晰、代码详尽,助你快速掌握Solana开发技能。
实操
创建项目
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?快来动手实践吧!