2 个不稳定版本
0.2.0 | 2023 年 5 月 15 日 |
---|---|
0.1.0 | 2023 年 4 月 20 日 |
#4 在 #walletd 中
32 每月下载量
用于 walletd
210KB
2.5K SLoC
WalletD Ethereum
对于“本地”示例,示例需要运行 Ganache-CLI 的实例。对于“远程”示例,示例期望存在一个设置了“INFURA_KEY”的 .env 文件。(这仍然是待办事项。参见 问题 #74)
要使所有示例与 ganache-cli 一致,可以使用以下命令实例化 ganache-cli
ganache-cli -b 3 -m "mandate rude write gather vivid inform leg swift usual early bamboo element"
运行示例,您可以运行所有示例
cargo test --examples
您也可以按名称运行特定示例
cargo run --example get_accounts_and_balances
lib.rs
:
WalletD Ethereum 库
为 Ethereum 和区块链特定功能提供钱包实现。
快速入门指南
使用 [EthereumWallet] 结构作为访问 walletD 提供的 Ethereum 功能的良好起点。
每个 [EthereumWallet] 都关联一个公钥地址。一个 [EthereumWallet] 可以在没有关联 [EthereumPrivateKey] 的情况下实例化,但不能签名交易。如果使用 [EthereumPublicKey] 创建 [EthereumWallet] 但没有 [EthereumPrivateKey],它将能够验证签名但不能签名或发送交易。
从种子导入
以下是根据主 [HDKey] 导入 Ethereum 钱包的方法。我们将使用 mut
关键字使 [ethereum 钱包][EthereumWallet] 可变,这样我们就可以稍后修改 ethereum_wallet
。通过从 master_hd_key
导入 ethereum_wallet
,将同时向 ethereum_wallet
提供一个 [EthereumPrivateKey] 和一个 [EthereumPublicKey]。
use walletd_ethereum::prelude::*;
use walletd_hd_key::prelude::*;
let master_seed = Seed::from_str("a2fd9c0522d84d52ee4c8533dc02d4b69b4df9b6255e1af20c9f1d4d691689f2a38637eb1ec778972bf845c32d5ae83c7536999b5666397ac32021b21e0accee")?;
let master_hd_key = HDKey::new_master(master_seed, HDNetworkType::TestNet)?;
let mut ethereum_wallet = EthereumWallet::builder().master_hd_key(master_hd_key).build()?;
let public_address = ethereum_wallet.public_address();
println!("ethereum wallet public address: {}", public_address);
默认派生路径
派生 [EthereumWallet] 简单且使用一些默认设置。我们可以检查我们的 ethereum_wallet
,以查看从主 master_hd_key
派生了一个子 derived_hd_key
,并查看默认使用的派生路径 [HDPath]。
let derived_hd_key = ethereum_wallet.derived_hd_key()?;
let address_derivation_path = derived_hd_key.derivation_path;
println!("address derivation path: {}", address_derivation_path);
我们看到默认情况下,Ethereum 钱包使用派生路径 "m/44'/60'/0'/0/",对应于 BIP44 的目的值 和 60',对应于 Ethereum 的币种。
我们需要为我们的[以太坊钱包][EthereumWallet]添加一个[区块链连接器][BlockchainConnector],以便与以太坊区块链进行交互。
添加区块链连接器
以下是如何将[EthClient]实例添加到我们的ethereum_wallet
中的示例。目前[EthClient]支持符合以太坊JSON-RPC标准的任何以太坊端点,用于访问以太坊区块链数据。我们建议使用Infura或Alchemy。这两个服务都提供慷慨的免费计划,您可以免费使用。请注意,用于连接的URL需要与所使用的网络类型匹配(请注意测试网网络(用于测试和开发目的)与主网网络(硬币具有实际价值)之间的区别)。
let ethclient_url = "https://goerli.infura.io/v3/9aa3d95b3bc440fa88ea12eaa4456161";
let eth_client = EthClient::new(ethclient_url)?;
ethereum_wallet.set_blockchain_client(eth_client);
使用EthClient访问区块链数据
区块链客户端ethclient
可以独立于ethereum_wallet
使用,以访问区块链数据,例如给定交易哈希的交易详情、当前区块编号或当前gas价格。
let tx_hash = "0xe4216d69bf935587b82243e68189de7ade0aa5b6f70dd0de8636b8d643431c0b";
let tx = eth_client.transaction_data_from_hash(tx_hash).await?;
let block_number = eth_client.current_block_number().await;
let gas_price = eth_client.gas_price().await;
println!("transaction data: {:?}", tx);
区块链上以太坊钱包的余额
当ethereum_wallet
连接到区块链时,我们可以找到钱包的余额。
let balance = ethereum_wallet.balance().await?;
println!("ethereum wallet balance: {} ETH, ({} wei)", balance.eth(), balance.wei());
依赖项
~17–26MB
~349K SLoC