walrus site Move源码解析

什么是WalrusSite?WalrusSite是利用Walrus存储资源的特性,在Portal中通过http协议,把数据以网站的形式展现给用户的一种结构。基本数据结构每个Walrus站点的核心是一个Site结构体,它包含站点的基本信息,如站点唯一标识(id)和名称(

什么是 Walrus Site?

Walrus Site 是利用 Walrus 存储资源的特性,在Portal 中通过 http 协议,把数据以网站的形式展现给用户的一种结构。

基本数据结构

每个 Walrus 站点的核心是一个 Site 结构体,它包含站点的基本信息,如站点唯一标识(id)和名称(name):

public struct Site has key, store {
    id: UID,
    name: String,
}

每新建一个站点,等于新建这样一个对象。后续,通过 dynamicfield 关联资源信息和路由信息。 因为,后续操作站点都是通过这个对象来实现,如果 share 这个 struct , 那就是个去中心化的 维基百科了。

资源数据结构

站点对应的资源保存在 Resource 的struct 中:

public struct Resource has store, drop {
    path: String,
    headers: vec_map::VecMap<String, String>,
    blob_id: u256,
    blob_hash: u256,
    range: Option<Range>,
}

即 一个 URL 按照 路径,可以解析到 对应的 存储对象。 blob_id 和 walrus 上的一个存储资源对应。 blob_hash 用来验证数据完整性。通过range 完成资源分块的获取输出。

headers 中的信息,也是可以返回给浏览器的。 开发者可以借助 header 完成更丰富的功能。

比如 :

  1. 特殊情况 301 跳转
  2. 返回cookie 并写入
  3. 浏览器缓存控制
  4. .... 更丰富的功能.

每个资源会通过 Path 关联的一个对象在 Sui 上存储:

 df::add(&mut site.id, path_obj, resource);

同理,也可以用这种方式获取。

特殊对象

每个站点除了资源 Map 以外,还包含一个字符串的Map 用来做跳转。 其资源结构如下:

  public struct Routes has store, drop {
      route_list: vec_map::VecMap<String, String>,
  }

可以用来处理特殊资源的跳转: 比如 默认网站根目录:

访问 "/" 跳转到 "/index.html"

以上便是,walrus site 相关联的合约部分说明了。

源码链接: https://github.com/MystenLabs/walrus-sites/blob/main/move/walrus_site/sources/site.move

  • 原创
  • 学分: 3
  • 分类: Sui
  • 标签:
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
xing.sir
xing.sir
0x427f...39a8
web3 让世界更美好。