链下操作

虽然 Walrus 操作发生在 Sui 之外,但它们可能会与定义资源生命周期的区块链流程交互。

写入路径

Walrus 的写入路径

写入的系统概述,如上图所示:

  • 用户在链上获取适当大小和持续时间的存储资源,可以通过直接在 Walrus 系统对象上购买或在二级市场购买。用户可以拆分、合并和转移拥有的存储资源。

  • 当用户想要存储一个 blob 时,他们首先对其进行纠删编码并计算 blob ID。然后他们可以自己执行以下步骤,或者使用发布者代为执行这些步骤。

  • 用户在链上(Sui)更新存储资源以注册具有所需大小和生命周期的 blob ID。这会发出一个事件,由存储节点接收。用户接收后继续上传。

  • 用户将 blob 元数据发送到所有存储节点,并将每个 blob 切片发送到当前管理相应分片的存储节点。

  • 管理分片的存储节点接收一个切片并根据 blob ID 进行检查。它还检查是否存在具有 blob ID 的 blob 资源,该资源被授权存储 blob。如果正确,存储节点会签署一份声明,表明它持有 blob ID(和元数据)的切片,并将其返回给用户。

  • 用户将存储节点返回的签名汇总成一个可用性证书并提交到链上。当证书在链上验证后,会发出一个 blob ID 的可用性事件,所有其他存储节点会尝试下载 blob ID 的任何缺失分片。由 Sui 发出的此事件是 blob ID 的 可用性点 (PoA)

  • 在 PoA 之后,无需用户参与,存储节点会同步并恢复任何缺失的元数据和切片。

用户等待 2/3 的分片签名返回以创建可用性证书。代码的速率低于 1/3,即使只有 1/3 的分片返回切片进行读取,也允许重建。因为最多 1/3 的存储节点可能会失败,这确保了如果读取者从所有存储节点请求切片时的重建。整个过程可以由接收 blob 并推动过程完成的发布者进行调解。

刷新可用性

因为刷新存储持续时间不需要内容数据,刷新完全在协议内的链上进行。要请求延长 blob 的可用性,用户提供适当的存储资源。成功后,这会发出一个事件,存储节点接收该事件以延长每个切片的存储时间。

不一致的资源流

当一个正确的存储节点尝试重建一个超过 PoA 的 blob 的切片时,如果 blob 的编码不正确,这可能会失败。在这种情况下,存储节点可以提取 blob ID 的不一致证明。然后它使用该证明创建一个不一致证书并将其上传到链上。

流程如下:

  • 存储节点未能重建切片,而是计算出不一致证明。

  • 存储节点将 blob ID 和不一致证明发送给 Walrus 纪元的所有存储节点。存储节点验证证明并签署。

  • 发现不一致的存储节点将签名汇总成一个不一致证书并将其发送到 Walrus 智能合约,智能合约验证并发出不一致资源事件。

  • 在收到不一致资源事件后,正确的存储节点删除 blob ID 的切片数据,并在元数据中记录在 可用性期间 返回 None。不会为此 blob ID 发出存储认证挑战。

Reading inconsistent blobs

A blob ID that is inconsistent always resolves to None upon reading because the read process re-encodes the received blob to check that the blob ID is correctly derived from a consistent encoding. This means that an inconsistency proof reveals only a true fact to storage nodes (that do not otherwise run decoding), and does not change the output of read in any case.

However, partial reads leveraging the systematic nature of the encoding might successfully return partial reads for inconsistently encoded files. Thus, if consistency and availability of reads is important, dApps should do full reads rather than partial reads.

读取路径

用户可以直接或通过聚合器/缓存读取存储的 blobs。对于直接用户访问、聚合器和缓存(在缓存未命中的情况下),操作是相同的。实际上,大多数读取通过缓存发生在热门 blobs 上,并且不会导致对存储节点的请求。

  • 读取者从任何存储节点获取 blob ID 的元数据,并使用 blob ID 进行身份验证。

  • 然后,读取者向存储节点发送请求以获取与 blob ID 对应的分片,并等待 的响应。并行发送足够的请求以确保读取的低延迟。

  • 读取者使用 blob ID 验证返回的切片,重建 blob,并决定内容是有效的 blob 还是不一致的。

  • 可选地,对于缓存,结果被缓存并且可以在不重建的情况下提供,直到它被从缓存中驱逐。对缓存的 blob 请求返回 blob 内容,或证明 blob 是不一致编码的。

存储认证的挑战机制

在一个纪元期间,正确的存储节点挑战所有分片以提供超过 PoA 的 blob 切片的符号:

  • 该纪元的可用 blobs 列表由直到上一个纪元的 Sui 事件序列确定。不一致的 blobs 不会被挑战,并且可以返回证明此状态的记录。

  • 挑战序列是通过向被挑战的分片提供种子来确定的。然后基于种子 每个被挑战的 blob ID 的内容计算序列。这创建了一个顺序读取依赖关系。

  • 对挑战的响应及时提供 blob ID 的分片内容序列。

  • 挑战者节点使用阈值来确定挑战是否通过,并在链上报告结果。

  • 挑战/响应通信是经过身份验证的。

挑战提供了一些保证,即存储节点可以以概率方式实际恢复分片数据,避免存储节点在没有任何证据表明它们可能检索分片数据的情况下获得支付。挑战的顺序性质和一些合理的超时也确保了过程的及时性。