操作

Blob 编码和 blob ID

Walrus 以 编码形式 在存储节点之间存储 blob,并通过其 blob ID 引用 blob。blob ID 是从 blob 的内容和 Walrus 配置中确定性派生的。具有相同内容的两个文件的 blob ID 将是相同的。

您可以使用命令在本地派生文件的 blob ID:walrus blob-id <file path>

存储

Walrus 可以通过本机客户端 API 或发布者 存储 blob

Public access

All blobs stored in Walrus are public and discoverable by all. Therefore you must not use Walrus to store anything that contains secrets or private data without additional measures to protect confidentiality.

在底层,一些操作同时发生在 Sui 和存储节点上:

  • 客户端或发布者对 blob 进行编码并派生一个标识 blob 的 blob ID。这是一个 u256,通常编码为 URL 安全的 base64 字符串。
  • 在 Sui 上执行交易以从系统对象购买一些存储,然后 注册占用此存储的 blob ID。客户端 API 返回 Sui blob 对象 ID。交易使用 SUI 购买存储并支付 gas。
  • blob 的编码片段分发到所有存储节点。它们每个都签署一份收据。
  • 签署的收据被汇总并提交给 Sui blob 对象以 认证 blob。认证 blob 会发出一个包含 blob ID 和可用期的 Sui 事件。

一旦在最后一步中认证了相应的 Sui blob 对象,blob 就被认为在 Walrus 上可用。存储操作中涉及的步骤可以由二进制客户端执行,或者由通过 HTTP 接受和发布 blob 的发布者执行。

Walrus 目前允许存储的 blob 最大大小可以通过 walrus info CLI 命令确定。当前最大 blob 大小为 13.3 GiB。您可以通过将它们拆分为更小的块来存储更大的 blob。

blob 存储了指定数量的 epochs,在存储时指定。Walrus 存储节点确保在这些 epochs 内读取成功。当前的测试网使用一天的短 epoch 持续时间进行测试,但主网 epochs 可能会更长,例如每个 epoch 持续数周。

读取

Walrus 还可以在存储后通过提供其 blob ID 来 读取 blob。读取通过执行以下步骤来执行:

  • 读取 Sui 上的系统对象以确定 Walrus 存储节点委员会。
  • 查询多个存储节点以获取 blob 元数据和它们存储的片段。
  • 从恢复的片段中重建 blob,并根据 blob ID 进行检查。

读取操作中涉及的步骤由二进制客户端执行,或由公开 HTTP 接口读取 blob 的聚合器服务执行。读取具有极高的弹性,即使多达三分之一的存储节点不可用,也能成功恢复 blob。在大多数情况下,同步完成后,即使三分之二的存储节点宕机,也可以读取 blob。

认证可用性

Walrus 可以使用 Sui 认证 blob 的可用性。目前可以通过 3 种不同的方式检查是否发生了这种情况:

  • Sui SDK 读取可用于验证在 Sui 上认证 blob ID 时发出的认证 blob 事件。客户端 walrus blob-status 命令可用于识别需要检查的事件 ID。
  • Sui SDK 读取可用于验证与 blob ID 对应的 Sui blob 对象,并检查其是否在到期 epoch 之前认证且不可删除。
  • Sui 智能合约可以读取 Sui 上的 blob 对象(或其引用),以检查其是否在到期 epoch 之前认证且不可删除。

Sui 轻客户端 的底层协议返回发出事件或对象的数字签名证据,可由离线或非交互式应用程序用作 blob ID 在一定数量的 epochs 内的可用性证明。

一旦 blob 被认证,Walrus 将确保在指定的 epochs 内,存储节点上始终有足够的片段可用于恢复它。

删除

存储的 blob 可以由创建它们的用户选择设置为可删除。此元数据存储在 Sui blob 对象中,blob 是否可删除包含在认证 blob 事件中。可删除的 blob 可以由 blob 对象的所有者删除,以回收和重新使用与其关联的存储资源。

如果 Walrus 中不存在 blob 的其他副本,删除 blob 最终将使其无法通过读取命令恢复。然而,如果 Walrus 中存在 blob 的其他副本,删除命令将为调用它的用户回收存储空间,但在所有其他副本被删除或过期之前,不会使 blob 不可用。