Walrus
欢迎使用Walrus开发者文档,Walrus是一个专为大型二进制文件(或称为“blobs”)设计的去中心化存储和数据可用性协议。Walrus专注于提供一种强大但经济实惠的解决方案,用于在去中心化存储节点上存储非结构化内容,同时确保即使在拜占庭故障的情况下也能保持高可用性和可靠性。
If you are viewing this site at https://docs.walrus.site, you are fetching this from Walrus behind the scenes. See the Walrus Sites chapter for further details on how this works.
The current Testnet release of Walrus and Walrus Sites is a preview intended to showcase the technology and solicit feedback from builders, users, and storage-node operators. All transactions are executed on the Sui Testnet and use Testnet WAL and SUI which have no value. The state of the store can and will be wiped at any point and possibly with no warning. Do not rely on this Testnet for any production purposes, it comes with no availability or persistence guarantees.
Furthermore, encodings and blob IDs may be incompatible with the future Testnet and Mainnet, and developers will be responsible for migrating any Testnet applications and data to Mainnet. Detailed migration guides will be provided when Mainnet becomes available.
Also see the Testnet terms of service under which this Testnet is made available.
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.
The previous Walrus Devnet instance is now deprecated and will be shut down after 2024-10-31. All data stored on Walrus Devnet (including Walrus Sites) will no longer be accessible at that point. You need to re-upload all data to Walrus Testnet if you want it to remain accessible. Walrus Sites also need to be migrated as described on the dedicated migration page.
功能
-
存储和检索: Walrus支持写入和读取blob的存储操作。它还允许任何人证明某个blob已被存储,并且可以在以后检索。
-
成本效益: 通过利用先进的纠删编码,Walrus将存储成本维持在大约是存储blob大小的五倍,并且每个blob的编码部分存储在每个存储节点上。这比传统的全复制方法显著更具成本效益,并且比仅在部分存储节点上存储每个blob的协议更能抵御故障。
-
与Sui区块链的集成: Walrus利用Sui进行协调、证明可用性和支付。存储空间在Sui上表示为一种资源,可以被拥有、拆分、合并和转移。存储的blob也由Sui上的对象表示,这意味着智能合约可以检查某个blob是否可用以及可用时间,延长其生命周期或选择性地删除它。
-
纪元、代币经济学和委托权益证明: Walrus由在纪元之间演变的存储节点委员会操作。一种原生代币WAL(及其子单位FROST,其中1 WAL等于10亿FROST)用于将权益委托给存储节点,那些拥有高权益的节点成为纪元委员会的一部分。WAL代币也用于存储支付。在每个纪元结束时,选择存储节点、存储和服务blob的奖励分配给存储节点及其权益委托者。所有这些过程都由Sui平台上的智能合约调解。
-
灵活访问: 用户可以通过命令行界面(CLI)、软件开发工具包(SDK)和web2 HTTP技术与Walrus交互。Walrus设计为能够很好地与传统缓存和内容分发网络(CDN)配合工作,同时确保所有操作也可以使用本地工具运行,以最大限度地实现去中心化。
架构和操作
Walrus的架构确保即使在许多存储节点不可用或恶意的情况下,内容仍然可以访问和检索。其底层使用基于快速线性喷泉码的现代纠错技术,增强以确保对拜占庭故障的弹性,并且存储节点集动态变化。Walrus的核心保持简单,存储节点管理和blob认证利用Sui智能合约。
组织
本文档分为几个部分:
- 开发博客 包含公告和其他博客文章。
- 设计 描述了Walrus的目标、安全属性和架构。
- 使用 为开发者提供具体信息。如果你想快速入门,可以直接跳到设置章节。
- Walrus站点 描述了如何使用Walrus和Sui一起构建真正的去中心化网站。
最后,我们提供了一个术语表,解释了文档中使用的术语。
来源
本文档使用mdBook从https://github.com/MystenLabs/walrus-docs/中的源文件构建。请在该GitHub项目中报告或修复你在本文档中发现的任何错误。
Walrus开发手册
Walrus文档的这一部分用于发布Walrus开发的新闻和更新!
发布Walrus:一个去中心化存储和数据可用性协议
Walrus是一个创新的区块链应用和自主代理的去中心化存储网络。Walrus存储系统今天作为开发者预览版发布给Sui构建者,以收集反馈。我们预计很快会向其他web3社区广泛推出!
利用擦除编码的创新,Walrus能够快速且稳健地将非结构化数据blob编码成较小的切片,分布并存储在存储节点网络中。即使多达三分之二的切片丢失,也可以使用部分切片快速重建原始blob。这在将复制因子保持在最低4x-5x的同时实现,类似于现有的基于云的服务,但具有去中心化和对更广泛故障的弹性等额外优势。
复制挑战
Sui是与验证器存储相关的最先进的区块链系统,具有诸如存储基金等创新,可以为链上存储数据的成本提供未来保障。尽管如此,Sui仍然需要在所有验证器之间进行完整的数据复制,导致今天的Sui主网中的复制因子达到100倍或更多。虽然这对于复制计算和在区块链状态上运行的智能合约是必要的,但对于简单地存储非结构化数据blob(如音乐、视频、区块链历史等)来说是低效的。
介绍Walrus:高效且稳健的去中心化存储
为了应对高复制成本的挑战,Mysten Labs开发了Walrus,一个去中心化存储网络,提供卓越的数据可用性和稳健性,复制因子最低为4x-5x。Walrus提供了两个关键优势:
-
成本效益高的Blob存储: Walrus允许一次上传数GB的数据,成本极低,使其成为存储大量数据的理想解决方案。Walrus能够做到这一点,因为数据blob在网络上传输一次,存储节点仅消耗与blob大小相比的一小部分资源。因此,系统中的存储节点越多,每个存储节点使用的资源就越少。
-
高可用性和稳健性: 存储在Walrus上的数据在故障条件下具有更高的可靠性和可用性。即使三分之二的存储节点崩溃或受到对手控制,数据恢复仍然是可能的。此外,无需下载完整的blob即可高效地认证可用性。
在现代生态系统中,去中心化存储可以采取多种形式。例如,它为作为NFT交易的数字资产提供了更好的保障。与当前将数据存储在链下的设计不同,去中心化存储确保用户拥有实际资源,而不仅仅是元数据,从而减轻数据被删除或被误传的风险。
此外,去中心化存储不仅对存储高可用性的数据(如图片或文件)有用;它还可以作为rollups的低成本数据可用性层。在这里,排序器可以在Walrus上上传交易,rollup执行器只需要临时重建它们以进行执行。
我们还认为Walrus将伴随数百万企业公司的现有灾难恢复策略。Walrus不仅成本低,而且提供了集中式解决方案设计无法提供的无与伦比的数据可用性、完整性、透明性和弹性层。
Walrus由Sui网络提供支持,并横向扩展到数百或数千个联网的去中心化存储节点。鉴于更高的保证和去中心化,这应该使Walrus能够以与当前集中式产品竞争的成本提供Exabytes的存储。
Walrus的未来
通过发布这个开发者预览版,我们希望与去中心化应用开发者社区分享一些设计决策,并收集关于存储、检索和认证blob的方法和API的反馈。在这个开发者预览版中,所有存储节点都由Mysten Labs操作,以帮助我们了解用例、修复错误并提高软件性能。
Walrus的未来更新将允许动态更改去中心化存储节点的集合,以及更改每个存储节点管理的切片的映射。可用的操作和工具也将扩展到涵盖更多与存储相关的用例。许多这些功能将根据我们收集的反馈进行设计。
敬请关注更多关于Walrus如何在web3生态系统中革新数据存储的更新。
开发者可以构建什么?
作为这个开发者预览版的一部分,我们提供一个二进制客户端(目前支持macOS和ubuntu),可以从命令行界面操作,一个JSON API,以及一个HTTP API。我们还为社区提供一个聚合和发布服务,以及由Mysten Labs操作的10个存储节点的Devnet部署。
我们希望开发者能够尝试以各种方式构建利用Walrus去中心化存储的应用程序。例如,我们希望看到社区构建:
-
NFT或dapps的媒体存储: Walrus可以直接存储和提供媒体,如图像、声音、精灵、视频、其他游戏资产等。这是可以通过HTTP请求在缓存中访问的公开可用媒体,以创建多媒体dapps。
-
与AI相关的用例: Walrus可以存储干净的训练数据集、具有已知和验证来源的数据集、模型权重和AI模型的正确训练证明。或者它可以用于存储和确保AI模型输出的可用性和真实性。
-
区块链历史的长期存档存储: Walrus可以用作低成本的去中心化存储来存储区块链历史。对于Sui,这可以包括所有相关交易和效果内容的检查点序列,以及区块链状态、代码或二进制文件的历史快照。
-
支持L2的可用性: Walrus使各方能够认证blob的可用性,这是L2需要的数据存储和认证为所有人可用的要求。这还可能包括额外审计数据的可用性,如有效性证明、正确执行的零知识证明或大规模欺诈证明。
-
支持完整的去中心化网络体验: Walrus可以托管完整的去中心化网络体验,包括所有资源(如js、css、html和媒体)。这些可以提供内容,但也可以托管dapps的用户体验,使链上完全去中心化的前端和后端成为可能。它将完整的“web”带回“web3”。
-
支持媒体的订阅模式: 创作者可以在Walrus上存储加密媒体,并仅通过解密密钥向支付订阅费或支付内容的各方提供访问权限。(请注意,Walrus提供存储;加密和解密必须在Walrus之外完成)。
我们很高兴看到web3开发者社区还能想象出什么!
入门
对于这个开发者预览版,公共Walrus Devnet对所有开发者开放。开发者文档可在https://docs.walrus.site获取。
SUI测试网代币是与Walrus交互的主要货币。开发者使用SUI测试网代币支付Walrus Devnet存储费用,这些代币可以在Sui测试网Discord水龙头获取。
还有一件事……
Walrus Sites网站、Walrus文档和这个博客都托管在Walrus上。要了解更多关于Walrus Sites的信息以及如何部署你自己的,请点击这里。
开发网络更新
发布日期:2024-08-12
我们重新部署了Walrus Devnet,以整合对Walrus存储节点和客户端的各种改进。在此过程中,存储在Walrus上的所有blob都被清除。请注意,这可能会在Devnet和Testnet上再次发生,但显然不会在未来的主网上发生。
Walrus Sites的迁移和重新部署
你可以按照设置章节中的描述获取最新版本的walrus
二进制文件和新配置。
如果你已经部署了任何Walrus Sites,Sui上的站点对象和任何SuiNS名称仍然有效。但是,你需要在Walrus上重新存储所有blob。你可以通过运行site-builder工具(在walrus-sites
目录中)来实现这一点,如下所示:
./target/release/site-builder --config site-builder/assets/builder-example.yaml update --force \
<path to the site> <site object ID>
更改
除了对存储节点的许多改进外,新版本的Walrus还包括以下面向用户的更改:
- 改进的币管理:客户端现在更好地选择用于gas和存储费用的币。用户不再需要在钱包中持有多个币。
- 改进的连接管理:客户端现在限制并行连接的数量,以提高低网络带宽用户存储大blob的性能。
- OpenAPI规范:Walrus存储节点、聚合器和发布者在路径
/v1/api
公开其API规范。 - JSON格式的系统信息:
info
命令现在也可以以JSON模式使用。 - 客户端版本:
walrus
CLI现在有一个--version
选项。 - 支持空blob:Walrus现在支持空blob。
- 默认配置文件路径:客户端现在除了在
~/.walrus
中查找配置文件外,还会在~/.config/walrus
中查找,并且除了.yaml
外,还识别.yml
扩展名。 - 路径中的主目录:配置文件中指定的路径现在将开头的
~
符号扩展为用户的主目录。 - 更强健的存储和状态检查:
store
和blob-status
命令现在对积极修剪过去事件的Sui全节点以及将交易发送到不同全节点的负载均衡器更强健。 - 修复CLI解析:
walrus
CLI现在可以正确处理blob ID中的连字符。
此更新还将分片数量增加到1000,这更能代表Testnet和Mainnet中的预期值。
宣布官方Walrus白皮书
在六月,Mysten Labs宣布了Walrus,一个新的去中心化安全blob存储设计,并推出了一个开发者预览版,目前存储了超过12TiB的数据。Breaking the Ice聚集了超过200名开发者,构建利用去中心化存储的应用。
是时候揭开项目的下一个阶段了:Walrus将成为一个独立的去中心化网络,拥有自己的效用代币WAL,该代币将在网络的运营和治理中发挥关键作用。Walrus将通过使用WAL代币的委托权益证明机制由存储节点操作。一个独立的Walrus基金会将鼓励Walrus的进步和采用,并支持其用户和开发者社区。
今天,我们发布了Walrus白皮书(也在GitHub上),提供了更多细节,包括:
- Walrus使用的编码方案和读/写操作,以确保安全性和高效扩展到数百和数千个存储节点,包括与作为Walrus操作协调层的Sui区块链的交互。
- 跨纪元的存储节点重新配置,以及协议如何确保Walrus上的可用blob在长时间内保持可用。
- 基于WAL代币的Walrus代币经济学,包括质押和质押奖励的结构,存储的定价和支付在每个纪元中的处理和分配,以及关键系统参数的治理。
- 前瞻性的设计选项,例如挑战和审计存储节点的廉价机制,确保更高服务质量的读取选项,可能需要支付,以及使轻节点能够有意义地贡献于协议的稳健性、提供读取服务并获得奖励的设计。
白皮书重点介绍了Walrus的稳态设计方面。关于项目的更多细节,例如时间表、社区参与的机会、如何作为存储节点加入网络以及围绕轻节点的计划,将在后续帖子中分享。
成为这段旅程的一部分:
- 在Twitter上关注我们
- 加入我们的Discord
- Build apps on Walrus
- 发布一个Walrus站点并分享它
发布测试网络
发布日期:2024-10-17
今天,一个运营者社区启动了第一个公共Walrus Testnet。这是验证Walrus作为去中心化blob存储操作的重要里程碑,通过在一组独立的存储节点上操作,这些节点通过委托权益证明机制随时间变化。Testnet还带来了与治理、纪元和blob删除相关的功能更新。
Blob删除
最重要的面向用户的新功能是可选的blob删除。blob的上传者可以选择性地指示一个blob是“可删除的”。此信息存储在Sui blob元数据对象中,并且还包括在表示blob被认证的事件中。随后,Sui blob元数据对象的所有者可以“删除”它。因此,剩余时间段的存储空间被回收,并可用于后续的blob存储操作。
Blob删除允许更细粒度的存储成本管理:包装blob元数据对象的智能合约可以定义存储blob并删除它们的逻辑,以最小化成本,并在Walrus纪元结束前回收存储空间。
然而,blob删除本身并不是一种有效的隐私机制:blob的副本可能存在于Walrus存储节点之外的缓存和终端用户存储或设备上。此外,如果相同的blob被多个Walrus用户存储,那么在没有副本存在之前,该blob仍将在Walrus上可用。因此,删除你自己的blob副本不能保证它从Walrus整体上被删除。
- 通过CLI了解如何上传和删除可删除的blob。
- 了解更多关于删除操作如何工作。
纪元
Walrus Testnet支持多个纪元。最初,纪元持续时间设置为一天,以确保纪元更改的逻辑得到彻底测试。在主网中,纪元可能会持续数周。
纪元的进展使得blob的到期纪元变得有意义,blob将在其到期纪元后变得不可用。存储命令可用于延长仍然可用的blob的到期纪元。此操作高效且仅影响支付和元数据,不会重新上传blob内容。
WAL代币和Testnet WAL水龙头
blob存储和延长blob到期的支付以Testnet WAL计价,这是一种在Sui Testnet上发行的Walrus代币。Testnet WAL没有价值,供应无限;所以不需要觊觎或囤积它,它只是用于测试目的,并且只在Sui Testnet上发行。
WAL还有一个较小的单位,称为FROST,类似于SUI的MIST。1 WAL等于10亿(1000000000)FROST。
为了使所有想要试验Walrus Testnet的人都能获得Testnet WAL,我们提供了一个工具和智能合约,将Testnet SUI(也没有价值)按一比一的汇率转换为Testnet WAL。这是任意选择的,通常不应过多解读Testnet上以WAL计价的存储成本。它们是任意选择的。
通过CLI了解如何请求Testnet WAL代币。
通过质押和解除质押实现去中心化
WAL代币还可以用于与存储运营商进行质押。质押的WAL可以解除质押并重新质押给其他运营商,或用于购买存储。
每个纪元,存储节点根据其委托的质押被选择并分配存储分片。在每个纪元结束时,存储blob的支付分配给存储节点和那些委托质押给它们的人。此外,每个纪元的重要网络参数(如总可用存储和存储价格)由选定的存储运营商根据其质押权重设置。
提供了一个质押web dApp来试验此功能。社区成员还创建了浏览器,可以在考虑与谁质押时查看存储节点。质押确保了Walrus的最终治理,直接在存储节点方面,间接在他们选择的参数和软件方面,归WAL代币持有者所有。
在接下来的几个月里,我们将在幕后测试纪元变化和存储节点委员会变化的许多方面:在变化或存储节点质押时更好的分片分配机制;在存储节点之间同步状态的有效方法;以及存储节点跟随Sui事件流的更好方法。
- 探索Walrus质押dApp。
- 查看Walrus Explorer上的最新活动。
新的Move合约和文档
作为Walrus Testnet发布的一部分,文档和Move智能合约已更新,可以在walrus-docs
仓库中找到。
新的Walrus站点功能
随着迁移到Walrus Testnet,Walrus站点也已更新!此更新中的新功能大大增加了Walrus站点的灵活性、速度和安全性。开发人员现在可以为其站点指定客户端路由规则,并为门户的响应添加自定义HTTP头,扩展了Walrus站点的可能性。
立即迁移以利用这些新功能!基于Walrus Devnet的旧Walrus站点仍将在短时间内可用。然而,Devnet将很快被清除(如下所述),因此建议尽快迁移。
停止Walrus Devnet
之前的Walrus Devnet实例现在已被弃用,并且将在2024-10-31之后关闭。存储在Walrus Devnet上的所有数据(包括Walrus站点)在那时将不再可访问。如果你希望它保持可访问状态,你需要将所有数据重新上传到Walrus Testnet。Walrus站点也需要按照专门的迁移页面中描述的进行迁移。
目标和用例
Walrus支持存储和读取blob的操作,并证明和验证其可用性。它确保内容在存储节点遭受拜占庭故障时仍然可用和可检索。它提供API,通过CLI、SDK和web2 HTTP技术访问存储的内容,并支持缓存和内容分发网络(CDN)等内容交付基础设施。
在底层,存储成本是blob大小的一个小的固定倍数(大约5倍)。高级纠删编码使成本保持较低,与传统区块链的数据完全复制形成对比,例如存储在Sui对象中的数据的>100倍倍数。因此,在Walrus上存储更大资源(最多几个GiB)的成本比在Sui或其他区块链上低得多。由于编码的blob存储在所有存储节点上,Walrus还提供了比少量副本存储完整blob的设计更高的鲁棒性。
Walrus使用Sui链进行协调和支付。可用存储表示为可以获取、拥有、拆分、合并和转移的Sui对象。存储空间可以在一段时间内绑定到存储的blob,生成的Sui对象用于在链上通过智能合约证明可用性,或在链下使用轻客户端证明可用性。
下一章详细讨论了与存储、检索和可用性相关的上述操作。
未来,我们计划在Walrus中包含一些最小的治理,以允许存储节点在存储周期之间进行更改。Walrus还兼容定期支付以继续存储。我们还计划实施基于挑战的存储认证,以确保blob已存储或至少可用。Walrus还允许存储小部分blob的轻节点通过证明可用性和协助恢复获得奖励。我们将在后续文档中讨论这些主题。我们还在单独的文档中提供编码方案的详细信息。
非目标
有几件事是Walrus明确不做的:
-
Walrus不会重新实现可能进行地理复制或延迟小于几十毫秒的CDN。相反,它确保传统CDN可用并与Walrus缓存兼容。
-
Walrus不会重新实现具有共识或执行功能的完整智能合约平台。它在必要时依赖Sui智能合约来管理Walrus资源和流程,包括支付、存储周期等。
-
Walrus支持存储任何blob,包括加密的blob。然而,Walrus本身不是分布式密钥管理基础设施,不管理和分发加密或解密密钥以支持完整的私有存储生态系统。然而,它可以为此类基础设施提供存储层。
用例
应用程序构建者可以将Walrus与任何L1或L2区块链结合使用,以构建需要以去中心化方式存储大量数据并可能认证为可用的体验:
-
Storage of media for NFT or dApps: Walrus can directly store and serve media such as images, sounds, sprites, videos, other game assets, and so on. This is publicly available media that is accessed using HTTP requests at caches to create multimedia dApps.
-
AI related use cases: Walrus can store clean data sets of training data, datasets with a known and verified provenance, models, weights and proofs of correct training for AI models. It can also store and ensure the availability of an AI model output.
-
Storage of long term archival of blockchain history: Walrus can act as a lower-cost decentralized store to store blockchain history. For Sui, this can include sequences of checkpoints with all associated transaction and effects content, as well as historic snapshots of the blockchain state, code, or binaries.
-
Support availability for L2s: Walrus allows parties to certify the availability of blobs, as required by L2s that need data to be stored and be attested as available to all. This may also include availability of extra audit data such as validity proofs, zero knowledge proofs of correct execution or large fraud proofs.
-
Support a fully decentralized web experience: Walrus can host fully decentralized web experiences, including all resources (such as js, css, html, media). These can not only provide content, but also host the UX of dApps to enable applications with fully decentralized front end and back ends on chain. Walrus puts the full "web" into web3.
-
Support subscription models for media: Creators can store encrypted media on Walrus and only provide access via decryption keys to parties that have paid a subscription fee or have paid for content. Walrus provides the storage, encryption and decryption needs to happen off the system.
概述
使用术语表作为本文件中许多加粗术语的参考。
基本架构和安全假设
Walrus架构中的关键角色如下:
-
用户通过客户端希望存储和读取由blob ID标识的blob。
这些角色在写入和非尽力而为的读取时准备支付服务费用。用户还希望向第三方证明blob的可用性,而无需发送或接收完整的blob。
用户可能会以各种方式进行恶意操作:他们可能不想支付服务费用,证明不可用的blob的可用性,未经授权修改/删除blob,试图耗尽存储节点的资源,等等。
-
存储节点在存储纪元内持有一个或多个分片。
每个blob都被擦除编码成多个切片。每个存储的blob的切片成为所有分片的一部分。在任何存储纪元中的一个分片都与一个存储节点相关联,该节点实际存储该分片的所有切片并准备提供服务。
Sui智能合约控制在存储纪元内将分片分配给存储节点,Walrus假设每个存储纪元内超过2/3的分片由正确的存储节点管理。这意味着Walrus必须容忍多达1/3的分片由拜占庭存储节点管理(大约1/3的存储节点是拜占庭节点),在每个存储纪元内和跨存储纪元。
-
所有客户端和存储节点都运行一个区块链客户端(特别是在Sui上),并通过区块链智能合约调解支付、资源(空间)、分片到存储节点的映射和元数据。用户与区块链交互以获取存储资源并上传存储的blob的证书。存储节点监听区块链事件以协调其操作。
Walrus支持任何数量的可选基础设施角色,这些角色可以在无需许可的情况下操作:
-
聚合器是从切片重建blob并通过传统的web2技术(如HTTP)将其提供给用户的客户端。它们是可选的,因为最终用户可以直接重建blob或运行本地聚合器以通过本地的web2技术执行Walrus读取。
-
缓存是具有额外缓存功能的聚合器,以减少延迟和减轻存储节点的负载。这种缓存基础设施还可以充当CDN,分摊多个请求的blob重建成本,连接更好,等等。客户端始终可以验证从这些基础设施读取的数据是否正确。
-
发布者是使用web2技术帮助最终用户存储blob的客户端,使用更少的带宽和自定义逻辑。
实际上,他们通过传统的web2协议(如HTTP)接收要发布的blob,并代表最终用户运行Walrus存储协议。这包括将blob编码成切片,将切片分发到存储节点,收集存储节点签名并将其聚合成证书,以及所有其他链上操作。
它们是可选的,因为用户可以直接与Sui和存储节点交互以存储blob。最终用户始终可以通过检查链上与blob的**可用性点**相关的事件来验证发布者是否正确履行了职责,然后执行读取以查看Walrus是否返回blob,或对blob进行编码并将结果与证书中的blob ID进行比较。
聚合器、发布者和最终用户不被视为系统的可信组件,它们可能会任意偏离协议。然而,Walrus的一些安全属性仅适用于使用诚实中介(缓存和发布者)的诚实最终用户。Walrus为最终用户提供了一种审计缓存和发布者正确操作的方法。
编码、开销和验证
以下列表总结了Walrus中使用的基本编码和加密技术:
-
一个擦除编码编码算法将一个blob分成若干个符号,并将其编码成符号,以便这些符号的一个子集可以用来重建blob。
-
Walrus使用高效的擦除编码,并选择,使得解码算法可以使用三分之一的符号来重建blob。
-
编码是_系统化_的,这意味着一些存储节点持有原始blob的一部分,从而允许快速随机访问读取。
-
所有编码和解码操作都是确定性的,编码器对此没有自由裁量权。
-
对于每个blob,多个符号被组合成一个切片,然后分配给一个分片。
-
存储节点管理一个或多个分片,每个blob的相应切片分布到所有存储分片。
详细的编码设置导致blob大小扩展了倍。这与分片数量和存储节点数量无关。
每个blob还与一些元数据相关联,包括一个blob ID以允许验证:
-
blob ID被计算为所有分片数据和元数据(字节大小、编码、blob哈希)集合的认证器。
Walrus对每个分片中的切片表示进行哈希处理,并将生成的哈希添加到Merkle树中。然后,Merkle树的根是用于派生系统中标识blob的blob哈希。
-
每个存储节点可以使用blob ID检查某些分片数据是否属于一个blob,使用与blob哈希(Merkle树)对应的认证结构。成功的检查意味着数据确实是由blob的编写者所预期的。
-
由于blob的编写者可能错误地编码了一个blob(无论是错误还是故意),任何从分片切片重建blob ID的方都必须检查它是否编码为正确的blob ID。在接受任何声称是特定blob ID的blob时也是如此。
此过程涉及使用擦除编码重新编码blob,并再次派生blob ID以检查blob是否匹配。这防止了格式错误的blob(错误擦除编码)在任何正确的接收者处被读取为有效的blob。
-
一组等于重建阈值的切片属于一个blob ID,这些切片要么不一致,要么导致重建不同的ID,代表了不正确的编码。这只有在编码blob的用户有故障或恶意并且错误编码时才会发生。
Walrus可以从每个切片中提取一个符号以形成不一致证明。存储节点可以删除属于不一致编码blob的切片,并在请求时返回不一致证明或链上发布的不一致证书。
操作
Walrus操作可以分为与Sui链的交互,Walrus用于协调和治理,以及客户端和存储节点之间的链下交互。
在Sui上的操作
Walrus使用Sui智能合约来协调作为具有生命周期的资源的存储操作和支付。智能合约还促进治理,以确定持有每个存储分片的存储节点。以下内容概述了这些操作,并将其作为读/写路径的一部分。
元数据是唯一暴露给Sui或其验证者的blob元素,因为blob的内容始终存储在Walrus存储节点和缓存的链下。存储节点或缓存不必与任何Sui基础设施组件(如验证者)重叠,并且存储纪元可以有不同的长度,并且与Sui纪元的开始/结束时间不同。
在Sui上的存储资源生命周期
一些Sui智能合约持有Walrus系统及其所有实体的元数据。
-
Walrus系统对象持有当前存储纪元的存储节点委员会。系统对象还持有Walrus上的总可用空间和每单位存储(1 KiB)的价格。
这些值由存储纪元的存储节点之间的2/3协议决定。用户可以支付购买一段时间的存储空间。这些空间资源可以拆分、合并和转移。之后,它们可以用于将一个blob ID放入Walrus。
-
存储基金持有用于在一个或多个存储纪元中存储blob的资金。当从系统对象购买存储空间时,用户支付到分布在多个存储纪元的存储基金中。每个纪元根据性能向存储节点支付(详细信息如下)。
-
用户通过合约或转移获得一些存储,并可以分配一个blob ID,表示他们想将这个blob ID存储到其中。这会发出一个Move 资源事件,存储节点会监听该事件以期望和授权链下存储操作。
-
最终,用户持有来自存储节点的一个blob ID的链下可用性证书。用户将证书上传到链上,以表示该blob ID在一个可用期内是可用的。证书会与最新的Walrus委员会进行核对,如果正确,则会为该blob ID发出一个可用性事件。这是该blob的可用性点。
-
在稍后的时间,通过添加一个具有更长到期时间的存储对象,可以扩展已认证的blob的存储。只要有资金继续提供存储,智能合约就可以使用此功能来延长永久存储的blob的可用性。
-
如果一个blob ID没有正确编码,可以在稍后时间将一个不一致证明证书上传到链上。此操作会发出一个不一致的blob事件,表示该blob ID的读取结果总是返回
None
。这表明其切片可以被存储节点删除,除了一个返回None
的指示器。
向Walrus写入数据的用户需要执行Sui交易以获取存储并认证blob。创建或使用blob可用性证明的用户仅读取链以证明或验证事件的发出。节点每个纪元只读取一次区块链以获取委员会元数据,然后通过blob ID直接从存储节点请求切片以读取Walrus资源。
在Sui上的治理操作
每个Walrus存储纪元由Walrus系统对象表示,该对象包含一个存储委员会和各种元数据或存储节点,如分片和存储节点之间的映射、可用空间和当前成本。
用户可以在该期间访问系统对象并购买一些存储量用于一个或多个存储纪元。在每个存储纪元都有一个存储价格,所提供的支付成为跨越所购买存储的所有存储纪元的存储基金的一部分。未来可以购买存储的最大存储纪元数(大约2年)。存储是一种可以拆分、合并和转移的资源。
在存储纪元结束时,存储基金中的部分资金需要分配给存储节点。这里的想法是存储节点相互进行轻度审计,并根据这些审计的表现建议哪些节点应获得支付。
链下操作
虽然 Walrus 操作发生在 Sui 之外,但它们可能会与定义资源生命周期的区块链流程交互。
写入路径
写入的系统概述,如上图所示:
-
用户在链上获取适当大小和持续时间的存储资源,可以通过直接在 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 发出存储认证挑战。
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 的分片内容序列。
-
挑战者节点使用阈值来确定挑战是否通过,并在链上报告结果。
-
挑战/响应通信是经过身份验证的。
挑战提供了一些保证,即存储节点可以以概率方式实际恢复分片数据,避免存储节点在没有任何证据表明它们可能检索分片数据的情况下获得支付。挑战的顺序性质和一些合理的超时也确保了过程的及时性。
基本架构和安全假设
以下属性在假设所有存储纪元中有 2/3 的分片由忠实且正确遵循 Walrus 协议的存储节点操作的前提下成立。
如前所述,每个 blob 使用纠删码编码成小块,并且 blob ID 是通过加密方式派生的。对于给定的 blob ID,有一个 可用性点 (PoA) 和一个 可用性周期,可以通过 Sui 链上的事件观察到。
以下属性与 PoA 相关:
- 在 PoA 之后读取由正确用户存储的 blob ,将得到 。
- 在 PoA 之后,如果两个正确的用户执行读取并分别得到 和 。 ,那么
- 具有适当存储资源的正确用户始终可以为 blob 执行存储,并使用 blob ID 推进协议直到 PoA。
- 在 PoA 之后读取由正确用户存储的 blob ,将得到 。
一些保证属性确保 Walrus 存储节点的正确内部过程。为了定义这些属性, 不一致性证明 证明了一个 blob ID 是由错误编码 blob 的用户存储的。
- 在 PoA 之后,对于由正确用户存储的 blob ID,存储节点始终能够恢复其分片的正确切片。
- 在 PoA 之后,如果正确的存储节点无法恢复切片,它可以为该 blob ID 生成不一致性证明。
- 如果一个 blob ID 是由正确用户存储的,则无法为其得出不一致性证明。
- 正确用户对可能存在不一致性证明的 blob ID 的读取将返回
None
。
请注意,没有删除操作,PoA 之后的 blob ID 将在整个可用期内可用。
Before the PoA it is the responsibility of a client to ensure the availability of a blob and its upload to Walrus. After the PoA it is the responsibility of Walrus as a system to maintain the availability of the blob as part of its operation for the full availability period remaining. Emission of the event corresponding to the PoA for a blob ID attests its availability.
未来讨论
在本文档中,我们省略了以下功能的详细信息:
- 存储纪元更改时的分片传输和恢复: Walrus 使用的编码方案旨在允许在分片故障的情况下进行高效恢复。尝试恢复切片的存储节点只需获取与丢失数据相同数量级的数据即可重建它们。
- 可用于采样可用性的轻客户端的详细信息: 个人客户端可以从 Sui 元数据中采样已认证的 blobs,并采样它们存储的某些切片的可用性。链上赏金可用于检索这些丢失 blob 的切片。
设置
在项目的这个阶段,我们的 Walrus 代码尚未公开。相反,我们提供了适用于 macOS(Intel 和 Apple CPU)和 Ubuntu 的预编译 walrus
客户端二进制文件,支持不同的使用模式(请参阅下一章)。本章介绍了 Walrus 客户端的先决条件、安装和配置。
先决条件:Sui 钱包和测试网 SUI
If you just want to set up a new SUI wallet for Walrus, you can skip this section and use the walrus generate-sui-wallet
command after installing Walrus. In that case, make sure to set the wallet_config
parameter in the Walrus configuration to the newly generated wallet.
与 Walrus 交互需要一个有效的 Sui 测试网钱包和一些 SUI 代币。设置此钱包的正常方法是通过 Sui CLI;请参阅 Sui 文档中的安装说明。
安装 Sui CLI 后,您需要通过运行 sui client
来设置测试网钱包,这会提示您设置新配置。请确保将其指向 Sui 测试网,您可以使用 https://fullnode.testnet.sui.io:443
的全节点。有关更多详细信息,请参见此处。
如果您已经配置了 Sui 钱包,可以直接设置测试网环境(如果您还没有),
sui client new-env --alias testnet --rpc https://fullnode.testnet.sui.io:443
并将活动环境切换到它:
sui client switch --env testnet
之后,您应该会得到类似的内容(除了 testnet
行之外的所有内容都是可选的):
$ sui client envs
╭──────────┬─────────────────────────────────────┬────────╮
│ alias │ url │ active │
├──────────┼─────────────────────────────────────┼────────┤
│ devnet │ https://fullnode.devnet.sui.io:443 │ │
│ localnet │ http://127.0.0.1:9000 │ │
│ testnet │ https://fullnode.testnet.sui.io:443 │ * │
│ mainnet │ https://fullnode.mainnet.sui.io:443 │ │
╰──────────┴─────────────────────────────────────┴────────╯
最后,确保您至少有一个至少包含 1 SUI 的 gas 代币。您可以从测试网水龙头获得一个:
sui client faucet
几秒钟后,您应该会看到您的新 SUI 代币:
$ sui client gas
╭─────────────────┬────────────────────┬──────────────────╮
│ gasCoinId │ mistBalance (MIST) │ suiBalance (SUI) │
├─────────────────┼────────────────────┼──────────────────┤
│ 0x65dca966dc... │ 1000000000 │ 1.00 │
╰─────────────────┴────────────────────┴──────────────────╯
如果没有指定其他路径,Walrus 将使用系统范围的钱包。如果您想使用不同的 Sui 钱包,可以在 Walrus 配置文件 中指定,或在运行 CLI 时指定。
安装
我们目前提供适用于 macOS(Intel 和 Apple CPU)、Ubuntu 和 Windows 的 walrus
客户端二进制文件:
操作系统 | CPU | 架构 |
---|---|---|
Ubuntu | Intel 64位 | ubuntu-x86_64 |
Ubuntu | Intel 64位(通用) | ubuntu-x86_64-generic |
MacOS | Apple Silicon | macos-arm64 |
MacOS | Intel 64位 | macos-x86_64 |
Windows | Intel 64位 | windows-x86_64.exe |
We now offer a pre-built binary also for Windows. However, most of the remaining instructions assume a UNIX-based system for the directory structure, commands, etc. If you use Windows, you may need to adapt most of those.
您可以从我们的 Google Cloud Storage (GCS) 存储桶下载最新版本(正确设置 $SYSTEM
变量):
SYSTEM= # 将此设置为您的系统:ubuntu-x86_64, ubuntu-x86_64-generic, macos-x86_64, macos-arm64, windows-x86_64.exe
curl https://storage.googleapis.com/mysten-walrus-binaries/walrus-testnet-latest-$SYSTEM -o walrus
chmod +x walrus
在 Ubuntu 上,您通常应使用 ubuntu-x86_64
版本。然而,这与旧硬件和某些虚拟化环境不兼容(会抛出 "Illegal instruction (core dumped)" 错误);在这些情况下,您可以使用 ubuntu-x86_64-generic
版本。
为了能够简单地以 walrus
运行它,请将二进制文件移动到包含在您的 $PATH
环境变量中的任何目录。标准位置是 /usr/local/bin/
,$HOME/bin/
或 $HOME/.local/bin/
。
Previously, this guide recommended placing the binary in $HOME/.local/bin/
. If you install the latest binary somewhere else, make sure to clean up old versions. You can find the binary in use by calling which walrus
and its version through walrus -V
.
完成此操作后,您应该能够在终端中简单地键入 walrus
。例如,您可以获取使用说明(有关详细信息,请参见下一章):
$ walrus --help
Walrus client
Usage: walrus [OPTIONS] <COMMAND>
Commands:
⋮
Our latest Testnet Walrus binaries are also available on Walrus itself, namely on https://bin.blob.store, for example, https://bin.blob.store/walrus-testnet-latest-ubuntu-x86_64.
以前的版本(可选)
除了最新版本的 walrus
二进制文件外,GCS 存储桶还包含以前的版本。XML 格式的概览可在 https://storage.googleapis.com/mysten-walrus-binaries/ 获得。
配置
Walrus 客户端需要了解存储 Walrus 系统和质押信息的 Sui 对象,请参阅开发者指南。这些需要在文件 ~/.config/walrus/client_config.yaml
中配置。
当前的 Testnet 部署使用以下对象:
system_object: 0x50b84b68eb9da4c6d904a929f43638481c09c03be6274b8569778fe085c1590d
staking_object: 0x37c0e4d7b36a2f64d51bba262a1791f844cfd88f31379f1b7c04244061d43914
exchange_object: 0x0e60a946a527902c90bbc71240435728cd6dc26b9e8debc69f09b71671c3029b
获取最新配置的最简单方法是从 https://github.com/MystenLabs/walrus-docs/blob/main/docs/client_config.yaml 下载。
自定义路径(可选)
默认情况下,Walrus 客户端将在当前目录、$XDG_CONFIG_HOME/walrus/
、~/.config/walrus/
或 ~/.walrus/
中查找 client_config.yaml
(或 client_config.yml
)配置文件。但是,您可以将文件放置在任何位置并命名为任何您喜欢的名称;在这种情况下,您需要在运行 walrus
二进制文件时使用 --config
选项。
高级配置(可选)
配置文件当前支持以下参数:
# 这些是唯一的必填字段。这些对象特定于特定的 Walrus
# 部署,但不会随时间变化。
system_object: 0x50b84b68eb9da4c6d904a929f43638481c09c03be6274b8569778fe085c1590d
staking_object: 0x37c0e4d7b36a2f64d51bba262a1791f844cfd88f31379f1b7c04244061d43914
exchange_object: 0x0e60a946a527902c90bbc71240435728cd6dc26b9e8debc69f09b71671c3029b
# 您可以在此处定义 Sui 钱包配置的自定义路径。如果未设置或为 `null`,
# 钱包将从 `./sui_config.yaml`(相对于您的当前工作目录)或
# 系统范围的钱包 `~/.sui/sui_config/client.yaml` 中配置,按此顺序。
wallet_config: null
# 以下参数可用于调整客户端的网络行为。玩弄这些值没有风险。
# 在最坏的情况下,您可能无法存储/读取
# blob,因为超时或其他网络错误。
communication_config:
max_concurrent_writes: null
max_concurrent_sliver_reads: null
max_concurrent_metadata_reads: null
max_concurrent_status_reads: null
max_data_in_flight: null
reqwest_config:
total_timeout:
secs: 30
nanos: 0
pool_idle_timeout: null
http2_keep_alive_timeout:
secs: 5
nanos: 0
http2_keep_alive_interval:
secs: 30
nanos: 0
http2_keep_alive_while_idle: true
request_rate_config:
max_node_connections: 10
max_retries: 5
min_backoff:
secs: 2
nanos: 0
max_backoff:
secs: 60
nanos: 0
disable_proxy: false
disable_native_certs: false
sliver_write_extra_time:
factor: 0.5
base:
secs: 0
nanos: 500000000
Testnet WAL 水龙头
Walrus Testnet 使用 Testnet WAL 代币来购买存储和质押。Testnet WAL 代币没有价值,可以通过以下命令以 1:1 的比例兑换一些 Testnet SUI 代币,这些代币也没有价值:
walrus get-wal
您可以通过检查 Sui 余额来确认您是否已收到 Testnet WAL:
sui client balance
╭─────────────────────────────────────────╮
│ Balance of coins owned by this address │
├─────────────────────────────────────────┤
│ ╭─────────────────────────────────────╮ │
│ │ coin balance (raw) balance │ │
│ ├─────────────────────────────────────┤ │
│ │ Sui 8869252670 8.86 SUI │ │
│ │ WAL 500000000 0.50 WAL │ │
│ ╰─────────────────────────────────────╯ │
╰─────────────────────────────────────────╯
默认情况下,0.5 SUI 兑换 0.5 WAL,但可以使用 --amount
选项兑换不同数量的 SUI(值以 MIST/FROST 为单位),并且可以通过 --exchange-id
选项使用特定的 SUI/WAL 兑换对象。walrus get-wal --help
命令提供了有关这些的更多信息。
与Walrus互动
我们提供 3 种方式直接与 Walrus 存储系统进行交互:
- 通过 Walrus 客户端命令行界面 (CLI)。
- 通过 Walrus CLI 的 JSON API。
- 通过公共或本地 Walrus 客户端守护进程公开的 HTTP API。
此外,用户可以通过质押 dApp 或 Sui 智能合约 质押和取消质押。
Using the Walrus client
walrus
二进制文件可用作客户端与 Walrus 进行交互。有关先决条件、安装和配置,请参阅 设置章节。
详细的使用信息可以通过以下方式获得
walrus --help
walrus
的每个子命令也可以使用 --help
调用,以打印其特定参数及其含义。
Walrus system information
有关 Walrus 系统的信息可以通过 walrus info
命令获得。例如,walrus info
提供了系统中存储节点和分片的数量概述、最大 blob 大小以及存储 blob 的当前 (Testnet) WAL 成本:
$ walrus info
Walrus system information
Current epoch: 2
Storage nodes
Number of nodes: 25
Number of shards: 1000
Blob size
Maximum blob size: 13.3 GiB (14,273,391,930 B)
Storage unit: 1.00 MiB
Approximate storage prices per epoch
Price per encoded storage unit: 100 FROST
Price to store metadata: 6,200 FROST
Marginal price per additional 1 MiB (w/o metadata): 500 FROST
Total price for example blob sizes
16.0 MiB unencoded (135 MiB encoded): 13,500 FROST per epoch
512 MiB unencoded (2.33 GiB encoded): 0.0002 WAL per epoch
13.3 GiB unencoded (60.5 GiB encoded): 0.0062 WAL per epoch
FROST is the smaller unit of WAL, similar to MIST for SUI. The conversion is also the same as for SUI: 1 WAL = 1 000 000 000 FROST
.
其他信息,如编码参数和大小、BFT 系统信息以及存储节点及其分片分布的信息,可以使用 --dev
参数查看:walrus info --dev
。
存储、查询状态和读取 blob
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.
It must be ensured that only a single process uses the Sui wallet for write actions (storing or deleting). When using multiple instances of the client simultaneously, each of them must be pointed to a different wallet.
You can exchange Testnet SUI for Testnet WAL by running walrus get-wal
. See the setup page for further details.
Storing blobs on Walrus can be achieved through the following command:
walrus store <some file>
store 命令接受一个 CLI 参数 --epochs <EPOCHS>
(或 -e
),指示 blob 应存储的 epoch 数量。默认值为 1 个 epoch,即当前 epoch。
When storing a blob, the client performs a number of automatic optimizations, including the following:
- If the blob is already stored as a permanent blob on Walrus for a sufficient number of epochs the command does not store it again. This behavior can be overwritten with the
--force
(or-f
) CLI option, which stores the blob again and creates a fresh blob object on Sui belonging to the wallet address. - If the user's wallet has a compatible storage resource, this one is (re-)used instead of buying a new one.
- If the blob is already certified on Walrus but as a deletable blob or not for a sufficient number of epochs, the command skips sending data to the storage nodes and just collects the availability certificate
可以通过以下命令之一查询 blob 的状态:
walrus blob-status --blob-id <BLOB_ID>
walrus blob-status --file <FILE>
这将返回 blob 是否已存储及其可用期。如果使用 --file
选项指定文件,CLI 将重新编码文件内容并在检查状态之前派生 blob ID。
当 blob 可用时,blob-status
命令还会返回 BlobCertified
Sui 事件 ID,该 ID 由交易 ID 和交易发出的事件中的序列号组成。此事件的存在证明了 blob 的可用性。
可以通过以下命令从 Walrus 读取 blob:
walrus read <some blob ID>
默认情况下,blob 数据写入标准输出。可以使用 --out <OUT>
CLI 选项(或 -o
)指定输出文件名。可以使用 --rpc-url <URL>
(或 -r
)指定要使用的 Sui RPC 节点,而不是钱包配置中设置的节点或默认节点。
通过可删除的 blob 回收空间
默认情况下,walrus store
上传一个 blob,Walrus 会在其到期纪元之后保持其可用性。即使是上传者也不能提前删除它。但是,可以选择使用 --deletable
标志调用 store 命令,以指示 blob 可以在其到期之前由表示该 blob 的 Sui blob 对象的所有者删除。可删除的 blob 在证明它们的 Sui 事件中被如此标示,不应依赖其他人来保证其可用性。
可以使用以下命令删除可删除的 blob:
walrus delete --blob-id <BLOB_ID>
可以选择通过指定 --file <PATH>
选项来调用 delete 命令,从文件中派生 blob ID,或 --object-id <SUI_ID>
删除指定的 Sui blob 对象中的 blob。
delete
命令回收与已删除 blob 关联的存储对象,该对象被重新用于存储新 blob。删除操作在管理存储成本和重新使用存储方面提供了灵活性。
删除操作对隐私的作用有限:它只删除当前纪元存储节点和后续纪元存储节点中的碎片,如果没有其他用户上传相同 blob 的副本。如果 Walrus 中存在相同 blob 的另一个副本,删除操作不会使该 blob 无法下载,并且 walrus read
调用将下载它。公共 blob 的副本可能会被用户缓存或下载,这些副本不会被删除。
All blobs stored in Walrus are public and discoverable by all. The delete
command will not delete slivers if other copies of the blob are stored on Walrus possibly by other users. It does not delete blobs from caches, slivers from past storage nodes, or copies that could have been made by users before the blob was deleted.
Blob ID 工具
walrus blob-id <FILE>
可用于派生任何文件的 blob ID。blob ID 是对文件的承诺,任何具有相同 ID 的 blob 都将解码为相同的内容。blob ID 是一个 256 位数字,在某些 Sui explorer 上表示为十进制大数字。命令 walrus convert-blob-id <BLOB_ID_DECIMAL>
可用于将其转换为命令行工具和其他 API 使用的 base64 URL 安全编码。
walrus list-blobs
命令列出当前帐户拥有的所有未过期的 Sui blob 对象,包括它们的 blob ID、对象 ID 以及有关到期和可删除状态的元数据。选项 --include-expired
还会列出已过期的 blob 对象。
更改默认配置
使用 --config
选项指定 配置位置 的自定义路径。
--wallet <WALLET>
参数可用于指定非标准 Sui 钱包配置文件。--gas-budget <GAS_BUDGET>
参数可用于更改命令允许使用的最大 Sui 数量(以 MIST 为单位)。
JSON 模式
所有 Walrus 客户端命令也都可以在 JSON 模式下使用。在此模式下,原始 CLI 命令的所有命令行标志都可以用 JSON 格式指定。因此,JSON 模式简化了对 CLI 的编程访问。
例如,要存储一个 blob,请运行:
walrus json \
'{
"config": "path/to/client_config.yaml",
"command": {
"store": {
"file": "README.md"
}
}
}'
或者,知道 blob ID 后读取 blob:
walrus json \
'{
"config": "path/to/client_config.yaml",
"command": {
"read": {
"blobId": "4BKcDC0Ih5RJ8R0tFMz3MZVNZV8b2goT6_JiEEwNHQo"
}
}
}'
所有选项、默认值和命令都与“标准”CLI 模式相同,只是它们以“camelCase”而不是“kebab-case”编写。
json
命令也接受来自 stdin
的输入。
json
命令的输出本身将是 JSON 格式的,再次简化了以编程方式解析结果。例如,JSON 输出可以通过管道传输到 jq
命令以解析和手动提取相关字段。
客户端守护进程模式和 HTTP API
除了 CLI 和 JSON 模式外,Walrus 客户端还提供 _daemon 模式。在此模式下,它运行一个简单的 Web 服务器,分别在 aggregator 和 publisher 角色中提供存储和读取 blob 的 HTTP 接口。我们还提供 公共聚合器和发布者服务 以尝试 Walrus HTTP API,而无需运行本地客户端。
本地启动守护进程
您可以使用以下命令运行守护进程,在同一地址 (127.0.0.1
) 和端口 (31415
) 上同时提供聚合器和发布者:
walrus daemon -b "127.0.0.1:31415"
或者,您可以在不同的地址/端口上分别运行聚合器和发布者进程:
walrus aggregator -b "127.0.0.1:31415" # 运行聚合器以读取 blob
walrus publisher -b "127.0.0.1:31416" # 运行发布者以存储 blob
聚合器提供所有读取 API,发布者提供所有存储 API,守护进程提供两者。
While the aggregator does not perform Sui on-chain actions, and therefore consumes no gas, the publisher does perform actions on-chain and will consume gas. It is therefore important to ensure only authorized parties may access it, or other measures to manage gas costs.
使用公共聚合器或发布者
对于某些用例(例如,公共网站),或者只是尝试 HTTP API,需要一个公开可访问的聚合器和/或发布者。几家公司运行此类聚合器和发布者,请参阅下面的公共 聚合器 和 发布者 列表。
公共发布者默认将请求限制为 10 MiB。如果您想上传更大的文件,您需要 运行自己的发布者 或使用 CLI。
另外,请注意,发布者在服务端消耗 (Testnet) SUI 和 WAL,主网部署可能无法在不要求某些身份验证和补偿所用资金的情况下提供不受控制的公共发布访问。
公共聚合器
以下是已知公共聚合器的列表;它们会定期检查,但每个聚合器可能仍会暂时不可用:
https://aggregator.walrus-testnet.walrus.space
https://wal-aggregator-testnet.staketab.org
https://walrus-testnet-aggregator.bartestnet.com
https://walrus-testnet.blockscope.net
https://walrus-testnet-aggregator.nodes.guru
https://walrus-cache-testnet.overclock.run
https://sui-walrus-testnet.bwarelabs.com/aggregator
https://walrus-testnet-aggregator.stakin-nodes.com
https://testnet-aggregator-walrus.kiliglab.io
https://walrus-cache-testnet.latitude-sui.com
https://walrus-testnet-aggregator.nodeinfra.com
https://walrus-tn.juicystake.io:9443
https://walrus-agg-testnet.chainode.tech:9002
https://walrus-testnet-aggregator.starduststaking.com:11444
http://walrus-testnet-aggregator.everstake.one:9000
http://walrus.testnet.pops.one:9000
http://scarlet-brussels-376c2.walrus.bdnodes.net:9000
http://aggregator.testnet.sui.rpcpool.com:9000
http://walrus.krates.ai:9000
http://walrus-testnet.stakingdefenseleague.com:9000
http://walrus.sui.thepassivetrust.com:9000
公共发布者
https://publisher.walrus-testnet.walrus.space
https://wal-publisher-testnet.staketab.org
https://walrus-testnet-publisher.bartestnet.com
https://walrus-testnet-publisher.nodes.guru
https://sui-walrus-testnet.bwarelabs.com/publisher
https://walrus-testnet-publisher.stakin-nodes.com
https://testnet-publisher-walrus.kiliglab.io
https://walrus-testnet-publisher.nodeinfra.com
https://walrus-testnet.blockscope.net:11444
https://walrus-publish-testnet.chainode.tech:9003
https://walrus-testnet-publisher.starduststaking.com:11445
http://walrus-publisher-testnet.overclock.run:9001
http://walrus-testnet-publisher.everstake.one:9001
http://walrus.testnet.pops.one:9001
http://ivory-dakar-e5812.walrus.bdnodes.net:9001
http://publisher.testnet.sui.rpcpool.com:9001
http://walrus.krates.ai:9001
http://walrus-publisher-testnet.latitude-sui.com:9001
http://walrus-tn.juicystake.io:9090
http://walrus-testnet.stakingdefenseleague.com:9001
http://walrus.sui.thepassivetrust.com:9001
HTTP API 使用
对于以下示例,我们假设您将 AGGREGATOR
和 PUBLISHER
环境变量设置为您所需的聚合器和发布者。例如:
AGGREGATOR=https://aggregator.walrus-testnet.walrus.space
PUBLISHER=https://publisher.walrus-testnet.walrus.space
Walrus aggregators and publishers expose their API specifications at the path /v1/api
. You can view this in the browser, e.g., at https://aggregator.walrus-testnet.walrus.space/v1/api
存储
您可以通过简单的 HTTP PUT 请求与守护进程交互。例如,使用 cURL,您可以使用发布者或守护进程存储 blob,如下所示:
curl -X PUT "$PUBLISHER/v1/store" -d "some string" # 将字符串 `some string` 存储 1 个存储周期
curl -X PUT "$PUBLISHER/v1/store?epochs=5" --upload-file "some/file" # 将文件 `some/file` 存储 5 个存储周期
存储 HTTP API 端点以 JSON 格式返回有关存储的 blob 的信息。当首次存储 blob 时,newlyCreated
字段包含有关新 blob 的信息:
$ curl -X PUT "$PUBLISHER/v1/store" -d "some other string"
{
"newlyCreated": {
"blobObject": {
"id": "0xd765d11848cbac5b1f6eec2fbeb343d4558cbe8a484a00587f9ef5385d64d235",
"storedEpoch": 0,
"blobId": "Cmh2LQEGJwBYfmIC8duzK8FUE2UipCCrshAYjiUheZM",
"size": 17,
"erasureCodeType": "RedStuff",
"certifiedEpoch": 0,
"storage": {
"id": "0x28cc75b33e31b3e672646eacf1a7c7a2e5d638644651beddf7ed4c7e21e9cb8e",
"startEpoch": 0,
"endEpoch": 1,
"storageSize": 4747680
}
},
"encodedSize": 4747680,
"cost": 231850
}
}
返回的信息是 Sui blob 对象 的内容。
当聚合器找到具有相同 blob ID 和足够有效期的已认证 blob 时,它会返回一个 alreadyCertified
JSON 结构:
$ curl -X PUT "$PUBLISHER/v1/store" -d "some other string"
{
"alreadyCertified": {
"blobId": "Cmh2LQEGJwBYfmIC8duzK8FUE2UipCCrshAYjiUheZM",
"event": {
"txDigest": "CLE41JTPR2CgZRC1gyKK6P3xpQRHCetQMsmtEgqGjwst",
"eventSeq": "0"
},
"endEpoch": 1
}
}
字段 event
返回 Sui 事件 ID,可用于查找在 Sui explorer 上创建 Sui Blob 对象的交易或使用 Sui SDK。
读取
可以使用 HTTP GET 从聚合器或守护进程读取 blob。例如,以下 cURL 命令读取一个 blob 并将其写入输出文件:
curl "$AGGREGATOR/v1/<some blob ID>" -o <some file name>
或者,您可以使用 cURL 命令在终端中打印 blob 的内容:
curl "$AGGREGATOR/v1/<some blob ID>"
Modern browsers will attempt to sniff the content type for such resources, and will generally do a good job of inferring content types for media. However, the aggregator on purpose prevents such sniffing from inferring dangerous executable types such as JavaScript or style sheet types.
开发者指南
本指南介绍了构建使用 Walrus 作为存储或可用性层的应用程序所需的所有概念。概述 提供了更多背景信息,并更详细地解释了 Walrus 如何在内部运行。
本开发者指南描述了以下内容:
- 开发人员感兴趣的 Walrus 组件,希望将其用于存储或可用性。
- 通过客户端二进制文件、API 或 Sui 操作支持的 操作。
- Walrus 用于存储元数据的 Sui 结构,以及如何从 Sui 智能合约中读取它们,或通过 Sui SDK 读取它们。
再次参考术语 词汇表 作为参考。
The current Testnet release of Walrus and Walrus Sites is a preview intended to showcase the technology and solicit feedback from builders, users, and storage-node operators. All transactions are executed on the Sui Testnet and use Testnet WAL and SUI which have no value. The state of the store can and will be wiped at any point and possibly with no warning. Do not rely on this Testnet for any production purposes, it comes with no availability or persistence guarantees.
Furthermore, encodings and blob IDs may be incompatible with the future Testnet and Mainnet, and developers will be responsible for migrating any Testnet applications and data to Mainnet. Detailed migration guides will be provided when Mainnet becomes available.
Also see the Testnet terms of service under which this Testnet is made available.
组件
从开发人员的角度来看,一些 Walrus 组件是 Sui 上的对象和智能合约,一些组件是 Walrus 特定的二进制文件和服务。通常,Sui 用于管理 blob 和存储节点元数据,而 Walrus 特定的服务用于存储和读取 blob 内容,这些内容可能非常大。
Walrus 在 Sui 上定义了许多对象和智能合约:
- 共享的 系统对象 记录和管理当前的存储节点委员会。
- 存储资源 代表可用于存储 blob 的空存储空间。
- Blob 资源 代表已注册并认证为存储的 blob。
- 对这些对象的更改会发出 Walrus 相关事件。
Walrus 系统对象 ID 可以在 Walrus client_config.yaml
文件中找到(请参阅 配置)。您可以使用任何 Sui explorer 查看其内容,并探索 blob 对象的内容。有关这些的更多信息,请参阅 Walrus Sui 结构快速参考。
Walrus 还由许多 Walrus 特定的服务和二进制文件组成:
- 客户端(二进制文件)可以在本地执行,并提供 命令行界面 (CLI)、JSON API 和 HTTP API 以执行 Walrus 操作。
- 聚合器服务允许通过 HTTP 请求读取 blob。
- 发布者服务用于将 blob 存储到 Walrus。
- 一组存储节点存储编码的 blob。这些节点构成了 Walrus 的去中心化存储基础设施。
聚合器、发布者和其他服务使用客户端 API 与 Walrus 交互。使用 Walrus 的服务的最终用户通过公开 HTTP API 的自定义服务、聚合器或发布者与存储交互,以避免在本地运行二进制客户端的需要。
操作
Blob 编码和 blob ID
Walrus 以 编码形式 在存储节点之间存储 blob,并通过其 blob ID 引用 blob。blob ID 是从 blob 的内容和 Walrus 配置中确定性派生的。具有相同内容的两个文件的 blob ID 将是相同的。
您可以使用命令在本地派生文件的 blob ID:walrus blob-id <file path>
。
存储
Walrus 可以通过本机客户端 API 或发布者 存储 blob。
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 不可用。
Sui 结构
本节是可选的,并启用高级用例。
您可以纯粹通过客户端 CLI 以及提供的 JSON 或 HTTP API 与 Walrus 交互,而无需直接在 Sui 上查询或执行交易。然而,Walrus 使用 Sui 来管理其元数据,智能合约开发人员可以在 Sui 上读取有关 Walrus 系统以及存储的 blob 的信息。
Walrus 测试网合约的 Move 代码可在 https://github.com/MystenLabs/walrus-docs/blob/main/contracts 获取。使用 Walrus 合约的示例包可在 https://github.com/MystenLabs/walrus-docs/blob/main/examples/move 获取。
以下部分提供了对合约的进一步见解,并概述了如何在您自己的 Sui 智能合约中使用 Walrus 对象。
Walrus Mainnet will use new Move packages with struct
layouts and function signatures that may not be compatible with this package. Move code that builds against this package will need to rewritten.
Blob 和存储对象
Walrus blob 表示为类型为 Blob
的 Sui 对象。首先注册一个 blob,表示存储节点应期望存储来自 Blob ID 的片段。然后认证一个 blob,表示已存储足够数量的片段以保证 blob 的可用性。当一个 blob 被认证时,其 certified_epoch
字段包含其被认证的 epoch。
Blob
对象始终与 Storage
对象相关联,为 blob 的存储保留足够长时间的足够空间。认证的 blob 在底层存储资源保证存储的期间内可用。
具体来说,Blob
和 Storage
对象具有以下字段,可以通过 Sui SDK 读取:
/// The blob structure represents a blob that has been registered to with some storage,
/// and then may eventually be certified as being available in the system.
public struct Blob has key, store {
id: UID,
registered_epoch: u32,
blob_id: u256,
size: u64,
encoding_type: u8,
// Stores the epoch first certified.
certified_epoch: option::Option<u32>,
storage: Storage,
// Marks if this blob can be deleted.
deletable: bool,
}
/// Reservation for storage for a given period, which is inclusive start, exclusive end.
public struct Storage has key, store {
id: UID,
start_epoch: u32,
end_epoch: u32,
storage_size: u64,
}
Blob
和 Storage
对象的所有字段都可以使用预期的函数读取:
// Blob functions
public fun blob_id(b: &Blob): u256;
public fun size(b: &Blob): u64;
public fun erasure_code_type(b: &Blob): u8;
public fun registered_epoch(self: &Blob): u32;
public fun certified_epoch(b: &Blob): &Option<u32>;
public fun storage(b: &Blob): &Storage;
...
// Storage functions
public fun start_epoch(self: &Storage): u32;
public fun end_epoch(self: &Storage): u32;
public fun storage_size(self: &Storage): u64;
...
事件
当一个 blob 首次注册时,会发出一个 BlobRegistered
事件,通知存储节点它们应该期望与其 Blob ID 相关的片段。最终,当 blob 被认证时,会发出一个 BlobCertified
事件,其中包含有关 blob ID 和 blob 将被删除的 epoch 的信息。在该 epoch 之前,blob 保证可用。
/// Signals that a blob with metadata has been registered.
public struct BlobRegistered has copy, drop {
epoch: u32,
blob_id: u256,
size: u64,
encoding_type: u8,
end_epoch: u32,
deletable: bool,
// The object id of the related `Blob` object
object_id: ID,
}
/// Signals that a blob is certified.
public struct BlobCertified has copy, drop {
epoch: u32,
blob_id: u256,
end_epoch: u32,
deletable: bool,
// The object id of the related `Blob` object
object_id: ID,
// Marks if this is an extension for explorers, etc.
is_extension: bool,
}
BlobCertified
事件中 deletable
设置为 false 且 end_epoch
在未来,表示该 blob 将在此 epoch 之前可用。轻客户端证明此事件为 blob ID 发出,构成该 blob ID 数据的可用性证明。
当一个可删除的 blob 被删除时,会发出一个 BlobDeleted
事件:
/// Signals that a blob has been deleted.
public struct BlobDeleted has copy, drop {
epoch: u32,
blob_id: u256,
end_epoch: u32,
// The object ID of the related `Blob` object.
object_id: ID,
// If the blob object was previously certified.
was_certified: bool,
}
当存储节点检测到编码错误的 blob 时,会发出 InvalidBlobID
事件。任何尝试读取此类 blob 的人都保证会将其检测为无效。
/// Signals that a BlobID is invalid.
public struct InvalidBlobID has copy, drop {
epoch: u32, // The epoch in which the blob ID is first registered as invalid
blob_id: u256,
}
系统级事件如 EpochChangeStart
和 EpochChangeDone
表示 epoch 之间的过渡。相关事件如 ShardsReceived
、EpochParametersSelected
和 ShardRecoveryStart
表示与 epoch 过渡、分片迁移和 epoch 参数相关的存储节点级事件。
系统和质押信息
Walrus 系统对象包含有关可用和已用存储的元数据,以及每 KiB 存储的 FROST 存储价格。系统对象内的委员会结构可用于读取当前的 epoch 编号以及有关委员会的信息。
public struct SystemStateInnerV1 has key, store {
id: UID,
/// The current committee, with the current epoch.
committee: BlsCommittee,
// Some accounting
total_capacity_size: u64,
used_capacity_size: u64,
/// The price per unit size of storage.
storage_price_per_unit_size: u64,
/// The write price per unit size.
write_price_per_unit_size: u64,
/// Accounting ring buffer for future epochs.
future_accounting: FutureAccountingRingBuffer,
/// Event blob certification state
event_blob_certification_state: EventBlobCertificationState,
}
/// This represents a BLS signing committee for a given epoch.
public struct BlsCommittee has store, copy, drop {
/// A vector of committee members
members: vector<BlsCommitteeMember>,
/// The total number of shards held by the committee
n_shards: u16,
/// The epoch in which the committee is active.
epoch: u32,
}
public struct BlsCommitteeMember has store, copy, drop {
public_key: Element<G1>,
weight: u16,
node_id: ID,
}
操作指南
本章介绍了 Walrus 系统中不同组件的操作员所需的所有概念。目前正在进行中,随着平台的成熟将会更新。
具体来说,本指南描述了以下内容:
操作存储节点
存储节点的二进制文件尚未公开。在正式网络启动之前,代码将开源。
运行存储节点的基本 systemd 服务可能如下所示:
[Unit]
Description=Walrus Storage Node
[Service]
User=walrus
Environment=RUST_BACKTRACE=1
Environment=RUST_LOG=info,walrus=debug
ExecStart=/opt/walrus/bin/walrus-node run --config-path /opt/walrus/config/walrus-node.yaml
Restart=always
LimitNOFILE=65536
确保调整任何路径,并根据需要调整日志级别。
walrus-node
二进制文件将片段存储在 RocksDB 中,这意味着数据将存储在磁盘上,路径由 /opt/walrus/config/walrus-node.yaml
文件配置。包含所有必需和可选配置参数的完整格式将与二进制文件一起提供。
以下是 walrus-node.yaml
配置文件简化版本中的一些重要配置参数:
storage_path: /opt/walrus/db
metrics_address: 127.0.0.1:9184
rest_api_address: 0.0.0.0:9185
sui:
rpc: https://fullnode.testnet.sui.io:443
system_object: 0xWALRUS_CONTRACT
blob_recovery:
max_concurrent_blob_syncs: 10
retry_interval_min_secs: 1
retry_interval_max_secs: 3600
metadata_request_timeout_secs: 5
max_concurrent_metadata_requests: 1
sliver_request_timeout_secs: 300
invalidity_sync_timeout_secs: 300
对于监控,您可以配置 Grafana Agent 从 localhost:9184/metrics
(或您配置的 metrics_address
)获取指标。
操作聚合器
以下是一个聚合器节点的示例,该节点托管一个 HTTP 端点,可用于通过网络从 Walrus 获取数据。
聚合器进程通过 walrus
客户端二进制文件以 守护进程模式 运行。它可以通过多种方式运行,其中一个示例是通过 systemd 服务:
[Unit]
Description=Walrus Aggregator
[Service]
User=walrus
Environment=RUST_BACKTRACE=1
Environment=RUST_LOG=info,walrus=debug
ExecStart=/opt/walrus/bin/walrus --config /opt/walrus/config/client_config.yaml aggregator --bind-address 0.0.0.0:9000
Restart=always
LimitNOFILE=65536
质押
在 Walrus 中,任何人都可以将质押委托给存储节点,并通过这样做,影响哪些存储节点在未来的 epoch 中被选为委员会成员,以及这些节点将持有多少分片。每个 epoch 都会将分片分配给存储节点,大致与委托给它们的质押量成比例。通过与存储节点质押,用户还可以获得奖励,因为他们将获得存储费用的一部分。
由于将分片从一个存储节点移动到另一个存储节点需要传输大量数据,并且存储节点可能需要扩展其存储容量,因此下一 epoch 的委员会选择提前进行,在前一个 epoch 的中间进行。这为存储节点操作员提供了足够的时间来提供额外的资源(如果需要)。
为了使质押影响 epoch e
中的分片分配并变得“活跃”,必须在该 epoch 的委员会选出之前进行质押,这意味着必须在 epoch e - 1
的中点之前进行质押。如果在那个时间点之后进行质押,它将只影响 epoch e + 1
的委员会选择,因此只在那个 epoch 中变得活跃并获得奖励。
解除质押有类似的延迟:因为解除质押资金只会在下一次委员会选择中生效,所以质押将保持活跃状态,直到该委员会接管。这意味着,要在 epoch e
开始时解除质押,用户需要在 epoch e - 1
的中点之前“请求提款”。否则,也就是说,如果用户在此时间点之后解除质押,质押将保持活跃状态,并在整个 epoch e
期间继续累积奖励,余额和奖励将在 epoch e + 1
开始时可供提取。
如何使用 Walrus 质押 dApp 进行质押
Walrus 质押 dApp 允许用户对系统中的任何存储节点进行质押(或解除质押)。
要使用 dApp,请访问 https://stake.walrus.site 并连接您的钱包:
- 点击右上角的
连接钱包
按钮。 - 选择钱包(如果之前已连接钱包,则此步骤和下一步将不需要)。
- 批准连接。
- (确保选择的钱包网络是测试网)。
将测试网 SUI 兑换为 WAL
要进行质押,您需要在钱包中拥有测试网 WAL。您可以使用 dApp 将测试网 SUI 兑换为 WAL,方法如下:
- 点击
获取 WAL
按钮。 - 选择 SUI 的数量。这将以 1:1 的比例兑换为 WAL。
- 然后点击
兑换
。 - 按照钱包中的说明批准交易。
质押
- 找到您要质押的存储节点。
- 在系统统计信息下方,有一个“当前委员会”存储节点的列表。
- 您可以选择该列表中的一个节点,或者,如果存储节点不在当前委员会中,您可以在页面底部找到所有存储节点。
- 选择存储节点后,点击质押按钮。
- 选择 WAL 的数量。
- 点击质押。
- 按照钱包中的说明批准交易。
解除质押
- 找到您要解除质押的
质押 WAL
。- 在“当前委员会”列表下方,您将找到所有的
质押 WAL
。 - 您还可以展开一个存储节点,找到与该节点相关的所有质押。
- 在“当前委员会”列表下方,您将找到所有的
- 根据
质押 WAL
的状态,您将能够解除质押或提取资金。 - 点击
解除质押
或提取
按钮。 - 点击继续以确认您的操作。
- 按照钱包中的说明批准交易。
示例
作为灵感,我们提供了几个不同编程语言的简单示例,通过各种接口与 Walrus 进行交互。它们位于 https://github.com/MystenLabs/walrus-docs/tree/main/examples 并在下面描述。
此外,我们在 Walrus 之上构建了实际应用程序。主要示例是 Walrus Sites,代码可在 https://github.com/MystenLabs/walrus-sites 仓库中找到。
至于如何构建静态网站并使用 GitHub actions 将其存储为 Walrus Site 的示例,只需查看我们用来发布此站点的 CI 工作流。
Python
Python 示例 文件夹包含多个示例:
- 如何 使用 HTTP API 存储和读取 blob。
- 如何 使用 JSON API 存储、读取和检查 blob 的可用性。检查 blob 的认证说明了读取认证的 Blob Sui 对象(参见 Walrus Sui 参考)。
- 如何 从 Walrus 系统对象读取信息。
- 如何 跟踪 Walrus 相关事件。
JavaScript
提供了一个 JavaScript 示例,展示了如何通过使用 HTTP API 的网页表单上传和下载 blob。
Move
对于更复杂的应用程序,您可能希望与 Walrus 链上对象进行交互。为此,当前部署的 Walrus 合约包含在 我们的 GitHub 仓库 中。
此外,我们提供了一个简单的 示例合约,该合约导入并使用 Walrus 对象。
故障排除
You can enable debug logging for Walrus by setting the environment variable RUST_LOG=walrus=debug
.
最新二进制文件
在进行任何其他步骤之前,请确保您拥有 最新的 walrus
二进制文件。如果您在不同位置有多个版本,请使用 which walrus
找到实际将使用的二进制文件。
旧硬件或不兼容的虚拟机
我们的标准 Ubuntu 二进制文件已知会在某些旧硬件和某些虚拟化环境中引起问题。如果您遇到类似“非法指令(核心转储)”的错误,请 安装 ubuntu-x86_64-generic
版本,该版本专门编译以兼容几乎所有物理和虚拟 x86-64 CPU。
最新 Walrus 配置
Walrus Devnet 和 Testnet 会定期清除,并需要更新到最新的二进制文件和配置。如果您收到类似“无法检索足够的确认以认证 blob”的错误,您可能正在使用指向非活动 Walrus 系统的过时配置。在这种情况下,请使用最新的 配置 更新您的配置文件,并确保 CLI 使用预期的配置。
The walrus
client binary prints information about the used configuration when starting execution, including the path to the Walrus configuration file and the Sui wallet.
正确的 Sui 网络配置
如果您收到类似“指定的 Walrus 系统对象不存在”的错误,请确保您的钱包已设置为 Sui 测试网 并使用最新的 配置。
Walrus站点介绍
Walrus Sites 是使用 Sui 和 Walrus 作为其底层技术的“网站”。它们是 Walrus 如何用于构建新的和令人兴奋的去中心化应用程序的主要示例。任何人都可以构建和部署 Walrus Site 并使其对世界开放!有趣的是,此文档本身也作为 Walrus Site 提供,网址为 https://docs.walrus.site/walrus-sites/intro.html(如果您还没有在那里)。
With the move to Walrus Testnet, Walrus Sites are also being updated! They now use Walrus Testnet as the backing store, and they have been improved with new awesome features. Migrate your site today to take advantage of these new features!
Since the Walrus Devnet will be shut down soon, all the Walrus Sites stored on it will be wiped. To minimize the downtime, the Devnet Walrus Sites will be available after the Testnet upgrade for two weeks (until 2024-10-31), to ensure that everyone has enough time to update.
Make sure to reupload your sites to the Walrus Testnet before the shutdown to avoid downtime!
从高层次来看,这里有一些最令人兴奋的功能:
- 发布站点不需要管理服务器或复杂的配置;只需提供源文件(由您喜欢的 Web 框架生成),使用 site-builder 工具 将它们发布到 Walrus Sites,您就完成了!
- 站点可以从普通的 Sui 对象链接到。这一功能使得,例如,创建一个 NFT 集合,其中 每个 NFT 都有一个 专属网站。
- Walrus Sites 由 Sui 上的地址拥有,并且可以交换、共享和更新,这要归功于 Sui 的灵活编程模型。这意味着,除其他外,Walrus Sites 可以利用 SuiNS 命名系统来拥有可读的名称。不再需要摆弄 DNS!
- 由于 Walrus 的去中心化和极高的数据可用性,您的站点不会无缘无故地被清除。
- 由于它们存在于 Walrus 上,这些站点在传统意义上不能有后端,因此可以被视为“静态”站点。然而,开发人员可以与 Sui 兼容的钱包集成,并利用 Sui 的可编程性为 Walrus Sites 添加后端功能!
展示给我看
为了给您一个非常高层次的直观了解 Walrus Sites 如何工作,让我们看一个示例:一个在 Sui 上的简单 NFT 集合,它有一个前端 dApp 来铸造托管在 Walrus Sites 上的 NFT,并且其中 每个 NFT 都有一个 特定的、个性化的 Walrus Site。
您可以在 https://flatland.walrus.site/ 查看铸造页面。此站点通过 Walrus Site 门户 https://walrus.site 提供给您的浏览器。虽然门户的操作在 后面的部分 中进行了说明,但现在考虑到可以有许多门户(由任何想要拥有自己门户的人托管,甚至在 localhost
上)。此外,门户的唯一功能是向浏览器提供一些代码(特别是服务工作者),使其能够从 Sui 和 Walrus 获取 Walrus Site。
如果您有一个带有一些测试网 SUI 的 Sui 钱包,您可以尝试从站点“铸造一个新的 Flatlander”。这会从集合中创建一个 NFT,并向您显示两个链接:一个指向浏览器,另一个指向“Flatlander 站点”。后者站点是一个仅存在于该 NFT 的特殊 Walrus Site,并且具有基于 NFT 内容的特殊特征(背景颜色、图像等)。
这个每个 NFT 站点的 URL 看起来像这样:https://2hzpawjycxuiuh36047yocxapc69g8ercrypa7ccsk8ek4iqu6.walrus.site/
。您会注意到域名仍然是 walrus.site
,但子域名是一个长的、看起来随机的字符串。这个字符串实际上是 NFT 对象 ID 的 Base36 编码,即 0x644bc958...。
总结:
- Walrus Sites 通过门户提供;在这种情况下,
https://walrus.site
。可以有许多门户,任何人都可以托管一个。 - URL 上的子域名指向 Sui 上的一个特定对象,允许浏览器获取和渲染站点资源。这个指针可以是
- SuiNS 名称,例如
https://flatland.walrus.site
中的flatland
,或 - Sui 对象 ID 的 Base36 编码,例如上例中的
0x644bc958...
。
- SuiNS 名称,例如
想知道这种魔法是如何实现的吗?阅读 技术概述!如果您只是想开始尝试 Walrus Sites,请查看 教程。
您的第一个Walrus站点
本教程将引导您完成发布 Walrus Site 所需的步骤。我们还提供了如何为其添加 SuiNS 名称以便于浏览的说明。
安装站点构建器
本节描述了设置 Walrus Sites 的 site-builder
工具并准备您的开发环境所需的步骤。
先决条件
在开始之前,请确保您
- 安装了最新版本的 Rust;
- 安装了
git
;并且 - 遵循了所有 Walrus 设置说明。
然后,按照这些额外的设置步骤进行操作。
克隆仓库并构建 site-builder
工具
首先,从 https://github.com/MystenLabs/walrus-sites 克隆并进入 Walrus Sites 仓库:
git clone https://github.com/MystenLabs/walrus-sites.git
cd walrus-sites
然后,构建 site builder 的发布版本:
cargo build --release
构建过程完成后,您就可以运行 site builder:
$ ./target/release/site-builder
Usage: site-builder [OPTIONS] <COMMAND>
Commands:
publish Publish a new site on Sui
update Update an existing site
convert Convert an object ID in hex format to the equivalent Base36
format
sitemap Show the pages composing the Walrus site at the given object ID
help Print this message or the help of the given subcommand(s)
⋮
发布Walrus站点
现在一切都已安装和配置,您应该可以开始发布您的第一个 Walrus Site!
选择站点的源材料
site-builder
通过将任何 web 框架生成的文件目录上传到 Walrus 并将相关元数据添加到 Sui 来工作。此目录的根目录中应有一个名为 index.html
的文件,该文件将是 Walrus Site 的入口点。
在本教程的其余部分中,我们将以 ./examples/snake
中包含的简单站点为例。
发布站点
由于我们已将 walrus
二进制文件和配置放置在默认位置,发布 ./examples/snake
站点就像调用发布命令一样简单:
./target/release/site-builder publish ./examples/snake --epochs 100
Currently on Walrus testnet, the duration of an epoch is 1 day. If you want your site to stay up longer, specify the number of epochs with the --epochs
flag!
The site builder will look for the default configuration file sites-config.yaml
in the ./walrus-sites
directory. In case you are calling the site-builder
command from a different location, use the --config
flag to specify the path to the configuration file.
输出的末尾应如下所示:
Execution completed
Resource operations performed:
- created resource /Oi-Regular.ttf with blob ID 76npyqDyGF10-jP_ov-UBHpi-RaRFnxcWgslueGEfr0
- created resource /file.svg with blob ID w70pYgtLmi--38Jg1sTGaLlZkQtximNMHXjxDQdXKa0
- created resource /index.html with blob ID LVLk9VSnBrEgQ2HJHAgU3p8IarKypQpfn38aSeUZzzE
- created resource /walrus.svg with blob ID 866UDjMAy_BB8SsTcgjGEOFp2uAO9BbcVbLh5-_oBNE
The site routes were modified
Created new site: test site
New site object ID: 0x407a308190eb82b266be9cc28b888d04c5b2e5a503c7d0ffd3f69681ea83b73a
Browse the resulting site at: https://1lupgq2auevjruy7hs9z7tskqwjp5cc8c5ebhci4v57qyl4piy.walrus.site
此输出告诉您,对于文件夹中的每个文件,创建了一个新的 Walrus blob 及其相应的 blob ID。此外,它还打印了 Sui 上 Walrus Site 对象的对象 ID(因此您可以在资源管理器中查看并使用它来设置 SuiNS 名称),最后是您可以浏览站点的 URL。
请注意,这里我们将默认配置 ./sites-config.yaml
作为 site builder 的配置。配置文件是必要的,以确保 site-builder
知道 Walrus Sites 逻辑的正确 Sui 包。
有关 site-builder
配置的更多详细信息,请参见 高级配置 部分。
更新站点
假设现在您想更新站点的内容,例如将标题从 "eat all the blobs!" 更改为 "Glob all the Blobs!"。
首先,在 ./examples/snake/index.html
文件中进行此编辑。
然后,您可以通过运行 update
命令来更新现有站点,提供找到更新文件的目录(仍然是 ./example/snake
)和现有站点的对象 ID (0x407a3081...
):
./target/release/site-builder update --epochs 100 examples/snake 0x407a3081...
这次的输出应为:
Execution completed
Resource operations performed:
- deleted resource /index.html with blob ID LVLk9VSnBrEgQ2HJHAgU3p8IarKypQpfn38aSeUZzzE
- created resource /index.html with blob ID pcZaosgEFtmP2d2IV3QdVhnUjajvQzY2ev8d9U_D5VY
The site routes were left unchanged
Site object ID: 0x407a308190eb82b266be9cc28b888d04c5b2e5a503c7d0ffd3f69681ea83b73a
Browse the resulting site at: https://1lupgq2auevjruy7hs9z7tskqwjp5cc8c5ebhci4v57qyl4piy.walrus.site
与 publish
操作相比,我们可以看到现在执行的唯一操作是删除旧的 index.html
,并用更新的文件更新它。
浏览提供的 URL 应反映更改。您已更新站点!
To extend the expiration date of a previously-stored site, use the update
command with the --force
flag, and specify the number of additional epochs (from the current epoch) with the --epochs
flag.
附加:设置SuiNS名称
浏览像 https://1lupgq2auevjruy7hs9z7tskqwjp5cc8c5ebhci4v57qyl4piy.walrus.site
这样的 URL 并不是特别好。因此,Walrus Sites 允许使用 SuiNS 名称(这类似于 Sui 的 DNS)为 Walrus Site 分配一个人类可读的名称。为此,您只需获取一个您喜欢的 SuiNS 名称,并将其指向 Walrus Site 的对象 ID(如 publish
或 update
命令提供)。
让我们一步一步来。
获取 SuiNS 名称
-
导航到 https://testnet.suins.io 并使用您的测试网钱包购买一个域名。例如,
walrusgame
(这个特定的已经被占用了,选择另一个您喜欢的)。
将 SuiNS 名称映射到 Walrus Site
现在,您可以将 SuiNS 名称设置为指向您的 Walrus Site 的地址。为此,请转到 SuiNS 网站的 "names you own" 部分,点击您要映射的名称上方的 "三点" 菜单图标,然后点击 "Link To Wallet Address"。在栏中粘贴 Walrus Site 的对象 ID,检查是否正确,然后点击 "Apply"。
批准交易后,我们现在可以浏览 https://walrusgame.walrus.site!
将您的站点从 Devnet 迁移到 Testnet
将 Walrus Site 从 Devnet 迁移到 Testnet 是一个非常简单的手动过程。这是必需的,因为支持站点的存储(Walrus)和在 Sui 上实现 Walrus Sites 功能的合约都已更新。
The migration will result in a new Site object on Sui (with a different object ID), and new blob objects on Walrus Testnet.
The default configuration file for the site-builder
has been moved to the ./sites-config.yaml
instead of the old ./site-builder/assets/builder-example.yaml
.
步骤如下:
- 按照 Walrus 安装说明 获取最新版本的
walrus
二进制文件以及最新的 Walrus 配置文件。 - 通过再次按照 安装说明 确保您拥有最新版本的
site-builder
二进制文件。如果您是从仓库构建并且之前已克隆,请记住git pull
。拉取仓库还可以保证您拥有最新的站点配置文件,指向正确的合约。 - 在您的站点目录上使用
publish
命令运行site-builder
。这将在 Sui 上创建一个新的 Walrus Site 对象,使用新的合约,并在 Walrus Testnet 上重新存储站点文件。请注意,此操作将为您的站点创建一个新的对象 ID! - 可选:如果您为您的站点设置了 SuiNS 名称,您将需要将该名称指向新站点的对象 ID。有关更多详细信息,请参见 设置 SuiNS 名称的教程。
高级功能
继续阅读以了解 Walrus Sites 的高级功能,包括配置 site builder、为站点资源指定标头和路由,以及 将 Sui 对象重定向到 Walrus Sites 以创建每个对象的网站!
站点构建器命令
我们现在更详细地描述通过 site builder 可用的命令。
In general, the --help
flag is your friend, you can add it to get further details for the whole CLI (./target/release/site-builder --help
) or individual commands (e.g., ./target/release/site-builder update --help
).
publish
publish
命令,如 上一节 所述,在 Sui 上发布一个新站点。该命令将目录作为输入,并从其中包含的资源创建一个新的 Walrus Site。
--epochs
标志允许您指定站点数据将在 Walrus 上存储多长时间。默认情况下,这设置为 1
纪元。
On Walrus Testnet, one epoch will last 1 day. Therefore, consider storing your site for a large number of epochs if you want to make it available for the following months! The maximum duration is set to 200 epochs.
如果您只是上传没有 index.html
的原始文件,您可能希望使用 --list-directory
标志,该标志将自动创建一个索引页面以浏览文件。例如,请参见 https://bin.blob.store。
publish
命令还将遵循 ws-resources.json
配置文件中的说明。要了解更多信息,请参见 指定标头和路由 部分。
update
此命令相当于 publish
,但用于更新现有站点。它采用相同的参数,并添加要更新的站点的 Sui 对象 ID。
The wallet you are using to call update
must be the owner of the Walrus Site object to be able to update it.
convert
convert
命令将十六进制格式的对象 ID 转换为等效的 Base36 格式。如果您有 Walrus Site 的 Sui 对象 ID,并且想知道可以浏览它的子域名,则此命令很有用。
site-map
sitemap
命令显示组成给定对象 ID 处的 Walrus Site 的资源。
list-directory
使用 list-directory
,您可以获得通过使用 --list-directory
标志运行 publish
或 update
生成的 index.html
文件。这对于在发布之前查看索引页面的外观很有用——并且可能会进行编辑以使其看起来更好!
配置 site builder
配置 site-builder
工具很简单,但需要小心以确保一切正常工作。
site-builder
工具需要一个配置文件来知道在 Sui 上使用哪个包,使用哪个钱包,gas 预算和其他操作细节。这些大部分通过合理的默认值抽象出来,所以您不需要触及它们。然而,为了完整性,我们在这里提供所有配置选项的详细信息。
最小配置
配置文件应位于 ./sites-config.yaml
中,并且可以使用 --config
标志指向其他位置。对于您的第一次运行,调用 site-builder
并使用 --config sites-config.yaml
应该就足够了,它已经适当配置。
如果由于任何原因,您没有将 walrus
添加到 $PATH
,请确保配置指向二进制文件的指针,请参见下文。
附加选项
如果您想对 site builder 的行为有更多控制,您可以在配置文件中自定义以下变量:
package
:Sui 上 Walrus Sites 包的对象 ID。这必须始终在配置中指定,并且已在assets/example-config.yaml
中适当配置。portal
:查看站点的门户名称;这只影响 CLI 的输出,其他都不影响(默认:walrus.site
)。所有 Walrus Sites 都可以通过任何门户访问,与此设置无关。general
:这些是可以通过 CLI 和配置进行配置的一般选项:rpc_url
:要使用的 Sui RPC 节点的 URL。如果未设置,site-builder
将从钱包中推断它。wallet
:指向要使用的 Sui 钱包的指针。默认情况下,它使用系统范围的钱包(来自sui client addresses
的那个)。walrus_binary
:指向walrus
二进制文件的指针。默认情况下,预计它从$PATH
运行。walrus_config
:walrus
客户端二进制文件的配置,请参见 相关章节。gas_budget
:交易所花费的最大 gas 量(默认:500M MIST)。
指定头和路由
The following features have been released with the Walrus Sites Testnet version.
在其基本配置中,Walrus Sites 通过门户提供静态资产。然而,许多现代 Web 应用程序需要更高级的功能,例如自定义标头和客户端路由。
因此,site-builder 可以读取 ws-resource.json
配置文件,您可以在其中直接指定资源标头和路由规则。
ws-resources.json
文件
此文件可选地放置在站点目录的根目录中,并且 不会 随站点的资源一起上传(换句话说,该文件不是生成的 Walrus Site 的一部分,也不会由门户提供)。
如果您不想使用此默认位置,可以在运行 publish
或 update
命令时使用 --ws-resources
标志指定配置文件的路径。
该文件是 JSON 格式的,类似如下:
{
"headers": {
"/index.html": {
"Content-Type": "text/html; charset=utf-8",
"Cache-Control": "max-age=3500"
}
},
"routes": {
"/*": "/index.html",
"/accounts/*": "/accounts.html",
"/path/assets/*": "/assets/asset_router.html"
}
}
我们现在详细描述配置文件的两个部分,headers
和 routes
。
指定 HTTP 响应标头
headers
部分允许您为特定资源指定自定义 HTTP 响应标头。headers
对象中的键是资源的路径,值是与门户将附加到响应的标头相对应的键值对列表。
例如,在上述配置中,文件 index.html
将以 Content-Type
标头设置为 text/html; charset=utf-8
和 Cache-Control
标头设置为 max-age=3500
提供。
此机制允许您控制资源传递的各个方面,例如缓存、编码和内容类型。
默认标头
默认情况下,无需指定标头,并且可以省略 ws-resources.json
文件。site-builder 将自动尝试根据文件扩展名推断 Content-Type
标头,并将 Content-Encoding
设置为 identity
(无转换)。
如果无法推断内容类型,则 Content-Type
将设置为 application/octet-stream
。
这些默认值将被 ws-resources.json
文件中指定的任何标头覆盖。
指定客户端路由
routes
部分允许您为站点指定客户端路由规则。这在您想要使用单页应用程序 (SPA) 框架(例如 React 或 Angular)时很有用。
routes
对象中的配置是从路由键到资源路径的映射。
routes
键 是 /path/to/some/*
形式的路径模式,其中 *
字符表示通配符。
Currently, the wildcard can only be only be specified at the end of the path. Therefore, /path/*
is a valid path, while /path/*/to
and */path/to/*
are not.
routes
值 是在匹配路由键时应提供的资源路径。
The paths in the values must be valid resource paths, meaning that they must be present among the site's resources. The Walrus sites contract will abort if the user tries to create a route that points to a non-existing resource.
简单的路由算法如下:
- 每当在站点资源中 找不到资源路径 时,门户会尝试将路径与
routes
匹配。 - 然后所有匹配的路由都按 字典顺序排序,并选择 最长 的匹配。
- 然后提供与此最长匹配相对应的资源。
In other words, the portal will always serve a resource if present, and if not present will serve the resource with the longest matching prefix among the routes.
回想上面的例子:
"routes": {
"/*": "/index.html",
"/path/*": "/accounts.html",
"/path/assets/*": "/assets/asset_router.html"
}
将发生以下匹配:
- 浏览
/any/other/test.html
将提供/index.html
; - 浏览
/path/test.html
将提供/accounts.html
,因为它比前一个更具体; - 同样,浏览
/path/assets/test.html
将提供/assets/asset_router.html
。
/index.html
、/accounts.html
和 /assets/asset_router.html
都是 Sui 上 Walrus Sites 对象的现有资源。
链接 Walrus 站点以及从 Walrus 站点链接出去
Walrus 站点中的链接 几乎 像您在常规网站中预期的那样工作。我们在此指定了一些细节。
链接到同一站点内的资源
相对链接和绝对链接(href="/path/to/resource.html"
)像往常一样工作。
链接到网络上的资源
链接到网络上的资源(href="https://some.cdn.example.com/stylesheet.css"
)也像往常一样工作。
Linking to resources in other Walrus Sites
这里有点不同。假设有一些图像,您可以在 https://gallery.walrus.site/walrus_arctic.webp
浏览,并且您想从自己的 Walrus 站点链接它。
请记住,https://walrus.site
只是可能的许多门户之一。也就是说,可以从本地门户(http://gallery.localhost:8080/walrus_arctic.webp
)或任何其他门户(例如,https://gallery.blob.store/walrus_arctic.webp
)浏览相同的资源。因此,如何以 门户无关的方式 链接资源?这对于互操作性、可用性以及尊重用户的门户选择非常重要。
The solution: Walrus Sites links
我们通过让门户解释在网络上通常无效的特殊链接并重定向到门户本身中相应的 Walrus 站点资源来解决这个问题。
考虑上面的例子,其中资源 /walrus_arctic.webp
是从具有 SuiNS 名称 gallery
的 Walrus 站点浏览的,该名称指向对象 ID abcd123…
(Base36 编码)。然后,门户无关的链接是:https://gallery.suiobj/walrus_arctic.webp
。要固定对象 ID 而不是 SuiNS 名称,您可以使用 https://abcd123….suiobj/walrus_arctic.webp
。
另一种可能性是直接指向资源的 Walrus blob ID,并让浏览器“嗅探”内容类型。例如,这适用于图像,但不适用于脚本或样式表。例如,要指向 blob ID(例如,包含图像)qwer5678…
,请使用 URL https://blobid.walrus/qwer5678…
。
使用这样的链接,门户将提取 blob ID 并将请求重定向到它用于获取 blob 的聚合器。
重定向对象到Walrus站点
我们已经在概述中看到了 Sui 上的 Walrus 站点对象的样子。我们现在将讨论如何创建确保一组 任意对象 都可以绑定到特定的,可能是唯一的 Walrus 站点。
目标
考虑一组 NFT,例如由 https://flatland.walrus.site 发布的 NFT。正如我们在那里展示的那样,每个铸造的 NFT 都有自己的 Walrus 站点,可以根据 NFT 本身的内容(例如颜色)进行个性化。我们如何实现这一点?
重定向链接
解决方案很简单:我们在 NFT 的 Display
属性中添加一个“重定向”。每次通过门户浏览 NFT 的对象 ID 时,门户将检查 NFT 的 Display
,如果遇到 walrus site address
键,它将去获取对应对象 ID 的 Walrus 站点。
Move 中的重定向
实际上,在创建 NFT 的 Display
时,您可以包含指向要使用的 Walrus 站点的键值对。
...
const VISUALIZATION_SITE: address = @0x901fb0...;
display.add(b"walrus site address".to_string(), VISUALIZATION_SITE.to_string());
...
如何根据 NFT 更改站点?
上面的代码只会在浏览 NFT 的对象 ID 时打开指定的 Walrus 站点。我们如何确保可以使用 NFT 的属性来个性化站点?
这需要在 VISUALIZATION_SITE
中完成:由于子域仍然指向 NFT 的对象 ID,加载的 Walrus 站点可以在 JavaScript 中检查其 origin
,并使用子域来确定 NFT,从链中获取它,并使用其内部字段来修改显示的站点。
有关端到端示例,请参见 flatland
repo。
Technical Overview
在以下部分中,我们将深入探讨 Walrus 站点的技术规范。
高级图片
Walrus 站点由 Sui 和 Walrus 启用。Walrus 站点的资源(html
、css
、js
、图像等)存储在 Walrus 上,而其主要入口点是存储在 Sui 上的对象,该对象包含站点的元数据并指向 Walrus blob ID。
The Walrus Sites objects on Sui
Walrus 站点
在 Sui 上表示为一个非常简单的对象:
struct Site has key, store {
id: UID,
name: String,
}
与此站点关联的资源然后作为类型为 Resource
的动态字段添加到此对象中:
struct Resource has store, drop {
path: String,
// The walrus blob id containing the bytes for this resource
blob_id: u256,
⋮
}
重要的是,每个资源包含:
- 资源的
路径
,例如/index.html
(所有路径始终表示为从根目录/
开始); blob_id
,即可以找到资源的 Walrus blob ID;以及- 其他字段,将在文档中稍后解释。
这些 Resource
动态字段以类型为 ResourcePath
的结构为键
struct ResourcePath has copy, store, drop {
path: String,
}
这个结构只包含路径的字符串(/index.html
);拥有单独的类型可确保我们不会与其他动态字段发生命名空间冲突,这些字段可能由其他包添加。
要查看其实际操作,请查看资源管理器中的 Walrus 站点,并检查其动态字段。
站点渲染路径
给定 Walrus 站点的 Sui 对象 ID,通过查看动态字段很容易查找组成它的资源,然后使用 Resource
结构中包含的 blob ID 从 Walrus 获取这些资源。
唯一悬而未决的问题是,如何在客户端执行这些查找。有几种方法是可能的:
- 拥有一个服务器,该服务器接受 Sui 对象 ID 和可能的路径的请求,并代表客户端执行此解析,将资源作为标准 HTML 响应返回。
- 在客户端使用一个自定义应用程序,该应用程序既有网络浏览器又了解 Walrus 站点的工作原理,并且可以在本地执行此解析。
- 基于服务工作线程的混合方法,其中能够执行解析的服务工作线程从门户安装到浏览器中。
所有这些方法都是可行的(例如,第一个方法已用于 IPFS 网关中的类似应用程序),并且各有利弊。
目前,我们提供基于服务器端和服务工作线程的方法。
浏览和域隔离
我们必须确保,当通过门户浏览多个站点时,例如托管在 https://walrus.site 的站点,这些站点是隔离的。隔离对于安全性是必要的,并确保浏览器中的钱包连接按预期工作。
为此,我们为每个 Walrus 站点提供门户域的特定 子域。例如,Flatland mint dApp 托管在 https://flatland.walrus.site,其中子域 flatland
通过 SuiNS 唯一关联到 Walrus 站点的对象 ID。
Walrus 站点也可以在没有 SuiNS 的情况下工作:可以 始终 通过使用站点的 Sui 对象 ID 的 Base36 编码作为子域来浏览站点。对于 Flatland dApp,此 URL 为:https://58gr4pinoayuijgdixud23441t55jd94ugep68fsm72b8mwmq2.walrus.site。
选择 Base36 有两个原因,这是由子域标准强制要求的:
- 子域最多可以有 63 个字符,而十六进制编码的 Sui 对象 ID 需要 64 个字符。
- 子域不区分大小写,排除了其他流行的编码,例如 Base64 或 Base58。
Walrus 站点门户
门户类型
如前所述,我们提供两种类型的门户来浏览 Walrus 站点:
- 服务器端门户,这是一个解析 Walrus 站点并将其返回到浏览器的服务器。服务器端门户托管在 https://blob.store。
- 服务工作线程门户,这是一个安装在浏览器中并解析 Walrus 站点的服务工作线程。服务工作线程门户托管在 https://walrus.site。
现在我们描述在浏览器中使用服务工作线程门户解析 Walrus 站点的过程。
Walrus 站点的端到端解析
现在我们更详细地展示了如何使用服务工作线程方法在客户端的浏览器中渲染 Walrus 站点。以下步骤均参考下图:
- ** 站点发布 **(步骤 0):站点开发人员使用
site-builder
或利用发布者发布 Walrus 站点。假设开发人员使用 SuiNS 名称dapp.sui
指向创建的 Walrus 站点的对象 ID。 - ** 浏览开始 **(步骤 1):客户端在其浏览器中浏览
dapp.walrus.site/index.html
。 - ** 服务工作线程安装 **(步骤 2-6):浏览器连接到托管在
walrus.site
的门户,该门户响应一个页面,该页面为dapp.walrus.site
安装服务工作线程。页面刷新以激活服务工作线程。 - ** 站点解析 **(步骤 7-10):现在安装的服务工作线程解释其 来源
dapp.walrus.site
,并进行dapp.sui
的 SuiNS 解析,获取相关的对象 ID。使用对象 ID,然后获取对象的动态字段(还检查 重定向)。从动态字段中,它选择index.html
的字段,并提取其 Walrus blob ID 和头信息(请参阅 头信息高级部分)。 - ** Blob 获取 **(步骤 11-14):给定 blob ID,服务工作线程会向 Walrus 聚合器查询 blob。
- ** 返回响应 **(步骤 15-16):现在服务工作线程已经获取了
/index.html
的字节及其头信息,它可以构建一个响应,然后由浏览器渲染。
这些步骤会对浏览器之后可能查询的所有资源执行(例如,如果 /index.html
指向 assets/cat.png
)。
The site builder
为了方便创建 Walrus 站点,我们提供了 "站点构建器" 工具。站点构建器负责在 Sui 上创建 Walrus 站点对象,具有正确的结构,并将站点资源存储到 Walrus。有关设置和使用说明,请参阅 教程。
Walrus站点门户
我们使用术语 "门户" 来表示用于访问和浏览 Walrus 站点的任何技术。如 概述 中所述,我们预见了三种类型的门户:
- 服务器端门户;
- 自定义本地应用程序;以及
- 浏览器中基于服务工作线程的门户。
目前,服务器端和服务工作线程门户分别可在 https://blob.store 和 https://walrus.site 访问。
在本地运行门户
如果您想在不访问外部门户的情况下浏览 Walrus 站点或出于开发目的,您可以在本地运行服务工作线程门户。
这需要安装 pnpm
工具。首先,克隆 walrus-sites
仓库并进入 portal
目录。在这里,运行
cd portal
pnpm install
# 构建您要使用的门户,或两者都构建
pnpm build:worker
pnpm build:server
来安装依赖项,然后运行以下命令之一:
# 提供服务器端门户服务
pnpm serve:dev:server
# 提供服务工作线程门户服务
pnpm serve:dev:worker
来提供其中一个门户服务。通常,您会发现它在 localhost:8080
提供服务(但请检查服务命令的输出)。
对于生产版本,请使用 prod
命令:serve:prod:server
和 serve:prod:worker
。
配置门户
门户的最重要配置参数在 portal/common/lib/constants.ts
中:
NETWORK
:用于获取 Walrus 站点对象的 Sui 网络。目前,我们使用 Suitestnet
。AGGREGATOR
:服务工作线程将从中获取 Walrus blob 的 聚合器 的 URL。SITE_PACKAGE
:Walrus 站点包的 Sui 对象 ID。MAX_REDIRECT_DEPTH
:服务工作线程在停止之前将遵循的 重定向 数量。SITE_NAMES
:硬编码的name: objectID
映射,以覆盖 SuiNS 名称。仅用于开发。
站点数据认证
Walrus 站点提供了一种简单的机制来验证从客户端的 Walrus 存储中提供的数据。因此,Walrus 站点可以保证(根据设置的不同,具有不同程度的置信度)站点数据是可信的,并且没有被恶意聚合器篡改。
认证机制
Sui 上的 Walrus 站点资源对象与资源信息一起存储资源内容的 SHA-256 哈希值。
当客户端请求资源时,门户将检查从 Walrus 存储(特别是 Walrus 聚合器)接收的数据的哈希值是否与存储在 Sui 上的哈希值匹配。
如果哈希值不匹配,门户将返回以下警告页面:
认证保证
根据部署类型,此技术提供了越来越高的置信度,确保站点数据是可信的。我们按置信度递增的顺序列出它们。
远程服务器端门户部署
在这种情况下,用户必须完全信任门户提供商来验证数据。通过可信的门户,认证机制保证聚合器或缓存(从中获取 blob)没有篡改 blob 的内容。
远程服务工作线程门户部署
在这里,门户提供商仅被信任向用户提供正确的服务工作线程代码。然后,用户的浏览器将执行获取和认证。因此,保证与远程服务器端门户相同,此外,用户可以检查门户提供商返回的代码并验证其完整性(例如,通过将服务工作线程代码的哈希值与已知正确的哈希值进行比较)。
本地门户部署
最后,用户可以克隆 Walrus 站点仓库并在本地部署门户,通过 localhost
浏览 Walrus 站点。在这种情况下,用户完全控制门户代码并可以验证其操作。因此,他们可以完全认证 Walrus 和 Walrus 站点提供的数据是原始开发人员所期望的。
已知限制
Walrus 站点可用于部署几乎任何形式的为现代浏览器构建的传统静态 web2 网站。但是,开发人员在创建或移植网站到 Walrus 站点时应牢记一些限制。
没有秘密值
Walrus 站点是完全公开访问的,因为元数据存储在 Sui 上,站点内容存储在 Walrus 上。因此,开发人员 绝不能 在站点中存储秘密值。
我们再次强调,任何此类后端特定操作(存储秘密值、认证等)都可以通过利用与 Sui 区块链和 Sui 兼容钱包的集成来实现。
有一个最大重定向深度
Walrus 站点可以执行的连续重定向次数由门户限制(请参阅 门户配置)。此措施确保加载 Walrus 站点不会导致无限加载循环。
不同的门户可以根据需要设置此限制。托管在 https://walrus.site 的门户的最大重定向深度为 3。
服务工作线程不可用
Walrus 站点利用客户端浏览器中的服务工作线程执行基本操作:
- 从 Sui 读取站点元数据;
- 从 Walrus 获取页面内容;并且
- 将内容提供给浏览器。
因此,部署在 Walrus 站点上的站点本身无法使用服务工作线程。从 Walrus 站点内安装服务工作线程将导致站点功能失效,并给用户带来不良体验。
This limitation only applies to portal based on service workers. A web portal will not have this limitation.
iOS Sui 移动钱包无法与服务工作线程门户一起使用
由于 WebKit 引擎的限制,服务工作线程无法在 iOS 的应用内浏览器中加载。因此,Walrus 站点无法在 iOS 上的 Sui 兼容钱包应用中使用。因此,Sui 钱包目前无法在 iOS 上的服务工作线程门户中使用。但是,请注意,通过任何浏览器在 iOS 上 浏览 Walrus 站点仍然是可能的。
为了为 iOS 用户(以及其他不支持服务工作线程的浏览器用户)提供无缝体验,我们实现了重定向到服务器端门户(https://blob.store)。每当 iOS 钱包上的用户浏览 Walrus 站点时,重定向将自动将他们带到 <site_name>.blob.store
服务器端门户。这样,用户仍然可以使用钱包。
This limitation only applies to portals based on service workers. A web portal will not have this limitation.
不支持渐进式网络应用程序(PWAs)
根据当前设计,Walrus 站点无法用于渐进式网络应用程序(PWAs)。
服务工作线程门户的两个特性阻止了对 PWAs 的支持:
- 由于需要注册服务工作线程才能使页面工作,浏览器无法直接加载 PWA 的清单文件。
- 每个源只能注册一个服务工作线程。因此,注册 PWA 的服务工作线程将移除 Walrus 站点的服务工作线程,从而破坏 Walrus 站点的功能。
请注意,服务器端门户不受这些限制。然而,目前我们支持这两种技术:Walrus 站点必须能够从服务工作线程门户和服务器端门户加载,因此必须使用更严格的功能集构建。有关更多详细信息,请参阅 PWAs 的安装要求。
Walrus 站点 - 服务条款
Last Updated: June 18, 2024
这些服务条款(“ 条款 ”)管理您对包括由 Mysten Labs, Inc.(“ Mysten Labs ”)提供的 Walrus 站点在内的某些软件服务的使用(统称为“ 服务 ”)。通过访问服务,您同意并接受这些条款和条件。如果您不同意受这些条款的约束,请不要使用服务。
关于美国客户仲裁的重要通知:当您同意这些条款时,您同意(有有限例外)通过具有约束力的个人仲裁而不是在法庭上解决您与 Mysten Labs 之间的任何争议。请仔细阅读以下第十四节“争议解决”以了解有关仲裁的详细信息。
I. 隐私政策
请查看我们的隐私政策,该政策也适用于您对服务的使用,以了解我们如何收集、使用和分享您的信息。通过使用服务,您同意受我们的隐私政策约束。
II. 资格标准
您只能在年满18岁并有能力与 Mysten Labs 签订具有约束力的合同的情况下使用服务,并且在适用法律(包括适用的美国和非美国出口管制和贸易制裁法律)下未被禁止使用服务。
III. Walrus站点
服务允许您访问存储在 Walrus Store 并由 Sui 区块链链接的网站资源(“ 存储对象 ”)。在提供服务时,Mysten Labs 为您提供访问存储对象的方式,但 Mysten Labs 不直接处理存储对象。Mysten Labs 对通过服务访问的存储对象不承担筛选或管理的责任。存储对象由 Mysten Labs 无法控制的人开发。服务可能会让您访问一些人认为令人反感、不适当或冒犯的存储对象。我们对通过服务访问的存储对象的内容不承担任何责任。
IV. 服务条件和免责声明
-
费用。我们可能会对我们提供给您的部分或全部服务收取费用。我们保留随时更改这些费用的权利,完全由我们自行决定。
-
确认某些风险;免责声明。Mysten Labs 对通过服务访问的信息或材料的准确性、内容、完整性、合法性、可靠性或可操作性或可用性不承担任何责任或义务。Mysten Labs 对任何信息或材料的删除、存储失败、错误传递或不及时传递不承担任何责任。Mysten Labs 对通过服务访问任何区块链上的任何信息或材料所造成的任何损害不承担任何责任。您理解并同意,您通过使用服务下载或以其他方式获取材料或数据是出于您自己的判断和风险,您将对下载此类材料或数据导致的任何计算机系统损坏或数据丢失承担全部责任。
服务可能会受到一个或多个监管调查或监管行动的影响,这可能会阻碍或限制 Mysten Labs 继续制作其专有软件的能力,从而可能会阻碍或限制您继续使用服务的能力。
您理解 Walrus Store 和 Sui 区块链(以及服务可能兼容的所有其他网络)仍在开发中,这在使用服务时会带来技术和安全风险,此外还存在与数字资产及其交易相关的不确定性。您承认,在 Sui 区块链上进行交易的成本是可变的,可能随时增加,从而影响在 Sui 区块链上进行的任何活动,这可能导致价格波动或使用服务的价格增加。
服务是按“原样”和“有所有缺陷”的方式提供给您的。我们不对服务的功能、质量或特定用途的适用性做出任何保证或陈述。通过使用服务,您承认并同意以下内容:
- Mysten Labs 不承担任何明示、暗示或法定的保证,包括但不限于任何适销性、非侵权和特定用途适用性的保证。
- Mysten Labs 不保证服务没有错误、漏洞或服务中断,包括您已支付相关燃气费的失败交易。任何使用服务的行为均由您自行承担风险。
- Mysten Labs 不对任何直接、间接、附带、特殊或后果性损害承担责任,无论是因使用服务或无法使用服务而引起的,即使 Mysten Labs 已被告知此类损害的可能性。
- 评估服务提供的任何信息、内容或数据的准确性、完整性和有用性是您的责任。
- Mysten Labs 没有义务为服务提供支持、维护、更新或修复。
- Mysten Labs 没有义务纠正或解决服务中发现的任何错误、缺陷或问题。
- Mysten Labs 可以随时更改、更新或终止服务,恕不另行通知。
- 您使用服务表示您接受与使用服务相关的风险。
V. 所有权
我们授予您有限的、非独占的、可撤销的、不可转让的、不可再许可的使用服务的许可,仅在这些条款中授权的范围内。我们保留这些条款中未明确授予您的所有权利。服务受美国和其他国家的版权、商标、专利和其他法律保护。我们拥有服务及其所有副本的所有权、所有权和权益。这些条款不授予您对我们的商标或服务标志的任何权利。
您可以提交有关服务的反馈、评论或想法(“ 想法 ”)。提交想法完全是自愿的,我们可以自由使用这些想法,而无需对您承担任何义务。
VI. 一般禁止事项和Mysten Labs的执行权利。
您同意不做以下任何事情:
- 未经Mysten Labs明确书面同意,不得使用、展示、镜像或框架服务或服务中的任何单个元素,Mysten Labs的名称,任何Mysten Labs商标、标志或其他专有信息,或页面上包含的任何页面或表单的布局和设计;
- 访问、篡改或使用服务的非公开区域,Mysten Labs的计算机系统或Mysten Labs提供商的技术交付系统;
- 试图探测、扫描或测试任何Mysten Labs系统或网络的漏洞,或破坏任何安全或身份验证措施;
- 避免、绕过、移除、停用、削弱、解码或以其他方式规避Mysten Labs或任何Mysten Labs提供商或任何其他第三方(包括其他用户)实施的任何技术措施,以保护服务;
- 试图使用任何引擎、软件、工具、代理、设备或机制(包括蜘蛛、机器人、爬虫、数据挖掘工具等)访问或搜索服务或从服务下载内容,除非是Mysten Labs提供的软件和/或搜索代理或其他普遍可用的第三方网络浏览器;
- 发送任何未经请求或未经授权的广告、促销材料、电子邮件、垃圾邮件、垃圾邮件、连锁信或其他形式的招揽;
- 未经Mysten Labs明确书面同意,不得使用任何元标签或其他隐藏文本或元数据,利用Mysten Labs的商标、标志URL或产品名称;
- 将服务或其任何部分用于任何商业目的或任何第三方的利益,或以这些条款不允许的任何方式使用;
- 伪造任何TCP/IP数据包头或任何电子邮件或新闻组发布中的头信息的任何部分,或以任何方式使用服务发送更改的、欺骗性的或虚假的源标识信息;
- 试图破译、反编译、反汇编或逆向工程用于提供服务的任何软件;
- 干扰或试图干扰任何用户、主机或网络的访问,包括但不限于发送病毒、过载、洪泛、垃圾邮件或邮件轰炸服务;
- 未经其他服务用户的明确许可,从服务中收集或存储任何个人身份信息;
- 冒充或歪曲您与任何个人或实体的关系;
- 违反任何适用的法律或法规;或
- 鼓励或使任何其他个人做上述任何事情。Mysten Labs没有义务监控对服务的访问或使用或审查或编辑任何内容。但是,我们有权这样做,以便操作服务,确保遵守这些条款并遵守适用的法律或其他法律要求。我们保留在任何时候且无需通知的情况下删除或禁用对任何内容的访问的权利,包括但不限于,如果我们自行决定认为其令人反感或违反这些条款。
我们有权调查违反这些条款或影响服务的行为。我们还可以咨询和配合执法部门起诉违反法律的用户。
VII. DMCA/版权政策
Mysten Labs尊重版权法,并期望其用户也这样做。Mysten Labs的政策是在适当情况下终止反复侵犯或被认为反复侵犯版权持有人权利的用户。
VIII. 制裁
在不限制上述规定的前提下,如果(i)您位于、受控于或是古巴、伊朗、朝鲜、叙利亚或任何其他受美国禁运的国家的国民或居民,或者您在美国财政部的特别指定国民名单或美国商务部的拒绝人员名单、未经验证名单或实体名单上;或(ii)您打算向古巴、伊朗、朝鲜、苏丹或叙利亚或任何其他受美国禁运的国家(或这些国家的国民或居民)或特别指定国民名单、拒绝人员名单、未经验证名单或实体名单上的人员提供任何服务,则您不得下载或使用服务。
IX. 终止
我们可以自行决定在任何时候暂停或终止您对服务的访问和使用,包括暂停访问或终止您的帐户,且无需通知您。如果您有帐户,您可以随时通过删除Wallet网络浏览器扩展并停止任何和所有服务的使用来取消您的帐户。在任何终止、停止或取消服务或您的帐户后,以下条款将继续有效:第八条和第九条至第十五条。
X. 免责声明
服务按“原样”提供,不提供任何形式的保证。在不限制上述规定的前提下,我们明确否认任何适销性、特定用途适用性、安静享受和非侵权的默示保证,以及任何因交易过程或贸易使用而产生的保证。我们不保证服务将满足您的要求,将按预期运行,将没有错误或错误,或将以不间断、安全或无错误的方式提供。我们不保证服务上的任何信息或内容的质量、准确性、及时性、真实性、完整性或可靠性。我们可以随时修改或终止服务,无论是否通知您。
XI. 赔偿
您将赔偿并使Mysten Labs及其高级职员、董事、员工和代理人免受任何索赔、争议、要求、责任、损害、损失和费用,包括但不限于因(a)您访问或使用服务,(b)您的用户内容,或(c)您违反这些条款而产生的或以任何方式与之相关的合理法律和会计费用。
XII. 责任限制
- 在法律允许的最大范围内,Mysten Labs及其参与创建、生产或交付服务的服务提供商均不对因这些条款或使用或无法使用服务而引起的任何附带的、特殊的、示范性的或间接的损害赔偿,或因利润损失、收入损失、储蓄损失、商业机会损失、数据或商誉损失、服务中断、计算机损坏或系统故障或任何类型的替代服务费用承担责任,无论是基于保证、合同、侵权(包括过失)、产品责任或任何其他法律理论,无论Mysten Labs或其服务提供商是否已被告知此类损害的可能性,即使此处规定的有限补救措施被发现未能达到其基本目的。
- 在法律允许的最大范围内,因这些条款或使用或无法使用服务而引起的或与之相关的Mysten Labs的总责任在任何情况下均不超过您为使用服务而支付或应支付给Mysten Labs的金额,或一百美元($100),如果您没有对Mysten Labs的任何付款义务,则适用。
- 上述损害赔偿的排除和限制是Mysten Labs与您之间交易基础的基本要素。
XIII. 适用法律和论坛选择
这些条款及与之相关的任何行为将受《联邦仲裁法》、联邦仲裁法和加利福尼亚州法律的管辖,而不考虑其法律冲突条款。除非第十七条“争议解决”中另有明确规定,您和Mysten Labs不需要仲裁的所有争议(定义如下)的专属管辖权将是位于圣克拉拉县的州和联邦法院,您和Mysten Labs均放弃对这些法院的管辖权和审判地的任何异议。
XIV. 争议解决
- 强制性争议仲裁 。我们各方同意,因这些条款或其违反、终止、执行、解释或有效性或使用服务而引起或与之相关的任何争议、索赔或争议(统称为“争议”)将仅通过具有约束力的个人仲裁解决,而不是在集体、代表或合并的诉讼或程序中解决。您和Mysten Labs同意,《美国联邦仲裁法》管辖这些条款的解释和执行,您和Mysten Labs均放弃由陪审团审判或参与集体诉讼的权利。本仲裁条款在这些条款终止后仍然有效。
- 例外 。作为上述第十七条(A)的有限例外:(i)如果符合条件,我们双方可以在小额索赔法院寻求解决争议;(ii)我们各自保留从法院寻求禁令或其他衡平法救济的权利,以防止(或禁止)侵犯或盗用我们的知识产权。
- 进行仲裁和仲裁规则 。仲裁将由美国仲裁协会(“AAA”)根据其当时有效的《消费者仲裁规则》(“AAA规则”)进行,除非这些条款另有修改。AAA规则可在www.adr.org查看或致电1-800-778-7879获取。希望开始仲裁的一方必须向AAA提交书面仲裁请求,并按照AAA规则的规定通知另一方。AAA提供了仲裁请求表格,网址为www.adr.org。任何仲裁听证会将在您居住的县(或教区)进行,除非我们双方同意不同的地点。双方同意,仲裁员应具有排他性权力来决定与本仲裁协议的解释、适用性、可执行性和范围有关的所有问题。
- 仲裁费用 。所有申请、管理和仲裁员费用的支付将受AAA规则的约束,除非仲裁员认定您的争议无聊,否则我们不会寻求收回我们负责支付的管理和仲裁员费用。如果我们在仲裁中胜诉,我们将支付我们所有的律师费和费用,并且不会向您收回。如果您在仲裁中胜诉,您将有权获得适用法律规定的律师费和费用。
- 禁令和宣告性救济 。除上述第XIV(B)条规定外,仲裁员应根据任何一方提出的任何索赔的实质确定所有责任问题,并且只能为寻求救济的个人当事方授予宣告性或禁令性救济,并且仅在必要的范围内为该当事方的个人索赔提供救济。如果您或我们在索赔中胜诉并寻求公共禁令救济(即,主要目的是禁止威胁公众未来伤害的非法行为的禁令救济),则此类救济的权利和范围必须在具有管辖权的民事法院进行诉讼,而不是在仲裁中。双方同意,在仲裁中任何个人索赔的实质结果出炉之前,公共禁令救济的任何问题的诉讼应暂停。
- 集体诉讼弃权 。您和Mysten Labs同意,双方只能以个人身份对对方提出索赔,而不能作为任何所谓的集体或代表性诉讼中的原告或集体成员。此外,如果双方的争议通过仲裁解决,仲裁员不得将他人的索赔与您的索赔合并,也不得以任何形式主持代表性或集体诉讼。如果此特定条款被发现不可执行,则本争议解决部分的全部内容将无效。
- 可分割性 。除本条款第XVII(F)条( “ 集体诉讼弃权 ” )中的任何条款外,如果具有管辖权的仲裁员或法院决定本条款的任何部分无效或不可执行,则本条款的其他部分仍然适用。
XV. 一般条款
- 权利保留 。Mysten Labs 及其许可方独家拥有服务的所有权利、所有权和权益,包括所有相关的知识产权。您承认服务受美国和外国的版权、商标和其他法律保护。您同意不删除、修改或掩盖服务中或随附的任何版权、商标、服务标记或其他专有权利声明。
- 完整协议 。这些条款构成 Mysten Labs 与您之间关于服务的全部和排他性理解和协议,并且这些条款取代并替换了 Mysten Labs 与您之间关于服务的所有先前的口头或书面理解或协议。如果具有管辖权的仲裁员或法院认定这些条款的任何条款无效或不可执行,则该条款将在最大允许范围内执行,这些条款的其他条款将继续完全有效。除非您所在司法管辖区的适用法律另有规定,否则未经 Mysten Labs 事先书面同意,您不得通过法律或其他方式转让或转移这些条款。在未经我们同意或您的法定权利的情况下,您试图转让或转移这些条款的任何行为将无效。Mysten Labs 可以不受限制地自由转让或转移这些条款。在不违反上述规定的前提下,这些条款将对双方、其继承人和允许的受让人具有约束力并使其受益。
- 通知 。Mysten Labs 根据这些条款提供的任何通知或其他通信将通过以下方式提供:(i) 通过电子邮件;或 (ii) 通过发布到服务。对于通过电子邮件发送的通知,接收日期将被视为此类通知传输的日期。
- 权利放弃 。Mysten Labs 未能执行本条款的任何权利或条款不应被视为放弃此类权利或条款。此类权利或条款的放弃只有在书面形式并由 Mysten Labs 的正式授权代表签署后才有效。除非本条款中明确规定,否则任何一方根据本条款行使其任何救济措施均不影响其根据本条款或其他方式的其他救济措施。
XVI. 联系信息
如果您对本条款或服务有任何疑问,请通过 legal@mystenlabs.com 联系 Mysten Labs。
Walrus 术语表
为了使沟通尽可能清晰和高效,我们确保对每个 Walrus 实体/概念使用单一术语,并且 不 使用任何同义词。下表列出了各种概念、它们的规范名称以及它们与其他术语的关系或区别。
描述中的斜体术语表示表中包含的其他特定 Walrus 术语。
批准名称 | Description |
---|---|
storage node (SN) | 为 Walrus 存储数据的实体;持有一个或多个 shards |
blob | 存储在 Walrus 上的单个非结构化数据对象 |
永久 blob | 所有者无法删除的 blob,保证至少在其到期 epoch 之前可用(假设其有效) |
可删除 blob | 所有者可以随时删除的 blob,以便重新使用存储资源 |
分片 | 所有 blobs 的擦除编码数据的(不相交)子集;在任何时间点,shard 都被分配并存储在单个 SN 上 |
RedStuff | 我们的擦除编码方法,使用两种不同的编码(primary 和 secondary)来实现分片恢复;详细信息请参见 白皮书 |
sliver | 对应于单个 blob 的一个 shard 的擦除编码数据,适用于两种编码之一;这包含该 blob 的几个擦除编码符号,但不包含 blob 元数据 |
sliver 对 | 分片的主 sliver 和次 sliver 的组合 |
blob ID | 从 blob 的 slivers 计算出的加密 ID |
blob 元数据 | 一个 blob 的元数据;特别是,这包含每个 shard 的哈希,以便验证 slivers 和恢复符号 |
(终端)用户 | 任何希望在 Walrus 上存储或读取 blobs 的实体/个人;可以作为 Walrus 客户端本身,或使用 publishers 和 caches 提供的简单接口 |
发布者 | 与 Sui 和 SNs 交互以在 Walrus 上存储 blobs 的服务;为 终端用户 提供一个简单的 HTTP POST 端点 |
聚合器 | 通过与 SNs 交互重建 blobs 的服务,并为 终端用户 提供一个简单的 HTTP GET 端点 |
缓存 | 具有额外缓存功能的 聚合器 |
(Walrus)客户端 | 直接与 SNs 交互的实体;这可以是一个 聚合器/缓存、一个 发布者 或一个 终端用户 |
(blob)重建 | 解码主要 slivers 以获得 blob;包括重新编码 blob 和检查 Merkle 证明 |
(shard/sliver)恢复 | SN 通过从其他 SNs 获取恢复符号来恢复 sliver 或完整 shard 的过程 |
存储证明 | SNs 交换挑战和响应以证明它们正在存储当前分配的 shards 的过程 |
可用性证书(CoA) | 一个 blob ID,其中包含持有至少 shards 的 SNs 的签名,在特定 epoch 中 |
可用性点(PoA) | CoA 提交给 Sui 的时间点,并保证相应的 blob 在其到期之前可用 |
不一致性证明 | 一组带有 Merkle 证明的恢复符号,使得解码的 sliver 与相应的哈希不匹配;这证明了客户端的不正确/不一致编码 |
不一致性证书 | 2/3 的 SNs(按其 shards 数量加权)的聚合签名,表明它们已经看到并存储了一个 blob ID 的不一致性证明 |
存储委员会 | 一个 storage epoch 的 SNs 集合,包括它们负责的 shards 的元数据和其他元数据 |
成员 | 在某个 epoch 中属于 委员会 的 SNs |
存储 epoch | Walrus 的 epoch 不同于 Sui 的 epoch |
可用期 | storage epochs 中指定的一个 blob 在 Walrus 上被认证为可用的时间段 |
到期 | 一个 blob 不再可用并可以删除的结束 epoch;结束 epoch 总是排他的 |
WAL | Walrus 的原生代币 |
FROST | WAL 的最小单位(类似于 SUI 的 MIST);1 WAL 等于 10 亿(1000000000)FROST |
DEVNET 服务条款 - Walrus
最后更新: 2024年6月18日
使用 Mysten Labs Devnet 软件、技术、工具和其他服务(统称为“Devnet”),即表示您同意一般服务条款和这些附加的 Devnet 服务条款(统称为“条款”)。如果您不同意,请不要参与 Devnet。如果您代表某个组织使用 Devnet,您声明并保证您是该组织的授权代表,并有权使该企业或实体受条款约束。
资格标准
只有在以下情况下,您才能使用 Devnet:
- 年满 18 岁并有能力与我们签订具有约束力的合同。
- 在适用法律下未被禁止参与 Devnet。
我们可以自行决定引入新的或更改现有的资格标准或我们认为合适的条件。Testnet可能在某些阶段运行,您参与Testnet的任何一个阶段并不保证您能够参与Testnet的任何其他阶段。
操作
Testnet将在我们规定的日期开始,并持续到我们自行决定终止为止。我们可以在任何时间自行决定更改、终止或清除Testnet的全部或任何部分,暂时或永久地,且无需通知,包括但不限于修改Testnet代币的存在、数量或任何其他适用条件,且对您或其他Testnet用户不承担任何责任。我们不保证Testnet代币会在任何特定时间段内继续提供,您也不能依赖于Testnet代币的持续可用性。如果Testnet到期,您承认并同意您对Testnet代币的访问和使用将被移除,所有累积的Testnet代币将从Testnet系统中删除。Testnet代币不会转换为Mysten Labs提供的任何未来奖励。
无保修
Mysten Labs提供Testnet平台仅作为开发者测试环境。Testnet按“原样”和“所有故障”提供。我们不对所提供服务的可靠性、准确性、性能或特定用途的适用性作出任何明示或暗示的保证。您接受与使用Testnet相关的所有风险,并同意Mysten Labs、其关联公司及其员工不对因使用或无法使用该服务而引起的任何损害承担责任,无论是直接的、间接的、附带的、特殊的、后果性的或惩罚性的损害,包括但不限于利润损失、业务损失或数据丢失。
Mysten Labs 的任何员工或代表均无权作出超出本协议规定的任何保证或陈述。Mysten Labs 的员工或代表就服务所作的任何陈述均不得视为保证或陈述,客户同意赔偿并使 Mysten Labs 免受任何此类陈述的损害。
Testnet平台中的任何缺陷或错误均不构成对本协议的违反,客户同意放弃基于此类缺陷或错误寻求退款或赔偿的任何权利。本“按原样,无保修”条款将在您与Mysten Labs之间的任何其他协议终止或到期后继续有效。
TESTNET 服务条款 - WALRUS
最后更新: 2024年6月18日
通过使用Mysten Labs的Testnet软件、技术、工具和其他服务(统称为 “Testnet” ),您同意一般服务条款和这些附加的Testnet服务条款(统称为 “条款” )。如果您不同意,请不要参与Testnet。如果您代表一个组织使用Testnet,您声明并保证您是该组织的授权代表,并有权使该企业或实体受条款的约束。
隐私政策
请查看我们的隐私政策,该政策也适用于您对Testnet的使用,以了解我们如何收集、使用和分享您的信息。通过使用Testnet,您同意受我们的隐私政策约束。
资格标准
您只有在以下情况下才能使用Testnet:
- 年满 18 岁并有能力与我们签订具有约束力的合同。
- 在适用法律下,您没有被禁止参与Testnet。
我们可以自行决定引入新的或更改现有的资格标准或我们认为合适的条件。Testnet可能在某些阶段运行,您参与Testnet的任何一个阶段并不保证您能够参与Testnet的任何其他阶段。
操作
Testnet将在我们规定的日期开始,并持续到我们自行决定终止为止。我们可以在任何时间自行决定更改、终止或清除Testnet的全部或任何部分,暂时或永久地,且无需通知,包括但不限于修改Testnet代币的存在、数量或任何其他适用条件,且对您或其他Testnet用户不承担任何责任。我们不保证Testnet代币会在任何特定时间段内继续提供,您也不能依赖于Testnet代币的持续可用性。如果Testnet到期,您承认并同意您对Testnet代币的访问和使用将被移除,所有累积的Testnet代币将从Testnet系统中删除。Testnet代币不会转换为Mysten Labs提供的任何未来奖励。
Testnet代币
在Testnet期间,您可以通过Testnet水龙头等方式累积Testnet代币,这些代币不会,也永远不会转换为或累积成为主网代币或任何其他代币或虚拟资产。Testnet代币是没有货币价值的虚拟物品。Testnet代币不构成任何类型的货币或财产,在任何情况下都不可兑换、不可退款或不可用于任何法定货币或虚拟货币或任何其他有货币价值的东西。Testnet代币不能在Testnet之外的用户之间转移,您不得尝试在Testnet之外出售、交易或转移任何Testnet代币,或使用任何Testnet代币获得任何形式的信用。任何在Testnet之外出售、交易或转移任何Testnet代币的尝试将无效。
无保修
Mysten Labs提供Testnet平台仅作为开发者测试环境。Testnet按“原样”和“所有故障”提供。我们不对所提供服务的可靠性、准确性、性能或特定用途的适用性作出任何明示或暗示的保证。您接受与使用Testnet相关的所有风险,并同意Mysten Labs、其关联公司及其员工不对因使用或无法使用该服务而引起的任何损害承担责任,无论是直接的、间接的、附带的、特殊的、后果性的或惩罚性的损害,包括但不限于利润损失、业务损失或数据丢失。
Mysten Labs 的任何员工或代表均无权作出超出本协议规定的任何保证或陈述。Mysten Labs 的员工或代表就服务所作的任何陈述均不得视为保证或陈述,客户同意赔偿并使 Mysten Labs 免受任何此类陈述的损害。
Testnet平台中的任何缺陷或错误均不构成对本协议的违反,客户同意放弃基于此类缺陷或错误寻求退款或赔偿的任何权利。本“按原样,无保修”条款将在您与Mysten Labs之间的任何其他协议终止或到期后继续有效。
隐私政策
最后更新: 2024年6月18日
本隐私政策旨在帮助您了解Mysten Labs, Inc.及其子公司和关联公司(统称为"Mysten Labs"、"我们"、"我们"和"我们的")如何收集、使用和共享您的个人信息,并帮助您根据适用法律理解和行使您的隐私权。当您使用我们的网站、联系我们的团队成员、在社交媒体上与我们互动或以其他方式与我们互动时,本政策适用。
- 范围
- 隐私政策的变更
- 我们收集的个人信息
- HOW WE USE YOUR INFORMATION
- HOW WE DISCLOSE YOUR INFORMATION
- YOUR PRIVACY CHOICES AND RIGHTS
- SECURITY OF YOUR INFORMATION
- INTERNATIONAL DATA TRANSFERS
- RETENTION OF PERSONAL INFORMATION
- SUPPLEMENTAL NOTICE FOR CALIFORNIA RESIDENTS
- SUPPLEMENTAL NOTICE FOR NEVADA RESIDENTS
- CHILDREN'S INFORMATION
- THIRD-PARTY'S WEBSITES/APPLICATIONS
- SUPERVISORY AUTHORITY
- 联系我们
范围
本隐私政策适用于Mysten Labs处理的个人信息,包括在我们的网站(“网站”)和其他在线和离线产品上。网站、我们的服务和其他在线和离线产品统称为“服务”。为明确起见,服务不包括Walrus协议或Walrus或Sui区块链的任何其他去中心化方面,因为这些区块链的去中心化性质不受Mysten Labs控制。
隐私政策的变更
我们可能会不时自行决定修订本隐私政策。如果本隐私政策有任何重大变更,我们将根据适用法律通知您。您理解并同意,如果您在新的隐私政策生效后继续使用我们的服务,您将被视为已接受更新的隐私政策。
PERSONAL INFORMATION WE COLLECT
我们收集的个人信息类别取决于您与我们的互动方式、我们的服务和适用法律的要求。我们收集您提供给我们的信息、您使用我们的服务时我们自动获取的信息以及来自其他来源的信息,例如第三方服务和组织,如下所述。
A. 您直接提供给我们的信息
我们可能会收集您提供给我们的以下个人信息。
- 账户创建。如果您在我们这里创建账户,我们可能会收集信息,例如您的姓名、用户名、电子邮件地址或密码。
- 钱包和交易信息。为了在服务上进行交易,您可能需要向我们或我们的第三方支付处理方提供访问或有关您的数字钱包的信息。我们绝不会向您索取或收集您的私钥。
- 其他交易。我们可能会收集与您在我们服务上的活动相关的个人信息和详细信息,包括向您提供与您使用服务相关的奖励。
- 您与我们的通信。当您请求有关我们服务的信息、注册我们的新闻通讯或营销推广、请求客户或技术支持、申请工作或以其他方式与我们沟通时,我们可能会收集个人信息,例如电子邮件地址。
- 互动功能。我们和其他使用我们服务的人可能会收集您通过我们的互动功能(例如,通过Mysten Labs社区、评论功能、论坛、博客和社交媒体页面)提交或提供的个人信息。您在这些功能的公共部分提供的任何个人信息将被视为“公开”,除非适用法律另有要求,并且不受本文所述的隐私保护。
- 调查。我们可能会联系您参与调查。如果您决定参与,您可能会被要求提供某些信息,这些信息可能包括个人信息。
- 抽奖、赠品或竞赛。我们可能会收集您为我们提供的任何抽奖、赠品或竞赛提供的个人信息。在某些司法管辖区,我们需要公开分享抽奖和竞赛获奖者的信息。
- 活动。当我们参加或举办会议、贸易展览和其他活动时,我们可能会收集个人信息。
- 业务发展和战略合作伙伴关系。我们可能会收集个人和第三方的个人信息,以评估和追求潜在的商业机会。
- 职位申请。我们可能会在我们的服务上发布职位空缺和机会。如果您通过提交申请、简历和/或求职信回复这些职位发布,我们将收集并使用这些信息来评估您的资格。
B. Information Collected Automatically
当您使用我们的服务时,我们可能会自动收集个人信息:
- 自动数据收集。当您使用我们的服务时,我们可能会自动收集某些信息,例如您的互联网协议(IP)地址、用户设置、MAC地址、cookie标识符、移动运营商、移动广告和其他唯一标识符、浏览器或设备信息、位置信息(包括从IP地址推导的大致位置)、互联网服务提供商以及您提供的内容的元数据。我们还可能自动收集有关您使用我们服务的信息,例如您在使用我们服务之前、期间和之后访问的页面、您点击的链接、您互动的内容类型、您的活动频率和持续时间以及有关您如何使用我们服务的其他信息。
- Cookies、像素标签/网络信标和其他技术。我们以及在我们的服务上提供内容、广告或其他功能的第三方,可能会使用cookies、像素标签、本地存储和其他技术("技术")通过您使用我们的服务自动收集信息。
- Cookies。Cookies是放置在设备浏览器中的小型文本文件,用于存储偏好并促进和增强您的体验。
- 像素标签/网络信标。像素标签(也称为网络信标)是嵌入在我们服务中的一段代码,用于收集有关用户在我们服务上的互动信息。使用像素标签可以让我们记录,例如,用户访问了特定网页或点击了特定广告。我们还可能在电子邮件中包含网络信标,以了解消息是否已被打开、操作或转发。
我们对这些技术的使用分为以下几类:
- 操作必要。这包括允许您访问我们的服务、应用程序和工具的技术,这些技术用于识别异常网站行为、防止欺诈活动、提高安全性或允许您使用我们的功能;
- 性能相关。我们可能会使用技术来评估我们服务的性能,包括作为我们分析实践的一部分,以帮助我们了解个人如何使用我们的服务(见下文分析);
- 功能相关。我们可能会使用技术,在您访问或使用我们的服务时为您提供增强的功能。这可能包括在您登录我们的服务时识别您,或跟踪您指定的偏好、兴趣或过去查看的项目;
- 广告或目标相关。我们可能会使用第一方或第三方技术在我们的服务或第三方网站上投放与您的兴趣相关的内容,包括广告。
请参阅下文的"您的隐私选择和权利",了解您对这些技术的选择。
- 分析。我们可能会使用我们的技术和其他第三方工具来处理我们服务上的分析信息。这些技术使我们能够处理使用数据,以更好地了解我们的网站和与网络相关的服务的使用情况,并不断改进和个性化我们的服务。我们的一些分析合作伙伴包括:
- Google Analytics。有关Google如何使用您的数据的更多信息(包括其自身目的,例如用于分析或将其与其他数据关联),请访问Google Analytics的隐私政策。要了解更多关于如何选择退出Google Analytics使用您的信息,请点击这里。
- LinkedIn Analytics。有关更多信息,请访问LinkedIn Analytics的隐私政策。要了解更多关于如何选择退出LinkedIn使用您的信息,请点击这里。
- Facebook Connect。有关更多信息,请访问Facebook的数据政策。您可以通过登录您的Facebook帐户并联系以下地址,反对Facebook像素收集您的数据,或反对将您的数据用于显示Facebook广告的目的:https://www.facebook.com/settings?tab=ads。
- Mixpanel。有关Mixpanel的更多信息,请访问Mixpanel的隐私政策。
- 社交媒体平台。我们的服务可能包含社交媒体按钮,例如Discord、Twitter、Instagram、TikTok、Youtube和Telegram,这些按钮可能包括“分享此内容”按钮或其他交互式小程序。这些功能可能会收集您的IP地址以及您在我们服务上访问的页面,并可能设置cookie以使该功能正常运行。您与这些平台的互动受提供该功能的公司的隐私政策的约束。
C. 从其他来源收集的信息
- 第三方来源。我们可能会从其他来源获取有关您的信息,包括通过第三方服务和组织。例如,如果您通过第三方应用程序(如应用商店、第三方登录服务或社交网络网站)访问我们的服务,我们可能会从您通过隐私设置提供的该第三方应用程序中收集有关您的信息。
- 推荐、分享和其他功能。我们的服务可能提供各种工具和功能,允许您通过我们的推荐服务提供有关您朋友的信息;第三方也可能使用这些服务上传有关您的信息。我们的推荐服务还可能允许您将某些内容转发或分享给朋友或同事,例如邀请您的朋友使用我们服务的电子邮件。请仅与我们分享您有关系的人的联系信息(例如,亲戚、朋友、邻居或同事)。
我们如何使用您的信息
我们出于各种业务目的使用您的信息,包括提供我们的服务、用于管理目的以及营销我们的产品和服务,如下所述。
A. 提供我们的服务
我们使用您的信息来履行与您的合同,并向您提供我们的服务和履行与您的合同,例如:
- 管理您的信息和账户;
- 提供访问我们服务的某些区域、功能和特性的权限;
- 回答客户或技术支持请求;
- 与您沟通有关您的账户、在我们服务上的活动和政策变更;
- 处理有关您钱包的信息,以便通过服务进行转账;
- 如果您申请我们在服务上发布的职位,处理申请;以及
- 允许您注册活动。
B. 管理目的
我们出于合法利益使用您的信息,例如:
- 追求我们的合法利益,例如直接营销、研究和开发(包括市场研究)、网络和信息安全以及防止欺诈;
- 检测安全事件,防止恶意、欺骗、欺诈或非法活动,并起诉对该活动负责的人;
- 衡量对我们服务的兴趣和参与度;
- 改进、升级或增强我们的服务;
- 开发新产品和服务;
- 确保内部质量控制和安全;
- 验证和核实个人身份;
- 调试以识别和修复我们服务中的错误;
- 审计与互动、转账和其他合规活动相关的内容;
- 根据需要与第三方共享信息以提供服务;
- 执行我们的协议和政策;以及
- 根据需要用于履行我们的法律义务的其他用途。
C. 营销和广告我们的产品和服务
我们可能会使用个人信息来定制和向您提供内容和广告。我们可能会在适用法律允许的情况下向您提供这些材料。我们可能向您进行营销的一些方式包括电子邮件活动、自定义受众广告和“基于兴趣”或“个性化广告”,包括通过跨设备跟踪。
如果您对我们的营销做法有任何疑问,或者如果您希望选择不将您的个人信息用于营销目的,您可以随时按照下文“联系我们”中的说明与我们联系。
D. 经您同意
我们可能会将个人信息用于在您提供个人信息时明确向您披露的其他目的,或经您同意。
E. 其他目的
我们还根据您的要求或适用法律允许的其他目的使用您的信息。
- 自动决策。我们可能会进行自动决策,包括分析。Mysten Labs对您的个人信息的处理不会导致仅基于自动处理的决定对您产生重大影响,除非此类决定是我们与您签订合同的一部分,我们已获得您的同意,或法律允许我们进行此类自动决策。如果您对我们的自动决策有任何疑问,您可以按照下文“联系我们”中的说明与我们联系。
- 去标识化和汇总信息。我们可能会使用个人信息和有关您的其他信息来创建去标识化和/或汇总信息,例如去标识化的人口统计信息、去标识化的位置信息、您访问我们服务的设备信息或我们创建的其他分析。
我们如何披露您的信息
我们向第三方披露您的信息以实现各种业务目的,包括提供我们的服务、保护我们或他人,或在发生重大业务交易(如合并、出售或资产转让)时,如下所述。
A. 为提供我们的服务而进行的信息披露
我们可能与之共享您的信息的第三方类别如下所述。
- 关于使用区块链的通知。服务上的交易将通过区块链进行。有关您转账的信息将提供给区块链,并且由于区块链的公共性质,第三方可能会访问这些信息。由于区块链的条目本质上是公开的,并且由于有人可能通过使用外部信息来源识别您的假名公共钱包地址,您在区块链上进行的任何交易都可能被用来识别您或有关您的信息。
- 服务的其他用户和与您交易的各方。您的某些个人信息可能对服务的其他用户可见(例如,您的个人资料中一般可访问部分的信息;其他Mysten Labs服务用户的用户名)。此外,为了通过服务完成转账,我们需要与您进行交易的一方共享您的某些个人信息。
- 第三方网站和应用程序。您可以选择共享个人信息或与第三方网站和/或第三方应用程序互动,包括但不限于第三方电子钱包扩展。一旦您的个人信息与第三方网站或第三方应用程序共享,它也将受该第三方的隐私政策的约束。我们建议您在共享个人信息或与其互动之前,仔细阅读每个第三方网站或第三方应用程序的隐私政策。请注意,我们不控制,也不对第三方网站或第三方应用程序处理您的个人信息负责。
- 服务提供商。我们可能会与我们的第三方服务提供商共享您的个人信息,这些服务提供商使用这些信息来帮助我们提供我们的服务。这包括为我们提供IT支持、托管、客户服务和相关服务的服务提供商。
- 业务合作伙伴。我们可能会与业务合作伙伴共享您的个人信息,以向您提供您请求的产品或服务。我们还可能与我们共同提供产品或服务的业务合作伙伴共享您的个人信息。
- 关联公司。我们可能会与我们的公司成员共享您的个人信息。
- 其他用户/网站访问者。如上文"我们收集的个人信息"所述,我们的服务允许您与其他用户或公开分享您的个人资料和/或用户内容,包括那些不使用我们服务的人。
- 广告合作伙伴。我们可能会与第三方广告合作伙伴分享您的个人信息。这些第三方广告合作伙伴可能会在我们的服务上设置技术和其他跟踪工具,以收集有关您的活动和设备的信息(例如,您的IP地址、cookie标识符、访问的页面、位置、时间)。这些广告合作伙伴可能会使用这些信息(以及从其他服务收集的类似信息)来在您访问其网络内的数字属性时向您投放个性化广告。这种做法通常被称为“基于兴趣的广告”或“个性化广告”。
- APIs/SDKs。我们可能会使用第三方应用程序接口("APIs")和软件开发工具包("SDKs")作为我们服务功能的一部分。有关我们使用APIs和SDKs的更多信息,请按照下文“联系我们”中的说明与我们联系。
B. 为保护我们或他人而进行的信息披露
如果我们真诚地认为这样做是必要或适当的,我们可能会访问、保存和向外部方披露我们存储的与您相关的任何信息,以:遵守执法或国家安全请求和法律程序,例如法院命令或传票;保护您、我们或他人的权利、财产或安全;执行我们的政策或合同;收取欠我们的款项;或协助调查或起诉涉嫌或实际的非法活动。
C. 在合并、出售或其他资产转让情况下的信息披露
如果我们涉及合并、收购、融资尽职调查、重组、破产、接管、资产购买或出售,或服务转移到另一个提供商,您的信息可能会作为此类交易的一部分被出售或转让,法律和/或合同允许的情况下。
您的隐私选择和权利
您的隐私选择。您对个人信息的隐私选择由适用法律决定,具体描述如下。
- 电子邮件通信。如果您收到我们发送的不需要的电子邮件,您可以使用电子邮件底部的退订链接选择不再接收未来的电子邮件。请注意,您将继续收到与您请求的服务相关的转账电子邮件。我们还可能向您发送有关我们和我们服务的某些非促销通信,您将无法选择退出这些通信(例如,关于我们服务的通信或我们服务条款或本隐私政策的更新)。
- 短信。您可以按照从我们收到的短信中的说明选择不再接收我们的短信,或通过其他方式与我们联系。
- 移动设备。我们可能会通过我们的移动应用程序向您发送推送通知。您可以通过更改移动设备上的设置选择不再接收这些推送通知。经您同意,我们还可能通过我们的移动应用程序收集基于精确位置的信息。您可以通过更改移动设备上的设置选择不再收集这些信息。
- “请勿追踪。” 请勿追踪("DNT")是一种用户可以在某些网络浏览器中设置的隐私偏好。请注意,我们不会响应或遵守网络浏览器传输的DNT信号或类似机制。
- Cookies和基于兴趣的广告。您可以通过调整浏览器或设备允许的偏好来停止或限制在您的设备上放置技术或将其移除。但是,如果您调整偏好,我们的服务可能无法正常工作。请注意,基于cookie的选择退出在移动应用程序上无效。但是,您可以按照Android、iOS和其他的说明选择退出某些移动应用程序上的个性化广告。
在线广告行业还提供了一些网站,您可以通过这些网站选择不再接收参与自律计划的数据合作伙伴和其他广告合作伙伴的定向广告。您可以访问这些网站,了解有关定向广告和消费者选择及隐私的更多信息:网络广告倡议、数字广告联盟、欧洲数字广告联盟和加拿大数字广告联盟。
请注意,您必须在每个浏览器和每个设备上分别选择退出。
您的隐私权利。根据适用法律,您可能有权:
-
访问有关您的个人信息,包括:(i) 确认我们是否正在处理您的个人信息;(ii) 获取您的个人信息或其副本;或 (iii) 接收您提供给我们的个人信息的电子副本,或要求我们将该信息发送给另一家公司(即数据可携权);
-
请求更正您的个人信息,如果它不准确或不完整。在某些情况下,我们可能会提供自助工具,使您能够更新您的个人信息;
请求删除您的个人信息;
- 请求限制或反对我们处理您的个人信息,包括在处理您的个人信息基于我们的合法利益或用于直接营销目的的情况下;以及
撤回您对我们处理您的个人信息的同意。请注意,您的撤回仅对未来的处理生效,不会影响撤回前处理的合法性。
如果您想行使这些权利中的任何一项,请按照下文“联系我们”中的说明与我们联系。我们将根据适用法律处理此类请求。
您的信息安全
我们采取措施,确保您的信息得到安全处理,并符合本隐私政策。不幸的是,没有任何系统是100%安全的,我们无法确保或保证您提供给我们的任何信息的安全性。在适用法律允许的最大范围内,我们不对未经授权的披露承担责任。
通过使用我们的服务或向我们提供个人信息,您同意我们可以通过电子方式与您沟通有关您使用我们服务的安全、隐私和管理问题。如果我们得知安全系统被破坏,我们可能会尝试通过在我们的服务上发布通知、通过邮件或向您发送电子邮件的方式通知您。
国际数据传输
我们处理的所有信息可能会在世界任何地方传输、处理和存储,包括但不限于美国或其他国家,这些国家的数据保护法律可能与您所在国家的法律不同。我们努力根据适用法律的要求保护您的信息。
如果我们将源自欧洲经济区、瑞士和/或英国的个人信息传输到一个未被发现提供足够保护水平的国家,我们可能会使用的一种保障措施是欧盟标准合同条款。
个人信息的保留
我们按照本隐私政策的描述存储我们收集的个人信息,只要您使用我们的服务或为实现收集目的、提供我们的服务、解决争议、建立法律辩护、进行审计、追求合法商业目的、执行我们的协议和遵守适用法律所必需的时间。
为了确定个人信息的适当保留期限,我们可能会考虑适用的法律要求、个人信息的数量、性质和敏感性、某些风险因素、我们处理您的个人信息的目的以及我们是否可以通过其他方式实现这些目的。
加利福尼亚州居民的补充通知
本加利福尼亚州居民的补充通知仅适用于我们处理受2018年加利福尼亚州消费者隐私法("CCPA")约束的个人信息。Mysten Labs不认为其受CCPA约束。尽管如此,Mysten Labs为了透明性提供了本补充通知。CCPA赋予加利福尼亚州居民了解Mysten Labs收集了哪些类别的个人信息以及Mysten Labs在过去十二个月中是否为商业目的(例如,向服务提供商)披露了这些个人信息的权利。加利福尼亚州居民可以在下方找到这些信息:
Category of Personal Information Collected by Mysten Labs | Categories of Third Parties Personal Information is Disclosed to for a Business Purpose |
---|---|
Identifiers A real name, postal address, unique personal identifier, online identifier, Internet Protocol address, email address, account name, or other similar identifiers. |
|
Personal information categories listed in Cal. Civ. Code § 1798.80(e) A name, signature, Social Security number, address, telephone number, passport number, driver’s license or state identification card number, insurance policy number, education, employment, employment history, bank account number, credit card number, debit card number, or any other financial information. Personal Information does not include publicly available information that is lawfully made available to the general public from federal, state, or local government records. Note: Some personal information included in this category may overlap with other categories. |
|
Protected classification characteristics under California or federal law Age (40 years or older), race, color, ancestry, national origin, citizenship, religion or creed, marital status, medical condition, physical or mental disability, sex (including gender, gender identity, gender expression, pregnancy or childbirth and related medical conditions), sexual orientation, veteran or military status, genetic information (including familial genetic information). |
|
Commercial information Records of personal property, products or services purchased, obtained, or considered, or other purchasing or consuming histories or tendencies. |
|
Internet or other electronic network activity Browsing history, search history, information on a consumer’s interaction with an internet website, application, or advertisement. |
|
Professional or employment-related information Current or past job history or performance evaluations. |
|
Inferences drawn from other personal information to create a profile about a consumer Profile reflecting a consumer’s preferences, characteristics, psychological trends, predispositions, behavior, attitudes, intelligence, abilities, and aptitudes. |
|
我们收集个人信息的来源类别以及我们使用个人信息的业务和商业目的分别在上文的“我们收集的个人信息”和“我们如何使用您的信息”中列出。
根据CCPA的个人信息“销售”。根据CCPA的规定,Mysten Labs不“出售”个人信息,我们也没有实际知道任何16岁以下未成年人的个人信息“销售”。
加利福尼亚州居民的额外隐私权利
非歧视。加利福尼亚州居民有权不因行使CCPA赋予的权利而受到我们的歧视性待遇。
授权代理人。只有您或依法授权代表您行事的人,才能提出与您的个人信息相关的可验证消费者请求。要指定授权代理人,请按照下文“联系我们”中的说明与我们联系,并提供由您和指定代理人签署的书面授权。
验证。为了保护您的隐私,我们将在履行您的请求之前采取以下步骤来验证您的身份。当您提出请求时,我们会要求您提供足够的信息,以便我们合理地验证您是我们收集个人信息的对象或授权代表,这可能包括确认与我们拥有的任何个人信息相关的电子邮件地址。如果您是加利福尼亚州居民,并希望行使CCPA赋予您的任何权利,请按照下文“联系我们”中的说明与我们联系。我们将根据适用法律处理此类请求。
**推荐朋友和类似的在“我们如何使用您的个人信息”中,我们可能会提供推荐计划或其他激励性数据收集计划。例如,我们可能会为您提供与这些计划相关的激励措施,如折扣或促销品或积分,您提供您的个人信息以换取奖励,或提供有关您的朋友或同事的个人信息(例如他们的电子邮件地址),并在他们注册使用我们的服务时获得奖励。(被推荐方也可能因通过您的推荐注册而获得奖励。)这些计划完全是自愿的,允许我们发展业务并为您提供额外的好处。您的数据对我们的价值取决于您最终如何使用我们的服务,而被推荐方的数据对我们的价值取决于被推荐方最终是否成为用户并使用我们的服务。该价值将反映在与每个计划相关的激励措施中。
可访问性。本隐私政策使用行业标准技术,并根据万维网联盟的Web内容可访问性指南2.1版开发。如果您希望打印此政策,请通过您的网络浏览器或将页面保存为PDF进行打印。
加利福尼亚州“闪耀之光”。加利福尼亚州的“闪耀之光”法律允许加利福尼亚州居民用户每年免费向我们请求并获得一份我们在前一个日历年中为其直接营销目的披露其个人信息的第三方名单(如果有),以及向这些第三方披露的个人信息类型。
未成年人删除已发布内容的权利。在法律要求的情况下,18岁以下的加利福尼亚州居民可以直接按照下文“联系我们”中的说明与我们联系,要求将其发布的内容或信息从服务的公开可见部分删除。
内华达州居民的补充通知
如果您是内华达州的居民,您有权选择不将某些个人信息出售给打算许可或出售该个人信息的第三方。您可以通过以下“联系我们”中的说明与我们联系,主题行填写“内华达州不出售请求”,并提供您的姓名和与您的账户关联的电子邮件地址。请注意,我们目前不会按照内华达州修订法规第603A章的定义出售您的个人信息。
儿童信息
本服务不针对13岁以下的儿童(或当地法律要求的其他年龄),我们不会有意收集儿童的个人信息。如果您发现您的孩子在未经您同意的情况下向我们提供了个人信息,您可以按照以下“联系我们”中的说明与我们联系。如果我们发现我们收集了违反适用法律的儿童个人信息,我们将立即采取措施删除这些信息。
第三方网站/应用程序
本服务可能包含指向其他网站/应用程序(如GitHub)的链接,其他网站/应用程序也可能引用或链接到我们的服务。这些第三方服务不受我们的控制。我们鼓励用户阅读他们所使用的每个网站和应用程序的隐私政策。我们不认可、筛选或批准这些其他网站或应用程序的隐私实践或内容,并且不对此负责。向第三方网站或应用程序提供个人信息的风险由您自行承担。
监督机构
如果您位于欧洲经济区、瑞士、英国或巴西,您有权向监督机构投诉,如果您认为我们处理您的个人信息违反了适用法律。
联系我们
如果您对我们的隐私实践或本隐私政策有任何疑问,或行使本隐私政策中详细说明的您的权利,请通过以下方式联系我们:
Mysten Labs, Inc.
收件人:隐私组
大学大道379号,#200
帕洛阿尔托,加利福尼亚州 94301
privacy@mystenlabs.com
+1 (408) 384-8237