2 个不稳定版本

0.2.0 2023 年 5 月 15 日
0.1.0 2023 年 4 月 20 日

#4#walletd

32 每月下载量
用于 walletd

MIT/Apache

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标准的任何以太坊端点,用于访问以太坊区块链数据。我们建议使用InfuraAlchemy。这两个服务都提供慷慨的免费计划,您可以免费使用。请注意,用于连接的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