#ethereum #simple #type-system #web3

ethane-types

ethane 的最小依赖类型系统

1 个稳定版本

1.0.2 2021 年 5 月 27 日

#6#type-system


用于 3 个 crate(2 个直接使用)

MIT 许可证

24KB
582

Ethane Logo

Stake to support us Latest Version Minimum rustc version

简介

此软件包最初由 thojest 创建,并由 ZGEN DAO 维护。其目的是为了提供一个简单替代 Rust 编写的 Web3 软件包。

描述

Ethane 是一个旨在精简和简单的 Web3 实现。它有两个特性 blockingnon-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