为Substrate引入PoC共识

Jianming Liu
2 min readJun 2, 2021

我们很兴奋的宣布Subspace Labs 已经获得了来自Web3 Foundation (W3F)的一项open grant资助来实现基于Substrate框架实现Proof-of-Capacity (PoC)共识。我们今天宣布这个消息, 并已经同时成功提交了第一个里程碑,可以运行一个包括Substrate客户端和PoC Farmer的本地开发链环境。这是通往我们最终部署Subspace Network成为波卡网络平行链的一个非常关键的步骤。

什么是Proof-of-Capacity (PoC)共识?

Proof-of-Capacity (PoC)共识是取代Proof-of-Work (PoW)和Proof-of-Stake (PoS)共识的首选方案。在一个PoC区块链中, 存储密集型挖矿取代计算密集型挖矿。存储挖矿的关键优势是能量效率(以及环境可持续发展),同时具有类似PoW以及优于PoS的安全特性。硬盘挖矿同样可以抗ASIC的潜力,允许普通用户使用市面普通硬件参与共识,虽然这一点也严重依赖于底层容量证明的实现方法。

现存的PoC区块链包括BurstFilecoinChia Network,以及Spacemesh。概括的说,这些链的每一个都在依据各自向网络提供的磁盘空间占的比例来选出下一个区块铸造的节点。每个链用不同的方式来实现这个目标。一般来说,有下面三种设计选择:

  1. 这个PoC是proof-of-useless-space (随机数据)还是proof-of-useful-storage (真实世界数据)
  2. 参与共识是permissionless (类似PoW) 还是permissioned (类似PoS)
  3. 区块间隔是通过CPU-bound delay (类似PoW) 还是一个共享时钟 (类似PoS).

例如,Chia Network使用了一个permissionless proof-of-useless-space和CPU-bound proof-of-time来保证区块间隔; 同时Filecoin使用 permissioned proof-of-useful-storage以及共享时钟来确保区块延迟。

Substrate的PoC

Substrate是一个构建区块链的框架,由Parity的优秀成员开发。想一下Django或者Rails,但是用于区块链。Substrate支持切换共识并且自带了几种现有共识算法,包括:proof-of-stake (BABE), proof-of-authority (Aura)和 proof-of-work (Kulupu)。我们W3F grant的关键目标是扩展这个共识算法集来支持PoC。

为了实现这个目标,我们设计了一系列的Substrate modules支持PoC共识的一个抽象概念。这些模块当前支持一个permissionless PoC(proof-of-useless-space或者proof-of-useful-storage),其中区块间隔通过共享时钟来保证。这些模块被设计作为一个底层PoC和上层定义链上逻辑的Substrate Pallet之间的中间层。

我们为这个grant正在实现Spartan,一个精心设计的简单的proof-of-useless-space作为我们接下来工作的基础。为了构建区块链,我们开始于sp_consensus_spartan, 作为spartan-codec的适配器, 在我们的情形下作为特定proof-of-space。这些随后被用于sp_consensus_poc以及sc_consensus_poc, 其中定义了一个permissionless, round-based, PoC 共识协议通用runtime。客户端也是设计了一个独立的spartan-farmer用于创建和查询磁盘plot。 Client和farmer之间的通信通过WebSocket RPC传输。最后,pallet_spartan 使用Spartan模块通过PoC模块来编排共识。我们也构造了node-template-spartan, 将pallet_spartan实现作为Substrate Client。关于Spartan更详细的介绍,请参考设计文档.

运行一个Spartan节点

一个本地开发链包括一个Spartan Substrate Client和一个Spartan Farmer。晕一个开发链的最容易的方式是使用Docker。Farmer容器将创建一个1GB plot(需要几分钟时间),之后它将连接到客户端容器并尝试每个time slot来解决创建区块的挑战问题。当farmer找到一个正确的答案之后会传回给客户端,随后产生一个新的区块添加到链上。要运行docker:

首先安装Docker

然后运行下面命令

# 初始化farmer (terminal 1)
# 创建用于plot的磁盘并初始化1 GiB plot
# 应该耗时30秒到几分钟时间
docker volume create spartan-farmer
docker run --rm -it \
--name spartan-farmer \
--mount source=spartan-farmer,target=/var/spartan \
subspacelabs/spartan-farmer plot 256000 spartan
# 运行客户端(terminal 2)
# 启动一个单节点开发链
docker run --rm --init -it \
--name node-template-spartan \
subspacelabs/node-template-spartan --dev --tmp
# 运行farmer (terminal 1)
# 一旦客户端节点在运行,你可以把farmer连接上去
docker run --rm --init -it \
--name spartan-farmer \
--mount source=spartan-farmer,target=/var/spartan \
--net container:node-template-spartan \
subspacelabs/spartan-farmer farm
# 现在你应该看到在客户端上开始产生区块(terminal 2)# 停止客户端
# 客户端容器必须从terminal 1进行中止
# Farmer可以正常通过ctrl c停止
docker kill node-template-spartan

也可以本地编译运行客户端。Farmer可以从crates.io直接安装或者也可以本地编译。如何手工创建或安装的详细指令请参考client readmefarmer readme

Spartan下一步计划

本地开发链是一个很好的开始,但是仍然有很多需要完成的工作。在我们下一个里程碑里,我们将扩展Spartan-Substrtae来实现:

  1. 和另一个全节点或者轻节点同步链的能力。
  2. 运行多个farmer的能力,可变大小的plot,自动调节解的范围(类似PoW中的难度调节)。
  3. 使用Polkadot-JS来通过浏览器监测链的能力,同时显示网络中的总磁盘大小估计。
  4. 启动一个开放和无许可的公开测试网络。

Subspace下一步计划

Spartan仅仅是通往将Subspace部署为波卡网络上平行链这个更大目标的一个垫脚石。Subspace是第一个解决了硬盘矿工困境(farmer’s dilemma)问题的PoC区块链。 硬盘矿工困境问题指代PoC机制设计过程中遇到的一系列挑战,而现存的PoC区块链方案并非激励兼容(incentive compatible)。Subspace扩展Spartan的proof-of-useless-space为proof-of-useful-storage,有用数据为区块链自身的历史数据。这使Subspace网络的用户可以直接在链上存储数据而无需担心区块爆炸,因为farmers一起合作存储数据,形成一个分布式的存储网络。更多关于Subspace Network和磁盘矿工困境的信息,请参阅我们的技术白皮书

原文链接

--

--