文章来源:李明阳的知乎解答
之前的文章中,我们介绍了Chia,一种使用硬盘挖矿的币种。
文章发布后,不少朋友按文中的教程开始挖矿并获得收益。
Chia挖矿前,需要对硬盘进行填充,也就是常说的P盘,咨询中,我发现大家对P盘很感兴趣。
从测试网启动开始,我就一直在关注Chia了,到现在也研究了差不多一年,颇有心得。
下面就让我来给大家介绍下P盘背后的秘密吧。
P盘的过程涉及到非常多密码学和计算机科学的知识,我希望我的文章都是通俗易懂的,因此我会更侧重解释What(这个东西是干什么的)和Why(为什么要这么做)。
至于How(怎么实现的),我会尽量少提及,因为这部分往往涉及大段的代码,对非专业人士帮助不大。
相信大家只要认真阅读,就可以理解全部或绝大部分的知识。
基础知识
- 非对称加密
提到非对称加密,得先聊聊对称加密,让我们先来对比下二者:
▼非对称加密中加密和解密使用不同的密钥,黄色密钥加密的数据,需要蓝色密钥才能解密。
由于加密解密用的密钥不同,是非对称的,因此得名非对称加密。
非对称加密的密钥有两个,公钥和私钥,公钥加密的数据,只能用私钥解密,私钥加密的数据,只能用公钥解密,公钥可以公开,私钥必须保密。
大多数区块链项目使用的非对称加密算法是椭圆曲线加密(ECC),这个算法下,通过私钥可以生成一个唯一对应的公钥,但是公钥却无法反推出对应的私钥。
非对称加密的出现,让密钥管理和分发变得非常简单。
举个例子,我希望大家都可以发信息给我,但是不希望信息在传递过程中被别人知道。
如果使用对称加密,由于通信双方共享一个密钥,分发密钥的过程必须保密,不然无论是我还是对方泄露了密钥,我们之间的通讯都毫无秘密可言。
同时,每个朋友和我之间通讯使用的密钥都要不同,要是我和所有朋友间都使用同一个密钥,朋友A的信息就可能被朋友B解密,造成泄密。像我这种朋友很多的人,怎么也得准备几百个密钥,每人分一个,非常麻烦。
如果使用非对称加密,我只要把公钥公开告诉大家就行了,反正他们用公钥加密的数据,必须要用我的私钥解密,我把私钥保密即可,公钥并不需要保密,这也是它为什么叫公钥的原因,即公开的密钥。
- 哈希算法
哈希算法是一类很特殊的算法,这类算法可以接受任何长度的输入,无论是一本小说、一部电影、还是短短的一句话,它都来者不拒。但是,无论你的输入有多长,它输出的长度却是完全一致的。
比特币使用的SHA256就是一种哈希算法,大家经常用于检查下载的文件是否损坏的MD5值,其实是一种叫MD5的哈希算法的输出。
现实中我们使用的哈希算法,还需要有很多其他的特性:
- 不可逆性:从哈希算法的输出无法反推回原文。
举个例子,“你好吗?”这句话,使用SHA256计算哈希值为d0e2a7709b7a8f5969d74c3e917ca0f65e480e1f6d4f1d80abc25cb3f98acfc8,
显然你无法从这堆乱码里反推出我的原文是什么。
- 混淆性:我对输入进行微小的修改,输出必须有很大的变化。
还是同样的例子,我把“你好吗?”改成“你好吗!”,只是改了个标点符号,SHA256哈希值就变成了
bc924ff26008c0930416a8ae1a2eaa6c95392a8c7defc26e42bfd5cba552c964,几乎完全改变。
- 抗碰撞性
所谓碰撞,就是两个不同的输入,哈希值相同。
这是不可避免的,毕竟把无限长度的输入变成了有限长度的输出。
抗碰撞要求想找到两个哈希值相同的输入非常困难,困难到几乎不可能。
因为哈希算法的这些优良特性,我们可以用哈希值来作为原文的一种特征,也叫信息摘要。
如果两个数据的信息摘要是相同的,我们就认为两个数据是一致的。
因为哈希算法有抗碰撞性,两个不同数据哈希值相同的概率可以忽略。
又因为哈希值的混淆性,两个数据即使有微小不同,哈希值也应该差异很大。
现在两个数据的哈希值相同了,唯一合理的解释,只有两个数据是相同的。
- 数字签名
有了非对称加密和哈希算法,我们就可以用他们一起来搞事情了。
比如今天我有个电子合同,我想证明我认可它,我该怎么做呢?
于是,我把这份电子合同用哈希算法计算了个信息摘要,然后用我的私钥对信息摘要进行加密,并把加密的结果与电子合同一起用邮件发出去,这个加密的结果就叫数字签名。
我的公钥是公开的,人人都知道这是我的公钥。
大家想证明我认可了这份电子合同,只要用我的公钥解开数字签名,获取里面的信息摘要。
然后再计算合同的信息摘要,与从数字签名中解密出来的信息摘要对比,如果一致,就能说明我对这份合同是认可的。
我的私钥只有我掌握,只有我可以用私钥对信息摘要加密,也就是说,只有我能进行数字签名。
而哈希值又能唯一代表这份电子合同,如果有人篡改了合同,势必与我进行数字签名时的信息摘要不一致,很容易就能发现。
区块链领域,基本上需要认证身份的地方,都有数字签名的影子。
Chia的私钥派生
每个钱包地址都是从公钥转换而来的,有公钥,就会有一个对应的私钥。
出于各种原因,我们可能有非常多的钱包地址,也就会有非常多的私钥。
这就对私钥的管理提出了挑战,你要保管如此多的私钥,既不丢失,也不泄露,这是非常困难的。
不过不要担心,有需求就有供给,社区的大神们很快想出了一个绝妙的主意:
我们可以设计一个算法,从一个私钥派生出若干其他私钥。
这个用于派生其他私钥的私钥,我们就把它称为主私钥(Master private key)。
从一个私钥派生出来的私钥,还可以继续派生更多的私钥,形成父子关系。
▼一个简单的派生例子,每个子私钥,也可以派生出自己的子私钥,最后形成一棵私钥树。
这样,我们只要管理好主私钥就可以了,使用派生算法,我们可以随时还原出由它派生的私钥树。
同时,你也会发现,我们只要掌握了父私钥,就可以间接掌握所有由它派生出的子私钥,用派生算法重新生成下,就可以找回子私钥了,完全不需要把子私钥存下来。
用上图举个例子:
如果你掌握主私钥,你可以掌握所有私钥。
如果你只掌握子私钥1,你就只能掌握它和它下面的孙私钥1、2、3。
Chia的官方钱包软件,正是通过这种方式,来管理私钥的。
▼在Chia钱包第一次启动时,创建的那些助记词,就是用来生成这个主私钥的。
助记词生成主私钥(Master Private Key),主私钥派生出矿池私钥(Pool Private Key)、农民私钥(Farmer Private Key)、一个或多个钱包私钥(Wallet Private Key)。
通过这些私钥,我们又可以生成对应的公钥。
钱包私钥很好理解,通过它生成的公钥,最终转化成一个钱包地址,你可以用它来接受别人的转账,当你想花费这个地址中的币时,也需要用钱包私钥对交易签名。
如果你生成了多个钱包地址,你就会有多个钱包私钥。
请记住这里的矿池公钥、矿池私钥以及农民公钥、农民私钥,之后讲P盘时,我们会再提到它们。
P盘到底在做什么
做了这么多铺垫之后,我们终于可以开始说P盘了。
每次P盘开始时,都会生成几个重要的变量。
首先,会生成一个随机主私钥,通过它可以派生出一个本地私钥,这个本地私钥又可以导出一个本地公钥,最终,本地公钥与农民公钥(Farmer Public Key)融合,生成了绘图公钥(Plot Public Key)
这个随机主私钥是P盘时随机生成的,每个Plot文件都使用不同的随机主私钥,与Chia钱包软件的主私钥(Master Private Key)不是一个东西。
紧接着,矿池公钥(Pool Public Key)和绘图公钥(Plot Public Key)会被组合到一起,并进行一次哈希,哈希的结果被称为绘图ID(Plot ID)。
P盘分为四个阶段:
1、前向传播(Forward Propagation)
这一步会完成所有F函数(F Function)的计算,并把中间结果存放在磁盘上,伴随有大量的读写操作,这就是为什么临时目录建议使用SSD。
F函数的计算过程中,需要使用到绘图ID(Plot ID),因此,绘图ID(Plot ID)会直接决定Plot文件的内容。
2、反向传播(Back Propagation)
这一步主要是剔除数据中对挖矿没有作用的死条目(Dead Entry),从而减少磁盘空间占用。
3、压缩(Compress)
这一步会把数据转换成特定的格式,并写入Plot文件。
4、检查点表(Checkpoint Table)
构建检查点表(Checkpoint Table),并写入Plot文件。
这一步是为了优化查询效率,这样挖矿时,就可以减少对硬盘的读取次数,从而降低对硬盘读取性能的要求,做到真正的只拼容量。
Plot文件
有朋友问过这样一个问题,既然Chia挖矿是在Plot文件中搜索满足条件的数据,那为什么矿工不可以共享Plot文件呢?
从上面P盘的过程中,我们已经明确了,Plot的内容与农民公钥(Farmer public key)和矿池公钥(Pool public key)有关,不同的矿工,显然这两个公钥是不同的。
也就是说,不同矿工的Plot文件是完全不同的。
▼从代码中,我们可以发现,每个Plot文件的头部,都存放着元数据。
元数据中有用于区分Plot文件的绘图ID(Plot ID),以及一个叫memo的字段。
memo可以翻译为备忘录,其中保存有生成Plot文件时的一些关键信息,这名字还真形象。
▼memo字段中,包含了随机主私钥、农民公钥(Farmer Public Key)、矿池公钥(Pool Public Key)
虽然矿工间的Plot文件不同,但是依然不能解释为什么矿工不能共享Plot文件。
我就不买关子了,直接告诉大家原因,因为当你生成一个区块时,你需要使用与Plot文件相匹配的矿池私钥(Pool Private Key)进行一次签名。
如果你使用别的矿工的Polt文件,这个文件关联的是人家的矿池公钥,你又无法拿到人家的矿池私钥,所以,你无法签名,这个Plot文件,也就对你无用了。
▼矿池公钥(Pool Private Key)会被记录进区块,注意红框部分。
▼生成区块时,需要使用矿池私钥(Pool Private Key)对接受区块奖励的地址对应的puzzle_hash做签名。
整个区块中的数据环环相扣,互相依赖,你缺失或修改了任何部分,都会造成其他数据无法对应,无法通过校验,也就拿不到奖励。
关于代P盘
经过了上面的讨论,我们很容易就可以得出一个结论:
其实P盘只需要农民公钥(Farmer public key)和矿池公钥(Pool public key)就可以完成。
Chia使用的椭圆曲线加密(ECC),公钥是无法导出私钥的,所以公钥不需要保密。
事实上,只要你挖到了区块,你的矿池公钥(Pool public key)就会被记录进区块链,对全网公开。
因此,你可以把这两个公钥提供给任何人,而不会有安全问题。
这也就为代P盘提供了可能,你提供这两个公钥和硬盘给代P盘的人,对方完成P盘之后,再把硬盘发回给你。
因为对方使用的是你的公钥信息来P盘,并且只有你掌握对应的私钥,所以只有你可以使用对应的Plot文件来挖矿。
不过,以上都只是理论,理论上,是可以实现安全的代P盘的。
事实上,代P盘这个市场目前非常混乱,出现问题来求助的朋友非常多,我总结了两个典型的骗局:
1、骗取助记词/私钥
农民公钥和矿池公钥追根溯源是从主私钥派生导出的,而主私钥又是根据助记词生成的,很多代P盘的人,就会利用大家对相关知识的欠缺,谎称P盘必须提供某些信息,骗取助记词,进而掌握主私钥。
对方掌握你的主私钥后,依然会帮你P盘,只是会一直潜伏着,在区块链上观察你的挖矿收益。
当你挖到足够多的币之后,对方就会一次性把你的币全都转走,由于P盘和盗币之间间隔的时间从几天到一两周不等,你很难把两者关联起来,还以为是自己的电脑或者操作出了问题。
对方赚了你P盘的钱,又卷走了你的币,简直是空手套白狼。
更糟糕的是,当你最终醒悟过来,意识到主私钥泄露了,重新生成了安全的主私钥,你势必会有新的农民公钥和矿池公钥,Plot文件和这两个公钥密切相关,你很可能要重新P盘,又要浪费大量时间和精力。
2、调包硬盘
稍有知识的朋友,知道不能提供私钥或者助记词,但是有可能对硬件知识了解不足。
电脑显示硬盘容量的方法其实是读取硬盘的底层信息或者文件系统的元数据,并不会把整个硬盘扫描一遍。
你可以这么理解,你到书店买书,想知道书有多少页,你是不可能一页页数一遍的,你只会看看目录或者看一下最后一页的页码。
事实上,这也是唯一可行的做法,如果把硬盘整个扫描一遍,计算容量的话,至少要几个小时。
这种行之有效的提升效率的做法,却给别有用心的人提供了可乘之机。
代P盘的人,会找一块外观和你的硬盘差不多的小容量硬盘,篡改文件系统和底层数据,让电脑把它识别为大容量的硬盘,再把相同的Plot文件用不同文件名重复显示很多次,你看着就是满满一盘的Plot文件。
你可能会说,硬盘可以通过软件读取序列号,盘体上的贴纸也有序列号,这个总不能造假了吧。
魔改序列号和清零盘早就是业内公开的秘密了,盘体上的贴纸,热风枪加热软化背胶揭下来或者重新打印一张,简直不要太容易。
最终的结果就是,你拿到手一个被调包的硬盘,外观无法发现,毕竟同一个系列的硬盘,外观万年不变,软件检测也看不出什么问题。
唯一的区别就是,你会发现算力很低,对方会找一大堆理由,等你一一排除之后,差不多P盘的尾款也付完了,被拉黑也就是早晚的事儿。
对骗子来说,现在硬盘这么贵,以小换大,无论是留着自己挖还是卖掉,利润都是极大的。
以上骗局其实只是众多骗局中的一小部分,只是实施门槛很低,较为常见而已。
虽然代P盘市场目前乱象丛生,我依然相信会有一些诚信而专业的商家,提供靠谱的P盘服务,当你有足够的认知,确保可以识破骗局之后,可以考虑使用。
一定记住,你只需要,并且只能提供给对方农民公钥(Farmer public key)和矿池公钥(Pool public key)。
对普通人来说,我还是建议自己完成P盘操作,省心安全。
多机P盘
既然找其他人代P盘可以是安全的,那么自己买多台机器同时P盘,也是可以的。
Chia的官方钱包为了照顾小白用户,设计了非常友好的图形界面,但是这也限制了我们自由发挥的空间。
很多朋友为了加快P盘速度,在多台机器上安装Chia钱包软件,通过导入助记词,来进行P盘,有时他们都懒的用纸笔记录,直接拍照,甚至用微信传输助记词或照片。
助记词意味着主私钥,主私钥意味着你对加密货币的控制,将主私钥如此草率地放置于多台机器,并暴露于公共通讯之下,实在是非常危险。
其实,Chia提供了命令行工具,我们完全可以直接提取农民公钥(Farmer public key)和矿池公钥(Pool public key),然后在其他P盘机上,使用命令行P盘。
这样,再也不用把助记词导入每台P盘机了,既安全,又方便。
▼使用下图中的命令,即可在命令行下P盘。不要为我担心,命令中的都是公钥。
李明阳有话说
在最近的咨询中,一位被调包了硬盘的朋友说了一句让我很有感触的话:
不怕你不知道,就怕你不知道你不知道,更怕你以为自己知道了,其实你不知道。
挖矿作为技术密集型行业,即使是Chia这类门槛很低的币种,看似简单背后,高手和小白间的差距也是巨大的,设备选型、软件架构、运维管理、收益变现等等,每一步都有不同的方案,而这些累加起来,也许就是盈利与亏损的区别。
很多小白在没有做好准备,认知不足的情况下,盲目入行,自己瞎折腾,白白浪费了时间,浪费了金钱,还做过了机会,甚至上当受骗。
并不是所有人都适合投资币圈和矿圈的,不要读了几篇科普文章就认为自己无所不能,在你入行之前,请务必确保你已经有了足够的认知。(例行劝退结束 )
(本文仅作为科普用途,为了通俗易懂,省略了大量细节,请勿作为投资依据。)
暂无评论 >_<