“Crust 实现了去中心化存储的激励层协议,适配包括 IPFS 在内的多种存储层协议,并对应用层提供支持。同时 Crust 的架构也有能力对去中心化计算层提供支持,构建分布式云生态。”
6月 18 日,Crust Show 第 3 期活动中,我们邀请了 Parity 工程师 kai chao老师,与 Crust Network CTO 子琨一起,就 Crust 核心技术相关进行了硬核的技术探讨。
本期分享,从 Crust 协议组的设计与技术实现、对于无缝升级的设计与思考以及 Crust 如何利用 Runtime Interface 扩展链上密码库、对于链上定时器(Scheduler)的运用、Crust 链上身份绑定的设计与实现等 5 个方面,子琨和大家进行了详细的讲解。
由于分享内容过长,分为上下两篇。本篇主要从 Crust 协议组的设计与技术实现方面展开详细的介绍。
以下为 Crust Show 003(上篇)分享整理。
能具体介绍下 Crust 协议组 MPoW、GPoS、Market 以及 Storage 的设计和实现吗?
Crust 协议组的设计是旨在解决 DS(Decentralized Storage,去中心化存储)激励层两个关键性的问题:证明和激励。证明主要指的是,如何将链下的存储状态正确的反映在链上;而激励就是对存储节点的激励方案,也就是节点获取奖励的方式。对此,Crust 定义了一个协议组,分别包括了量化链下存储状态的 MPoW 协议、对节点进行链上区块激励的 GPoS 协议、去中心化(存储/检索)市场的 Market 模块以及适配多种存储协议的 Storage 模块。我看你画的《GPoS 协议组》含有 TEE 模块,能具体聊一下 TEE 在协议组内部是如何使用的吗?
TEE 是 MPoW 协议的核心模块,为MPoW提供可信有效的链下输入。而 MPoW 又为 GPoS 协议以及 Market 模块提供初始输入,所以 MPoW 也是整个协议组的基础。- TEE 通过身份绑定,可信认证节点身份(后面会详细讲解)
- TEE 可信量化有意义用户文件和 SRD(Sealed Random Data,aka. 随机数据,用于证明磁盘容量),并通过工作量报告(数据块证明)提交到链上
- 为链上的状态函数的转移提供正确的初始输入(存储量和文件信息{Merkle Root, File Size});
这里多提一句,MPoW 的证明过程(包括链下和链上)十分高效:1. 由于 TEE 的提交发生在本地并且能够自我验证(SGX 程序的不可篡改性),所以省去了互相验证数据块的网络开销以及本机进行零知识证明的计算开销,我们在不断的优化整个验证流程。目前的数据表现让我们十分满意,1TB 的数据(这里不管是 SRD 还是有意义文件)进行全验证的时间是 18s,抽查验证并且抽查率为 2% 的情况下,我们的验证过程只需要 0.36s。2. 另外,链上的验证得力于 Rust 高效的 Native 执行与 Substrate Runtime Interface 的 Native+Wasm 交互机制,能够让链上验证基于 Rust Native 进行高效的签名验证。目前测试的数据是,进行 100 次 p256 椭圆曲线的签名验证(背后是数据块证明的验证)仅仅只需要花费 0.016s。对于链上协议 GPoS 和 Market,具体指的什么呢?
GPoS(Guaranteed Proof of Stake,担保权益证明),对节点进行区块激励的协议,这个协议的设计是从波卡的 NPoS 得到的灵感并结合我们的系统进行的创新。首先,刚才谈到 MPoW 作为整个协议组的基础,会设置一个链上状态函数的初始输入,这个初始输入就是节点的工作量/存储量,其包含了该节点有多少存储容量、存储了多少有意义文件以及每个有意义文件的大小。而这个数据矩阵会通过一个公式被转化为 GPoS 里面的一个关键值 StakeLimit。在 GPoS 里 Stake Limit 会被作为节点可抵押/可被担保的额度,穿插在整个 GPoS的协议的流转中。当然,整个 GPoS 的实现机制是较为复杂的,包括了主动检测、被动检测、有效票、顺延担保、多次担保等机制。这次的技术分享大概无法 Cover 掉所有的实现细节,之后可以再安排一个技术分享去讲一下 GPoS 所有的细节规则。目前 Crust 设计并实现了的版本是存储市场,检索市场会在 Maxwell 2.0 版本上线,这次技术分享我们就先聊一下存储市场的设计和实现。同样基于 MPoW 给定的初始输入,Market 模块只关注节点提交上来的有意义文件的 Merkle Root,根据 Merkle Root 对应 Market 存储订单信息,从而反映节点是否有效存储文件。Market 也会周期性的检测 Provider 名下所有有效订单的文件是否被合理存储,一旦检测失效,会对 Provider 的订单失效率进行链上记录,并根据不同程度的文件丢失进行惩罚。Market 模块的实现挑战在于订单数量的巨大,这个部分我们将采用 Substrate 的 Offchain Worker 来进行订单记录,并通过 Forkless Upgrade 在 Maxwell 后续版本进行升级。我们知道 Crust 是去中心化存储激励层,能为我们介绍下协议组里的存储协议吗?
Storage 这个部分主要是想聊 Crust 支持的存储层协议 Karst,对于 Karst,我们将其定义为存储适配器(Storage Adapter)。什么叫存储适配器呢,也就是 Karst 协议会将不同存储协议(包括 IPFS, FastDFS,HDFS 等)转化为能被 TEE 识别的存储结构并且持久化在本地。在 Karst 内部定义了一系列的通用接口,比如存储转化器(Storage Transformer,实现这个接口并返回 Karst 规定的结构,就能被 TEE 所量化),Sealer(调用TEE Seal接口和 Unseal 接口进行加密解密存储,防止女巫和生成攻击)以及Checker(可被 TEE 抽查的接口)。这个设计有趣之处在于,无论底层的存储如何变动,需求如何变动,只要适配了 Karst 协议的 FS,就能够被量化到 Crust 网络中。这也使得 Crust 网络能够多协议共存,让存储协议和量化层解耦是我们认为正确的方向。在活动进行到自由问答环节中,由于社区成员提问比较多,我们挑选了一些大家较为关心的问题,整理出来:1. 问一个问题,矿工质押的时候,应该既有存储质押也有作为验证人的质押,那么在惩罚的时候,这两部分质押是逻辑上分离的还是有关系的?关于 GPoS 和 Market 是我们基于 CRU 通证设计的两款游戏,游戏的规则是独立的,独立性包括了奖励,抵押和罚没,GPoS 获取区块奖励,Market 获取订单奖励。对于Crust网络而言,两个模块的贡献度也有所不同,GPoS 保证了 Crust 网络的基本运行(决定出块),Market 则支撑了 Crust 网络去中心化存储的应用特性。2.所有的去中心化存储都必须面对的一个问题,即高波动的币价与锁定的存储费用与存储质押怎么协调,假设币价暴跌,导致矿工质押金已经不值什么钱了,或者币价暴涨,导致矿工认为以前的存储订单亏了。就是怎么用一个有波动的 Token 支付系统,去让存储保持稳定?子琨:嗯,我们会引入稳定币的机制,目前这套机制设计出来了,但是实现上还有些细节没有想通,之后成熟后会做分享。生态内的比如 Acala(通过 Parachain),生态外的 USDT 等我们都有考虑。稳定币是存储市场的核心,这套机制我们也在反复打磨,但是目前还没有特别成熟,But good question,回答就是持续关注我们。3. 按 Crust 的计划,底层只实现了简单存取之类的接口,而对于可靠性可用性保障会放在上层,这个上层也是由 Crust 开发么?以及它的保障是由链保证,还是一定的中心化因素?比如一个用户存了四份数据,他希望在丢了两份以后,能有人帮他重新下订单给其他人存。1. 可靠性可用性。具体来讲就是节点加速和纠删冗余,这些一定是二层来完善的机制,Crust 会开发一个模版供给社区使用。2. 链会通过 Market 模块的订单状态记录 Provider 的服务质量,包括订单失败率,连续失败时间,累计失败时间。这些 QoS 会在一层就对 Provider 进行 Slash,但二层能做的东西更多(比如历史的 QoS)。你刚才打比方的这套机制是二层。在 Crust 网络一层只会定义一些元语,订单状态就是 QoS 的元语,二层可以叠加这个部分进行复杂的组合,评估出更丰富的 QoS 机制。4. 存储节点 Slash 怎么处理还没确定吧?比如把惩罚的钱给一个新节点,让他检索了继续存。或者烧掉一部分,还有退给用户之类的,我看 Filecoin 目前的设计基本没考虑可靠性。子琨:Maxwell 1.0 会有一个简单的 Slashing,文件丢失 5%,会 Slash 掉本订单 50% 的保证金,10% 会直接罚没。但这个参数的话,我们会一直打磨,包括你提到的机制,就是 Slash 的钱是 Burn 还是类似 Storj 的 Graceful Quit 一样给接盘的节点,会通过链上升级更改。