实用工具

这个 crate 提供了各种组件和库,其中包含用于处理常见任务的实用工具函数。

核心

utils

use openzeppelin_utils;

包含库的核心实用程序模块。

内部模块

cryptography module

deployments module

math module

contract_clock module

serde module

cryptography

use openzeppelin_utils::cryptography;

包含与密码学相关的实用程序的模块。

成员
内部模块

内部模块

deployments

use openzeppelin_utils::deployments;

包含用于通过 deploy_syscall通用部署合约 (UDC)计算合约地址的实用程序函数模块。

结构体

DeployerInfo(caller_address: ContractAddress, udc_address: ContractAddress) struct

包含在 utils::calculate_contract_address_from_udc 中进行依赖来源的部署计算所需的参数的结构体。

函数

calculate_contract_address_from_deploy_syscall(salt: felt252, class_hash: ClassHash, constructor_calldata: Span<felt252>, deployer_address: ContractAddress) → ContractAddress function

当将给定参数传递给 deploy_syscall 时,返回合约地址。

compute_hash_on_elements(data: Span<felt252>) → felt252 function

使用`data`的元素创建 Pedersen 哈希链,并返回最终哈希。

calculate_contract_address_from_udc(salt: felt252, class_hash: ClassHash, constructor_calldata: Span<felt252>, deployer_info: Option<DeployerInfo>) → ContractAddress function

返回 UDC 部署计算的合约地址。

独立来源的部署(从零部署)应将 Option::None 作为 deployer_info 传递。

依赖来源的部署使用 caller_addressDeployerInfo 的成员)对 salt 进行哈希处理,并将哈希后的 salt 作为 contract_address_salt 参数传递给内部的 deploy_syscall

math

use openzeppelin_utils::math;

包含数学实用程序的模块。

成员
函数

函数

average(a: T, b: T) → T function

返回两个无符号整数的平均值。结果向下舍入。

T 是一个泛型值,匹配不同的数字实现。

contract_clock

use openzeppelin_utils::contract_clock;

提供 EIP-6372 标准的 trait,以及基于区块号或区块时间戳的默认时钟实现。

特性

ERC6372Clock {github-icon}

use openzeppelin_utils::contract_clock::ERC6372Clock;

EIP-6372 标准的 trait,它允许灵活的内部时钟实现——基于区块时间戳、区块号或自定义逻辑。

函数

clock() → u64 external

返回由合约的操作模式确定的当前时间点,旨在用于对时间敏感的逻辑。

要求:

  • 这个函数必须始终是非递减的。

CLOCK_MODE() → ByteArray external

返回对合约运行的时钟的描述。

要求:

  • 输出必须格式化为 URL 查询字符串,可以在标准 JavaScript 中解码。

实现

ERC6372BlockNumberClock impl

使用区块号作为其时钟参考的 ERC6372Clock 特性的实现。

ERC6372TimestampClock impl

使用区块时间戳作为其时钟参考的 ERC6372Clock 特性的实现。

serde

use openzeppelin_utils::serde;

包含与 Cairo 数据结构的序列化和反序列化相关的实用程序的模块。

成员

特性

SerializedAppend trait

导入此 trait 允许将 Cairo 数据结构的序列化表示形式附加到已实现 Serde trait 的 felt252 缓冲区。

使用示例:

use openzeppelin_utils::serde::SerializedAppend;
use starknet::ContractAddress;

fn to_calldata(recipient: ContractAddress, amount: u256) -> Array<felt252> {
    let mut calldata = array![];
    calldata.append_serde(recipient);
    calldata.append_serde(amount);
    calldata
}

请注意,append_serde 方法自动用于 felts 数组,并且它接受任何实现 Serde trait 的数据结构。

密码学

NoncesComponent

use openzeppelin_utils::cryptography::nonces::NoncesComponent;

此组件提供了一种简单的机制来处理一组地址的增量 nonce。它通常用于防止合约接受签名作为输入时的重放攻击。

可嵌入的实现
NoncesImpl

可嵌入的函数

nonces(self: @ContractState, owner: ContractAddress) → felt252 external

返回 owner 的下一个未使用的 nonce。

内部函数

use_nonce(ref self: ComponentState, owner: ContractAddress) → felt252 internal

消耗一个 nonce,返回当前值,并递增 nonce。

对于每个帐户,nonce 的初始值为 0,只能递增 1,不能递减或重置。这保证了 nonce 永远不会溢出。

use_checked_nonce(ref self: ComponentState, owner: ContractAddress, nonce: felt252) → felt252 internal

use_nonce 相同,但检查 nonce 是否为 owner 的下一个有效 nonce。

snip12

use openzeppelin_utils::snip12;

支持链上生成符合 SNIP12 的消息哈希。

有关如何使用此模块的完整演练,请参阅 SNIP12 和类型化消息 指南。