一、简介

  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的更多相关文章

  1. btcpool之StratumServer

    一.简介 StratumServer(简称sserver)接收JobMaker发送的stratumjob消息,从http api获取用户列表,对外部矿机提供服务. 二.处理stratumjob消息 s ...

  2. btcpool之总架构

    一.架构图 二.模块划分 整个btcpool分成GbtMaker.BlockMaker.JobMaker.StratumServer.PoolWatcher.statshttpd.sharelogge ...

  3. btcpool之BlockMaker

    一.简介 BlockServer将StratumServer发送的solvedshare数据(块头和coinbase交易)与GbtMaker发送的rawgbt数据(其他交易)一起组装成一个块,然后通过 ...

  4. btcpool之Stratum协议

    一.简介 矿机(或挖矿软件)与矿池之间通过stratum协议通讯,它包括订阅.授权.下发难度.下发任务.提交share五种消息. 二.订阅(mining.subscribe) 矿机启动后,先和矿池建立 ...

  5. btcpool之GbtMaker

    一.简介 GbtMaker全称getblocktemplate maker,它通过getblocktemplate rpc接口从bitcoind获得挖矿所需数据,然后把该数据发送到kafka消息队列. ...

随机推荐

  1. 商品规格笛卡尔积PHP

    <?php $color = array('red', 'green'); $size = array(39, 40, 41); $local = array('beijing', 'shang ...

  2. Jmeter性能测试之基础知识(一)

    1. 官网下载Jmeter: 点这里, 下载完成解压即可 2. 启动: 进入解压后的bin目录, Windows点击jmeter.bat, Linux执行jmeter 3. 添加线程组(user) : ...

  3. n 个骰子的点数

    把 n 个骰子仍在地上,求点数和为 s 的概率. java: public List<Map.Entry<Integer, Double>> dicesSum(int n) { ...

  4. spring security 简单应用

    Pom <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http:// ...

  5. React十进制和二进制转换的实现和分析

    [描述] 模仿官方文档的摄氏度和华氏度的转换,实现十进制和二进制的互换. [实现] import React from 'react'; import ReactDOM from 'react-dom ...

  6. Python面向对象之魔术方法

    __str__ 改变对象的字符串显示.可以理解为使用print函数打印一个对象时,会自动调用对象的__str__方法 class Student: def __init__(self, name, a ...

  7. silverlight 调试问题

    web端调用方式是:<param name="source" value="/ClientBin/Chns.Web.RoomChart.xap?v=012" ...

  8. Gradle入门与使用

    注:此篇博客主要是看官网的学习笔记:https://docs.gradle.org/current/userguide/installation.html 一.安装: 1.Gradle有内置的groo ...

  9. (59)Wangdao.com第十天_JavaScript 对象在 栈和堆

    对象的属性值 如果要使用特殊的属性名,需 对象["属性名"] = 属性值       // 存 对象["属性名"]       // 取 obj["1 ...

  10. [LeetCode] Design HashSet 设计HashSet

    Design a HashSet without using any built-in hash table libraries. To be specific, your design should ...