8个版本

0.2.0 2023年10月29日
0.1.2 2023年6月23日
0.0.4 2023年6月19日
0.0.3 2022年11月20日
0.0.1 2022年3月26日

#2109 in 魔法豆

MIT/Apache

240KB
6K SLoC

solabi

crates.io docs.rs

Solidity ABI实现(在Rust中)。

简介

这个crate旨在提供一个用于处理Solidity ABI的全面工具包,包括编码、解码值以及解析由Solidity编译器生成的JSON ABI。

用法

只需将solabi作为依赖项添加!

solabi = "*"

solabi依赖于ethprim crate,该crate被重新导出以方便使用。这个crate特别包括用于编译时计算字面量的宏(例如256位整数和校验和地址)以及编译时计算Keccak-256摘要

use solabi::*;

const DIGEST: Digest = keccak!("hello world!");
const PRIME: I256 = int!("57896044618658097711785492504343953926634992332820282019728792003956564819949");
const ADDRESS: Address = address!("0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045");

未来工作

尽管Solidity ABI实现的核心组件基本完成,但在本crate的v1版本之前,还有一些功能预计将实现,具体如下

  • Solidity ABI项生成的过程宏。这包括生成用于编码和解码Solidity合同项的类型。虽然确切的API尚未确定,但预计将类似于以下
    #[derive(solabi::Function)]
    #[solabi(signature = "function transferFrom(address, address, uint256) returns (bool)")]
    struct TransferFrom;
    
    #[derive(solabi::Event)]
    struct Transfer {
        #[solabi(indexed)]
        pub from: Address,
        #[solabi(indexed)]
        pub to: Address,
        pub value: U256,
    }
    
    fn main() {
        TransferFrom.encode_params(...);
        TransferFrom.decode_result(...);
    
        Transfer { ... }.encode();
        Transfer::decode(Log {
            topics: ...,
            data: ...,
        })
    }
    
  • EncodeDecode提供派生宏。
    #[derive(solabi::Decode, solabi::Encode)]
    struct MyStruct {
        name: String,
        age: uint256,
        occupation: Occupation,
    }
    
    #[derive(solabi::Decode, solabi::Encode)]
    enum Occupation {
        Crypto,
        Other,
    }
    
  • Solidity打包编码。

依赖关系

~0.8–1.6MB
~33K SLoC