Swarm白皮书学习

Swarm白皮书个人翻译,仅供学习参考,详细请参考官方版本 Swarm Whitepaper, v1.0 of June 13, 2021

Swarm - 自主权数字社会的存储和通信基础架构

Swarm是一个点对点网络,网络中的所有节点作为一个整体,共同为用户提供去中心化存储和通信服务。凭借其内置的激励机制,整个系统在经济上是自给的。其内置激励机制通过Ethereum智能合约和BZZ token共同驱动。

在本文中,我们首先介绍Swarm的网络层,其实现了对固定大小的数据单元的分布式归档存储。然后我们会描述Swarm API提供的上层功能,这些功能为去中心化web提供了一个切实可行的开发栈和部署环境。

1. Swarm简介

Swarm的使命是要通过为去中心化互联网提供可扩展的基础层基础设施来重塑未来,以达到一个自主权的全球社会和无需授权的开放市场。其愿景是用点对点存储和通信来扩展当前的区块链,以此实现一个世界电脑,能够为去中心化应用提供操作系统和部署环境。

Swarm提供持续且具有弹性的服务来应对网络中断故障和那些有针对性的拒绝服务攻击。作为一个无需授权的信息发布平台,Swarm鼓励和提倡信息自由。Swarm通过匿名浏览、可拒绝存储、不可追踪消息,和不会泄露文件信息的文件格式描述等一系列卓越的隐私保护功能,积极响应Web不断增长的安全需求。

内置的激励机制寻求优化带宽和存储资源分配的同时,也使Swarm在经济上能自我供给。Swarm节点会追踪每个对端连接上的相对带宽贡献和不对等BZZ消耗导致的超额债务。Swarm中的信息发布者必须花费BZZ来购买向Swarm写入数据的权力,并且预付租金来获取数据的长期存储。

作为模块化设计的模范,图1清晰地展示了Swarm包含的可分离层级。技术上来说,层2和层3构成了Swarm的核心,会在本文接下来的两部分中讨论。
在这里插入图片描述

2. DISC - 分布式不可变存储数据块

分布式不可篡改存储数据块(DISC)是Swarm底层的数据存储模型。它包含了一系列在存储和服务数据上相互配合的节点。虽然从单个节点的角度来看,每个节点都会尽力追求运营者利润的最大化,但是作为一个整体,整个网络的行为却可以达到以下特性:

  • 隐私保护和无需授权的上传和下载
  • 数据发布后的健壮性保护,内容发布后即不能禁止和修改访问权限
  • 内容的完整性保护
  • 对不需要保存的内容的最终遗忘

任何拥护空闲存储和带宽能力的人都可以作为节点运营者参与到DISC中来,并且从中获得奖励。运营者安装并运行Swarm客户端软件后,就会创建一个新节点,这个节点会成为Swarm网络的一部分,负责Swarm整个全球存储中的一部分。

在接下来的章节中,我们会定义DISC,并详细解释它是如何支持上边提到的这些特性的。

2.1 网络连接、拓扑和路由

DISC的最初职责是建立和维护一个多节点网络,网络中所有节点之间可以相互发送消息。消息交互通过节点间持久、安全的,基于点对点通信协议的通信通道进行。Swarm期望节点自己去建立Kademlia连接,也就是说,新节点在接入一个特定的子网以后,节点自己的每一次转发决定都会促进消息路由子的全局优化。

Kademlia算法假设每个节点都会被分配到一个Swarm地址,这个地址与节点本身的网络地址是不同的。通过计算两个Swarm地址中前缀字节的相同位数,我们可以定义两个节点的相似度数。最接近彼此的节点会形成完全相连的“邻居”。另外,每个节点还会与每个不同相似度中的多个节点连接。

图2: Kademlia连接。 图中中间部分为与节点完全连接的邻居网络,包含了至少8个节点,我们可以定义相似度为d。同时这个节点也与每个相似度桶(相似度为d-1, d-2, ..., 0)中的至少8个平衡节点连接。

因此产生的网络拓扑能够保证中继节点在转发消息过程中的每一跳都能够使消息更接近目的地(如图3所示)。这保证了消息可以在任何两个节点间路由,即使两个节点间没有直接连接。传递消息需要的跳数上限是总节点数的对数,这确保了任何两个节点之间的可达性,即使是在一个超级大的网络中。

 图3:Kademlia转发中的请求响应回路
覆盖地址为…0000…的节点正在向地址为…1111…的节点发送请求。地址开始的省略号表示发送者和目的节点之间共享的地址前缀,长度为n个字节;末尾的省略号表示与路由不相关的地址部分,因为在当前深度下地址的末尾都不会相同。请求者将消息转发给与自己连接的、自认为离目的地最近的节点(图中的黄色节点)。中继节点依据同样的策略通过黄色、橙色、蓝色节点形成的链路转发消息,每次转发消息就会离目标节点更近。路径上的中继节点会记录请求发送来的节点,这样当响应到达时,他们可以按相同的路由将响应传递回去。

2.2 数据块和存储

Swarm中的标准存储单元被叫做chunk (数据块). 数据块最多包含大小为4kB的数据,并且有自己的地址。由于数据库的地址是从与节点地址相同的地址空间分配的,类似的也可以根据地址地址计算数据块之间的相似度。Swarm的存储架构规定,每个数据块由与自己地址接近的节点负责存储。

为了数据的私密性,数据块先被封装成4kB,然后进行加密。没有解密密钥的情况下,加密后的数据块和随机数据没有区别。甚至对于没有加密的数据块,节点运营者也很难分辨数据的哪一部分对应哪个数据块。由于Swarm节点本身不能选择要存储的数据块,同时通过加密、上下文模糊化以及不泄露信息的元数据,所有这一切确保了Swarm节点对寄存的内容的保护。

要把一个数据块插入到Swarm,Swarm节点会通过push-sync协议分程传递数据块,直至数据块到达它所属的邻居节点。存储确认声明也通过同样的路径传回。为了获取某个数据块,Swarm节点通过retrieval协议将携带数据块地址的请求路由至数据块的邻居节点。在这个中继传输过程中,如果有节点的本地存储中有对应的数据块,数据就会被直接返回。

图4 Push/Pull/Retrieve协议

Swarm节点会持续不断地使用push-sync协议同步自己的数据块存储。这保证了属于社区的所有数据块被每个邻里节点冗余存储。这种冗余加上网络本身的弹性,保证了即使社区中一些节点不可用,数据块仍然可以访问。同步协议也确保了有节点下线,或者有新节点加入网络时,整个社区内数据存储的一致性。

2.3 数据转发、隐私保护和数据缓存

在Swarm中,消息的路由时通过每一次更接近目的地的转发和基于相同路由的回传完成的。这种路由算法有两个重要特性:

  • 消息请求者的模糊性
  • 需求增加时的自动扩展性

从各方面来看,节点自己发起的请求消息与节点转发的请求消息是没有区别的。这种模糊性很好地保护了请求发起者的隐私,也方便地实现了无授权发布和私密浏览。

由于每个节点在参与路由数据请求时都可以选择存储要转发的数据块,这就很好的实现了数据分发的自动扩展性。这种投机性缓存的经济动机是就是接下来要讨论的带宽激励。

2.4 Swarm记账协议

Swarm会计协议(SWAP)在防止滥用Swarm带宽资源的同时,确保节点运营这合作完成对消息的路由。

伴随着节点对请求和响应的中继转发,每个节点都会跟踪他们的对端节点的相对带宽消耗。在一定限度内,节点简单地参与这种服务对服务的交换。然而达到一定限制后,负载方要么等待一段时间知道他们的债务随着时间逐渐还清,要么直接发送可以在区块链兑现BZZ的支票偿还债务(参考图5)。

SWAP协议本身确保了那些想要下载或者上传少量内容,或者可以通过给对端节点提供对等服务来赚取信用的人,可以免费使用Swarm。同时,对愿意付费的用户,在上传和下载数据时,Swarm可以提供更优质的体验。

Swarm从经济上激励节点在消息中转过程中相互帮助,成功将消息请求路由到更接近目的地的节点都可以在消息成功传输后获得BZZ奖励。如果节点本身不存储数据,那么它就需要支付少量费用从临近的节点获取数据块。通过这样的交易,节点可以在为每个消息请求服务时获利。这同时也意味着Swarm鼓励节点去缓存数据,一旦从临近节点购买了某个数据块,节点就可以从接下来对该数据块的请求中获利。

2.5 容量短缺和垃圾回收

随着不断有新数据加入到Swarm,每个节点有限的存储容量迟早会被用完。这时,每个节点就需要一个回收策略来决定哪些数据块应该被删除,以便为新数据块留出空间。

Swarm节点的本地存储有两种:预留区和缓存区。

预留区是一个预留的存储空间,专门用来存放邻居节点的数据块。一个数据块是否存放在预留区,取决于数据块上的邮票大小。区块链合约允许用户提前购买邮票包,用户可以从邮票包签发邮票。这些邮票作为信用凭证,代表了关联数据内容在Swarm中对用户价值的大小。存储节点根据邮票的大小判断哪些数据块需要优先从预留区移除,以此来最大化DISC使用率。邮票的大小随着时间减少,从这个意义来说,就好像空间租用会定期消耗邮票包余额;一旦邮票余额不足,相应的数据块就会从预留区移除,转移到缓存区。

图5 Swarm的会计处理协议
上图描述了节点间怎么追踪相互的带宽贡献。步骤0中,双方从0余额开始,伴随着一段时间的消息交换,到达步骤1,再到步骤n,始终伴随着其中一方债务达到限定值。要减少债务,要么随着时间的推移双方交互的不平等差距降低,,要么对端获得一定的补偿。

缓存区的作用是存放那些不被预留区保护的数据块,这些数据块要么是邮票包余额不足,要么就是距离所属节点太远。缓存区容量满了以后会定期清理,那些最不经常访问的数据块会被删除。由于数据块的最后一次请求时间是一个比较合理的判断其权威性的指标,那些可以获取更多SWAP交换收入的数据块会被优先保留。这种垃圾收集策略,与投机性数据缓存机制结合,实现了节点运营者从带宽激励中的获利的最大化。然而从整个网络来看,却实现了网络对高权重内容的自动扩展。

在这里插入图片描述

2.6 数据块类型

前边我们定义了数据块为DISC中数据的标准单位。由两种类型的基础数据块类型:基于内容寻址的数据块和单用户数据块。

内容寻址数据块的地址是基于自身的数据的hash生成的。使用内容hash作为数据块地址可以直接通过地址来验证数据块内容的完整性。Swarm基于一小段数据的hash树,使用BMT哈希函数生成数据块地址。

图7: 最大为4KB的内容寻址数据块,地址为扩展和内容的二进制hash树生成的hash串。
单用户数据块的地址是根据所属用户地址加上一个账户标识产生的hash。单用户数据块的数据完整性性由所属用户的加密签名保证,证明任意数据块和其用户间的关联性。也就是说,每个用户对Swarm地址空间的一部分拥有控制权,他们可以自由分配数据内容到这个地址。

3. API功能

除了数据块存储,Swarm也提供了接口来处理更高层面的概念和功能,比如文件、携带各种元数据文件的结构化集合、以及节点间消息通信等。这些接口寻求实现对现有web功能的一对一镜像。其它新功能和数据结构都可以映射到这些功能上,或者映射到与这些功能平行的高层应用模式上。这为那些想从DISC提供的隐私保护和去中心化中获益的人提供了更丰富和多样化的可能性。

在这里插入图片描述

3.1 文件和数据集合

因为单个数据块最大为4KB,大于4KB的数据会被拆分成多个数据块。属于同一份数据的数据块,按照上传文件时的拆分方法,由一个Swarm哈希树表示。哈希树包含一系列叶子节点,叶子节点它自己的数据,被一层或几层中间层数据块的连接,中间节点引用到叶子节点。

整个文件的地址由整个hash树的根节点数据块的数据摘要决定,比如,概括整个文件的哈希树的merkle根节点。通过这种方法,文件的checksum就变成了文件的地址,这样就能使用地址够验证文件内容的完整性。代表文件的数据块平衡merkle树也提供了对文件的随机访问,因此,通过hash树也能够有效实现文件的区域查询。

Swarm使用文件清单表示文件集合。清单对字符串及其引用内容的映射进行编码,以便对目录树、键值对存储或 路由表进行建模。这些使Swarm能够实现文件系统、数据库,甚至是网站和分布式应用所需要的虚拟主机等功能。

Manifest清单提供了一种基于URL的寻址。如果我们把URL的主机部分理解为清单的引用,URL的path作为key来检索清单表示的这个映射表,来找到对应的文件引用。

在这里插入图片描述

Manifest清单用紧凑Merkle字典树的方式对他们所要表示的映射关系进行编码,使用的数据块对数的节点进行序列化。当查询某个路径时,我们只要获取遍历的分支上的节点对应的数据块。这保证了文件和记录的查找效率,相应的时延和带宽开销为文件集大小的对数。

在这里插入图片描述
图10:代表紧凑字典树中节点的manifest清单数据块,这些数据块量使用键值的下一个字节建立连续索引。这个连续性规定用键值key的剩余部分表示对文件的引用(比如robots.txt),或者,如果有多个索引有连续相同的key,用路径上的下一个分叉和最长的公共前缀建立字典树节点的引用(index.html和img,第一个字母都为i,下一个分叉即在最长共用前缀i后,即n和m。)。

文件hash树的中间数据块对子节点的引用,以及文件集合的清单字典树的节点,在位置上跟BMT哈希的部分保存一直。因此,Swarm支持紧凑证明,也就是某个特定的数据片段是否属于某个指定URL文件的指定位置的一部分,这是公共可证明数据块索引和验证不可信任聚合的基础。

3.2 更新跟踪: 订阅和域解析

Feed是单用户数据块应用的例子,但用户数据块可以用来描述可变的资源。Feeds能代表可变资源的版本化修改,话题的序列化更新,或者通信通道中其中一方发送的连续消息等,还有其它很多类似的场景。

Feed通过用一个话题或者索引来定义单用户数据块标识来实现。当内容的发布者和使用者对索引如何更新以及何时更新达成一致后,就可以实现对feed更新的引用和查找。

类似于DNS将域名解析为主机的IP地址,通过使用以太坊名称解析服务ENS将域名解析为对用的Swarm资源引用,Swarm也支持可读域名。

当web应用或网站因为更新而获取一个新的Swarm引用地址时,ENS中注册的引用地址就会相应地更新。可选的,当一个域名指向某个feed时,用户也可以从可读的域名中收益,这样用户就可以不频繁地与区块链交互的情况下更新他们订阅的内容,避免每次更新都要支付对应的交易花费。

3.3 消息

PSS(Swarm邮寄服务)是Swarm中一个之间点对点消息通信协议。它针对消息接受的地址对消息进行加密,然后与对应话题一起封装成一个基于内容寻址的数据块。由于数据块的地址本身落在接收者邻居的范围,依据push-sync协议,数据块会自然被Swarm传递。

更进一步来说,对于任何第三方来说,要传递的消息数据块和一般的随机加密数据块没有区别,我们也可以称这些数据块为“特洛伊”数据块。一个想要接收PSS消息的节点会尝试解密、解压所有邻居内的数据块。当接收者成功解密和解包“特洛伊”数据块后,Swarm客户端节点就可以将纯文本消息发送给使用PSS API订阅了当前话题的应用。

PSS也提供异步消息传递,因为Swarm中数据块会被持久化存储,并最终同步到接收者的邻居节点(即使邻居节点过一段时间后才上线)。

由于PSS允许用户接收所有来自未知用户的消息,针对需要发送匿名消息给某个公共用户的场景,PSS是一个理想的通信方式,比如用户注册,通过使用feeds建立一个安全通信通带,在这个通道基础上,初始化合约来开始一个对话。由于PSS不需要接受端任何操作,首选作为推送消息服务来使用。

3.4 数据持久化保存和恢复

DISC最终会删除那些很少被访问而又没有付费的内容。通过固定数据块,节点可以确保特定的内容在本地持续保存。然而,这些本地被固定的内容可以参与到主动、或被动的数据恢复中,从而使所有用户收益。

被动恢复包括这样一个恢复协议,当数据获取失败时,使用PSS发送数据恢复请求来通知数据的固定者。数据固定者会监听数据恢复请求,并将丢失的数据块重新上传,这样数据下载者在重传的时候就可以找到这个数据块。这种回退恢复功能可以从内容的发布节点分发数据,这跟一些现有的文件共享方案的运转方式相同,比如BitTorrent, IPFS.

相反,主动恢复或者数据管理是由数据固定者(pinner)主动检查网络中的数据内容,当他们发现数据丢失时,重新上传对应的数据块。

结论

Swarm作为一个点对点网络被引入,网络中的节点作为一个整体,共同为用户提供去中心化存储和通信服务。基于其无需授权、隐私保护机制,Swarm在维护数据一致性、防审查和放攻击的同时,提倡支持表达自由,维护web中的数据主权和开放市场。本文覆盖了使用Bee1.0节点构成的初始Swarm主网的主要功能。

这仅仅是整个路程刚刚开始的一个里程碑,加入Swarm来共同完成其数字自由的使命。

阅读The Book of Swarm获取关于Swarm的更多信息。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值