关于 walrus-data-security
walrus-data-security 是介绍 Walrus 和 Seal 安全属性及集成模式的技能,面向开发者说明客户端加密、链上访问策略、数据可用性,以及使用 Nautilus 进行安全链下计算。
主要功能
- 01说明 Walrus 的可用性和完整性保证
- 02介绍使用 Seal 进行客户端加密
- 03描述基于 Move 的访问策略
- 04记录 Seal 配置与解密常见问题
- 05介绍 Nautilus TEE 计算
适用场景
- 01在将敏感数据存入 Walrus 前加密
- 02设置代币门控或限时解密
- 03排查 Seal 交易和签名错误
- 04评估 Nautilus 链下计算方案
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ mystenlabs/ walrus-skills --skill walrus-data-security安装后在 Claude Code 中输入/walrus-data-security确认已加载。
附带文件evals/evals.jsonseal-sdk.md
详细介绍
Walrus 数据安全
**来源限制:**本技能中的所有信息均来源于 Walrus 数据安全文档 和 Seal SDK 文档。 扩展本技能时,只能使用这些来源。
Walrus 原生提供数据可用性和完整性保证,但不提供机密性:存储在 Walrus 上的所有数据都是公开的,任何人都能发现;blob ID 不是秘密;也没有机制可以将 blob 固定到某个节点、区域或司法管辖区。若要确保数据机密,请在存储前于客户端加密,例如使用 Seal,并将 blob ID 视为公开信息。加密由你负责;Walrus 会存储并提供你上传的任何字节。
本技能中的所有模式均源自:
- https://docs.wal.app/docs/data-security
- https://seal-docs.wal.app/
- https://www.npmjs.com/package/@mysten/seal
如果不确定 Seal 或 Walrus 的安全性,请在回答前获取相关页面。
相关技能
| 主题 | 技能 | 加载时机 |
|---|---|---|
| 存储 blob | walrus-cli 或 walrus-ts-sdk | 上传 blob(加密后) |
| HTTP API | walrus-http-api | 通过 REST 存储加密数据 |
| Blob 生命周期 | walrus-blob-lifecycle | 管理加密 blob 的生命周期 |
| Move 集成 | walrus-move-integration | Seal 的链上访问策略 |
| 故障排查 | walrus-troubleshooting | Seal 错误消息及修复方法 |
参考文件
seal-sdk — Seal SDK 集成指南
路径: seal-sdk.md
**加载时机:**集成 @mysten/seal TypeScript SDK、编写 seal_approve Move 函数、配置密钥服务对象 ID、实现加密/解密流程,或调试 Seal 专属错误(会话签名、发送方不匹配、未达到阈值)时。
**涵盖内容:**SealClient 初始化、密钥服务 ID、加密/解密流程、seal_approve Move 函数模式、访问控制模式(允许列表、令牌门控、时间锁)、会话签名、常见错误表、限制。
路由指南
| 任务 | 加载内容 |
|---|---|
| 了解 Walrus 安全保证 | 下方的技能内容 |
| 在 Walrus 上存储前加密数据 | seal-sdk.md |
| 在 Move 中编写 Seal 访问策略 | seal-sdk.md |
| 调试 Seal 加密/解密错误 | seal-sdk.md |
| 设置 Nautilus TEE 计算 | 下方的技能内容 |
| 决定使用 Seal 还是自定义加密 | 下方的技能内容 |
技能内容
关键概念
-
**所有 Walrus blob 都是公开的。**任何拥有 blob ID 的人都能获取该 blob。Walrus 本身没有原生加密或访问控制。blob ID 不是秘密。
-
**上传前加密。**若要存储私有数据,请在调用任何 Walrus 存储操作前于客户端加密。Walrus 存储的是密文。只有拥有解密密钥的各方才能读取明文。
-
**Seal。**一种阈值加密系统,没有任何单一参与方持有完整的解密密钥。你可以定义链上访问策略(Move 智能合约),以决定谁能解密以及在什么条件下解密。Seal 与 Walrus 和 Sui 区块链直接集成。
-
**Nautilus。**一种利用可信执行环境(TEE)进行安全链下计算的框架。对于需要私有数据处理、AI 推理或带有链上验证的 Web2 集成的混合应用,可使用 Nautilus。
数据可用性保障
- 写入阈值: 只要 2/3 的分片由诚实的存储节点运营,Blob 就可以写入并保持可用。
- 读取阈值: 数据写入后,即使只有 1/3 的节点可用,仍可读取。
- 可用性时点(PoA): 可通过 Sui 事件观察。在达到 PoA 之前,你需要负责保证 Blob 可用;达到 PoA 之后,Walrus 会在整个存储期内保障其可用性。
- 不一致证明: 如果 Blob 编码不正确,存储节点会生成不一致证明,读取时返回
None。正确存储的 Blob 不会产生虚假的不一致证明。
数据主权和驻留
Walrus 不允许你选择存储数据的存储节点或地理区域。Blob 会进行纠删编码,拆分为小块并分发到所有分片;Sui 智能合约则会将分片分配给存储节点。由于每个 Blob 都是公开的,且无法控制其存放位置,因此不要以明文形式在 Walrus 上存储个人数据或受监管数据:请先加密,将明文和任何密钥保存在 Walrus 之外,并且只存储你愿意永久公开的内容。
数据完整性### 数据完整性
Walrus 保证读取的数据与上传者预期的数据一致。由于编码在客户端完成,编码可能会出错(无论是无意还是故意)。一致性检查机制(默认和严格模式)可以检测并处理此类问题。
Seal:具备链上访问控制的阈值加密
Walrus 文档将 Seal 列为一种客户端加密方式;以下所有内容均以 Seal 自身的文档为准。
Seal 提供:
- 阈值加密: 没有任何单一方持有完整的解密密钥。
- 链上访问策略: Move 智能合约定义谁可以解密,以及在什么条件下解密。
- 与 Walrus 无缝集成: 在本地加密,在 Walrus 上存储密文,并在 Sui 上定义访问规则。
Seal 的使用场景
- 敏感的链下内容:用户文档、游戏资产、私信
- 时间锁定或代币门控的数据
- 在可信方或不同角色之间共享的数据
安装
npm install @mysten/seal
初始化 Seal SDK
import { SealClient } from '@mysten/seal';
import { SuiClient } from '@mysten/sui/client';
const suiClient = new SuiClient({ url: getFullnodeUrl('mainnet') });
const sealClient = new SealClient({ suiClient, network: 'mainnet' });
重要提示:设置交易发送方
为 Seal 策略检查构建可编程交易块(PTB)时,请先设置交易发送方,再将 PTB 传递给 Seal。发送方必须与请求解密访问权限的地址一致:
tx.setSender(address);
如果未设置发送方或发送方不匹配,解密将失败,并返回 Transaction was not signed by the correct sender。
钱包会话签名
Seal 解密需要钱包签署多笔交易。一些钱包支持会话签名,以避免反复弹出审批提示。如果连接的钱包不支持会话签名,你将收到 Connected wallet does not support Seal session signing。在这种情况下,用户必须逐一批准每次签名,或改用支持会话签名的其他钱包。
Nautilus:安全的链下计算
Nautilus 支持将敏感或资源密集型任务委托给自托管的可信执行环境(TEE),同时通过智能合约验证保障链上信任。
- 目前支持自托管的 AWS Nitro Enclave TEE
- 使用 Move 智能合约在链上验证证明
- 适用于:可信预言机、AI Agent、DePIN、防欺诈、身份管理
开始使用:https://docs.sui.io/concepts/cryptography/nautilus/using-nautilus
规则
- 上传到 Walrus 前,务必加密敏感数据。 Walrus 保证可用性和完整性,但不保证机密性。它不提供服务器端加密,也无法控制数据存放的位置。
- Blob ID 不是秘密。 任何拥有 Blob ID 的人都可以获取 Blob 内容。安全性来自加密,而不是隐匿。
- 使用 Seal 实现链上访问控制。 如果你希望解密权限与区块链状态(代币所有权、时间锁、角色成员身份)绑定,建议使用 Seal。
- 在 Seal PTB 前设置
tx.setSender(address)。 未设置或设置的发送方不匹配,都会导致解密失败。 - 删除并不能保证隐私。 即使删除了,缓存、曾经的存储节点或用户下载内容中仍可能存在副本。加密是唯一可靠的隐私保护机制。
常见错误
- 在 Walrus 上存储未加密的敏感数据。 所有 Blob 都是公开的。未加密时,任何人都可以读取。
- 误以为 Blob ID 是秘密。 Blob ID 是根据内容确定性生成的。如果有人拥有内容,就可以计算出 Blob ID;如果拥有 Blob ID,就可以获取内容。
- 在 Seal 交易中忘记调用
tx.setSender()。 必须先在 PTB 上显式设置发送方,再将其传递给 Seal。这是最常见的 Seal 集成错误。 - 依赖删除来保护隐私。 删除会从当前及未来的存储节点移除分片,但不会影响缓存、过去的节点或他人制作的副本。请先加密。
- 将 Seal 与 Walrus 原生加密混为一谈。 Walrus 本身没有加密功能。Seal 是一个独立系统,可与 Walrus 配合使用。
Connected wallet does not support Seal session signing。 并非所有钱包都支持 Seal 的会话签名协议。请检查钱包兼容性,或实现逐个签名的手动审批。- 将 Seal 用于 HIPAA/PHI 或政府机密数据。 Seal 并非为高度受监管的数据而设计。其威胁模型假定密钥服务器之间存在阈值信任,这可能无法满足监管要求。
- 未指定 Seal 密钥服务器对象 ID。 Seal 客户端需要目标网络对应的正确密钥服务器对象 ID。测试网和主网使用的 ID 不同。请查看 Seal 文档获取当前值。