You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Rust的alloy crate调用XDC网络上XRC-20代币的name、symbol等方法的最小可运行示例需求

Rust的alloy crate调用XDC网络上XRC-20代币的name、symbol等方法的最小可运行示例

刚好我之前也折腾过用alloy和XDC网络交互,给你整理了一个直接能用的最小示例,替换掉占位参数就能跑起来:

首先是你的Cargo.toml依赖配置,确保引入alloy和异步运行时tokio:

[package]
name = "xdc-xrc20-alloy-demo"
version = "0.1.0"
edition = "2021"

[dependencies]
alloy = { version = "0.2", features = ["full"] }
tokio = { version = "1.35", features = ["full"] }
thiserror = "1.0"

然后是核心的src/main.rs代码:

use alloy::{
    primitives::{Address, U256},
    providers::{Provider, ProviderBuilder},
    signers::local::PrivateKeySigner,
    sol,
};
use std::error::Error;

// 用sol!宏定义XRC-20核心接口,和标准ERC20完全一致
sol! {
    interface IERC20 {
        function name() external view returns (string);
        function symbol() external view returns (string);
        function totalSupply() external view returns (uint256);
        function balanceOf(address account) external view returns (uint256);
    }
}

#[tokio::main]
async fn main() -> Result<(), Box<dyn Error>> {
    // -------------------------- 替换成你自己的参数 --------------------------
    const RPC_URL: &str = "https://rpc.apothem.network";
    // 私钥可带/不带0x前缀
    const PRIVATE_KEY: &str = "你的MetaMask私钥";
    const CONTRACT_ADDRESS: &str = "你的XRC-20合约地址";
    const MY_ADDRESS: &str = "你的MetaMask钱包地址";
    // -----------------------------------------------------------------------

    // 1. 加载私钥并创建签名器
    let signer = PrivateKeySigner::from_bytes(hex::decode(PRIVATE_KEY.trim_start_matches("0x"))?)?;
    println!("成功加载私钥,对应地址:{}", signer.address());

    // 2. 连接到XDC Apothem测试网RPC节点
    let provider = ProviderBuilder::new()
        .with_recommended_fillers()
        .http(RPC_URL)
        .await?;
    // 结合签名器与提供者,得到带签名能力的中间件(视图方法/交易都能用)
    let signer_middleware = provider.with_signer(signer);

    // 3. 实例化XRC-20合约
    let contract = IERC20::new(Address::from_str(CONTRACT_ADDRESS)?, &signer_middleware);

    // 4. 调用合约视图方法
    let name = contract.name().await?;
    let symbol = contract.symbol().await?;
    let total_supply = contract.total_supply().await?;
    let my_balance = contract.balance_of(Address::from_str(MY_ADDRESS)?).await?;

    // 5. 打印结果
    println!("=== XRC-20代币信息 ===");
    println!("代币名称: {}", name);
    println!("代币符号: {}", symbol);
    println!("总供应量: {}", total_supply);
    println!("你的钱包余额: {}", my_balance);

    Ok(())
}

几个关键点说明:

  • 私钥加载:代码自动处理带0x前缀的私钥,直接传原始十六进制字符串也能正常工作
  • 中间件选择:虽然调用视图方法不需要签名,但SignerMiddleware可以统一处理后续的交易操作(比如转账),用它实例化合约更省心
  • 错误处理:全程用?传播错误,任何步骤出错都会输出清晰的错误信息,方便调试
  • 合约实例化:IERC20::new只需要合约地址和链交互提供者,逻辑非常简洁

最后提醒:

  • 绝对不要把私钥硬编码到代码里,实际项目建议用环境变量或加密配置文件加载
  • 测试阶段务必用Apothem测试网,避免主网操作带来的资产风险

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.08 10:48:03