ERC-6372: 合约时钟
用于公开合约时钟值和详细信息的接口
Authors | Hadrien Croubois (@Amxx), Francisco Giordano (@frangio) |
---|---|
Created | 2023-01-25 |
摘要
许多合约依赖于某种时钟来强制执行延迟和存储历史数据。虽然有些合约依赖于区块号,但其他的合约使用时间戳。目前没有简单的方法来发现合约内部使用哪种时间跟踪函数。此 EIP 建议标准化一个接口,以便合约可以公开其内部时钟,从而提高可组合性和互操作性。
动机
许多合约检查或存储与时间相关的信息。例如,时间锁合约强制执行延迟,然后才能执行操作。类似地,DAO 强制执行一个投票期,在此期间,利益相关者可以批准或拒绝提案。最后但并非最不重要的一点是,投票代币通常使用定时快照存储投票权的历史记录。
有些合约使用时间戳进行时间跟踪,而另一些合约使用区块号。在某些情况下,可能会使用更奇特的函数来跟踪时间。
目前没有接口供外部观察者检测合约使用哪个时钟。这严重限制了互操作性,并迫使开发人员做出有风险的假设。
规范
本文档中的关键词“MUST”、“MUST NOT”、“REQUIRED”、“SHALL”、“SHALL NOT”、“SHOULD”、“SHOULD NOT”、“RECOMMENDED”、“MAY”和“OPTIONAL”应按照 RFC 2119 中的描述进行解释。
符合规范的合约必须实现如下指定的 clock
和 CLOCK_MODE
函数。
interface IERC6372 {
function clock() external view returns (uint48);
function CLOCK_MODE() external view returns (string);
}
方法
clock
此函数根据合约运行的模式返回当前时间点。它必须是链的非递减函数,例如 block.timestamp
或 block.number
。
- name: clock
type: function
stateMutability: view
inputs: []
outputs:
- name: timepoint
type: uint48
CLOCK_MODE
此函数返回对合约运行的时钟的可机读字符串描述。
此字符串的格式必须类似于 URL 查询字符串(又名 application/x-www-form-urlencoded
),可以在标准 JavaScript 中使用 new URLSearchParams(CLOCK_MODE)
解码。
- 如果使用区块号运行:
- 如果区块号是
NUMBER
操作码 (0x43
) 的区块号,则此函数必须返回mode=blocknumber&from=default
。 - 如果是任何其他区块号,则此函数必须返回
mode=blocknumber&from=<CAIP-2-ID>
,其中<CAIP-2-ID>
是 CAIP-2 区块链 ID,例如eip155:1
。
- 如果区块号是
- 如果使用时间戳运行,则此函数必须返回
mode=timestamp
。 - 如果使用任何其他模式运行,则此函数应返回编码后的
mode
字段的唯一标识符。
- name: CLOCK_MODE
type: function
stateMutability: view
inputs: []
outputs:
- name: descriptor
type: string
预期属性
clock()
函数必须是非递减的。
理由
clock
返回 uint48
,因为它足以存储实际值。在时间戳模式下,uint48
足以用到 8921556 年。即使在区块号模式下,每秒 10,000 个区块,也足以用到 2861 年。使用小于 uint256
的类型允许将时间点与其他关联值进行存储压缩,从而大大降低了从存储中写入和读取的成本。
根据区块链的演变(尤其是 Layer 2),使用较小的类型(例如 uint32
)可能会很快导致问题。另一方面,任何大于 uint48
的类型都显得浪费。
除了时间戳之外,有时还需要定义持续时间或延迟,这是时间戳之间的差异。在一般情况下,我们希望这些值使用与时间点相同的类型 (uint48
) 表示。但是,我们认为在大多数情况下 uint32
是一个不错的选择,如果时钟以秒为单位运行,它可以表示超过 136 年。在大多数情况下,我们建议使用 uint48
存储时间点,使用 uint32
存储持续时间。该建议适用于使用时间戳或间隔超过 1 秒的区块号运行时的“合理”持续时间(时间锁的延迟、投票或归属持续时间…)。
安全注意事项
没有已知的安全问题。
版权
在 CC0 下放弃版权及相关权利。
Citation
Please cite this document as:
Hadrien Croubois (@Amxx), Francisco Giordano (@frangio), "ERC-6372: 合约时钟 [DRAFT]," Ethereum Improvement Proposals, no. 6372, January 2023. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-6372.