1 个稳定版本
1.0.2 | 2021 年 5 月 27 日 |
---|
#170 in #web3
65KB
1.5K SLoC
故事
该软件包最初由 thojest 创建,后来由 ZGEN DAO 维护。创建目的是提供一个简单的替代方案,用于在 Rust 中编写的 Web3
软件包。
描述
Ethane 是一个旨在简洁简单的 Web3
实现。它具有两个功能 blocking
和 non-blocking
,这些功能决定了它应使用的 http 连接类型。
阻塞 http 客户端不依赖于 futures 或任何执行器。此外,它目前支持 websockets(包括 plain 和 TLS)以及通过 Unix 域套接字(仅限 Unix)进行进程间通信。对于 http 和 websockets,它还支持 Http Basic 和 Bearer 认证。它还包含一个内置的 ABI 解析库。它隐藏在合约功能之下,但可以与主 crate 一起使用。
如果您仍然需要一个非阻塞 http 客户端(例如,用于 wasm
兼容性),您可以编译 Ethane
并带有 non-blocking
功能标志以启用异步 http 客户端。
请参阅文档。如果您只想使用此软件包,它也可在 crates.io 上找到。(Ethane)。如果您发现任何错误,请毫不犹豫地提出问题。
用法
使用 Ethane 库的指南。示例是为阻塞客户端编写的,但非阻塞版本非常相似。主要区别在于 AsyncConnection
只能包装不带任何类型泛型的 AsyncHttp
客户端,因此目前还没有非阻塞 websockets 的实现。
连接
一切从连接开始。
use ethane::{Connection, Http, WebSocket};
fn main() {
let conn = Connection::new(Http::new("https://127.0.0.1:8545", None));
// or
let conn = Connection::new(WebSocket::new("ws://127.0.0.1:8546", None));
}
方法
在连接到以太坊网络后,我们可以调用几个方法。有关支持的方法的更多详细信息稍后提供。
use ethane::{Connection, Http};
use ethane::types::Address;
fn main() {
let conn = Connection::new(Http::new("https://127.0.0.1:8545", None));
match conn.call(rpc::eth_get_balance(Address::try_from_str(ADDRESS1).unwrap(), None)) {
Ok(res) => res,
Err(err) => println!("{:?}", err),
}
}
合约调用
该库还支持通过 ethane-abi
进行合约调用。
use ethane::{Connection, Http};
use ethane::contract::{CallOpts, CallResult, Caller};
use ethane::types::{Address, U256};
use ethane_abi::Parameter;
fn main() {
let conn = Connection::new(Http::new("https://127.0.0.1:8545", None));
let mut caller = Caller::new_from_path(
conn,
"path/to/contract.abi",
Address::try_from_str("0x141770c471a64bcde74c587e55a1ffd9a1bffd31").unwrap(),
);
// The call function determine the call_type based on the state_mutability.
// This calls to function from an ERC-20 compliant token
// eth_call
let address = Address::try_from_str("0x141770c471a64bcde74c587e55a1ffd9a1bffd31").uwnrap();
let result = caller.call(
"balanceOf",
vec![Parameter::from(address)],
None,
);
match result {
CallResult::Transaction(_) => panic!("Should be eth_call"),
CallResult::Call(r) => match r[0] {
Parameter::Uint(data, 256) => assert_eq!(data, H256::from_int_unchecked(1000000000_u64)),
_ => panic!("Invalid data received!"),
},
}
// eth_sendTransaction
let to_address = Address::try_from_str("0x...").unwrap();
let result = caller.call(
"transfer",
vec![
Parameter::from(to_address),
Parameter::from(U256::try_from_int(1000_u128).unwrap()),
],
Some(CallOpts {
force_call_type: None, // NOTE: the call_type can be forced
from: Some(address),
}),
);
match result {
CallResult::Call(_) => panic!("Should be a transaction"),
CallResult::Transaction(tx_hash) => println!("{}", tx_hash),
}
}
订阅
订阅有不同的连接方法。
use ethane::{Connection, WebSocket};
fn main() {
let conn = Connection::new(WebSocket::new("ws://127.0.0.1:8546", None));
let mut tx_subscription = conn.subscribe(eth_subscribe_new_pending_transactions()).unwrap();
// Get next transaction item
let tx = tx_subscription.next_item().unwrap();
}
贡献
欢迎提出问题和Pull Request。开发遵循开源软件标准。
依赖项
~13–29MB
~512K SLoC