学习Filecoin开发一个自己的公链一共识-LearnDapp系列

8次阅读

共计 4381 个字符,预计需要花费 11 分钟才能阅读完成。

区块链存储一直被认为是最有希望落地的方向,存储的重要性不言而喻,公链普遍存储贵。分片和 layer2 方案可以提升性能和降低存储成本,但如果以存储作为挖矿基础岂不是一举两得。

为什么 LearnDapp 要讲公链?探索落地应用是 W3c.Group 的使命,每个 Dapp 开发者一定会涉及链的调用或者合约编写,有一个自己的公链之后,我们能在需要时自行改参数,也免去了在“水龙头”申请测试网络代币的环节,Dapp 开发效率自然提升。

一些存储类公链

Burstcoin

计算一次(一个称为绘图的过程)并将您的工作结果缓存在硬盘空间上,然后挖掘只需要读取缓存,大部分时间你的硬盘空闲,并且每个块只读几秒钟的绘图文件。当硬盘容量越大,能够获得奖励的命中率越大。除此以外,提交答案的过程也是网速越快越有利。由私钥推导出的 Account Id 然后结合 Shabal256 最终完成绘图,以此保证缓存不会被复用从而避免作弊。白皮书附录部分提到了 Poc 和 Poc2,也承认了矿工吐槽说硬盘被浪费而没有起到执行绘图以外的作用,因此官方规划了 Poc3 或者说 Dymaxion,集合了纠缠等各种技术。

Chia

基于 PoSpace 的 SpaceMint,使用像 PoSpace 这样的证明系统,每个矿工都可以立即使用计算一个 PoSpace,所以需要指定谁“赢”以及何时继续下一个区块。为每个 PoSpace 分配一个质量,但要最终确定块,必须增加 PoSpace 具有 VDF(Verifiable Delay Functions 可验证延迟函数)的输出。用 VDF 指定需要多少个连续计算步骤计算输出,在 PoSpace 的质量上是线性的,具有最佳质量的 PoSpace 可以最终确定胜出。

Storj 和 Sia
定位是分布式云存储的产品,实现更经济的存储。文件在上传前会分割加密,并且 p2p 节点保证数据取回速度。这两个项目的白皮书一长一短也是有趣,就如同他们的去中心化程度一样有差别,相对而言 sia 做的彻底些,没有注册,没有服务器,不需要中介或信任第三方因为引入了智能合约执行。

Lambda

Lambda 采用 PoST 时空证明算法保证数据的存储安全,同时实现了 VRF+BFT 的共识算法保证共识网络的运转效率与可靠性。Lambda 通过交易市场连接存储供应方(矿工)与存储需求方(用户),在链上完成去中心化交易。

Filecoin

基于 IPFS 的设计,也是其从底层去中心化的一个表现。使用 Proof-of-Storage 共识,包含复制证明(PoRep)和时空证明(PoSt),作用主要有两点:证明矿工做了有效存储;竞争区块打包出块,获取区块奖励。除去硬盘空间大小还有时间(网速快慢)的影响。矿工的算力是他硬盘上存储的数据的大小,存储多少数据在于获取多少订单,而订单数量取决于网络速度快慢,以及报价合不合适。

其他还有 genaro 等等存储类项目都可以继续了解,这里不展开。在以上项目中,Filecoin 的设计目标远大并且也备受关注,出于学习和今后迭代的考虑,接下来我们通过学习 Filecoin,完成一个最简单的属于自己的公链。

PoRep 和 PoSt

时空证明(PoSt)可以理解为矿工持续性地生成复制证明(PoRep)或者说是数字证明,filecoin 的 PoRep 以及 PoSt 的数据存储证明是通过 FPS 模块实现,也就是 rust-fil-proofs。

代码结构如下:

其中 filecoin-proofs(实现 filecoin 存储证明的接口)和 storage-proofs(存储证明)都有对应的目录。代码已更新,但文档中的图还是之前的,sector-base 和 storage-backend 这两个部分的文件已经转移,比如原先在 sector-base 中的 sector_class.rs 移动到了 storage-proofs 目录下。

你可能会好奇 go-filecoin 是如何实现 go 到 rust 语言的调用的?

在 rust-fil-proofs 的 READMD 中搜索“Go implementation of filecoin-proofs”可以看到有 rustverifier.go 和 rustsectorbuilder.go 这 2 个文件相关,查看 go-filecoin 中的对应文件发现都引入了 libsectorbuilder 这个用 cgo 实现的 package。找到 cgo_bindings.go 中的函数 VerifySeal,能发现在 rust-fil-proofs 的 api.rs 中有 verify_seal 对应,不使用 cgo 的实现可以自行了解。最终,在 go-filecoin 的 miner.go 的 CommitSector 中调用 ctx.Verifier().VerifySeal(req),VerifySeal 就是 Verifier 接口中的函数实现。

如果想要详细了解各个共识算法,可以参考这篇文章 https://www.chainnews.com/articles/729117267789.htm。

运行官方实例

根据文档指引,成功运行并参与了 replication-game 的游戏(Zigzag 10M)

游戏流程是先在本地 build 完 replication-game,再获取 seed,然后在本地选择不同的算法计算出 proof 结果,最后上传结果到官方服务器参与。
过程中,有两个地方值得关注,一个是生成 proof.json,另一个是验证,来看看 replication-game 的代码:

1. 从 game.rs 中的这段开始

let res = match typ {proof::ProofType::DrgPoRep => porep_work(prover, params, seed),
    proof::ProofType::Zigzag => zigzag_work(prover, params, seed),
};

找到 proofs.rs 中能找到对应的 porep_work 和 zigzag_work,依赖了 storage_proofs::drgporep 等在 rust-fil-proofs 的 storage_proofs 中的函数,通过 extern crate storage_proofs 标记为外部函数接口。

2. 再看 server.rs

既然是基于 rocket 这个 web 框架实现,我们就可以从 routes 目录开始,找到 proof.rs 文件,其中有 validate 方法,调用了storage_proofs::layered_drgporep

以上提到的 zigzag_drgporep 和 layered_drgporep 在 rust-fil-proofs 的 storage_proofs 目录下被定义为模块,layered_drgporep 中的 LayerChallenges 和 ChallengeRequirements 分别是数据复制逻辑和复制证明逻辑的实现和结构,详细算法解析的文章可以看看 https://mp.weixin.qq.com/s/Sd6Y0gSX6HB4BFRKPV_0dQ,代码已更新文章分享的版本较早但也非常值得学习。

简单的共识示例

近两年使用 Rust 语言的区块链项目越来越多,相关的包也逐渐完善。虽说 Filecoin 使用了 golang,但出于方便今后从 polkadot/substrate 或 nervos/ckb 等等更多新区块链项目中学习的考虑,我们自己的公链也用 Rust 实现。若你之前的技术栈中未加入 Rust,不妨先看看 https://kaisery.github.io/trpl-zh-cn/ch01-01-installation.html,能够帮助你快速上手。

代码结构如下:

rust-fil-proofs 中的 storage_proofs 直接通过 storage-proofs 包来调用,共识的生成和验证逻辑就在 proofs/all.rs 下。

执行以下命令可以生成 ldc

cargo +nightly build

然后运行

./target/debug/ldc --size 1024 --prover lduser zigzag > proof.json

可以生成 proof.json

最后运行

./target/debug/ldc --proof-path ./proof.json proof

可以验证结果

以上过程执行了一次加密到解密验证的过程,体验了 PoRep 共识的执行,而 PoSt 可以理解为矿工一定时间内持续地生成复制证明和接受挑战和验证的过程。所以“存力挖矿”的说法相比“硬盘挖矿”更贴切,验证过程涉及到加密计算,并非只是硬盘越大得到的奖励越多。

代码已经上传 https://github.com/learndapp/LDC,下一部分将实现 p2p 网络,明确证明者(prover)和检验者(verifier)以及系统之间的关系。此后也会逐步完善我们的公链,以学习的目的略去一些部分做到最小可执行的程度。

本文作者是 W3c.Group 社区(https://w3c.group)的核心共建者。W3c.Group 社区目前正在进行只对开发者开放的有奖投票活动,以及有奖发文计划。也欢迎前往 W3c.Group 的“LearnDapp 小组”私信组长和本文作者建立联系。

参考连接:

白皮书:

https://www.burst-coin.org/wp-content/uploads/2017/07/The-Burst-Dymaxion-1.00.pdf
https://www.chia.net/assets/ChiaGreenPaper.pdf
https://storj.io/storjv3.pdf
https://sia.tech/sia.pdf
https://www.lambdastorage.com/doc/Lambda%E9%BB%84%E7%9A%AE%E4%B9%A6-Beta.pdf
https://filecoin.io/filecoin.pdf

代码:

https://github.com/filecoin-project/go-filecoin
https://github.com/filecoin-project/rust-fil-proofs
https://github.com/filecoin-project/replication-game

文档:

https://github.com/waynewyang/analysis-of-filecoin-in-Chinese
https://github.com/filecoin-project/go-filecoin/blob/master/CODEWALK.md#sector-builder–proofs
https://github.com/filecoin-project/specs/blob/master/proofs.md

正文完
 0