EIP-2027: State Rent C - 网络合约大小统计
Authors | Alexey Akhunov (@AlexeyAkhunov) |
---|---|
Created | 2019-05-14 |
Discussion Link | https://ethereum-magicians.org/t/eip-2027-net-contract-size-accounting-change-c-from-state-rent-v3-proposal/3275 |
Table of Contents
简单概要
以太坊开始统计合约中已填充和已清空的存储槽的数量。由于预先存在的槽的数量目前未在状态中进行统计,实际上,仅跟踪槽数量的净变化。在后续更改中,称为Gross contract size accounting,将开始跟踪存储槽的总数。
摘要
这是状态租金路线图的一部分。这个特定的更改引入了合约存储槽数量的初始净统计。虽然它本身不是很有用,但它可以引入存储槽数量的毛额统计,这对于许多事情很有用:
- 像
SLOAD
和SSTORE
这样的操作的 Gas 成本需要增加,以补偿块证明消耗的额外带宽。虽然一开始成本是固定的,但之后会根据合约SLOAD
和SSTORE
操作的大小自动校准。 - 快照同步协议,如 fast sync、warp sync、firehose、red queen,以及可能其他的,将受益于状态中存在的正确大小的合约存储(因此可以通过 Merkle 证明来证明)。
动机
以太坊目前根本不跟踪合约存储槽的数量,并且在给定下载的状态下生成这样的数字无法在恒定的 O(1) 时间内完成。
规范
每个合约(codeHash
字段不等于 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 的帐户,这是空代码的哈希值)获得一个新的 uint64 字段,称为 storagesize
。在区块 C
及其之后,操作 SSTORE
(location
,value
)的语义更改如下:
- 如果 [
location
] 的先前值为 0,且值为非 0,则增加storagesize
(增加的语义如下所述) - 如果 [
location
] 的先前值不为 0,且值为 0,则减少storagesize
(减少的语义如下所述) - 与其他状态更改一样,
storagesize
的更改会在执行帧回滚时恢复,即,它需要使用与存储值相同的技术,例如日志记录(在 Geth 中)和子状态(在 Parity 中)。storagesize
的值此时无法从合约中观察到。
增加 storagesize
的语义
如果 storagesize
不存在,storagesize
= HUGE_NUMBER
+ 1。
如果 storagesize
存在,storagesize
= storagesize
+ 1。
减少 storagesize
的语义
如果 storagesize
不存在,storagesize
= HUGE_NUMBER
- 1。
如果 storagesize
存在,storagesize
= storagesize
- 1。
关于 HUGE_NUMBER
的说明
存在一个常量 HUGE_NUMBER
。它需要足够大,以便任何实际指标(合约存储大小、帐户数量、合约数量、代码总大小、存储总大小)永远不会达到该数字,并且足够小,可以容纳在无符号 64 位整数中。
目前的建议是将 HUGE_NUMBER
= 2^63,其二进制表示形式是 64 位数字中的单个位。
这个想法是为了以后可以确定 storagesize 是否曾经增加/减少(字段的存在),以及它是否已从净值转换为总值(通过值小于 HUGE_NUMBER/2
- 因为在区块 C
时,任何合约都不可能大于 2^62)。
理由
此处 提出了评估合约存储大小的机制。但它确实存在一个很大的缺点,即在共识中引入了大量的复杂性 (以估计算法的形式,该算法需要处理相当多的边缘情况以适应不同大小的存储)。
向后兼容性
此更改不向后兼容,需要硬分叉才能激活。由于新引入的字段是无法观察到的,因此此更改不会影响任何现有智能合约的操作。
测试用例
测试用例将从参考实现中生成。
实现
将有一个概念验证实现来完善和阐明规范。
版权
通过 CC0 放弃版权和相关权利。
Citation
Please cite this document as:
Alexey Akhunov (@AlexeyAkhunov), "EIP-2027: State Rent C - 网络合约大小统计 [DRAFT]," Ethereum Improvement Proposals, no. 2027, May 2019. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-2027.