CIP编号:133
标题:增强区块哈希查询能力
作者:Chenxing Li(@ChenxingLi)
状态:最终版
类型:规范改变
创建日期:2024-01-11
本文是整理好的CIP-133中文介绍,供大家交流讨论。
CIP-133详情链接:https://github.com/Conflux-Chain/CIPs/blob/master/CIPs/cip-133.md
内容
此 CIP 旨在改进以太坊虚拟机(EVM)中的区块哈希查询。在以太坊中,BLOCKHASH(0x40)
操作码允许查询前 255 个区块的哈希,但由于 Conflux 的共识复杂性,目前仅支持查询直接前一个区块的哈希。
此 CIP 提出了一种新方法,通过在状态中存储区块哈希来检索区块哈希,从而访问更广泛的区块哈希范围,并将查询范围从 256 个区块增加到 65,536 个区块。
摘要
EVM 中的 BLOCKHASH(0x40)
操作码能够检索区块哈希。然而,Conflux 独特的区块结构限制了其高效获取一系列区块哈希的能力。虽然对于生成随机种子等应用来说这一限制是微不足道的,但随着生态系统需求的发展,如 Layer 2 解决方案和无信任跨链功能,可靠的区块头信息对于验证越来越重要。
此 CIP 提出了一种新颖的方法,通过将相关区块哈希写入状态中,以便于按需访问这些哈希。在 Core Space 中,这种变化支持基于纪元号的查询(通过内部合约)和基于区块号的查询(通过 BLOCKHASH 操作码)。在 espace 中,BLOCKHASH 将基于纪元号检索哈希,因为 espace 中的“区块”本质上是纪元。
这些查询的成本将从 20 增加到单个 SLOAD(0x54)
操作(200)。考虑到 Conflux 更快的区块生成率,查询范围扩展到了 65,536 个区块,从而允许更长时间地访问相关区块哈希数据。
动机
现有的 Conflux 协议未能充分满足其区块链生态系统内对可靠且广泛对区块哈希访问的日益增长的需求。随着区块链领域的发展,对 Layer 2 解决方案和无信任跨链操作的强调不断增加,对更强大和多功能的区块哈希检索方法的需求变得越来越重要。目前仅能访问前一个区块哈希的限制,以及返回的哈希值的不准确性,阻碍了更先进和安全的区块链功能的发展和实现。
规格说明
约定
在本文档中,“存储键”被定义为一种特殊类型,既可被视为 32 字节数组,也可被视为大端存储的 256 位整数。当表示为 0x12345...
时,左侧表示较低的地址,与 EVM 的标准和实践一致。
keccak
指的是 Keccak-256 哈希函数,这是 EVM 中最常用的函数。
定义
-
B
:整数类型,CIP-133 激活时的区块号。 -
E
:整数类型,CIP-133 激活时的纪元号。 -
BLOCK_HASHES_START_SLOT
:存储键类型,值为keccak("CIP_133_BLOCK_HASHES_START_SLOT") & (~0xffff)
,CIP_133_BLOCK_HASHES_START_SLOT
的哈希值,最低有效 16 位设置为 0。实际值为0xc7662a0b77939cdc926212423640a0ef86fc7aed29480a86e82c099374090000
。 -
EPOCH_HASHES_START_SLOT
:存储键类型,值为keccak("CIP_133_EPOCH_HASHES_START_SLOT") & (~0xffff)
,CIP_133_EPOCH_HASHES_START_SLOT
的哈希值,最低有效 16 位设置为 0。实际值为0x79eb05c8bfb57e3a0da7c978fead9ee853a5b47d4b2ccb56d6d9e770549d0000
。 -
CONTEXT_CONTRACT_ADDRESS
:内置合约地址,0x0888000000000000000000000000000000000004
。 -
SYSTEM_STORAGE_ADDRESS
:内置合约地址,0x088800000000000000000000000000000000000a
。
记录区块哈希和时代哈希
当一个区块满足 block number >= B
时,在区块内所有交易执行结束后,执行以下操作:在 SYSTEM_STORAGE_ADDRESS 的 BLOCK_HASHES_START_SLOT + b % 65536
存储槽设置区块哈希,其中 b
是当前区块号,存储所有者为 null。
对于满足 epoch number >= E
的枢轴区块,在区块内所有交易执行后,执行:在 SYSTEM_STORAGE_ADDRESS 的 EPOCH_HASHES_START_SLOT + e % 65536
存储槽设置区块哈希,其中 e
是当前纪元号,存储所有者为 null。
查询
Core Space 区块号查询 如果当前区块号 >= B
,操作码 BLOCKHASH
,在接收到输入 x
时,检查 x <= current block number && x >= B && x > current block numbe - 65536
。如果为真,它返回 SYSTEM_STORAGE_ADDRESS 的 BLOCK_HASHES_START_SLOT + x % 65536
的哈希;否则,返回 0。
eSpace 纪元号查询 如果当前 eSpace 区块号 >= E
,操作码 BLOCKHASH
,在接收到输入 x
时,检查 x <= current espace block number && x >= E && x > current espace block number - 65536
。如果为真,它返回 SYSTEM_STORAGE_ADDRESS 的 EPOCH_HASHES_START_SLOT + x % 65536
的哈希;否则,返回 0。
Core Space 纪元号查询 如果当前区块号 >= B
,在 CONTEXT_CONTRACT_ADDRESS
的内部合约中引入以下函数:
function getEpochHash(uint256 epochNumber) public view returns (bytes32);
这与 eSpace 的 BLOCKHASH
表现类似。
成本
在区块号 >= B
之后,Core Space 的 BLOCKHASH
的燃气费用调整为 SLOAD_GAS(200)
。在纪元号 >= E
之后,eSpace 的 BLOCKHASH
和内置合约函数 getEpochHash
的燃气费用设置为 SLOAD_GAS(200)
。
后向兼容性
此改动将改变原有系统规范。
版权
此提案遵守 CC0 协议,所有版权及相关权利不设限。