第 6 章 管理 Blob 生命周期
学习目标
- 用
extend延长 Blob 存储时间。 - 用
delete删除 deletable Blob。 - 理解
burn-blobs、share、共享 Blob 资助和属性命令。
前置条件
- 已有一个普通 Blob 的
BLOB_ID和BLOB_OBJECT_ID。 - 当前钱包拥有该 Blob 对象。
- 本章命令默认 Testnet,但仍可能改变链上对象状态,先读完再执行。
延长 Blob
extend 使用 Sui object ID,不使用 Blob ID:
walrus extend \
--blob-obj-id "$BLOB_OBJECT_ID" \
--epochs-extended 3 \
--context testnet
延长后检查:
walrus blob-status --blob-id "$BLOB_ID" --context testnet
共享 Blob 延长时加 --shared:
walrus extend \
--blob-obj-id <SHARED_BLOB_OBJECT_ID> \
--epochs-extended 3 \
--shared \
--context testnet
删除 Blob
只有 deletable Blob 才能提前删除。命令会询问确认:
walrus delete --blob-id "$BLOB_ID" --context testnet
脚本化时显式确认:
walrus delete --blob-id "$BLOB_ID" --yes --context testnet
也可以按文件或对象删除:
walrus delete --file files/hello.txt --context testnet
walrus delete --object-id "$BLOB_OBJECT_ID" --context testnet
删除后再次查询:
walrus blob-status --blob-id "$BLOB_ID" --context testnet
注意:删除不会清除缓存、历史节点、别人已经下载的副本,也不会删除别人上传的同内容 Blob。
Burn Blob 对象
burn-blobs 会销毁当前钱包拥有的 Blob 对应 Sui 对象,不删除 Walrus 数据,也不退还存储。Burn 后你会失去对该对象的控制。
walrus burn-blobs --object-ids "$BLOB_OBJECT_ID" --context testnet
批量 burn 前先谨慎列对象,不要对生产钱包运行不理解的批处理。官方还支持按条件 burn:
walrus burn-blobs --all-expired --context testnet
--all 会 burn 当前钱包拥有的所有 Blob 对象,除非你正在清理专用测试钱包,否则不要使用。
Share Blob
共享 Blob 是包装普通 Blob 的共享 Sui 对象,任何人都可以为它继续付费延长。共享 Blob 只能包含 permanent Blob,不能提前删除。
从已有 permanent Blob 创建共享对象:
walrus share --blob-obj-id "$BLOB_OBJECT_ID" --context testnet
上传时直接共享:
walrus store files/hello.txt \
--epochs 2 \
--permanent \
--share \
--context testnet
创建时资助共享 Blob:
walrus share \
--blob-obj-id "$BLOB_OBJECT_ID" \
--amount <AMOUNT_IN_WAL_OR_FROST_AS_CLI_EXPECTS> \
--context testnet
资助已有共享 Blob:
walrus fund-shared-blob \
--blob-obj-id <SHARED_BLOB_OBJECT_ID> \
--amount <AMOUNT_IN_WAL_OR_FROST_AS_CLI_EXPECTS> \
--context testnet
不同版本对金额单位和格式的帮助文本可能更细,执行前用:
walrus share --help
walrus fund-shared-blob --help
设置和读取属性
属性是挂在 Blob Sui 对象上的 key-value 元数据。设置:
walrus set-blob-attribute "$BLOB_OBJECT_ID" \
--attr "content-type" "text/plain" \
--attr "cache-control" "public, max-age=31536000" \
--context testnet
读取:
walrus get-blob-attribute "$BLOB_OBJECT_ID" --context testnet
删除指定 key:
walrus remove-blob-attribute-fields "$BLOB_OBJECT_ID" \
--keys "cache-control" \
--context testnet
删除全部属性:
walrus remove-blob-attribute "$BLOB_OBJECT_ID" --context testnet
输出解读
extend成功后,blob-status的 end epoch 应增加。delete成功后,该对象对应的 deletable 存储资源会回收给钱包复用。burn-blobs成功后,sui client object <BLOB_OBJECT_ID>不应再显示可用对象。get-blob-attribute应显示刚设置的 key-value。
常见坑
- 用 Blob ID 执行
extend、share、属性命令:这些命令要 Sui object ID。 - 对 permanent Blob 执行
delete:permanent 到期前不可提前删除。 - Burn 当成 Delete:Burn 只销毁链上对象,不删除 Walrus 数据。
- Share 普通 deletable Blob:共享 Blob 要求 permanent。
- 属性不是访问控制;不要把 secret 写进属性。
下一步
下一章学习 Quilt,把大量小文件打包成一个 Walrus 存储单元,并按 identifier 或 tag 读取其中部分文件。