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
82,780 每月下载量
用于 39 个 包(12 个直接使用)
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