Alert Source Discuss
🚧 Stagnant Standards Track: Core

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

简单概要

以太坊开始统计合约中已填充和已清空的存储槽的数量。由于预先存在的槽的数量目前未在状态中进行统计,实际上,仅跟踪槽数量的净变化。在后续更改中,称为Gross contract size accounting,将开始跟踪存储槽的总数。

摘要

这是状态租金路线图的一部分。这个特定的更改引入了合约存储槽数量的初始净统计。虽然它本身不是很有用,但它可以引入存储槽数量的毛额统计,这对于许多事情很有用:

  1. SLOADSSTORE 这样的操作的 Gas 成本需要增加,以补偿块证明消耗的额外带宽。虽然一开始成本是固定的,但之后会根据合约 SLOADSSTORE 操作的大小自动校准。
  2. 快照同步协议,如 fast syncwarp syncfirehosered queen,以及可能其他的,将受益于状态中存在的正确大小的合约存储(因此可以通过 Merkle 证明来证明)。

动机

以太坊目前根本不跟踪合约存储槽的数量,并且在给定下载的状态下生成这样的数字无法在恒定的 O(1) 时间内完成。

规范

每个合约(codeHash 字段不等于 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 的帐户,这是空代码的哈希值)获得一个新的 uint64 字段,称为 storagesize。在区块 C 及其之后,操作 SSTORElocationvalue)的语义更改如下:

  • 如果 [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.