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。有关设置和使用说明,请参阅 教程。