walrus-blob-lifecycle について
WalrusのBlobを管理するユーザー向けのライフサイクル解説スキルです。期限確認、保存期間の延長、削除、共有、属性管理、大容量アップロードの計画を扱い、Blob IDとSuiオブジェクトIDの違いや不可逆操作の注意点も示します。
主な機能
- 01Blobの状態と期限の確認
- 02Blobの保存期間の延長
- 03Blobの削除やオブジェクトの焼却
- 04Blobの共有と資金管理
- 05Blob属性の設定と取得
- 06大容量アップロードの計画
活用シーン
- 01Blobの期限前に保存期間を延長する
- 02削除可能なBlobを取り除く
- 03共有利用するBlobに資金を追加する
- 041 GiBを超えるアップロードを計画する
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ mystenlabs/ walrus-skills --skill walrus-blob-lifecycleインストール後、Claude Code で/walrus-blob-lifecycleを入力して読み込まれたか確認します。
同梱ファイルevals/evals.jsonlarge-uploads.md
詳細
Walrus Blob のライフサイクル
情報源の制約: このスキルのすべての情報は、 Walrus の Blob 管理に関するドキュメント と大容量アップロードガイドから取得しています。 このスキルを拡張する場合は、これらの情報源のみを使用してください。
Walrus の Blob の有効期間は有限で、エポック単位で計測されます。このスキルでは、保存後のすべての操作(有効期間の延長、削除、バーン、共有、属性の設定、大容量データのアップロード計画)を扱います。
このスキルのすべてのパターンは、以下の情報源に基づいています。
- https://docs.wal.app/docs/walrus-client/managing-blobs
- https://docs.wal.app/docs/walrus-client/storing-blobs(有効期間のオプション)
- https://docs.wal.app/docs/large-uploads
ライフサイクル操作について不明な点がある場合は、回答する前に該当するページを取得してください。
参照ファイル
large-uploads — 大容量データのアップロードパターン
パス: large-uploads.md
読み込むタイミング: 1 GiB を超えるアップロードの計画、大規模データセットのストレージコストの見積もり、同時アップロード時のメモリ管理、またはデータ取り込みパイプラインの構築時。
内容: コストの見積もり、1 GiB を超えるアップロードの調整、アップロードの可観測性、パイプライン状態の永続化、スループット管理、メモリオーバーヘッド(Blob サイズの 4.5 倍)。
関連スキル
| トピック | スキル | 読み込むタイミング |
|---|---|---|
| 基本的な保存/読み取り | walrus-cli | Blob の保存と読み取り |
| HTTP API | walrus-http-api | REST 経由での保存/読み取り |
| TypeScript SDK | walrus-ts-sdk | プログラムによる Blob 管理 |
| Quilts | walrus-quilts | Quilt のライフサイクル操作(Quilt 全体に適用) |
| 暗号化 | walrus-data-security | 保存前の暗号化 |
| Move との統合 | walrus-move-integration | オンチェーンの Blob 参照 |
振り分けガイド
| タスク | 読み込むもの |
|---|---|
| Blob の有効期間を延長する | スキルの内容 |
| 削除可能な Blob を削除する | スキルの内容 |
| Blob の Sui オブジェクトをバーンする | スキルの内容 |
| 共有 Blob を作成または資金提供する | スキルの内容 |
| Blob の属性を設定/取得/削除する | スキルの内容 |
| 大容量データのアップロード(1 GiB 超)を計画する | large-uploads.md |
| ストレージコストを見積もる | large-uploads.md |
| データ取り込みパイプラインを構築する | large-uploads.md |
| 同時アップロード時のメモリを管理する | large-uploads.md |
スキルの内容
主な概念
-
エポックと有効期間。 Blob のストレージ期間はエポック単位で測定されます。Mainnet の1エポックは14日です。ストレージ期間は最大53エポック(約2年)です。Blob は終了エポックの開始時に期限切れになります。現在のエポックと期間を確認するには、アグリゲーターで
walrus infoまたはGET /v1/infoを使用します。 -
Blob ID と Sui オブジェクト ID。 Blob ID は、Blob のコンテンツから生成される URL セーフな base64 文字列です(コンテンツアドレス方式)。同じコンテンツからは常に同じ Blob ID が生成されます。Sui オブジェクト ID は、オンチェーンの
Blobオブジェクトを識別する0x...形式の16進文字列です。アップロードのたびに、コンテンツが同一でも新しいオブジェクト ID が作成されます。コンテンツの読み取りには Blob ID を、有効期間の操作(延長、削除、共有)にはオブジェクト ID を使用します。 -
削除可能と永久保存。 新しく保存された Blob は、デフォルトで削除可能です。削除可能な Blob は、期限切れになる前であれば Sui オブジェクトの所有者が削除できます。永久保存の Blob は、アップロードしたユーザーであっても期限切れになる前に削除できません。
-
Blob が期限切れになるとどうなるか。 Blob の終了エポックに達すると、データは利用できなくなります。猶予期間はありません。ストレージノードはスライバーを破棄します。再び利用できるようにするには、データを再アップロードする必要があります。期限切れの Blob は延長できません。
-
Blob を共有オブジェクトにラップする。
Blobオブジェクトは任意の Sui 共有オブジェクトにラップできるため、複数の当事者が費用を負担し、有効期間を延長できます。Walrus コントラクトでは、このパターンの参照実装としてshared_blob::SharedBlobを提供していますが、開発者は独自のロジック(アクセス制御、メタデータなど)を備えた共有ラッパーを自由に作成できます。 -
ストレージプール。 プレビュー機能です。1つのストレージ予約を複数の Blob で共有します。プール内の Blob はプールの前払い済み容量を使用するため、各保存で必要なのは書き込み料金のみとなり、プール内のすべての Blob は同時に期限切れになります。Rust SDK(
walrus-sdk、walrus-sui)と Move コントラクトから利用できます。walrusCLI、HTTP パブリッシャーおよびアグリゲーター API、TypeScript SDK では、まだプールを利用できません。 -
Blob 属性。 Blob の Sui オブジェクトに保存されるキーと値のメタデータペアです。特定のキー(
content-type、content-dispositionなど)はアグリゲーターによって認識され、オブジェクト ID で読み取る際に HTTP ヘッダーとして返されます。 -
Blob ごとのストレージオーバーヘッド。 サイズに関係なく、各 Blob には約64 MBのメタデータオーバーヘッドが発生します。約10 MB未満の Blob では、このメタデータコストが大部分を占めます。多数の小さな Blob をまとめてこのオーバーヘッドを分散するには、キルトを使用してください。
操作の前にステータスを確認し、利用可能であることを検証する
Blob を延長したり、Blob に依存したりする前に、まだ保存されていることと、期限切れになる時期を確認してください。
walrus blob-status --blob-id <BLOB_ID> # stored? availability period; event ID for certified permanent blobs
walrus info # current epoch, to compare against the end epoch
期限切れは通知されません。終了エポックになると、ストレージノードは Blob の提供を停止し、イベントも発行されません。読み取りに失敗するのを待たず、定期的に確認し、終了エポックより十分前に延長してください。
書き込み後にプログラムで確認するには、書き込み結果のオブジェクト ID を使って、Sui から Blob オブジェクトを再読み込みしてください。認証済みで、現在のエポックが終了エポックより前であり、削除可能でない場合、その Blob は耐久性があります。
const blob = await walrusClient.getBlobObject(blobObjectId);
const durable = blob.certified_epoch != null && currentEpoch < blob.storage.end_epoch && !blob.deletable;
整合性を確保するには、strict_consistency_check=true を指定したアグリゲーターを通じてオブジェクト ID でバイト列を読み取り、データが認証を検証したオブジェクトに紐付いていることを確認してください。Sui オブジェクトの blob_id フィールドは u256 であり、URL で使用される base64 ID ではありません。
Blob の有効期間を延長する
# Extend by blob Sui object ID
walrus extend --blob-obj-id <BLOB_OBJECT_ID>
# Extend with a specific new end epoch
walrus extend --blob-obj-id <BLOB_OBJECT_ID> --end-epoch <EPOCH>
# Extend a shared blob (requires --shared flag)
walrus extend --blob-obj-id <BLOB_OBJECT_ID> --shared
- Blob は期限切れになっていてはなりません。
- 所有 Blob と共有 Blob のどちらも延長できます。
- 所有 Blob を延長できるのは所有者のみです。共有 Blob は誰でも延長できます。
- Blob の Sui オブジェクト ID(Blob ID ではありません)が必要です。
Blob の削除
# Delete by blob ID
walrus delete --blob-id <BLOB_ID>
# Delete by file (derives blob ID)
walrus delete --file <PATH>
# Delete by Sui object ID
walrus delete --object-id <SUI_ID>
# Skip confirmation prompt
walrus delete --blob-id <BLOB_ID> --yes
# Skip post-delete status check
walrus delete --blob-id <BLOB_ID> --yes --no-status-check
重要な注意事項:
- 削除可能な Blob を削除できるのは、Sui
Blobオブジェクトの所有者だけです。 - 削除するとストレージリソースが回収され、自動的に再利用されます。
- 削除によって、現在および今後のストレージノードからスリバーのみが削除されます。同じ Blob のコピーが別に存在する場合(他の人がアップロードしたものなど)、データには引き続きアクセスできます。
- 削除によるプライバシー保護には限界があります。すべての Blob は公開されています。キャッシュされたコピーや、以前にダウンロードされたコピーには影響しません。
Blob のバーン
バーンすると、Walrus 上のデータを削除したりストレージ料金を返金したりせずに、Blob の Sui オブジェクトを削除します。
# Burn a specific blob by object ID
walrus burn-blobs --object-ids <BLOB_OBJECT_ID>
# Burn all blob objects owned by the current wallet
walrus burn-blobs --all
# Burn all expired blob objects
walrus burn-blobs --all-expired
バーンした後は、永続 Blob の保存期間を延長したり、削除可能な Blob の保存期間を延長または削除したりできません。Blob に対するすべての制御を失います。
共有 Blob
Blob を Sui の共有オブジェクトにラップすると、誰でも資金を追加して保存期間を延長できるようになります。Walrus コントラクトはリファレンス実装として shared_blob::SharedBlob を提供していますが、必要なロジックを組み込んで、Blob を独自のカスタム共有オブジェクトにラップすることもできます。
CLI で組み込みの SharedBlob を使用する方法:
# Share an existing blob using the built-in SharedBlob
walrus share --blob-obj-id <SUI_OBJ_ID>
# Fund an existing shared blob
walrus fund-shared-blob --blob-obj-id <SHARED_OBJ_ID> --amount <WAL_AMOUNT>
# Store and share in one step
walrus store myfile.png --epochs 10 --share
組み込みの共有 Blob:
- 永続 Blob のみを格納できます
- 期限前に削除できません
- 誰でも資金を追加して保存期間を延長できます
さらに細かく制御するには、Blob を独自の共有オブジェクトにラップすることを検討してください(walrus-move-integration を参照)。
ストレージプール(プレビュー)
ストレージプールとは、多数の Blob が共有する単一のストレージ予約です。標準的なフローでは、各 Blob がサイズと保存期間に応じたストレージリソースを個別に購入します。プールを使用すると、エンコード済み容量のブロックを一度だけ一定期間分予約でき、プールに登録する Blob ごとに書き込み料金だけを支払います。
| 通常の Blob | プール内の Blob | |
|---|---|---|
| ストレージ料金 | Blob ごとに専用のストレージリソース | プールの前払い済み容量を使用。登録時に支払うのは書き込み料金のみ |
| 保存期間 | Blob ごとに個別の期限があり、個別に延長 | プールの期限を共有。プールを延長すると、その中のすべての Blob の保存期間が延長 |
| 削除 | ストレージリソースが返却されます | エンコード済みサイズ分の容量がプール内の次の Blob のために空きます(WAL の返金なし) |
| 所有権 | Blob は所有、転送、共有が可能 | PooledBlob はプール内にあり、単独では転送できません |
| 読み取り | Blob ID を使用 | 同じです。プール内の Blob にも通常の Blob ID が付与されます |
料金:プールの作成時には、Blob が容量をすべて使い切るかどうかにかかわらず、予約容量全体の全期間分のストレージ料金を支払います。Blob の登録時には、そのエンコード済みサイズに応じた書き込み料金を支払います。プールの延長または拡張時には、追加するエポック数または容量分のストレージ料金を支払います。削除時には料金も返金もありません。Blob ごとの固定メタデータオーバーヘッドはプール内の Blob にも適用されるため、プールを使っても多数の小さな Blob のコストは下がりません。その場合は、必要に応じてプール内で使用することもできるキルトを使ってください。
予測可能な合計容量に対して Blob を継続的に書き込み、廃棄する場合、各書き込みの料金を確実に書き込み料金のみにしたい場合、また単一の共有期限を許容できる場合は、プールを使用してください。Blob ごとに独立した保存期間が必要な場合、個々の Blob オブジェクトを転送または共有する必要がある場合、または必要な容量を予測できない場合は、通常の Blob を選んでください。
プールは Rust SDK(create_storage_pool、reserve_and_store_blobs_in_storage_pool、storage_pool_status、delete_pooled_blob、extend_storage_pool、increase_storage_pool_capacity)と walrus::system Move モジュールから利用できます。walrus CLI はプールをサポートしていません。--storage-pool フラグはありません。Rust および Move の例については、ストレージプールのページを参照してください。
Blob の属性
# Set attributes (multiple key-value pairs supported)
walrus set-blob-attribute <BLOB_OBJECT_ID> --attr "content-type" "image/png" --attr "creator" "myapp"
# Get attributes
walrus get-blob-attribute <BLOB_OBJECT_ID>
# Remove all attributes
walrus remove-blob-attribute <BLOB_OBJECT_ID>
# Remove specific keys
walrus remove-blob-attribute-fields <BLOB_OBJECT_ID> --keys "creator"
認識される HTTP ヘッダー属性キー:content-disposition、content-encoding、content-language、content-location、content-type、link。これらは、オブジェクト ID を指定して読み取る際に HTTP ヘッダーとして返されます。
ルール
- Blob は終了エポックの開始時に期限切れになります。 終了エポックが 314 の Blob は、エポック 314 の開始時に利用できなくなります。計画的に運用してください。
- 期限切れの Blob の有効期限は延長できません。 期限切れになる前に延長してください。
walrus blob-statusで有効期限を監視してください。 - 削除しても、データが確実に消去されるわけではありません。 同じ Blob のコピーがほかに存在する可能性があります。キャッシュと過去のストレージノードには影響しません。
- 共有する Blob は永続的である必要があります。 削除可能な Blob は共有できません。先に永続化するか、
--shareを指定して永続 Blob として保存してください。 - Burn は取り消せません。 Blob オブジェクトを Burn すると、ストレージ料金の払い戻しがないまま、すべての制御権を失います。期限切れの Blob を安全にクリーンアップするには、
--all-expiredを使用してください。 - Blob の最大サイズは約 13.6 GiB です。
walrus infoの「Maximum blob size」で現在の上限を確認してください。大容量アップロードについては、リファレンスファイルlarge-uploads.mdを参照してください。
よくある間違い
- 存在しない
--storage-poolCLI フラグを考案してしまう。 プールは CLI にはなく、Rust SDK と Move のプレビュー機能です。 - Blob の期限切れを確認するために、読み取りが失敗するまで待つ。 期限切れを示すイベントは発生しません。定期的に
blob-statusとwalrus infoを確認してください。 - オブジェクト ID ではなく Blob ID を指定して延長しようとする。
extendコマンドには Blob ID ではなく、--blob-obj-id(Sui オブジェクト ID)が必要です。 - 期限切れの Blob を延長しようとする。 期限切れになると、Blob は延長できません。再アップロードする必要があります。
- 削除すればデータを完全に利用できなくなると思い込む。 ほかのユーザーが同じコンテンツをアップロードしている場合、そのデータは残ります。プライバシーを確実に保護する方法は、暗号化だけです。
- まだ価値のある Blob を Burn する。 Burn は取り消せず、ストレージを失い、払い戻しもありません。ストレージを回収するには、代わりに
deleteを使用してください。 - 削除可能な Blob を共有する。 共有するには永続 Blob が必要です。
--permanent --shareを指定して保存するか、共有前に Blob が永続的であることを確認してください。 - エポック境界の近くで
--epochs 1を指定して保存する。 Blob はほぼ即座に期限切れになります。余裕のあるエポック数を指定してください。