26个版本 (6个重大更新)

0.8.0 2024年8月21日
0.7.7 2024年7月8日
0.7.6 2024年6月10日
0.7.0 2024年3月30日
0.3.1 2023年7月30日

#262 in 神奇豆子

Download history 39425/week @ 2024-05-02 38046/week @ 2024-05-09 38612/week @ 2024-05-16 48048/week @ 2024-05-23 42614/week @ 2024-05-30 38825/week @ 2024-06-06 45926/week @ 2024-06-13 51346/week @ 2024-06-20 44605/week @ 2024-06-27 44510/week @ 2024-07-04 52080/week @ 2024-07-11 58773/week @ 2024-07-18 55530/week @ 2024-07-25 56799/week @ 2024-08-01 74176/week @ 2024-08-08 52291/week @ 2024-08-15

每月249,986次下载
110 个crate中使用(50个直接使用)

MIT/Apache

680KB
14K SLoC

alloy-sol-types

Solidity类型建模和ABI以及EIP-712编解码器实现。

此crate提供用于在Rust中表达Solidity类型的工具,以及将这些表示编码为适合智能合约处理的ABI blob的工具。换句话说,您可以在原生Rust中表示您的智能合约参数,轻松地将它们编码以传递给智能合约,并轻松地将智能合约返回值解码。

我们通过通过SolType trait在rust中表示Solidity类型。这个特性通过关联的SolType::RustType将Solidity类型映射到Rust类型。

ABI编解码器在[abi]模块中实现,请参阅其文档了解其工作原理。

use alloy_sol_types::{sol_data::*, SolType, SolValue};

// Represent a Solidity type in rust
type MySolType = FixedArray<Bool, 2>;

let data = [true, false];
let validate = true;

// SolTypes expose their Solidity name :)
assert_eq!(&MySolType::sol_type_name(), "bool[2]");

// SolTypes are used to transform Rust into ABI blobs, and back.
let encoded: Vec<u8> = MySolType::abi_encode(&data);
let decoded: [bool; 2] = MySolType::abi_decode(&encoded, validate)?;
assert_eq!(data, decoded);

// This is more easily done with the `SolValue` trait:
let encoded: Vec<u8> = data.abi_encode();
let decoded: [bool; 2] = <[bool; 2]>::abi_decode(&encoded, validate)?;
assert_eq!(data, decoded);
# Ok::<_, alloy_sol_types::Error>(())

sol!

sol!过程宏提供了一种方便的方式来定义自定义的SolType并引用原始类型。请参阅[sol!的文档][sol!]了解如何使用它。

SolStruct

`SolStruct` 特性主要提供 EIP-712 签名支持。

# use alloy_sol_types::{sol, SolStruct};
# use alloy_primitives::U256;
// `sol!` allows you to define struct types!
// You can just paste Solidity into the macro and it should work :)
sol! {
    struct MyStruct {
        uint256 a;
        bytes32 b;
        address[] c;
    }
}

sol! {
    struct MyStruct2 {
        MyStruct a;
        bytes32 b;
        address[] c;
    }
}

// All structs generated with `sol!` implement `crate::SolType` &
// `crate::SolStruct`. This means you get eip-712 signing for freeeeee
let my_struct = MyStruct {
    a: U256::from(1),
    b: [0; 32].into(),
    c: vec![Default::default()],
};

// The `eip712_domain` macro lets you easily define an EIP-712 domain
// object :)
let my_domain = alloy_sol_types::eip712_domain!(
   name: "MyDomain",
   version: "1",
);

// Because all the hard work is done by the `sol!` macro, EIP-712 is as easy
// as calling `eip712_signing_hash` with your domain
let signing_hash = my_struct.eip712_signing_hash(&my_domain);

sol! 用户定义值类型

对用户定义值类型的支持是新的!这些目前实现为包装类型。请关注此处以获取更多功能!

# use alloy_sol_types::{sol, sol_data, SolType};
# use alloy_primitives::U256;
// We also also support Solidity value types
sol! {
    type MyValueType is uint256;
}

// UDTs are encoded as their underlying type
let mvt = MyValueType::from(U256::from(1));
assert_eq!(mvt.abi_encode(), sol_data::Uint::<256>::abi_encode(&U256::from(1)));

令牌化/反令牌化

将 Rust 类型转换为 abi 令牌的过程称为“令牌化”。典型用户不会直接访问令牌化。高级用户应使用 [SolType::tokenize()] 和 [SolType::detokenize()] 方法。

在实现自己的 SolType 时,已在令牌结构体上提供了一系列 From 实现来帮助将 Rust 数据转换为令牌。

编码/解码

Token 转换为序列化 ABI 块的过程称为“编码”。它是解码的反操作。

ABI 编码和解码在令牌序列上操作。

SolType 编码和解码方法在 Rust 类型上操作。我们建议用户尽可能使用它们。我们不建议用户与 Tokens 交互,除非实现自己的 SolType

许可

此包是 parity 团队对 ethabi 包的全面重写。该代码库根据 MIT 许可证使用。我们在包含 ethabi 代码的文件中保留了原始许可通知。

依赖

~5–8MB
~156K SLoC