#ethereum #json-rpc #web3 #wasm #rpc

ethane-wasm

一个旨在简洁简单的 Web3 实现,编译为 WebAssembly

1 个稳定版本

1.0.2 2021 年 5 月 27 日

#170 in #web3

MIT 许可证

65KB
1.5K SLoC

Ethane Logo

Stake to support us Latest Version Minimum rustc version

故事

该软件包最初由 thojest 创建,后来由 ZGEN DAO 维护。创建目的是提供一个简单的替代方案,用于在 Rust 中编写的 Web3 软件包。

描述

Ethane 是一个旨在简洁简单的 Web3 实现。它具有两个功能 blockingnon-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