btcpool之JobMaker
一、简介
JobMaker从kafka消息队列接收rawgbt消息,然后解码该消息中的gbt数据,生成Job,发送到kafka消息队列。
二、StratumJob结构
StratumJob结构是JobMaker的核心数据结构,其字段如下:
三、coinbase交易
The first transaction in a block, called the coinbase transaction, must have exactly one input, called a coinbase. The coinbase input currently has the following format.
忽略隔离见证,coinbase交易只有一个输出,其结构如下:
其中value为gbt数据中coinbasevalue。
四、生成Job
JobMaker从kafka接收到rawgbt消息(包含时间、gbthash及gbt数据三部分)后,先判断该消息是否过期(超过1分钟),若该消息已经过期,则忽略该消息。然后解码该消息的gbt数据部分。若该gbt对应的块高度小于最近一次的Job的块高度,则不进行处理。若该gbt对应的块高度等于最近一次的Job的块高度且最近一次的Job不是空块Job,则也不进行处理。否则用该gbt数据来生成StratumJob,生成流程如下:
1、计算生成gbthash(其实rawgbt消息中已包含gbthash,但没保存);
2、生成64位jobId(高32位为当前时间戳,接下来24位取gbthash中的3字节,低8位为JobMaker服务器id);
3、从gbt数据中获取previousblockhash、height、version、bits、curtime、mintime、coinbasevalue、default_witness_commitment等数据;
4、用bits生成networkTarget(其实gbt数据中包含了target);
5、将prevHash转换成小端字节序;
6、解码gbt数据中的transactions,并生成merkle branch哈希数组(用于快速生成block header的merkle root);
7、生成coinbase input:
a)由于coinbase input没有用到UTXO,所以hash为32字节0,index为0xffffffff(即-1);
b)将块高度(长度+实际高度,由于当前块的高度用3字节就能表示,所以当前长度为3)、当前时间戳(长度4+时间戳小端字节序)、coinbase info(一般是矿池信息,可在配置文件中配置)、12字节0xEE占位符(给extraNonce占位)写到CScript,然后由该CScript生成coinbase input中的script bytes、height及coinbase script;
c)sequence为0xffffffff;
8、用gbt数据中的coinbasevalue及挖矿钱包地址(可在配置文件中配置)生成coinbase output ;
9、将coinbase交易序列化,然后按12字节0xEE占位符分割成coinbase1(占位符之前)和coinbase2(占位符之后)两部分;
然后将生成的Job序列化成json数据并发送到kafka消息队列的StratumJob主题。
五、其他
1、整个coinbase交易分成coinbase1、extraNonce及coinbase2三部分。其中extraNonce由4字节的extraNonce1和8字节的extraNonce2组成,extraNonce1一般为矿机在StratumServer上的session id,extraNonce2由矿机计算并提交给矿池。
2、coinbase交易与其他交易生成block header的merkle root,但为了快速生成merkle root,用其他交易生成merkle branch哈希数组(矿池会将该数组下发给矿机),然后由coinbase交易与merkle branch数组生成merkle root。另外将coinbase交易拆分成变动(extraNonce)和不变动(coinbase1及coinbase2)部分,可以快速生成coinbase交易。
btcpool之JobMaker的更多相关文章
- btcpool之StratumServer
一.简介 StratumServer(简称sserver)接收JobMaker发送的stratumjob消息,从http api获取用户列表,对外部矿机提供服务. 二.处理stratumjob消息 s ...
- btcpool之总架构
一.架构图 二.模块划分 整个btcpool分成GbtMaker.BlockMaker.JobMaker.StratumServer.PoolWatcher.statshttpd.sharelogge ...
- btcpool之BlockMaker
一.简介 BlockServer将StratumServer发送的solvedshare数据(块头和coinbase交易)与GbtMaker发送的rawgbt数据(其他交易)一起组装成一个块,然后通过 ...
- btcpool之Stratum协议
一.简介 矿机(或挖矿软件)与矿池之间通过stratum协议通讯,它包括订阅.授权.下发难度.下发任务.提交share五种消息. 二.订阅(mining.subscribe) 矿机启动后,先和矿池建立 ...
- btcpool之GbtMaker
一.简介 GbtMaker全称getblocktemplate maker,它通过getblocktemplate rpc接口从bitcoind获得挖矿所需数据,然后把该数据发送到kafka消息队列. ...
随机推荐
- Java Callable使用
1. 创建线程的三种方式: 继承Thread,重写run方法 实现Runnable接口,重新run方法 实现Callable接口,重写call方法 2. Callable接口实际上是属于Executo ...
- Android+openCV 的坑
之前一直用IntelliJ IDEA 导入 opencv_android_sdk 的 java 包,在最后一步finish时,始终出错. 后来重新安装Android Studio 重复以上步骤,能顺利 ...
- spark MLlib collaborativeFilltering学习
package ML.collaborativeFilltering; import org.apache.spark.SparkConf; import org.apache.spark.api.j ...
- hdu5701-中位数计数
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5701 题目: Problem Description 中位数定义为所有值从小到大排序后排在正中间的那个 ...
- jdbc和odbc
JDBC简介 JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,它是Java十三个规范之一.可以为多种关系数据库提供统一 ...
- 2017-11-4—模拟PID电路(参考ADN8834datasheet)
先贴几张datasheet原图: 这部分都很想了解,最想了解的是这四个zero point.pole point.pole point.zero point是怎么求出来的? 现在S域求出传函?(自动化 ...
- Java笔记(二十) 注解
注解 一.内置注解 Java内置了一些常用注解: 1.@Override 该注解修饰一个方法,表示当前类重写了父类的该方法. 2.@Deprecated 该注解可以修饰类.方法.字段.参数等.表示对 ...
- pymongo使用手册
MongoDB是由C++语言编写的非关系型数据库,是一个基于分布式文件存储的开源数据库系统,其内容存储形式类似JSON对象,它的字段值可以包含其他文档.数组及文档数组,非常灵活.在这一节中,我们就来看 ...
- [LeetCode] Chalkboard XOR Game 黑板亦或游戏
We are given non-negative integers nums[i] which are written on a chalkboard. Alice and Bob take tu ...
- c语言的二进制表示的是什么码
int -1 的二进制是 1111 1111 1111 1111 1111 1111 1111 1111 int -2 的二进制是 1111 1111 1111 1111 1111 1111 1111 ...