1 个稳定版本
1.0.2 | 2021 年 5 月 27 日 |
---|
#6 在 #type-system
24KB
582 行
简介
此软件包最初由 thojest 创建,并由 ZGEN DAO 维护。其目的是为了提供一个简单替代 Rust 编写的 Web3 软件包。
描述
Ethane 是一个旨在精简和简单的 Web3 实现。它有两个特性 blocking
和 non-blocking
,这些特性决定了它应该使用哪种 HTTP 连接类型。
阻塞式 HTTP 客户端不依赖于 futures 或任何执行器。此外,它目前支持 WebSocket(包括普通和 TLS)以及通过 Unix 域套接字进行进程间通信(仅限 Unix)。对于 HTTP 和 WebSocket,它还支持 Http Basic 和 Bearer 身份验证。它还包含一个内置的 ABI 解析库。它隐藏在合约功能之下,但可以与主 crate 一起使用。
如果您仍然需要一个非阻塞的 HTTP 客户端(例如,为了与 wasm
兼容),您可以通过编译 Ethane
并启用 non-blocking
功能标志来启用异步 HTTP 客户端。
请参阅文档。如果您只想使用此 crate,它也存在于 crates.io 上。 (Ethane)。如果您发现任何错误,请毫不犹豫地提出问题。
使用
使用 Ethane 库的指南。示例针对阻塞客户端进行了处理,但非阻塞版本相当类似。主要区别在于 AsyncConnection
只能包装一个没有任何类型泛型的 AsyncHttp
客户端,因此目前还没有非阻塞 WebSocket 的实现。
连接
一切从连接开始。
use ethane::{Connection, Http, WebSocket};
fn main() {
let conn = Connection::new(Http::new("http://localhost:8545", None));
// or
let conn = Connection::new(WebSocket::new("ws://localhost:8546", None));
}
方法
连接到以太坊网络后,我们可以调用几个方法。稍后会有更多关于支持的方法的详细信息。
use ethane::{Connection, Http};
use ethane::types::Address;
fn main() {
let conn = Connection::new(Http::new("http://localhost: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("http://localhost: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://localhost: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();
}
贡献
欢迎提交问题和 PR。开发遵循 OSS 标准。
依赖项
~0.4–1MB
~24K SLoC