filecoin通用语言理解

笔者认为一位优秀的软件从业人员,必须具备两种必备能力:架构设计能力、架构剖析能力。这两者是相辅相成的,架构设计师所设计之架构不可能超过自己的认知范畴,故架构设计师必须有效高效地拓展自己的技术认知视图,以适应当代软件架构高速发展的现实。而拓展的途径,一方面就是相关理论体系的快速学习跟进;另一方面,就是实战,对有显著价值的优秀软件项目进行架构剖析。有理论、有实战方是王道。理解具体架构的通用语言就是分析他人架构设计思维的一条捷径。

2.1 为什么要把filecoin通用语言单独列为一讲

理解具体技术架构的通用语言是分析架构的一条捷径

    • 通用语言是架构设计人员为实现某个具体技术架构,所高度抽象出来的名词或者称谓,通过理解通用语言,可以快速理解架构设计人员的思维和设计目的。
    • 与读书方法类似(薄读->厚读>再薄读),理解通用语言就是第一次的薄读过程,非常重要。
  • 对业务的理解是非常有必要的,所以在 filecoin概念 中,笔者铺垫了filecoin的一些基本概念,任何架构的设计不能脱离业务而行,业务驱动开发仍是非常实用的架构模式;filecoin 技术架构从业务来划分,可划分为两个大的范畴。
    • 分布式存储解决方案
      • 存储矿工
      • 检索矿工
      • 存储客户端
      • 检索客户端
    • 区块链项目
      • filecoin公链
      • filecoin actors 智能合约
  • filecoin核心通用业务组件

下面各节将会对filecoin技术架构中的核心通用语言进行解释。

2.2 存储证明

Proof-of-Storage包含复制证明(PoR)和时空证明(PoSt),其作用主要有两点:

  • 证明矿工做了有效存储
  • 竞争区块打包出块,获取区块奖励

2.2.1 为什么使用存储证明

  • 相对于PoW(Proof-of-Work)或者PoC
    • PoW耗能严重;PoC以空间换时间,同样存在耗能严重问题
    • 而filecoin网络的耗能必须远低于类似比特币的PoW,参见 filecoin概念 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,如果重新密封就来不及证明,每次挑战是有时间要求的

2.2.2 复制证明

2.2.2.1 基础

  • 复制证明本质上可以理解为一种零知识证明,既然是零知识证明,我们在后面需要理解filecoin复制证明的题目和答案

zk-SNARK zero knowledge Succinct Non-interactive ARgument of Knowledge zero knowledge:零知识,即在证明的过程中不透露任何内情 succinct:简洁的,主要是指验证过程不涉及大量数据传输以及验证算法简单 non-interactive:无交互。

  • 生成证明的方法在filecoin架构中称之为seal密封

密封过程是需要时间的,Seal过程串行加密的过程,无法并行操作,seal密封过程是有意设计慢的,主要目的是为了防攻击。

2.2.2.2 filecoin复制证明的题目和答案

  • 公开的信息
    • 矿工的节点公钥、密封公钥、存储公钥、原始Data哈希、该矿工存储的副本根哈希
  • 隐含因素理解:
    • 特有节点的副本哈希是由哪些哈希组成(DAG),任意挑战者或者攻击者是不知情的
    • 挑战随机参数,通过CRH(防碰撞的哈希散列Collision-resistant hashing)生成哈希之后传递给证明者,作用是确定特定的叶子节点的哈希,比如让证明者自行计算离H(c))最近的叶子节点哈希。
  • 复制证明的题目与答案
    • 挑战参数:副本哈希rt,挑战随机参数c -> H(c)
    • 证明者输入(题目):
      • H(c)(每一次挑战都会变)
      • 隐含信息比喻:该叶子节点是与H(c)最近的节点
    • 证明者输出(答案):
      • H(c)对应的叶子节点 ——> rt的路径(攻击者是很难反推的)

2.2.3 时空证明

  • 时空证明可以理解为矿工持续性地生成复制证明
    • 挑战者输入一个随机参数c,后面的随机参数由证明者基于上一个的挑战答案去生成。(不用与挑战者持续交互)
    • 下图中变量i会轮询生成新的时间变量产生随机挑战。

2.3 预期共识

2.3.1 基础前提

  • filecoin基于存储证明(有效存储量)来作为矿工在整个网络中的power

| power属性 | 说明 |

| :------------: | :-----------------------------------------------------------------------------------------------------------------------------: |

| 公开 | 1 某一时刻,整个网络存储总量是公开的2 单个矿工某一时刻,有效存储总量是公开的 |

| 可公开验证的 | 对于每个存储任务,矿工都需要生成”时空证明“,证明持续提供服务。通过读取区块链,任何人都可以验证矿工的power声明是否是正确的。 |

| 变化 | 在任意时间点,矿工都可以通过增加新增扇区和扇区补充的抵押来增加新的存储。这样矿工就能变更他们能提供的power。 |

2.3.2 使用power达成共识

  • 目的:

每一轮选举一个(或多个)矿工,使得赢得选举的概率与每个矿工分配的存储成比例

  • filecoin预期共识(Expected Consensus,EC)
    • 预期共识的基本直觉是确定性的,不可预测的
    • 预期的期望是每个周期内当选的Leader是1,但一些周期内可能有0个或者许多的Leader。
    • 在每个周期,每个区块链被延伸一个或多个区块,见下图
    • 区块线性扩展,但是数据结构是DAG
    • EC是一个概率共识,每个周期都使得比前面的区块更加确定,最终达到了足够的确定性

2.3.3 选举方案

预期共识通过选举方案产生

2.4 filecoin智能合约

2.4.1 文件合约

允许用户对他们提供的存储服务进行条件编程,会形成一个多样化市场

  • 承包矿工:客户可以提前指定矿工提供服务而不参与市场
  • 付款策略:客户可以为矿工设计不同的奖励策略,例如合约可以给矿工支付随着时间的推移越来高的费用
  • 票务服务:合约可以允许矿工存放token和用于代表用户的存储/检索的支付
  • 更复杂的操作:客户可以创建合约来运行数据更新

2.4.2 智能合约

用户可以将程序关联到其他系统(如以太坊)的交易上,他们不直接依赖存储的使用。

2.4.3 与其他系统的兼容

规格支持跨链交互,以便能将filecoin存储带入其他基于区块链的平台,同时也将其他平台的功能带入filecoin。

2.5 交易市场

  • 存储需求和供给组成了两个Filecoin市场:存储市场和检索市场。这两个市场是两个去中心化交易所,简而言之,客户和矿工们通过向各自的市场提交订单来设定他们请求服务或者提供服务的订单的价格。交易所为客户和矿工们提供了一种方式来查看匹配出价并执行订单。如果服务请求被成功满足,通过运行管理协议,网络保证了矿工得到报酬,客户将被收取费用。
  • 可以类比为淘宝商城

2.5.1 存储市场

  • 交易数据会上链,包含于区块之中。
  • 本质上也属于filecoin智能合约中的文件合约。
  • 20190214上线的开发网络已支持

2.5.2 检索市场

  • 交易数据不会上链,属于offchain的方式。
  • 本质上也属于filecoin智能合约中的文件合约。

2.6 filecoin节点

  • filecoin节点相关
    • node id表示filecoin网络节点
    • account id并表示账号,默认与钱包地址一致
    • wallet addr表示钱包地址
    • miner id表示矿工id