Mining时代进化:
CPU挖矿 -> GPU挖矿 -> FPGA挖矿 -> ASIC挖矿
CPU挖矿时代:SENGENERATE
GPU挖矿时代:GETWORK

Miner:
挖矿的程序或者机器统称矿工

挖矿本质:
执行Hash函数的过程,而Hash函数是一个单输入单输出函数,输入数据就是一个区块头

区块头分为六个字段:
nVersion 版本号(固定)
hashPrewBlock 前一个区块hash(固定)
hashMerkleRoot 交易Merkle根(理论上提供2^256种可能)
nTime 时间戳(一般矿工直接使用机器当前时间戳)
nBits 难度(固定)
nNonce 随机数(如BTC提供2^32种可能取值)

挖矿逻辑
打包交易。检索待确认交易内存池,选择包含区块的交易
构造Coinbase。
构造hashMerkleRoot。
填充其他字段,获得完整区块头。
Hash运算,对区块头进行SHA256D运算。
验证结果,如果符合难度,则广播到全网,挖下一个块;不符合难度则根据一定策略改变以上某个字段后再进行Hash运算并验证。

GETWORK

getwork协议代表了GPU挖矿时代,需求主要源于挖矿程序与节点客户端分离,区块链数据与挖矿部件分离。

getwork核心设计思路是:

由节点客户端构造区块,然后将区块头数据交给外部挖矿程序,挖矿程序遍历nNonce进行挖矿,验证合格后交付回给节点客户端,节点客户端验证合格后广播到全网。

合格的区块条件如下:
SHA256D(Blockherder)"挖矿结果"<F(nBits)“难度对应目标值”
都是256位

STRATUM
矿池通过getblocktemplate协议与网络节点交互,以获得区块链的最新信息,通过stratum协议与矿工交互。
为了让之前用getwork协议挖矿的软件也可以连接到矿池挖矿,矿池一般也支持getwork协议,通过阶层挖矿代理机制实现(Stratum mining proxy)。
在矿池刚出现时,显卡挖矿还是主力,getwork用起来非常方便,另外早期的FPGA矿机有些是用getwork实现的,stratum与矿池采用TCP方式通信,数据使用JSON封装格式。

一句话简单的总结:

挖矿实际上就是矿池作为与链上节点交互的一个角色,将new block的json数据格式的Header给到矿工,矿工聚集算力给矿池算出new block需要的正确的Nonce,最后验证通过后矿池拿到出块奖励分发给矿工。

至于多年前diff低的时候的不需要pool的solo mining就不提了....

笔记参考:深度解析挖矿的逻辑与技术实现

最新文章

  1. php-fpm优化
  2. A Beginner&#39;s Guide to Paxos
  3. Activity的Launch Mode
  4. linux下的触控板手势xSwipe and tag
  5. js动态增加表格
  6. ruby编程语言-学习笔记4(第4章 表达式和操作符)
  7. zoj2562:搜索+数论(反素数)
  8. 利用阿里云Centos7建站过程
  9. 服务器安装centos
  10. 只有mdf文件和ldf文件--怎么恢复数据库
  11. spring AOP源码分析(一)
  12. Golang入门教程(十二)安装注意事项
  13. 题解-UOJ284 快乐游戏鸡
  14. C# ReaderWriterLockSlim 实现
  15. C#连接数据库MD5数据库加密
  16. 峰Spring4学习(2)依赖注入的几种方式
  17. DBA_实践指南系列8_Oracle Erp R12数据维护模式Adadmin(案例)
  18. IOS中摇一摇实现截屏(可实现问题反馈的功能)
  19. 对/proc/cpuinfo文件下的各个参数的说明及实践
  20. 用CRF做命名实体识别(一)

热门文章

  1. JPA+Hibernate 3.3 ——基本属性映射
  2. mysql索引hash索引和b-tree索引的区别
  3. 判断一棵二叉树是否为AVL树
  4. Java知多少(78)Java向量(Vector)及其应用
  5. Java知多少(104)网络编程之统一资源定位符URL
  6. Gson - 学习
  7. 关于spring boot自动注入出现Consider defining a bean of type &#39;xxx&#39; in your configuration问题解决方案
  8. 5 -- Hibernate的基本用法 --5 3 改变持久对象状态的方法
  9. javascript +new Date()
  10. [Android] 基于 Linux 命令行构建 Android 应用(六):Android 应用签名