“海峡链”自诞生开始,一直专注于区块链底层基础技术的研究,在已获得的国家技术专利中,区块链底层技术专利占比高达96%。其中,“许可IPFS存储网络”是“海峡链”自组研发的去中心文件存储及管理基础设施,获得了多项国家技术专利,现已针对开发者部分服务中定量免费使用。
“海峡链”的创始人兼CEO王超博表明:去中心化存储未来会是“去中心化”技术最早商业化爆发的基础技术之一,同时也会为数据要素流通提供新的基底层支撑。从海峡链成立以来,团队一直大力投入去中心化存储技术的底层研发,深度结合区块链和去中心化存储的底层融合,首创了“许可IPFS存储网络”架构,兼容不同安全级别要求的应用场景。目前,“SC-IPFS存储网络”已经是“海峡链”的重要核心技术创新重点。在“金砖国家可持续发展高层论坛”、“第二十一届世界商业领袖圆桌会议”等重要国际会议中,“海峡链”也多次强调区块链底层技术尤其去中心化存储技术的重要性,并分享“海峡链”对于去中心化存储的研究及落地成果。
在“SCDC海峡链开发者大会”上,海峡链存储架构师刘岭峰对SC-IPFS技术原理,传统IPFS现存的缺点以及海峡链的“许可IPFS存储网络”的价值优势进行了简要的介绍,本文将详细阐述“许可IPFS存储网络”的架构设计和运行机制。
在IPFS网络中上传文件时,首先会将文件切割成文件片,然后每个文件片都会根据它的哈希值生成一个对应CID。这些文件片将被组织成DAG,最终形成文件的最终CID。文件一旦上传到IPFS节点后,该节点就会向文件片CID最近的节点发送路由信息,然后就会形成一个分布式的路由表,也就是DHT。而当其他的节点通过CID下载文件的时候,首先会询问与文件CID距离最近的节点,然后找到拥有该文件的节点,然后从该节点去获取文件,这就是内容路由。一旦节点下载了某个文件,它就成为了某个文件的一个提供者。为了符合人们的使用习惯IPFS中还提供了ipns,来将文件名和CID进行绑定。这就是IPFS上传分享文件的大致的流程。
在IPFS的目前技术应用情况来看,需要指出IPFS的几个缺点。这些缺点在现有的IPFS架构中,几乎是无法避免的。
首先是难以忍受的低效。IPFS是通过分布式路由表来维护文件的索引信息的。在分布式路由表中,查询一个文件的位置的时间复杂度是O(logN)。表面上看,这个复杂度是挺不错的,但是在IPFS中,这个N是一个可以大到2的次方的一个数字,再加上网络因素等各方面的原因,这样的低效让人非常难以忍受。我曾经试过在IPFS网络中用几个小时才下载下来一张图片的情况。
其次是不符合预期的备份。在上传文件到IPFS时,只会将分布式索引表引入其他节点,如果你只上传一份文件,那么这份文件是没有任何备份的,它只会存在于你的节点,直到有其他的节点主动来下载,这个文件才会有备份。所以说这个备份机制是不符合我们对文存储系统的预期的。
然后是IPFS中存在不稳定的节点。IPFS是一个开放的网络,节点完全不受约束,可以随时自由的上线或下线,这样就存在不稳定的节点。节点不稳定,带来的后果就是IPFS服务的不可靠,经常会遇到下载不到一个图片或文件的情况。
最后是IPFS缺乏对文件内容的监管。IPFS是一个完全匿名的系统,节点可以自由的上传、下载和分享文件,而对文件的内容没有任何的限制和监管。这其中隐藏着很多的法律风险,而IPFS的架构中无法对文件内容进行有效的监管。
海峡链技术团队对IPFS进行深入研究后,对原生IPFS进行了多方面的改进,并将IPFS与海峡链进行了深度融合,自主研发了“许可IPFS存储网络”。开发者们可以在海峡链中轻松使用“许可IPFS存储网络”,为用户提供可信任的、不可篡改、公开透明的文件存储和管理服务。
“许可IPFS存储网络”主要对IPFS进行了以下改进:
合理拆分轻重节点,改进网络结构,提供合理易用的接口;
与区块链深度结合,支持文件权限管理、版本管理等功能;
引入合理激励措施,鼓励许可存储节点主动保存用户文件分片的同时避免浪费过多的存储空间。
一、许可IPFS存储网络
海峡链的“许可IPFS存储网络”由区块链、重节点网络和接入端轻节点组成,整体架构如下图所示:
1.1区块链
传统的IPFS网络中没有区块链。这会导致IPFS网络处于一种自发运行的状态,无法对一些数据和逻辑达成共识,这在应用层面造成了困难。因此在海峡链中,我们引入了区块链,让IPFS与链打通,需要共识的数据和逻辑可通过链完成。每个IPFS节点都连接到链上,在链上对平台层面,各个节点间需要配合和沟通的内容进行共识。这些内容包括:合法IPFS重节点地址、链上有效文件元数据、存储服务商业化、重节点参与激励。
1.2重节点网络
“许可IPFS存储网络”对节点进行了区分,重节点提供存储服务,轻节点提供终端访问服务。重节点的职责是长期存储文件片,保证足量的冗余文件片备份,且在有其它节点申请文件片时,按规则发送文件片。“许可IPFS存储网络”通过激励方案保证长期和足量的文件片备份,重节点存储的有效文件片越多,获取存储激励的几率越大。“许可IPFS存储网络”提供基础数量的重节点,能保证用户文件获得基础的可信的存储服务。重节点之间互相传输和备份文件片时,不做权限检查;轻节点向重节点申请文件片时,重节点从区块链上查询请求者是否有读文件权限,通过检查后才会发送文件片。
多个重节点构建而成的文件服务网络称为重节点网络,其提供文件的存储和下载服务以及安全检查,重节点通过提供存储服务获取激励。
重节点网络与IPFS公共网络是打通的,可以从IPFS公共网络读取资源,同时可以对IPFS公共网络提供重节点网络中没有权限限制的文件片。另一方面,重节点网络优先响应来自“许可IPFS存储网络”节点的请求,服务质量不会受到来自IPFS公共网络的影响。
存储服务提供商可提交申请加入重节点网络,但需经过管理委员会投票同意后方可加入。链上记录着重节点白名单,所有重节点、轻节点都会同步该白名单,并只访问该白名单上的重节点。
1.3轻节点
轻节点是海峡链独创的技术实现方案。开发者可以使用海峡链部署的公共轻节点或自己运行的轻节点来访问“许可IPFS存储网络”,推荐开发者自己运行轻节点。开发者可以通过轻节点完成文件上传、下载以及维护本地重节点列表,相应的功能可通过调用轻节点的独立接口实现。
上传文件:
对文件按DAG方式切片,生成CID;
将CID提交到区块链,并完成付款;
如果该文件需设置权限,可在链上合约中设置拥有查看权限的用户列表;
分发文件片至重节点网络。
文件下载:
从重节点网络收集下载文件片到本地;
如果文件头有加密,从链上获取密钥并解密;
恢复原始文件,返回给调用者。
维持本地重节点列表
重节点列表是公开在区块链上的白名单。轻节点会适时拉取该名单,并维持在本地,以便在文件上传、下载时连接到重节点。
二、文件权限管理
真实使用场景中,文件一般都有权限设置需求。该需求在开放共识链和开放许可链中有所不同。在开放共识链场景中,通常只需要将文件设置为开放或受限,对受限的文件,设置白名单确认哪些账户可读取即可。而在开放许可链场景中,文件安全要求更高。不仅要进行权限设置,还需要对文件流转过程做全流程管理和追溯。例如文件分享给第二人后,第二人希望分享给更多人时,是否需要文件所有者同意;有人查看了文件时,是否需要通知文件所有者;还包括文件的分享历史和查看历史追溯等问题。
“许可IPFS存储网络”对IPFS增加了文件权限管理功能,开发者可调用轻节点的接口完成文件管理。
“许可IPFS存储网络”使用独特的文件头加密技术,在不减少文件加密安全性的前提下,极大地降低了加密操作的运算量。同时我们使用了基于秘密分享的文件备份策略,低于门限数量的存储中心无法获取文件的任何内容。
此外,文件权限管理功能还具有如下属性:
文件的读取权限只允许授予,不允许撤回。因为曾经拥有权限的用户随时可以通过区块历史数据获取对称密钥解密,所以撤回权限是没有意义的。
当文件从授权访问改为完全公开时,文件所有者需要公布解密密码(不推荐的操作)或上传未加密的文件头,需要注意的是,这一操作是不可逆的。
对于获取部分文件分片即会造成内容泄露的情况,将对全文件做压缩处理或加密后再做文件切片处理。
重节点在响应文件的获取请求时,会先在区块链上检查请求者是否拥有访问权限,拥有访问权限的才会发送文件片。
具体的技术细节和实现方案请详见后续发布的《海峡链白皮书-IPFS篇》。
三、网络架构和实现
由于开放共识链和开放许可链的应用场景有所不同,安全设定和需求差异较大,因此需要采用不同的IPFS网络策略。
IPFS开放共识网络是由海峡链直接构建的,可使用单一网络对所有开放共识链提供服务,是公共资源,存储服务提供商可参与网络建设;IPFS开放许可网络,可根据具体的许可链使用方的需求搭建,支持本地化部署,属于专属网络。下面着重介绍一下IPFS开放共识网络:
3.1IPFS开放共识网络
IPFS开放共识网络旨在构建一个人人可提供服务,购买服务的长期稳定、健康运行的存储资源共享平台。重节点存储网络是开放共建的,拥有存储资源的服务提供商均可申请加,而DApp开发者可以通过自建或公共的轻节点来购买和使用服务。
3.1.1核心特征
所有开放共识链共用同一个IPFS网络;
该网络与IPFS公共网络互通;
重节点由专业的存储服务提供商提供服务,提供商在申请加入并投票通过后成为重节点;
重节点的行为受激励策略调控,重节点被鼓励在一定范围内尽量多存储文件片。
3.1.2文件存储成本
IPFS开放共识网络的存储服务将对文件进行永久存储,我们将根据摩尔定理和kryder定律制定一个合理的存储单价。
存储费用计算公式为:
存储费用=存储量*存储单价
其中存储量为10MB的倍数,不足10MB部分将按10MB标准收费。例如一个文件大小为32MB,则它占用的存储量为4。
3.1.3重节点的激励方案
3.1.3.1目标
海峡链通过激励方案鼓励重节点存储尽可能多的有效文件片,引导整个网络进入健康可持续发展的方运行状态。激励方案符合如下目标:
激励方案应该公平公开、可验证且去中心化,减少各环节作弊的可能;
鼓励IPFS节点尽量多存储数据,存储的文件越多,获得的激励越多;
鼓励重节点主动存储有效文件的同时避免存储资源的过度浪费。
3.1.3.2可能的作弊行为
激励方案的设计应避免发生如下的作弊行为:
重节点只存储CID,不存储文件片内容;
重节点在抽奖结束后临时拉取文件片领奖;
重节点存储使用多个身份进行多次领奖,即多个重节点共享存储池;
可能影响随机数生成的行为。
3.1.3.3激励流程
激励活动中有三个参与者:
运行于区块链上的激励服务智能合约,简称激励合约。激励合约通过代码方式明确了激励规则,所有参与激励活动的节点均需遵守此规则;
提供存储服务并尝试获取激励的重节点们;
海峡链上运行的可信重节点,该重节点不会尝试获取激励,但是会参与部分存储证明的验证工作。该节点是公正可信的,其地址会被写入激励合约。
激励在区块链上完成,分为epoch和slot两类周期。每个阶段中,激励合约和重节点需要配合完成不同工作:
GEN:
激励合约生成存储挑战随机数并发布在链上;
重节点收到该存储挑战随机数后,将本地保存的文件片生成存储证明(一棵merkle树),并将树根提交到激励合约,提交树根后才能参与奖励。如果重节点存储的文件片很多,来不及在第一个slot的GEN内生成包含所有文件片的存储证明,可以先提交包含一部分存储文件片的存储证明根,后续在该epoch内任意slot的UPDATE阶段更新存储证明根,存储证明中包含的文件片越多,获得激励的几率越高。不同epoch间的存储挑战随机数不同,因此每个epoch内,重节点都需要重新生成存储证明并提交到激励合约。
COLLECT:
激励合约生成并发布开奖随机数,开奖随机数为bit,与CID中文件hash部分长度相同。
官方可信重节点将根据开奖随机数和当前网络中的有效文件片检索出最佳CID,发布到链上。
重节点收到最佳CID值时,检索当前存储证明树中是否存在该CID,如果存在,则向激励合约报告。请注意重节点需在COLLECT阶段提交该CID,如果超时未提交,则该重节点可能会丧失本次奖励机会。
激励合约收到不同重节报告后,计算其权重并保存。
ANNOUNCE:
激励合约按圈中抽取获奖者
获奖重节点向激励合约发送SV证明,来证明本地确实有保存该文件片源文件。
UPDATE:
激励合约验证SV证明,实施奖励或惩罚。激励合约会将获奖者记录在链上,并允许其提款。
如果获奖重节点没有提供有效SV证明,或提交的SV证明无效,则说明该重节点作弊或离线。此时需对其惩罚,惩罚方案是不允许其参加本epoch和下个epoch的激励。如果某重节点多次被惩罚,则说明其有作恶行为或网络能力不足,监管委员会会发起将其驱逐出重节点网络的投票。
3.1.3.4存储证明
提供存储证明的目的有两个:
存在性证明,就是证明IPFS节点确实在本地保存了文件片,而不是只存储了CID,也不是在被检查到的时候才从IPFS网络中临时拉取文件片;
有效性证明,就是证明中奖文件片是存储在IPFS网络上的有效文件片(有真实的用户),而不是随机生成的无效文件片。
这两个目的分别用存在性证明和有效性证明的SV证明实现,在ANNOUNCE阶段被提交到激励合约中并验证。
(1)存在性证明
proofLeaf是存储证明树的叶子节点,使用节点pidHash,由存储证明随机数和文件块的rowdata生成。因此IPFS节点必须本地有存储文件片内容才能生成,只存储CID是生成不了的。而且也不能拷贝其他节点的证明。对于多个节点共享存储池的方案,只能提高其成本,无法避免。其中存储证明随机数即GEN阶段公布的storeChallenge,该随机数在一个epoch中是不变的,而在各个epoch间是不同的。如下为proofLeaf的计算方法,其中Hash()函数采用sha。
每个本地存储的文件片都会生成proofLeaf,所有proofLeaf组成merkle树即为存储证明树,树根即为存在性证明。下图为存储证明树的结构:
SPV证明(SimplifiedPaymentVerification)源自比特币,SV(SimplifiedVerification)借鉴了其方法,旨在使用较短的数据量来证明某个CID对应的proofLeaf确实存在于存储证明中。存在性证明的SV证明包含proofLeaf和其存储证明根的SPV证明。该SV证明在ANNOUNCE阶段被生成,并提交到激励合约验证。需要分别验证proofLeaf和SPV证明的有效性。其中SPV证明的验证不再赘述。主要描述对proofLeaf的验证。proofLeaf是pid和Hash(storeChallenge+rowdata)两部分合起来的hash,pid可以从重节点账户获取。storeChallenge是激励合约中发出的,可以方便获取。困难的是rowdata的获取,海峡链有部署官方可信的IPFS节点,这些节点是公开的、固定的。
(2)有效性证明:
有效性证明需在领奖时提供,如无法提供,则不能领奖。该证明可以保障重节点存储了链上认可的有效文件,而不是本地随机生成文件片;而且因为文件存储上链需要耗费成本,所以重节点们也不会为了提高获奖几率而主动上传无用文件。
有效性证明是一棵树,包括从文件根CID到待证明文件片CID的路径,及该路径上所有节点的兄弟节点,如下图中,希望生成绿色节点的有效性证明,则绿色、*色节点的CID均需包括在该证明中,蓝色节点的CID无需包含在该证明中。
3.1.3.5重节点获奖概率
可以预见,对于同一个挑战值,总是会有多个节点存储最佳CID,为了避免节点无差别的存储所有文件,浪费存储资源,并且文件总量超出节点的存储能力时给节点一些取舍依据,多个找到最佳CID的节点获奖概率将会依据节点与挑战值/最佳CID的距离不同而不同。
(1)前置条件:重节点逻辑位置均匀
IPFS节点的地址空间(addressSpace)大小为2,地址address可以表示为:
对于重节点而言,有效地址空间随着重节点网络世代(generation)变化重节点网络的世代(generation)随着重节点数量(CorePeerNum)变化而变化
而在每个generation,重节点的生效地址空间eeffectAddress为:
(2)重节点的获奖权重
重节点网络中,每一个分片至少有2n个重节点持有,只需保证激励中至少有2n个节点处于奖励的第一梯队就可以满足这个需求。基于重节点网络逻辑位置的均匀性,我们规定在generation-n的长度内,与分片逻辑位置越接近的节点在参与抽奖时有更大的获奖概率。
例如,在generation=4即(CorePeerNum=16,为了方便起见,这里假设CorePeerNum=16),n=2时,假设16个节点都存储了某个开奖文件片,该文件片地址为CAddress,并且都参与了激励。
那么在抽奖时,每个节点将依据与该分片的逻辑距离分别获取20,21,22三种权重Weight,每个节点地址addressi权重Weighti计算方式如下:
函数CommonPrefixLen(x,y)用于求两个相同位数的二进制数值的共同前导零个数,go语言实现如下:
每个节点获奖概率Pi计算如下:
每个节点自由选择是否存储某个文件片,在正常情形下,节点将优先存储与自己更近的文件片,在存储能力还有空余时一级一级的选择存储更远的文件片。
(3)重节点的存储门槛
在generation较大的情况下,可以发布一个门槛数值threshold(数值默认为0),只有节点与文件片的地址的共同前导大于threshold时才能参与激励服务,此设置可以强制避免一个文件片存储在过多的节点上,同时也有助于减少激励服务和文件检索的压力,因为网络中将只有1/2threshold的节点存储某个分片和参加对应的激励。
四.存储生态建设
纵观互联网的各项技术的发展,或多或少都符合这样一个趋势,就是从单点走向多点,由中心化转为多中心化或者去中心化。存储技术的迭代当然也符合这样的规律,从最早的单点的硬件存储到后面的云存储,再到后面的分布式存储,去中心化存储也是历史的必然。
海峡链的“许可IPFS存储网络”旨在为用户提供可信任的、不可篡改、抗物理攻击的文件存储服务,以及文件权限管理、版本管理以及全生命周期追溯等功能。海峡链面向生态建设者开放“许可IPFS存储网络”存储生态,存储服务提供商可通过建设重节点来分享收益。海峡链希望与存储服务提供商一起,“共识、共建、共治、共享”海峡链去中心化存储生态!