使用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
相关产品推荐
相关产品推荐

