miner: refactor extranonce.

This commit is contained in:
Christopher Jeffrey 2016-12-14 17:15:27 -08:00
parent 40b3e56402
commit ee3745616e
No known key found for this signature in database
GPG Key ID: 8962AB9DE6666BBD
2 changed files with 44 additions and 15 deletions

View File

@ -11,6 +11,7 @@ var assert = require('assert');
var util = require('../utils/util');
var btcutils = require('../btc/utils');
var co = require('../utils/co');
var StaticWriter = require('../utils/staticwriter');
var constants = require('../protocol/constants');
var Network = require('../protocol/network');
var BN = require('bn.js');
@ -54,7 +55,8 @@ function MinerBlock(options) {
this.target = btcutils.fromCompact(this.bits).toArrayLike(Buffer, 'le', 32);
this.locktime = options.locktime;
this.flags = options.flags;
this.extraNonce = new BN(0);
this.nonce1 = 0;
this.nonce2 = 0;
this.iterations = 0;
this.coinbaseFlags = options.coinbaseFlags;
this.witness = options.witness;
@ -132,20 +134,15 @@ MinerBlock.prototype._init = function _init() {
// Height (required in v2+ blocks)
input.script.set(0, new BN(this.height));
// extraNonce - incremented when
// the nonce overflows.
input.script.set(1, this.extraNonce);
// Add a nonce to ensure we don't
// collide with a previous coinbase
// of ours. This isn't really
// necessary nowdays due to bip34
// (used above).
input.script.set(2, util.nonce());
// Let the world know this little
// miner succeeded.
input.script.set(3, this.coinbaseFlags);
input.script.set(1, this.coinbaseFlags);
input.script.set(2, util.nonce().slice(0, 4));
// extraNonce - incremented when
// the nonce overflows.
input.script.set(3, this.extraNonce());
input.script.compile();
@ -219,7 +216,7 @@ MinerBlock.prototype.updateCoinbase = function updateCoinbase() {
var output = this.coinbase.outputs[0];
// Update extra nonce.
input.script.set(1, this.extraNonce);
input.script.set(3, this.extraNonce());
input.script.compile();
// Update reward.
@ -235,7 +232,12 @@ MinerBlock.prototype.updateNonce = function updateNonce() {
// Overflow the nonce and increment the extraNonce.
this.block.nonce = 0;
this.extraNonce.iaddn(1);
this.nonce1++;
this.nonce1 &= 0xffffffffffff;
if (this.nonce1 === 0)
this.nonce2++;
// We incremented the extraNonce, need to update coinbase.
this.updateCoinbase();
@ -263,6 +265,20 @@ MinerBlock.prototype.updateMerkle = function updateMerkle() {
this.block.merkleRoot = this.block.createMerkleRoot('hex');
};
/**
* Render extraNonce.
* @returns {Buffer}
*/
MinerBlock.prototype.extraNonce = function extraNonce() {
var bw = new StaticWriter(12);
bw.writeU32BE(this.nonce1 / 0x10000 | 0);
bw.writeU16BE(this.nonce1 & 0xffff);
bw.writeU32BE(this.nonce2 / 0x10000 | 0);
bw.writeU16BE(this.nonce2 & 0xffff);
return bw.render();
};
/**
* Add a transaction to the block. Rebuilds the merkle tree,
* updates coinbase and commitment.
@ -475,6 +491,7 @@ MinerBlock.prototype.commit = function commit(nonce) {
this.block.nonce = nonce;
this.block.mutable = false;
this.coinbase.mutable = false;
return this.block;
};
/**

View File

@ -851,6 +851,18 @@ encoding.U32 = function U32(num) {
return data;
};
/**
* Serialize number as a u32be.
* @param {Number} num
* @returns {Buffer}
*/
encoding.U32BE = function U32BE(num) {
var data = new Buffer(4);
data.writeUInt32BE(num, 0, true);
return data;
};
/**
* Get size of varint-prefixed bytes.
* @param {Buffer} data