chia 的 p 图过程详解及优化攻略

仅仅两个⽉的时间,chia 全⽹算⼒就突破了 15EP,1p 算⼒单⽇收益也从最初的三十多个变成了零点⼏个。在这场激烈的博弈中,⼤家为了更快的⼊场,都想加快 p 图速度,⽽事实证明,较快的 p 图速度确实能获得更多收益。那么究竟什么是 p 图呢?⽽⼜如何才能更快的 p 图呢?本文带你⼀起来研究。

准备工作

chia 的 p 图过程⼗分漫⻓,根据不同的机器配置,需要消耗 6 个⼩时甚⾄10 多个⼩时,在这么⻓的时间, p 图都做了哪些⼯作呢?

每次 P 盘开始时,都会⽣成⼀个随机主私钥,通过它可以派⽣出⼀个本地私钥,这个本地私钥⼜可以导出⼀个本地公钥,最终,本地公钥与农⺠公钥(Farmer Public Key)融合,⽣成了绘图公钥(Plot Public Key),这个随机主私钥是 P 盘开始时随机⽣成的,每个 Plot⽂件都使⽤不同的随机主私钥(注意:这⾥提到的 plot⽂件的随机主私钥与 Chia 钱包软件的主私钥(Master Private Key)不是⼀个东西),矿池公钥(Pool Public Key)和绘图公钥(Plot Public Key)会被组合到⼀起,并进⾏⼀次哈希,⽣成⻓度 64 的字符串,哈希的结果被称为绘图 ID (Plot ID)。

在 chia 的区块链浏览器中我们也可以看到类似的绘图 ID。

每个图的 Plot ID 是唯⼀的,这也就为矿池判断旷⼯是否双挖提供了依据(钱包和矿池双挖),矿池只需要拿旷⼯数据库中已签名的 Plot ID 和链上数据做下匹配,就能在⼀定程度上判断是否双挖,当然,这只是判断的⼿段之⼀,也不是本⽂讨论的重点。

P 图过程详解

接下来,⽣成 Plot ID 之后,就开始了漫⻓的 P 盘过程,⽽整个 P 盘过程⼜分为了四个阶段:正向传播、 反向传播、压缩以及检查数据点。在官⽅代码中我们可以找到 P 图相关的代码,代码位于 : chia-blockchain/chia/plotting/createplots.py ,在代码中有⼀个 createplots 的⽅法,不过实际阅读下来,P 图的核⼼代码还是⽤ C++ 实现,C++ 运⾏速度更快,能够提升 P 图效率。

展开全文

从 DiskPlotter 中,我们可以了解到 P 图的整个过程在这四个阶段中都完成了什么⼯作,

代码位置位于:

https://github.com/Chia-Network/chiapos/blob/78dea902eaa068a687538f2f433509461a7681e9/src/plotter_disk.hpp

第一阶段:正向传播 Forward Propagation

这⼀步主要完成 F 函数(F Function)的计算,并把中间结果存放在磁盘上,这个过程会有⼤量的读写操作,这就是为什么临时⽬录建议使⽤ SSD,如果使⽤机械硬盘,由于读写速度的限制,P 图过程会⾮常慢。在这个阶段会完成 7 个表的计算,耗时根据电脑情况的不同,需要 3 到 6⼩时不等,该过程除了对磁盘的读写速度要求较⾼之外,同时对 cpu 的线程数和主频都有⼀定的要求。

第二阶段:反向传播 Backpropagation

该过程会倒序对数据表 7 到 1 逐个进⾏扫描和排序,剔除对挖矿没有作⽤的⽆效证明数据,从⽽减少磁盘空间占⽤,并同时⽣成新的临时⽂件。如果你看到 P 图的进度条很⻓时间卡在 31%,那说明正处于这个阶段,该阶段主要消耗内存。

第三阶段:压缩 Compression

该阶段会对哈希进⾏排序并通过算法将其压缩到临时⽬录中,同时开始构建最终⽂件,为了更快的数据检索匹配,会对筛选好的证明数据进⾏磁盘排序整理和压缩,该阶段主要消耗固态硬盘。

第四阶段:检查数据点 Checkpoints

这⼀步构建检查点表(Checkpoint Table),并写⼊ Plot ⽂件到机械硬盘,该过程优化了查询效率,这样挖矿时,就可以减少对硬盘的读取次数,从⽽降低对硬盘读取性能的要求,该阶段主要消耗机械硬盘。

如何优化

在了解 P 图过程之后,我们再来探讨根据每个阶段所消耗的资源情况来进⾏针对性优化。

1、合理计算电脑能够同时的 P 图数量

以 k32 为列,我们先来了解⼀下关键因素的计算公式:

固态硬盘的计算:

单个固态硬盘实际容量 /239GB= 任务数

附:GiB 和 GB 单位误差较⼩,这⾥直接忽略误差,直接以 GB 为单位,⽅便计算。

CPU 的计算:

CPU 线程数 /2= 任务数

内存的计算:内存容量 /4GB= 任务数

以上是根据 P 图默认参数进⾏计算,实际 P 图过程中可以适当考虑给系统留⼀些资源,P 图对硬件的需求也遵守“⽊桶理论”,即⼀只⽊桶盛⽔的多少,并不取决于桶壁上最⾼的那块⽊块,⽽恰恰取决于桶壁上最短的那块。同样的道理,我们在设置任务时也要遵循这个原理,⽐如你的 cpu 是 8 核 16 线程,得到的任务数是 16/2=8 个,但固态硬盘只有 2T,2T 固态硬盘实际容量只有 1.8T, 得到的任务数 (1.8*1024)/239=7.7 (取 7 个), 所以按照⽊桶理论最多只能并⾏7 个任务。

2、任务并⾏时要设置间隔时间

不要同时启动多个任务,每个任务之间应该有 10 到 20 分钟的间隔时间。这么做的原因是因为 P 图的每个阶段对资源的需求都不⼀样,这样做的好处是避免多个任务竞争同⼀资源,⽐如在写机械硬盘时,如果多个任务都在写,那效率会⾮常低下。

3、合理优化 cpu

如果 cpu 的线程数 > 任务数 *2 且剩余线程数⽐较多的情况下,可以考虑增加每个任务的线程数,设置为 3 或 4,可以增加第⼀阶段的效率,当然,这⾥不是越⼤越好,官⽅推荐的最⼤设为 4 是⽐较理想的状态。

4、合理优化内存

内存如果⽐较充裕,可以适当增加每个任务的内存,如果内存⾜够⼤,还可以把桶设置为 64 桶,默认桶 是设置的 128 桶,128 桶需要 4G 内存,⽽64 桶需要 8G 内存,经测验,64 桶在 P 图效率上更胜⼀筹。

作者:创宇区块链安全实验室;来自链得得内容开放平台“得得号”,本文仅代表作者观点,不代表链得得官方立场凡“得得号”文章,原创性和内容的真实性由投稿人保证,如果稿件因抄袭、作假等行为导致的法律后果,由投稿人本人负责得得号平台发布文章,如有侵权、违规及其他不当言论内容,请广大读者监督,一经证实,平台会立即下线。如遇文章内容问题,请发送至邮箱:linggeqi@chaindd.com

来源:http://www.bitekongjian.com/news/28927.html