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 神奇豆子
每月249,986次下载
在 110 个crate中使用(50个直接使用)
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