跳转至主要内容
Change page

区块链数据存储策略

上次修改时间: @Joe-Chen(opens in a new tab), 2024年6月18日

有多种通过区块链储存信息的方式,不论是直接在区块链上储存,或是用区块链保护信息安全:

  • EIP-4844 二进制大对象
  • 调用数据
  • 具有一层网络机制的链下
  • 合约“代码”
  • 事件
  • 以太坊虚拟机存储

使用方法的选择基于几个标准:

  • 信息来源。 调用数据中的信息不能直接来自区块链本身。
  • 信息目的地。 Calldata 仅在其发起的交易中可用。 链上完全无法访问事件。
  • 能够接受多少麻烦? 相比在浏览器内运行的应用程序中的轻客户端,运行全节点的计算机能够执行更多处理。
  • 是否有必要使来自每个节点的信息易于访问?
  • 安全要求。

安全要求

一般情况下,信息安全由三个属性组成:

这里的不同解决方案全都具有出色的完整性,因为哈希被发布在一层网络上。 但是,它们的可用性保证确实有所不同。

前提条件

你应该充分理解区块链基础知识。 本页面还假设读者熟悉区块交易和其他相关主题。

EIP-4844 二进制大对象

Dencun 硬分叉(opens in a new tab)开始,以太坊区块链包含了 EIP-4844(opens in a new tab),这为以太坊数据二进制大对象增加了有限的生命期(最初约为 18 天(opens in a new tab))。 这些二进制大对象与执行燃料分开定价,尽管它们使用类似的机制。 它们是一种发布临时数据的低成本方式。

EIP-4844 二进制大对象的主要使用案例是供卷叠发布其交易。 乐观卷叠需要在其区块链上发布交易。 那些交易必须在质询期(opens in a new tab)内对所有人可用,以便在卷叠排序者(opens in a new tab)发布错误的状态根时,验证者(opens in a new tab)能够修复错误。

然而,一旦质询期结束并且状态根被最终确定,了解这些交易的目的就只剩下复制链的当前状态。 该状态也能从链节点获得,并且需要的处理要少得多。 因此,交易信息仍应保留在一些地方,比如区块浏览器,但无需偿付以太坊提供的抗审查水平。

零知识卷叠也会发布其交易数据,以便其他节点能够复制现有状态并验证有效性证明,但这同样也是一个短期要求。

撰写本文时,在 EIP-4844 上发布的每个字节需要花费 1 wei(10-18 个以太币),相较于任何交易(包括发布二进制大对象的交易在内)都会花费的 21,000 执行燃料(opens in a new tab),该费用微不足道。 你可以在 blobscan.com(opens in a new tab) 上查看当前 EIP-4844 价格。

在以下地址可以查看一些知名卷叠发布的二进制大对象。

卷叠邮箱地址
Optimism(opens in a new tab)0xFF00000000000000000000000000000000000010(opens in a new tab)
Arbitrum(opens in a new tab)0x1c479675ad559DC151F6Ec7ed3FbF8ceE79582B6(opens in a new tab)
Base(opens in a new tab)0xFF00000000000000000000000000000000008453(opens in a new tab)

调用数据

调用数据是指作为交易一部分发送的字节。 它作为区块链永久记录的一部分,被储存在包含该交易的区块中。

这是将数据永久放在区块链上最便宜的方法。 每个字节的费用为 4 执行燃料(如果字节为 0) 或 16 执行燃料(如果字节为任意其他值)。 如果数据经过压缩(这是标准做法),则每个字节的值几乎相等,所以每个字节的平均费用约为 15.95 燃料。

撰写本文时的价格为 12 Gwei/燃料(2300 美元/以太币),这意味着每个字节的费用约为 45 美分。 由于这是 EIP-4844 之前最便宜的方法,卷叠使用此方法来储存交易信息,这些交易信息必须在缺陷质询期(opens in a new tab)内可用,但无需直接在链上访问。

在以下地址可以查看一些知名卷叠发布的交易。

卷叠邮箱地址
Optimism(opens in a new tab)0xFF00000000000000000000000000000000000010(opens in a new tab)
Arbitrum(opens in a new tab)0x1c479675ad559DC151F6Ec7ed3FbF8ceE79582B6(opens in a new tab)
Base(opens in a new tab)0xFF00000000000000000000000000000000008453(opens in a new tab)

具有一层网络机制的链下

根据你的安全权衡,将信息放在其他位置并使用一种可确保数据在需要时可用的机制,或许是可以接受的做法。 要实现这一点,有两个要求:

  1. 将一个数据的哈希(opens in a new tab)发布在区块链上,这被称为“输入承诺”。 这可以是单个 32 字节的单词,因此并不昂贵。 只要输入承诺可用,完整性就能得到保证,因为不可能找到任何其他数据具有相同的哈希值。 因此,提供错误的数据会被检测出来。

  2. 拥有一种确保可用性的机制。 例如,在 Redstone(opens in a new tab) 中,任何节点都能提交可用性质询。 如果排序者未能在截止时间前在链上回应,输入承诺就会被丢弃,因此信息会被视为从未被发布过

这对于乐观卷叠来说是可接受的,因为我们已经依赖于拥有至少一名诚实的验证者来验证状态根。 这样的诚实验证者还将确保拥有处理区块所需的数据,并在链下信息不可用时提出可用性质询。 这种乐观卷叠被称为 plasma

合约代码

那些只需写入一次便永远不会被覆盖,并且需要在链上可用的信息可作为合约代码储存。 这意味着我们会创建一个带有数据的“智能合约”,然后使用 EXTCODECOPY(opens in a new tab) 来读取信息。 这样做的优势是复制代码相对便宜。

除了内存扩展的费用之外,EXTCODECOPY 在首次访问合约时(当它处于“冷”状态时)还需要花费 2600 燃料,后续从相同合约进行复制需要 100 燃料 + 3 燃料/32 字节单词。 与调用数据的花费(15.95 燃料每字节)相比,200 字节以上的数据使用合约代码会更便宜。 基于内存扩展成本公式(opens in a new tab),只要你需要的内存不大于 4MB,内存扩展的花费就会低于添加调用数据。

当然,这只是“读取”数据的花费。 创建合约的花费约为 32,000 燃料 + 200 燃料/字节。 这个方法只有在相同信息需要被不同交易多次读取时才是经济的。

合约代码可以是无意义的,只要不以 0xEF 开头。 以 0xEF 开头的合约会被解释为以太坊对象格式(opens in a new tab),该格式有更加严格的要求。

事件

事件(opens in a new tab)由智能合约触发,并由链下软件读取。 它们的优势是链下代码可以侦听事件。 成本为燃料(opens in a new tab),375 燃料 + 8 燃料/数据字节。 在 12 Gwei/燃料和 2300 美元/以太币的情况下,该费用相当于 1 美分 + 22 美分/千字节。

存储

智能合约能够访问永久存储(opens in a new tab)。 但这非常昂贵。 将一个 32 字节的单词写入一个先前为空的储存时隙会花费 22,100 燃料(opens in a new tab)。 在 12 Gwei/燃料和 2300 美元/以太币的情况下,该费用相当于 61 美分/写入操作,即 19.5 美元/千字节。

这是以太坊上最昂贵的存储方式。

总结

下表总结了各种选项、它们的优势与劣势。

存储类型数据来源可用性保证链上可用性其他限制
EIP-4844 二进制大对象链下由以太坊保证 18 天(opens in a new tab)仅哈希可用
调用数据链下由以太坊永久保证(区块链的一部分)只有被写入合约时于该交易可用
具有一层网络机制的链下链下在质询期内由“一名诚实的验证者”保证仅哈希可用仅在质询期内由质询机制提供保证
合约代码链上或链下由以太坊永久保证(区块链的一部分)写入到一个不以 0xEF 开头的“随机”地址
事件链上由以太坊永久保证(区块链的一部分)
存储链上由以太坊永久保证(区块链的一部分,并保持当前状态直至被覆盖)

本文对你有帮助吗?