#contract #ethereum #async #bindings-generator #smart-contracts #web3 #proc-macro

ethcontract

用于与Ethereum智能合约交互和生成类型安全的绑定的运行时库和proc宏

50个版本

0.25.7 2024年5月15日
0.25.5 2024年2月22日
0.25.4 2023年11月24日
0.25.0 2023年7月13日
0.1.0 2019年11月7日

#25 in #web3

Download history 354/week @ 2024-04-27 128/week @ 2024-05-04 578/week @ 2024-05-11 240/week @ 2024-05-18 162/week @ 2024-05-25 275/week @ 2024-06-01 383/week @ 2024-06-08 281/week @ 2024-06-15 379/week @ 2024-06-22 355/week @ 2024-06-29 548/week @ 2024-07-06 287/week @ 2024-07-13 87/week @ 2024-07-20 686/week @ 2024-07-27 196/week @ 2024-08-03 173/week @ 2024-08-10

1,161 每月下载量
7 crates 中使用

MIT/Apache

365KB
8K SLoC

生成Ethereum智能合约的绑定。内部,生成的类型使用 web3 crate 与Ethereum网络交互,并使用自定义的 Instance 运行时,可以直接使用而无需代码生成。

该crate使用 std::future::Future 通过将 web3 futures 0.1 与 futures 0.3 兼容层包装来处理未来。这意味着这个crate已经准备好支持 async/await

以下是一个与智能合约 MyContract 交互的示例。使用构建器模式来配置事务。

pragma solidity ^0.6.0;

contract MyContract {
  function my_view_function(uint64 some_val) public view returns (string) {
    // ...
  }

  function my_function(bool some_bool, string some_str) public returns (uint256) {
    // ...
  }

  function my_other_function() public {
    // ...
  }
}

一旦使用truffle构建并部署了这个合约,以下示例展示了如何从Rust中与其交互。

use ethcontract::transaction::Account;
use std::time::Duration;
use web3::api::Web3;
use web3::types::*;

// this proc macro generates a `MyContract` type with type-safe bindings to
// contract functions
ethcontract::contract!("path/to/MyContract.json");

// create a web3 instance as usual
let transport = ...;
let web3 = Web3::new(transport);

// now create an instance of an interface to the contract
let instance = MyContract::deployed(web3).await?;

let addr: Address = "0x000102030405060708090a0b0c0d0e0f10111213".parse()?;
let some_uint: U256 = U256::from_dec_str("1000000000000000000")?;
let some_bool = true;
let some_val = u64;

// call instance view functions with type-safe bindings! will only compile
// if contract function accepts a single `u64` value parameter and returns
// a concrete type based on the contract function's return type
let value = instance
    .my_view_function(some_val)
    .from(addr)
    .execute()
    .await?;

// contract functions also have type-safe bindings and return the tx hash
// of the submitted transaction; allows for multiple ways of signing txs
let tx = instance
    .my_function(some_bool, value)
    .from(Account::Locked(addr, "password".into(), None))
    .value(some_uint)
    .gas_price(1_000_000.into())
    .execute()
    .await?;

// wait for confirmations when needed
let receipt = instance
    .my_important_function()
    .poll_interval(Duration::from_secs(5))
    .confirmations(2)
    .execute_confirm()
    .await?;

有关使用方法和参数的更多信息,以及如何直接从Etherscan使用合约ABI的说明,请参阅 contract! proc宏文档。一个用于在交互生成的合约时导入常用类型的预览模块。到使用底层 DynTransport 的各种运行时类型的类型别名。这些类型在生成的代码中被广泛使用。

依赖项

~10–29MB
~432K SLoC