19个稳定版本
1.12.3 | 2024年6月3日 |
---|---|
1.12.1 | 2024年3月12日 |
1.12.0 | 2024年2月27日 |
1.11.1 | 2023年11月20日 |
0.3.0 | 2022年5月23日 |
在 数学 类别中排名 10
每月下载量 276,781
在 272 个Crate中使用 (22 个直接使用)
450KB
10K SLoC
Rust uint
crate使用const-generics
实现了 [Uint<BITS, LIMBS>
],模 $2^{\mathsf{BITS}}$ 的数环。它需要两个泛型参数:位数和存储这些位所需的64位'肢体'数量。
# use ruint::Uint;
let answer: Uint<256, 4> = Uint::from(42);
您可以使用 $\mathsf{LIMBS} = \left\lceil{\mathsf{BITS} / 64}\right\rceil$ 计算出 LIMBS
,即 LIMBS
等于 BITS
除以 $64$ 向上取整。如果尝试使用错误的参数构造 Uint
,Uint
将会 panic!
。理想情况下这应该是一个编译时错误,但受Rust问题 #60551 的限制。
在稳定版本中,可以使用更方便的方法,即使用 uint!
宏,该宏将为您构造正确的 Uint
。
# use ruint::{Uint, uint};
let answer = uint!(42_U256);
您还可以使用预计算的类型之一 aliases
# use ruint::Uint;
use ruint::aliases::*;
let answer: U256 = Uint::from(42);
当然,如果您需要有趣的尺寸,也可以创建自己的类型别名
# use ruint::Uint;
type U1337 = Uint<1337, 21>;
let answer: U1337 = Uint::from(42);
Rust nightly
如果您正在使用nightly,可以使用 Uint<BITS>
,它会为您计算肢体数量。遗憾的是,没有 generic_const_exprs
支持无法将其稳定化(Rust问题 #76560)。
# #[cfg(feature = "generic_const_exprs")] {
use ruint::nightly::Uint;
let answer: Uint<256> = Uint::<256>::from(42);
# }
即使在夜间版本中,Rust 的 ergonomics 也有限。在上面的示例中,Rust 要求对 Uint::from
进行显式类型标注,而在稳定版本中则不需要。还有一些更微妙的问题使得这看起来并不像表面上那么理想。这些夜间功能可能需要一段时间才能稳定下来。
示例
use ruint::Uint;
let a: Uint<256, 4> = Uint::from(0xf00f_u64);
let b: Uint<256, 4> = Uint::from(42_u64);
let c = a + b;
assert_eq!(c, Uint::from(0xf039_u64));
有一个方便的宏 uint!
可以为您创建常量。它允许使用标准的 Rust 整数语法创建任意长度的常量。使用 U
或 B
后缀后跟位数来指定 Uint
或 Bits
的大小。支持使用它们的修饰符 0x
、0b
和 0o
来使用十进制、十六进制,甚至二进制和八进制。可以在字面量中添加下划线 _
以提高可读性。
# use ruint::uint;
let cow = uint!(0xc85ef7d79691fe79573b1a7064c19c1a9819ebdbd1faaab1a8ec92344438aaf4_U256);
实际上,这个宏会递归地遍历解析树,因此您可以将其应用于整个源文件。
# use ruint::uint;
uint!{
let a = 42_U256;
let b = 0xf00f_1337_c0d3_U256;
let c = a + b;
assert_eq!(c, 263947537596669_U256);
}
请注意,由于 B
是一个有效的十六进制数字,因此可能会产生歧义。在这种情况下,需要使用下划线分隔符 _B
来减轻影响。
支持的 Rust 版本
Uint 将保持至少 6 个月的滚动 MSRV(最低支持 Rust 版本)政策。当提高 MSRV 时,新 Rust 版本必须至少发布 6 个月。当前的 MSRV 是 1.65.0。
请注意,MSRV 不会自动提高,并且只有在小版本更新时才会提高。
功能标志
支持多个 crate。这些可以通过设置同名功能标志来启用。
unstable
启用 sem-ver 不稳定功能。rand
:实现了从Standard
分布式进行采样的功能,即rng.gen()
。arbitrary
:实现了Arbitrary
特性,允许为模糊测试生成Uint
。quickcheck
:实现了Arbitrary
特性,允许为属性测试生成Uint
。proptest
:实现了Arbitrary
特性,允许为属性测试生成Uint
。Proptest 用于uint
自身的测试套件。serde
:为Serialize
和Deserialize
特质实现Uint
和Bits
。序列化使用大端十六进制格式的人类可读格式和机器可读格式的大端字节字符串。在人类可读格式中序列化时,Uint
使用以太坊Quantity
格式(以0x开头的最小字符串)。rlp
:为Uint
实现Encodable
和Decodable
特质,允许从/到RLP的序列化。fastrlp
:为Uint
实现Encodable
和Decodable
特质,允许从/到RLP的序列化。primitive-types
:实现相应类型之间的From<_>
转换。postgres
:实现支持多种列类型的ToSql
特质。num-bigint
:实现到/fromBigUint
和BigInt
的转换。ark-ff
:实现到/fromBigInteger*
类型和来自ark-ff@0.3
的Fp*
类型的转换。ark-ff-04
:实现到/fromBigInt
和Fp
类型的转换,来自ark-ff@0.4
。sqlx
:实现数据库无关的字节数组存储。由于问题sqlx#1627,需要使用sqlx
与tokio-native-tls
运行时一起使用。zeroize
:实现了Zeroize
特性。这使得Uint
和Bits
与secrecy
库兼容。valuable
:实现了Valuable
特性。pyo3
:实现了ToPyObject
、IntoPy
和FromPyObject
特性。parity-scale-codec
:实现了Encode
、Decode
、MaxEncodedLen
和HasCompact
特性。bn-rs
:实现了从/toBN
和BigNumber
的转换。bytemuck
:为Uint
实现了Pod
和Zeroable
特性,其中大小为 64 的倍数,最多到 1024。这允许在存在Pod
特性约束的地方使用Uint
。num-traits
:实现了大约四十个适用的特性。
构建和测试
格式化、检查、构建和测试所有内容(我建议为这个操作创建一个shell别名)
cargo fmt &&\
cargo clippy --all-features --all-targets &&\
cargo test --workspace --all-features --doc -- --nocapture &&\
cargo test --workspace --all-features --all-targets -- --nocapture &&\
cargo doc --workspace --all-features --no-deps
使用提供的 .cargo/config.toml
别名运行基准测试
cargo criterion
检查文档覆盖率
RUSTDOCFLAGS="-Z unstable-options --show-coverage" cargo doc --workspace --all-features --no-deps
特性
- 所有您可能想要的提升生活质量的特性。
- 与 std
u64
等类型兼容。请参阅 Rust 的 整数方法。 - 遵循 Rust API 指南
- Montgomery REDC 和其他用于实现素数域的算法。
待办事项
- 构建
no-std
和wasm
。 - 快速的平台无关的泛型算法。
- 在可用的情况下针对特定目标进行汇编优化。
- 可选的 num-traits 等,支持。
- 具有兼容接口的运行时大小类型。
依赖项
~0–8.5MB
~78K SLoC