Rust Solana区块链交互库solana-rpc的使用:实现高效JSON-RPC通信与节点操作

Rust Solana区块链交互库solana-rpc的使用:实现高效JSON-RPC通信与节点操作

安装

在项目目录中运行以下Cargo命令:

cargo add solana-rpc

或者在Cargo.toml中添加以下行:

solana-rpc = "2.3.7"

基础使用示例

以下是一个使用solana-rpc库与Solana节点进行交互的基本示例:

use solana_rpc::rpc_client::RpcClient;
use solana_sdk::pubkey::Pubkey;

fn main() {
    // 连接到Solana主网Beta节点
    let rpc_url = "https://api.mainnet-beta.solana.com".to_string();
    let client = RpcClient::new(rpc_url);

    // 获取当前区块高度
    match client.get_block_height() {
        Ok(height) => println!("当前区块高度: {}", height),
        Err(e) => eprintln!("获取区块高度失败: {}", e),
    }

    // 获取账户余额示例
    let pubkey = Pubkey::new(&[0; 32]); // 替换为实际的公钥
    match client.get_balance(&pubkey) {
        Ok(balance) => println!("账户余额: {}", balance),
        Err(e) => eprintln!("获取余额失败: {}", e),
    }
}

完整示例DEMO

以下是一个更完整的示例,展示了如何使用solana-rpc库进行各种节点操作:

use solana_rpc::{
    rpc_client::RpcClient,
    rpc_request::RpcRequest,
};
use solana_sdk::{
    pubkey::Pubkey,
    signature::{Keypair, Signer},
    commitment_config::CommitmentConfig,
};
use std::str::FromStr;

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    // 初始化RPC客户端
    let rpc_url = "https://api.mainnet-beta.solana.com".to_string();
    let client = RpcClient::new(rpc_url);
    
    // 1. 获取节点信息
    let version = client.get_version()?;
    println!("Solana节点版本: {:?}", version);
    
    // 2. 获取最近的区块hash
    let recent_blockhash = client.get_latest_blockhash()?;
    println!("最近的区块hash: {}", recent_blockhash);
    
    // 3. 查询特定账户信息
    let account_pubkey = Pubkey::from_str("4fYNw3dojWmQ4dXtSGE9epjRGy9pFSx62YypT7avPYvA")?;
    let account_info = client.get_account(&account_pubkey)?;
    println!("账户信息: {:?}", account_info);
    
    // 4. 获取多个账户的余额
    let pubkeys = vec![
        Pubkey::from_str("4fYNw3dojWmQ4dXtSGE9epjRGy9pFSx62YypT7avPYvA")?,
        Pubkey::from_str("83astBRguLMdt2h5U1Tpdq5tjFoJ6noeGwaY3mDLVcri")?,
    ];
    let balances = client.get_multiple_balances(&pubkeys)?;
    println!("多个账户余额: {:?}", balances);
    
    // 5. 发送自定义RPC请求
    let slot = client.send(
        RpcRequest::GetSlot,
        serde_json::json!([{"commitment": "confirmed"}]),
    )?;
    println!("当前slot: {}", slot);
    
    // 6. 使用自定义承诺级别
    let commitment = CommitmentConfig::confirmed();
    let balance_with_commitment = client.get_balance_with_commitment(&account_pubkey, commitment)?;
    println!("确认后的账户余额: {}", balance_with_commitment.value);
    
    Ok(())
}

高级功能

solana-rpc库还支持以下高级功能:

  1. 批量请求:可以一次性发送多个RPC请求
  2. 自定义超时:可以配置请求超时时间
  3. WebSocket订阅:支持通过WebSocket订阅账户变更、日志等
  4. 事务发送:支持发送已签名的交易到网络

资源

请注意,在实际使用时,您需要处理错误和边缘情况,并根据您的具体需求调整代码。


1 回复

Rust Solana区块链交互库solana-rpc使用指南

以下是基于提供内容的完整示例demo,展示了solana-rpc库的主要功能:

use solana_rpc::rpc_client::RpcClient;
use solana_sdk::{
    pubkey::Pubkey,
    signature::{Keypair, Signer},
    system_instruction,
    transaction::Transaction,
};
use std::str::FromStr;

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    // 1. 创建RPC客户端
    let rpc_url = "https://api.mainnet-beta.solana.com".to_string();
    let client = RpcClient::new(rpc_url);

    // 2. 查询账户余额
    let wallet_address = Pubkey::from_str("YourWalletAddressHere")?;
    match client.get_balance(&wallet_address) {
        Ok(balance) => println!("账户余额: {} lamports", balance),
        Err(e) => println!("查询失败: {:?}", e),
    }

    // 3. 获取最新区块哈希
    match client.get_latest_blockhash() {
        Ok((hash, _)) => println!("最新区块哈希: {}", hash),
        Err(e) => println!("获取失败: {:?}", e),
    }

    // 4. 发送交易(示例,实际使用需要有效的密钥对)
    let from_keypair = Keypair::new(); // 生产环境应使用安全的密钥存储
    let to_pubkey = Pubkey::new_unique();

    let instruction = system_instruction::transfer(
        &from_keypair.pubkey(),
        &to_pubkey,
        1000, // lamports
    );

    let mut transaction = Transaction::new_with_payer(
        &[instruction],
        Some(&from_keypair.pubkey()),
    );

    let (recent_blockhash, _) = client.get_latest_blockhash()?;
    transaction.sign(&[&from_keypair], recent_blockhash);

    match client.send_and_confirm_transaction(&transaction) {
        Ok(signature) => println!("交易成功! 签名: {}", signature),
        Err(e) => println!("交易失败: {:?}", e),
    }

    // 高级功能示例
    advanced_features(&client, &wallet_address).await?;

    Ok(())
}

async fn advanced_features(
    client: &RpcClient,
    wallet_address: &Pubkey,
) -> Result<(), Box<dyn std::error::Error>> {
    // 1. 批量请求
    use solana_rpc::rpc_request::RpcRequest;
    
    let requests = vec![
        RpcRequest::GetBalance(wallet_address.to_string()),
        RpcRequest::GetAccountInfo(wallet_address.to_string()),
    ];

    match client.batch(requests) {
        Ok(responses) => {
            println!("批量请求结果:");
            for response in responses {
                println!("{:?}", response);
            }
        }
        Err(e) => println!("批量请求失败: {:?}", e),
    }

    // 2. 订阅账户变更(需要tokio运行时)
    use solana_rpc::rpc_subscriptions::RpcSubscriptions;
    use solana_sdk::commitment_config::CommitmentConfig;

    let subscriptions = RpcSubscriptions::new_with_commitment(
        "ws://api.mainnet-beta.solana.com".to_string(),
        CommitmentConfig::confirmed(),
    );

    let (mut account_notifications, unsubscribe) = subscriptions
        .account_subscribe(wallet_address, None)
        .unwrap();

    tokio::spawn(async move {
        println!("开始监听账户变更...");
        while let Some(notification) = account_notifications.next().await {
            println!("账户变更通知: {:?}", notification);
        }
    });

    // 在实际应用中,可以在适当的时候调用unsubscribe()取消订阅
    // unsubscribe();

    Ok(())
}

代码说明

  1. 初始化RPC客户端:连接到Solana主网的JSON-RPC端点
  2. 查询功能
    • 获取账户余额(lamports)
    • 获取最新区块哈希(用于交易签名)
  3. 交易功能
    • 创建转账交易
    • 签名并发送交易
  4. 高级功能
    • 批量请求:同时发送多个查询请求
    • 订阅通知:实时监听账户变更

注意:实际使用时需要替换示例中的钱包地址,并妥善管理密钥对。生产环境应考虑添加错误处理、重试机制和适当的日志记录。

回到顶部