#solidity #parser #abi #ethereum #evm

无 std linera-alloy-sol-type-parser

简单轻量级的Solidity类型字符串解析器

1 个不稳定版本

0.7.4 2024年5月30日

#1698 in 魔法豆

Download history 153/week @ 2024-05-27 103/week @ 2024-06-03 78/week @ 2024-06-10 90/week @ 2024-06-17 17/week @ 2024-06-24 75/week @ 2024-07-01 26/week @ 2024-07-08 95/week @ 2024-07-15 85/week @ 2024-07-22 103/week @ 2024-07-29

310 每月下载量
14 个crate(2个直接) 中使用

MIT/Apache

47KB
1K SLoC

linera-alloy-sol-type-parser

简单轻量级的Solidity类型字符串解析器。

此库主要是linera-alloy-json-abilinera-alloy-dyn-abi的用户界面API的依赖。有关更多信息,请参阅这些crate的文档。

此解析器通常遵循Solidity规范,但它仅支持可能的类型子集,以支持ABI编码。

用法

TypeSpecifier 是此crate中的顶级类型。它是一个字符串部分(称为span)的包装器。它逐步将字符串分解为子span,并添加有关类型的元数据。例如,它跟踪主类型以及数组维度的尺寸。期望TypeSpecifier处理任何有效的Solidity类型字符串。

use linera_alloy_sol_type_parser::TypeSpecifier;
use core::num::NonZeroUsize;

// Parse a type specifier from a string
let my_type = TypeSpecifier::parse("uint8[2][]").unwrap();

// Read the total span
assert_eq!(
    my_type.span(),
    "uint8[2][]"
);

// A type specifier has a stem type. This is the type string, stripped of its
// array dimensions.
assert_eq!(my_type.stem.span(), "uint8");

// Arrays are represented as a vector of sizes. This allows for deep nesting.
assert_eq!(
    my_type.sizes,
    // `None` is used for dynamic sizes. This is equivalent to `[2][]`
    vec![NonZeroUsize::new(2), None]
);

// Type specifiers also work for complex tuples!
let my_tuple = TypeSpecifier::parse("(uint8,(uint8[],bool))[39]").unwrap();
assert_eq!(
    my_tuple.stem.span(),
    "(uint8,(uint8[],bool))"
);

// Types are NOT resolved, so you can parse custom structs just by name.
let my_struct = TypeSpecifier::parse("MyStruct").unwrap();

为什么不支持parse()

由于生命周期限制,core::str::FromStr trait 没有为 TypeSpecifier 实现。不幸的是,对于依赖于输入字符串生命周期的类型,无法实现此功能。相反,我们建议使用相关的 parse 函数,或者在需要特质的情况下使用 TryFrom::<&str>::try_from

为什么不使用 syn

这不是一个完整的语法库,也不打算作为 linera-alloy-syn-solidity 的替代品。这个crate旨在用于解析现有生态系统工具中存在的类型字符串,仅此而已。它不打算用于解析Solidity源代码。

此crate对以下方面有用:

  • 检查JSON ABI文件语法
  • linera-alloy-dyn-abi 提供已知良好的输入
  • 将 ethers.js 代码移植到 rust

它对以下方面没有用:

  • 解析Solidity源代码
  • 从Solidity源代码生成Rust代码
  • 从Rust代码生成Solidity源代码

依赖关系

~1MB
~16K SLoC