/*! * mine.js - mining function for bcoin * Copyright (c) 2014-2017, Christopher Jeffrey (MIT License). * https://github.com/bcoin-org/bcoin */ 'use strict'; const assert = require('bsert'); const hash256 = require('bcrypto/lib/hash256'); /** * Hash until the nonce overflows. * @alias module:mining.mine * @param {Buffer} data * @param {Buffer} target - Big endian. * @param {Number} min * @param {Number} max * @returns {Number} Nonce or -1. */ function mine(data, target, min, max) { let nonce = min; data.writeUInt32LE(nonce, 76, true); // The heart and soul of the miner: match the target. while (nonce <= max) { // Hash and test against the next target. if (rcmp(hash256.digest(data), target) <= 0) return nonce; // Increment the nonce to get a different hash. nonce += 1; // Update the raw buffer. data.writeUInt32LE(nonce, 76, true); } return -1; } /** * "Reverse" comparison so we don't have * to waste time reversing the block hash. * @ignore * @param {Buffer} a * @param {Buffer} b * @returns {Number} */ function rcmp(a, b) { assert(a.length === b.length); for (let i = a.length - 1; i >= 0; i--) { if (a[i] < b[i]) return -1; if (a[i] > b[i]) return 1; } return 0; } /* * Expose */ module.exports = mine;