为什么要把 filecoin 通用语言单独列为一讲
笔者认为一位优秀的软件从业人员,必须具备两种必备能力
架构设计能力
架构剖析能力
这两者是相辅相成的,架构设计师所设计之架构不可能超过自己的认知范畴,故架构设计师必须有效高效地拓展自己的技术认知视图,以适应当代软件架构高速发展的现实。而拓展的途径,一方面就是相关理论体系的快速学习跟进;另一方面,就是实战,对有显著价值的优秀软件项目进行架构剖析。有理论、有实战方是王道。理解具体架构的通用语言就是分析他人架构设计思维的一条捷径。
理解具体技术架构的通用语言是分析架构的一条捷径
通用语言是架构设计人员为实现某个具体技术架构,所高度抽象出来的名词或者称谓,通过理解通用语言,可以快速理解架构设计人员的思维和设计目的。
与读书方法类似(薄读-> 厚读 > 再薄读),理解通用语言就是第一次的薄读过程,非常重要。
对业务的理解是非常有必要的,所以在第一章中,笔者铺垫了 filecoin 的一些基本概念,任何架构的设计不能脱离业务而行,业务驱动开发仍是非常实用的架构模式;filecoin 技术架构从业务来划分,可划分为两个大的范畴。
分布式存储解决方案
存储矿工
检索矿工
存储客户端
检索客户端
区块链项目
filecoin 公链
filecoin actors 智能合约
filecoin 核心通用业务组件
组件名称 目的
DSN 保障数据安全、包括故障容错、数据完整性、数据可恢复等
新型存储证明 证明矿工按照协议规范存储了客户指定的数据,数据有效性
可验证市场 对矿工与客户组成的交易市场进行了建模,保证交易的有效性
有效工作量证明 出块的共识机制,很重要,做到激励兼容
下面各节将会对 filecoin 技术架构中的核心通用语言进行解释。
存储证明
Proof-of-Storage 包含复制证明(PoR)和时空证明(PoSt),其作用主要有两点:
证明矿工做了有效存储
竞争区块打包出块,获取区块奖励
2.2.1 为什么使用存储证明
相对于 PoW(Proof-of-Work)或者 PoC
PoW 耗能严重;PoC 以空间换时间,同样存在耗能严重问题
而 filecoin 网络的耗能必须远低于类似比特币的 PoW,参见第一讲 filecoin 的对标对象,filecoin 必须实现以更低的成对去应对商业竞争,同时提供相同级别的安全性,以及文件存储的效用
存储证明需要做要与实体经济挂钩,减少无谓浪费
相对于 PoS(Proof-of-Stake)或者 PoC
Proof-of-Storage 在定向领域(分布式存储)以更简单方式,协调激励,并驱使矿工以有竞争力的价格提供真实的新存储,它促使矿工积极保证 filecoin 网络的效用
当然 Proof-of-Stake 是区块链领域的热点研究问题
Proof-of-Storage 阻止网络攻击
攻击类型 说明 阻止攻击原理
女巫攻击 Sybil attack 作恶节点创造多个女巫身份,谎称存储了多个副本 每个节点的副本都是有签名的,想通过复制证明,就相当于真实做了有效存储
外包攻击 outsourcing attacks 作恶节点快速从其他节点获取内容,谎称他们存储了比他们实际存储更多的内容 针对外包攻击,从其他节点获取的整个过程,满足不了证明人随机挑战的要求,依然需要重新生成副本(重新 seal 需要时间),从而阻止外包攻击
生成攻击 generation attacks 作恶节点宣称将要存储超过其实际容量的内容但并未存储内容,以此增加出块的概率 宣称无用,存储证明一定要确认密封动作并能应对随机挑战才能 OK,如果重新密封就来不及证明,每次挑战是有时间要求的
复制证明
基础
复制证明本质上可以理解为一种零知识证明,既然是零知识证明,我们在后面需要理解 filecoin 复制证明的题目和答案
zk-SNARK zero knowledge Succinct Non-interactive ARgument of Knowledge
zero knowledge:零知识,即在证明的过程中不透露任何内情
succinct:简洁的,主要是指验证过程不涉及大量数据传输以及验证算法简单
non-interactive:无交互。
生成证明的方法在 filecoin 架构中称之为 seal 密封
密封过程是需要时间的,Seal 过程串行加密的过程,无法并行操作,seal 密封过程是有意设计慢的,主要目的是为了防攻击。
filecoin 复制证明的题目和答案
公开的信息
矿工的节点公钥、密封公钥、存储公钥、原始 Data 哈希、该矿工存储的副本根哈希
隐含因素理解:
特有节点的副本哈希是由哪些哈希组成(DAG),任意挑战者或者攻击者是不知情的
挑战随机参数,通过 CRH(防碰撞的哈希散列 Collision-resistant hashing)生成哈希之后传递给证明者,作用是确定特定的叶子节点的哈希,比如让证明者自行计算离 H(c))最近的叶子节点哈希。
复制证明的题目与答案
挑战参数:副本哈希 rt,挑战随机参数 c -> H(c)
证明者输入(题目):
H(c)(每一次挑战都会变)
隐含信息比喻:该叶子节点是与 H(c)最近的节点
证明者输出(答案):
H(c)对应的叶子节点 ——> rt 的路径(攻击者是很难反推的)
时空证明
时空证明可以理解为矿工持续性地生成复制证明
挑战者输入一个随机参数 c,后面的随机参数由证明者基于上一个的挑战答案去生成。(不用与挑战者持续交互)
下图中变量 i 会轮询生成新的时间变量产生随机挑战。
时空证明
预期共识
基础前提
filecoin 基于存储证明(有效存储量)来作为矿工在整个网络中的 power
power 属性 说明
公开 1 某一时刻,整个网络存储总量是公开的
2 单个矿工某一时刻,有效存储总量是公开的
可公开验证的 对于每个存储任务,矿工都需要生成”时空证明“,证明持续提供服务。通过读取区块链,任何人都可以验证矿工的 power 声明是否是正确的。
变化 在任意时间点,矿工都可以通过增加新增扇区和扇区补充的抵押来增加新的存储。这样矿工就能变更他们能提供的 power。
使用 power 达成共识
目的:
每一轮选举一个(或多个)矿工,使得赢得选举的概率与每个矿工分配的存储成比例
filecoin 预期共识(Expected Consensus,EC)
预期共识的基本直觉是确定性的,不可预测的
预期的期望是每个周期内当选的 Leader 是 1,但一些周期内可能有 0 个或者许多的 Leader。
在每个周期,每个区块链被延伸一个或多个区块,见下图
区块线性扩展,但是数据结构是 DAG
EC 是一个概率共识,每个周期都使得比前面的区块更加确定,最终达到了足够的确定性
选举方案
预期共识通过选举方案产生
选举方案
选举方案
选举方案属性 说明
公平 每个参与者每次选举只有一次试验,因为签名是确定性的,而且 t 和 rand(t)是固定的。随机值 rand(t)在时刻 t 之前是未知的
保密 由于有能力的攻击者不拥有 Mi 用来计算签名的秘钥
公开可验证 当选 Leader i ∈ Lt 可以通过给出 t,rand(t),H(i)/2L,来说服一个有效的验证者。鉴于前面的观点(复制证明与时间证明),有能力的攻击者在不拥有获胜秘密秘钥的情况下不能生成证明。
filecoin 智能合约
文件合约
允许用户对他们提供的存储服务进行条件编程,会形成一个多样化市场。
承包矿工:客户可以提前指定矿工提供服务而不参与市场
付款策略:客户可以为矿工设计不同的奖励策略,例如合约可以给矿工支付随着时间的推移越来高的费用
票务服务:合约可以允许矿工存放 token 和用于代表用户的存储/检索的支付
更复杂的操作:客户可以创建合约来运行数据更新
智能合约
用户可以将程序关联到其他系统(如以太坊)的交易上,他们不直接依赖存储的使用。
与其他系统的兼容
规格支持跨链交互,以便能将 filecoin 存储带入其他基于区块链的平台,同时也将其他平台的功能带入 filecoin。
交易市场
存储需求和供给组成了两个 Filecoin 市场:存储市场和检索市场。这两个市场是两个去中心化交易所,简而言之,客户和矿工们通过向各自的市场提交订单来设定他们请求服务或者提供服务的订单的价格。交易所为客户和矿工们提供了一种方式来查看匹配出价并执行订单。如果服务请求被成功满足,通过运行管理协议,网络保证了矿工得到报酬,客户将被收取费用。
可以类比为淘宝商城
存储市场
交易数据会上链,包含于区块之中。
本质上也属于 filecoin 智能合约中的文件合约。
20190214 上线的开发网络已支持
检索市场
交易数据不会上链,属于 offchain 的方式。
本质上也属于 filecoin 智能合约中的文件合约。
filecoin 节点
filecoin 节点相关
node id 表示 filecoin 网络节点
account id 并表示账号,默认与钱包地址一致
wallet addr 表示钱包地址
miner id 表示矿工 id
filecoin 节点
深入浅出区块链 - 打造高质量区块链技术博客,学区块链都来这里,关注知乎、微博 掌握区块链技术动态。