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且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交易。

posted @ 2019-04-25 10:02  perimeter  阅读(490)  评论(0编辑  收藏  举报