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 日

7#evm

Download history 11004/week @ 2024-05-01 10270/week @ 2024-05-08 10869/week @ 2024-05-15 10232/week @ 2024-05-22 9294/week @ 2024-05-29 11841/week @ 2024-06-05 12649/week @ 2024-06-12 14463/week @ 2024-06-19 12805/week @ 2024-06-26 14254/week @ 2024-07-03 16033/week @ 2024-07-10 17073/week @ 2024-07-17 18091/week @ 2024-07-24 20116/week @ 2024-07-31 23011/week @ 2024-08-07 18570/week @ 2024-08-14

82,780 每月下载量
用于 39 包(12 个直接使用)

MIT/Apache

1MB
23K SLoC

alloy-dyn-abi

动态 Solidity 类型编码器。

使用 ABI 编码和解码的运行时 Ethereum 类型系统表示。

此库为 Solidity 类型提供运行时编码器/解码器。当在编译时不知道 Solidity 类型时,可以使用它。这对于 EIP-712 签名接口特别有用。

我们 强烈 推荐在有选择的情况下使用 静态编码器/解码器。动态编码器/解码器成本更高,尤其是对于复杂类型。它也更容易出错,因为 Solidity 类型与 Rust 类型之间的映射不受编译器强制执行。

示例

基本用法

use alloy_dyn_abi::{DynSolType, DynSolValue};
use alloy_primitives::hex;

// parse a type from a string
// note: eip712 `CustomStruct`s cannot be parsed this way.
let my_type: DynSolType = "uint16[2][]".parse().unwrap();

// decode
let my_data = hex!(
    "0000000000000000000000000000000000000000000000000000000000000020" // offset
    "0000000000000000000000000000000000000000000000000000000000000001" // length
    "0000000000000000000000000000000000000000000000000000000000000002" // .[0][0]
    "0000000000000000000000000000000000000000000000000000000000000003" // .[0][1]
);
let decoded = my_type.abi_decode(&my_data)?;

let expected = DynSolValue::Array(vec![DynSolValue::FixedArray(vec![2u16.into(), 3u16.into()])]);
assert_eq!(decoded, expected);

// roundtrip
let encoded = decoded.abi_encode();
assert_eq!(encoded, my_data);
# Ok::<(), alloy_dyn_abi::Error>(())

EIP-712

todo!()

它是如何工作的

动态编码器/解码器通过一组枚举实现,这些枚举表示Solidity类型、Solidity值(以Rust表示形式)以及ABI令牌。与静态编码器不同,这些枚举必须在运行时实例化。枚举DynSolType表示Solidity类型,相当于实现crate::SolType特质的枚举。枚举DynSolValue表示Solidity值,描述了可能的Solidity值的Rust形状。它与crate::SolType::RustType类似,但不相同。枚举DynToken表示ABI令牌,相当于实现alloy_sol_types::abi::Token特质的枚举。

静态编码系统将期望的类型信息编码到Rust类型系统中,而动态编码器/解码器将其编码为DynSolType的具体实例。

  • 去令牌化:`DynSolType` + `DynToken` = `DynSolValue`

用户必须手动处理`DynSolValue`与其自己的Rust类型之间的转换。我们提供了一些`From`实现,但它们在处理数组、元组和结构体时不足。我们还提供了将内容转换为每个变体的错误处理。

DynToken::decode_populate

因为数据的形状仅在运行时才知道,所以我们不能在编译时分配用于存储解码数据的内存。相反,我们预先分配了一个与期望类型形状相同的DynToken,并填充空值。然后我们用解码的数据填充这些空值。

这与静态解码器的行为有显著不同。我们不推荐直接使用DynToken类型。相反,我们建议使用DynSolType的编码和解码方法。

许可

这个crate是对parity团队ethabi crate的全面重写。该代码库是在MIT许可下使用的。我们在包含ethabi代码的文件中保留了原始许可声明。

依赖项

~6–8.5MB
~169K SLoC