本文旨在介绍如何使用 Rust SDK(alloy-rs) 与链上合约进行交互,进而开发 DApp。
在.env
文件中添加必要的配置,包括且不限于:
RPC_URL
:节点 RPC 地址DEV_PRIVATE_KEY
:私钥
在 Rust 项目中,我们可以通过如下代码(main.rs
)与合约进行交互:
-
导入必要的依赖
use std::env; use alloy::{providers::ProviderBuilder, sol}; use alloy::network::{EthereumWallet, NetworkWallet}; use alloy::primitives::{U256}; use alloy::providers::Provider; use alloy::signers::local::{PrivateKeySigner}; use dotenv::dotenv; use eyre::Result; use log::info;
-
引入合约 abi
sol!( #[allow(missing_docs)] #[sol(rpc)] SimpleToken, "src/abi/SimpleToken.json" );
-
初始化环境
#[tokio::main] async fn main() -> Result<(), Box<dyn std::error::Error>> { dotenv().ok(); env_logger::init(); ... }
-
读取
.env
文件中的配置let rpc_url = env::var("RPC_URL").parse()?; let private_key = env::var("PRIVATE_KEY")?;
-
初始化 Wallet 和 Provider
let signer: PrivateKeySigner = private_key.parse().expect("Failed to parse private key"); let address = signer.address(); let wallet = EthereumWallet::from(signer); let provider = ProviderBuilder::new().with_recommended_fillers().wallet(wallet).on_http(rpc_url);
-
创建合约实例
// 或者连接已有的合约 // let erc20_contract = SimpleToken::new("0xapple".parse()?, provider); let erc20_contract = SimpleToken::deploy(provider).await?;
-
调用合约方法
let amount = U256::from(100u64); let receipt = erc20_contract.transfer(address, amount).send().await?.get_receipt().await?; assert_eq!(receipt.status(), true); info!("Transfer successful");