仅仅两个⽉的时间,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 图效率上更胜⼀筹。

chia 的 p 图过程详解及优化攻略相关推荐

  1. python画动图-Python绘制动态水球图过程详解

    先来看看绘制的动态水球图: 没有安装PyEcharts的,先安装PyEcharts: # 安装pyecharts模块,直接安装就是最新的版本pip install pyecharts 安装好PyEch ...

  2. ML之shap:分析基于shap库生成的力图、鸟瞰图、散点图等可视化图的坐标与内容详解之详细攻略

    ML之shap:分析基于shap库生成的力图.鸟瞰图.散点图等可视化图的坐标与内容详解之详细攻略 目录 一.力图可视化 1.单个样本力图可视化

  3. NLP:Transformer的架构详解之详细攻略(持续更新)

    NLP:Transformer的架构详解之详细攻略(持续更新) 目录 Transformer的架构详解 1. Encoder 1.1.Positional Encoding-数据预处理的部分 1.2. ...

  4. NLP:Transformer的简介(优缺点)、架构详解之详细攻略

    NLP:Transformer的简介(优缺点).架构详解之详细攻略 目录 Transformer的简介(优缺点).架构详解之详细攻略 1.Transformer的简介 (1).Transforme的四 ...

  5. Python之pandas:pandas中to_csv()、read_csv()函数的index、index_col(不将索引列写入)参数详解之详细攻略

    Python之pandas:pandas中to_csv().read_csv()函数的index.index_col(不将索引列写入)参数详解之详细攻略 目录 pandas中to_csv().read ...

  6. Python之pandas:pandas中缺失值与空值处理的简介及常用函数(drop()、dropna()、isna()、isnull()、fillna())函数详解之详细攻略

    Python之pandas:pandas中缺失值与空值处理的简介及常用函数(drop().dropna().isna().isnull().fillna())函数详解之详细攻略 目录 pandas中缺 ...

  7. Computer:字符编码(ASCII编码/GBK编码/BASE64编码/UTF-8编码)的简介、案例应用(python中的编码格式及常见编码问题详解)之详细攻略

    Computer:字符编码(ASCII编码/GBK编码/BASE64编码/UTF-8编码)的简介.案例应用(python中的编码格式及常见编码问题详解)之详细攻略 目录 符串编码(ASCII编码/GB ...

  8. CCF201812-5 管道清洁 建图过程详解+代码

    题目就不贴出来了,网上很多,但是网上的题解基本都是在默认读者已经懂网络流/费用流的前提下写的,解析很少,我就以初学者的角度记录一下这个题的学习过程. 首先这个题是无汇源有上下界的费用流最大流问题(好像 ...

  9. BilSTM 实体识别_NLP-入门实体命名识别(NER)+Bilstm-CRF模型原理Pytorch代码详解——最全攻略

    最近在系统地接触学习NER,但是发现这方面的小帖子还比较零散.所以我把学习的记录放出来给大家作参考,其中汇聚了很多其他博主的知识,在本文中也放出了他们的原链.希望能够以这篇文章为载体,帮助其他跟我一样 ...

最新文章

  1. 链表 -- 双向循环链表(线性表)
  2. AngularJS 国际化——Angular-translate
  3. web前端html图片轮播,如何使用LayUI实现网页轮播图_WEB前端开发,layui,轮播图
  4. spark广播变量的使用(转)
  5. 2018-2019-2 20175235 实验四《Android开发基础》实验报告
  6. c++ 使用socket实现C/S端文件的下载传输
  7. 施一公:让科技工作成为富有吸引力的工作
  8. Bootstrap3 全局样式
  9. 在html插入数学公式,在网页中显示数学公式
  10. 【IT之路】LoadRunner系列-Win7 64bit下搭建Loadrunner11破解版
  11. 用通俗易懂的方式讲解: GBDT算法及案例(Python 代码)
  12. 时间轮定时器的实现(C++)
  13. 如何选择APP的推广渠道?
  14. python显示图片_python Image 模块处理图片
  15. pentaho开源商业智能平台的搭建
  16. ssl证书过期怎么解决?
  17. 我的第一篇论文诞生的故事
  18. 《微信小程序-证件照换底色》之二:用pycharm搭建django框架来接收微信小程序上传的图片
  19. PCI-Express转4串/8串/28串口CH384的硬件配置及设计
  20. 隐私保护与生成模型: 差分隐私GAN的梯度脱敏方法

热门文章

  1. vue中展示mapbox地图
  2. sybase 设置默认值_SYBASE性能优化
  3. Velocity ユーザガイド
  4. jquery 点击元素以外任意地方隐藏该元素的方法
  5. Android刘海屏如何适配?一份详细的Android刘海屏、水滴屏全面屏适配方案
  6. PyQt自定义标题栏(界面美化,附C++和Python源码)
  7. 解决elementui中Container自适应最上面有空白
  8. matlab移花接木,分析帝:天山移花接木VS明教怒火连斩
  9. 【工具】AlibabaPuHuiTi 阿里巴巴 普惠体 字体windows安装
  10. 十问十答带你快速了解ASPICE