diff --git a/README.md b/README.md index 8ec7e1d..4aa1132 100644 --- a/README.md +++ b/README.md @@ -31,6 +31,8 @@ Requirements * coin daemon * PostgreSQL * npm dependencies + * [scrypt256-hash](https://github.com/zone117x/node-scrypt256-hash) + * [quark-hash](https://github.com/zone117x/node-quark-hash) * [binpack](https://github.com/russellmcc/node-binpack) * [bignum](https://github.com/justmoon/node-bignum) * [buffertools] (https://github.com/bnoordhuis/node-buffertools) @@ -44,6 +46,7 @@ Credits * [viperaus](https://github.com/viperaus/stratum-mining) - scrypt adaptions to python code * [ahmedbodi](https://github.com/ahmedbodi/stratum-mining) - more algo adaptions to python code * [TheSeven](https://github.com/TheSeven) - being super knowledgeable & helpful +* [vekexasia](https://github.com/vekexasia) - bug fixes Donations --------- diff --git a/blockTemplate.js b/blockTemplate.js index b0e226b..61910f7 100644 --- a/blockTemplate.js +++ b/blockTemplate.js @@ -53,15 +53,28 @@ var BlockTemplate = module.exports = function BlockTemplate(jobId, rpcData, publ ]); }; - this.serializeHeader = function(merkleRootBuffer, nTimeBuffer, nonceBuffer){ - return Buffer.concat([ + this.serializeHeader = function(merkleRoot, nTime, nonce){ + + var header = new Buffer(80); + var position = 0; + header.writeUInt32BE(nonce, position); + header.write(rpcData.bits, position += 4, 4, 'hex'); + header.writeUInt32BE(nTime, position += 4); + header.write(merkleRoot, position += 4, 32, 'hex'); + header.write(rpcData.previousblockhash, position += 32, 32, 'hex'); + header.writeUInt32BE(rpcData.version, position + 32); + //var header = reverseBuffer(header); + + return header; + + /*return Buffer.concat([ binpack.packInt32(rpcData.version, 'big'), this.previousHashBuffer, merkleRootBuffer, nTimeBuffer, new Buffer(this.rpcData.bits, 'hex'), nonceBuffer - ]); + ]);*/ }; this.serializeBlock = function(header, coinbase){ diff --git a/jobManager.js b/jobManager.js index 18def15..30d4b44 100644 --- a/jobManager.js +++ b/jobManager.js @@ -2,6 +2,8 @@ var events = require('events'); var binpack = require('binpack'); var bignum = require('bignum'); +var scrypt = require('scrypt-hash'); +var quark = require('quark-hash'); var util = require('./util.js'); var blockTemplate = require('./blockTemplate.js'); @@ -98,25 +100,30 @@ var JobManager = module.exports = function JobManager(options){ var extraNonce2Buffer = new Buffer(extraNonce2, 'hex'); - var nTimeBuffer = new Buffer(nTime, 'hex'); - var nonceBuffer = new Buffer(nonce, 'hex'); - var coinbaseBuffer = job.serializeCoinbase(extraNonce1Buffer, extraNonce2Buffer); var coinbaseHash = util.doublesha(coinbaseBuffer); - var merkleRootBuffer = job.merkleTree.withFirst(coinbaseHash); - for (var i = 0; i < 8; i++) - merkleRootBuffer.writeUInt32LE(merkleRootBuffer.readUInt32BE(i * 4), i * 4); + var merkleRoot = job.merkleTree.withFirst(coinbaseHash).toString('hex'); + var headerBuffer = job.serializeHeader(merkleRoot, nTime, nonce); + + var headerHash = (function(){ + switch(options.algorithm){ + case 'sha256': + return util.doublesha(headerBuffer); + case 'scrypt': + return scrypt.digest(headerBuffer); + case 'scrypt-jane': + return scryptJane.digest(headerBuffer); + case 'quark': + return quark.digest(headerBuffer); + } + })(); - var headerBuffer = job.serializeHeader(merkleRootBuffer, nTimeBuffer, nonceBuffer); - for (var i = 0; i < 20; i++) headerBuffer.writeUInt32LE(headerBuffer.readUInt32BE(i * 4), i * 4); - var headerHash = util.doublesha(headerBuffer); var headerBigNum = bignum.fromBuffer(headerHash); - var targetUser = bignum.fromBuffer( new Buffer('00000000ffff0000000000000000000000000000000000000000000000000000', 'hex') ).div(difficulty); @@ -128,7 +135,6 @@ var JobManager = module.exports = function JobManager(options){ _this.emit('blockFound', job.serializeBlock(headerBuffer, coinbaseBuffer)); } - return {result: true}; }; }; diff --git a/util.js b/util.js index e7f7a62..ff1358a 100644 --- a/util.js +++ b/util.js @@ -37,9 +37,8 @@ exports.doublesha = function(buffer){ exports.reverseBuffer = function(buff){ var reversed = new Buffer(buff.length); - for (var i = 0; i < buff.length; i++){ - reversed[buff.length - (i + 1)] = buff[i]; - } + for (var i = buff.length - 1; i >= 0; i--) + reversed[buff.length - i - 1] = buff[i]; return reversed; };