"节能"的容量证明(Proof of Capacity)
本文转载自公众号IPFSFAN,以获得授权。想了解硬盘矿机和相关知识?请关注公众号:IPFSFAN 与网站:ipfsfans.io
试想一下,2030年,比特币的算力上升到了珠穆朗玛峰,随着算力水涨船高的还有比特币的耗电量,比特币一年的电力消耗已经相当于北欧诸国年耗电量总和。虽然币价早已To the moon,但比特币社区内就耗电量日益增加的问题七嘴八舌。终于有一天,世界大战打响了,全球各国重要的发电设施接连摧毁,比特币矿机因为停电而无法运转,全网算力大跌!紧接而来的就是比特币网络瘫痪——由于算力骤降导致出块速度大幅降低,而比特币要2016个区块才能进行难度调整,新的区块迟迟不能挖出。在全球大停电中,只有那些耗电量低的数字货币得以存活,而遭受电力攻击的数字货币,也不得不寻求低电力消耗的共识机制,技术人员翻遍了网络,终于找到了一个方法——容量证明(Proof-of-Capacity)
以上只是不负责任的脑洞,但我们必须认清比特币工作量证明的高能耗问题。比特币社区就此问题提出了各种各样的解决措施,其中一种措施便是将传统挖矿的算力损耗转为对硬盘损耗,硬盘储存的耗电量远远低于定制集成电路的耗电量,这种措施被称为空间证明Proof-of-Space(Filecoin的时空证明也取自此),后来经由Burst改进形成了目前的容量证明Proof-of-Capacity。
容量证明是一种特殊的工作量证明,不同于比特币工作量证明要求矿工追求哈希算力,容量证明要求矿工追求储存空间,而目前提高储存空间的最佳办法就是加装大容量机械硬盘,这也令容量证明得以从”电老虎“和Asic化中解脱出来——相比于比特币矿机动辄数千瓦的功耗,目前10T硬盘功耗普遍在10W以下。除了省电以外,容量证明还带来了意想不到的抗中心化——无需担心Asic化,增加算力的唯一方式就是加装(大家都买得起的)硬盘。采用容量证明的加密货币现在有Burstcoin,BHD等,他们无一例外均需要矿工将用于挖矿的硬盘写满Plot文件(行业内称”P盘“),P盘后的硬盘却不像IPFS那般用于储存文件,只用于网络挖矿。这着实令初了解容量证明的人挠头,究竟容量证明的机制怎样?为什么矿工要尽可能占满硬盘?让我们从最基础讲起,参透容量证明的原理。
注:本文涉及数据推算,若希望简单了解容量证明可见最后加粗字体总结
算法原理:缓存大量数据来节省计算时间
传统的工作量证明为了保证公平性,每一次区块竞争时矿工都是求解全新的问题,之前做出的计算结果都需要被抛弃。而在容量证明中,计算虽然也很困难,但矿工可以通过牺牲硬盘空间,储存计算缓存来提高计算效率。为什么储存缓存可以提高计算效率?我们取如下例子:
2x3x4=24
2x3x4+10=34
2x3x4+111=135 ……
上面的三个计算中,如果按照正常的计算机逻辑,总共需要执行6次乘法与2次加法。但我们可以发现,只需要找地方储存2x3x4的结果,我们就只需计算两次加法即可算出所有结果,当然,代价是我们需要花费一定的空间来储存计算结果,这就是为何储存缓存可以提高计算效率。容量证明便是采用此项方法,矿工通过储存缓存数据即可降低计算难度,以此将工作量证明的目标由算力消耗转向储存消耗。
核心:Shabal哈希函数与Plot文件生成
Shabal哈希函数是2007年NIST举办的加密函数竞赛中的候选方案,尽管该方案没能进入决赛,但仍不失为一个优秀的哈希算法,该算法目前也没有出现致命弱点。容量证明的Plot文件需要通过Shabal函数来生成,生成方式如下:
第一轮运算:
矿工账户ID+随机数→Shabal256(256位Shabal函数)=Hash值8191号
上述过程产生的8191号哈希值总共有32字节,矿工ID和随机值各8字节。
第二轮运算:
Hash#8191+账号ID+随机数→Shabal256=Hash#8190
第三轮运算:
Hash#8910+Hash#8191+ID+随机数→Shabal256=Hash#8189
重复上述运算,当哈希函数输入值(前几轮的哈希结果+ID+随机数)大于4096字节后,之后的运算将只会取最新的4096字节数据来进行哈希,例如:
Hash#7001+…+Hash#7128+ID+随机数→Shabal256=Hash#7000
每一个哈希值由32字节,128个哈希值一共4096字节最后,当完成8192次循环后,我们会有从0号到8191号总共8192个哈希值,将所有的哈希值作为输入,再加上ID与随机数,算出最终Hash值,如下:
Hash#0+…+Hash#8191+ID+随机数→Shabal256=Final Hash
最终Hash拿来与其他8192个哈希值进行异或运算,得到全新的8192个哈希值,保存这些哈希值,两两分组分为4096组Scoop,Scoop便是容量证明挖矿所需要用到的基础缓存数据。每一组Scoop包含64字节,4096组Scoop总共占用256KB的储存空间。
由于矿工的ID由矿工的公钥生成,基本不会变动,因此Hash值生成的不同由随机数来决定,每个随机数都将生成256KB的Scoop组,而一个随机数占8字节,1byte(字节)=8bit,所以8字节总共有18,446,744,073,709,551,615种可能,想要储存完所有随机数所对应的Scoop组,总共需要4096ZB的空间,而目前人类所有数据加起来不超过50ZB,储存所有的数据数据是不可能的,因此矿工只能储存一部分的Scoop数据。至于矿工为何要储存Scoop组,原因是矿工的挖矿将会用到这些Scoop组,其缓存的数据将成为计算缓存来加快挖矿计算速度。
应用:利用Scoop组的信息挖矿
在挖矿之前,矿工需要根据相关信息计算初需要读取的scoop组,我们以BHD为例(BHD的容量证明与Burst类似),其生成挖矿所需scoop组的方式如下:
钱包生成挖矿信息,包含最新区块的产块签名,下一区块高度以及base target。base target涉及到BHD的”Deadline“设定,其设定相当于比特币网络中的“当前网络难度”。
钱包生成挖矿所需Scoop组流程如下:
最新区块的产块签名0+矿工ID→Shabal256=产块签名1产块签名1+下一区块高度→Shabal256=产块哈希
产块哈希 mod 4096=Scoop组编号(对产块哈希以4096取模,即取最小余数)
假设产块哈希取模后得到值 199,矿工就需要遍历198#Scoop组(Scoop组含0~4095)的数据,将相应组所有内容取一次Shabal256哈希值,再结合之前的产块签名还有Target数据(一种由钱包生成的当前网络挖矿难度数据),共同换算出Deadline数据
换算方式如下:
Scoop组数据+产块签名→Shabal256=难度Target
难度Target/当前网络难度Base Target=Deadline(产块目标时间)
由于BHD网络中,Deadline被设定为>1的值(实际网路中设定值比1大得多),所以矿工为了让Deadline符合难度目标,必须要从硬盘中反复读取储存的Scoop数据进行运算。每一个Scoop组的信息包含对0~4095随机数取值的所有信息,因此矿工为了能算出符合要求的Deadline就必须要尽可能多的储存Scoop组信息,即提升挖矿效率只能通过增加硬盘,提高储存空间来实现。就如同比特币工作量证明中,提升挖矿效率只能通过增加矿机或提高矿机效率来实现。
总结:殊途同归的工作量证明
就如前文所言,容量证明在广义上仍属于“工作量证明”,原因在于其哲学本质均是通过对资源的“浪费”来构筑网络的稳定性。比特币的工作量证明通过消耗计算力,进而通过消耗电力成本与设备成本来为流通货币赋予基本价值;BHD与Burst通过消耗储存空间,进而通过硬盘电力成本与设备成本为流通货币赋予基本价值。只是当电力消耗达到一定区间后,电力本身将成为网络稳定性的重要影响因子,其不仅影响网络算力的稳定性(电力波动时对网络的算力影响),还会影响到网络的去中心化程度,尤其是后者,当电力价格与设备成本成为矿工加入网路之敲门砖后,普通用户将无法承担维护网络稳定性的职责,网络的去中心化程度下降且鲁棒性亦下降。比特币网络目前已初现此端倪。
在容量证明的环境下,由于机械硬盘天生对(相对的)电力不敏感,电力成本短期内不再是矿工加入网络的敲门砖,而机械硬盘的广泛适配性,更进一步降低了矿工加入网络的难度,目前家用电脑常用之1~2T硬盘即可成为挖矿设备。更进一步,容量证明实际上不储存网络数据,即使硬盘损坏也不会导致网络内容丢失,避免了FIlecoin时空证明中数据丢失对网络使用性的影响
容量证明设计之初即是为了弥补传统工作量证明的缺陷,当然,由于其本质仍是通过消耗物理资源来为数字赋值,从长远来看容量证明仍存在挖矿中心化的趋向——人类的本质之一即是对资源的最大化利用欲望。另外一方面,由于硬盘成本与电力成本对矿工制约性下降,网络加入成本降低导致了流通货币的价格支撑下降,必须通过经济模型来对货币价格和网络可持续发展提供动力。容量证明并非万能膏药,但在比特币挖矿产业日益中心化的今天,如何治疗挖矿过于垄断的弊病,容量证明不失为一种可行解决方案。
参考文献:
1)聊聊容量证明(PoC)挖矿——李明阳 https://zhuanlan.zhihu.com/p/613471152
2)Proof-of-space——Wikipedia https://en.wikipedia.org/wiki/Proof-of-space#cite_ref-DziembowskiFaust2015_1-13
3)BitcoinHD:基于条件容量证明算法的加密货币系统 http://www.btchd.org/BHD-Whitepaper-1.0_zh.pdf4
4)BurstWiki https://burstwiki.org/