diff --git a/lib/blockTemplate.js b/lib/blockTemplate.js index f776dd0..e42155d 100644 --- a/lib/blockTemplate.js +++ b/lib/blockTemplate.js @@ -39,7 +39,7 @@ var BlockTemplate = module.exports = function BlockTemplate(rpcData, publicKey, })); this.merkleTree = new merkleTree(getTransactionBuffers(rpcData.transactions)); this.merkleBranch = getMerkleHashes(this.merkleTree.steps); - this.generationTransaction = new transactions.Generation( + this.generationTransaction = transactions.CreateGeneration(//new transactions.Generation( rpcData, publicKey, extraNoncePlaceholder @@ -51,10 +51,10 @@ var BlockTemplate = module.exports = function BlockTemplate(rpcData, publicKey, this.serializeCoinbase = function(extraNonce1, extraNonce2){ return Buffer.concat([ - this.generationTransaction.coinbase[0], + this.generationTransaction[0], extraNonce1, extraNonce2, - this.generationTransaction.coinbase[1] + this.generationTransaction[1] ]); }; @@ -96,8 +96,8 @@ var BlockTemplate = module.exports = function BlockTemplate(rpcData, publicKey, this.jobParams = [ this.jobId, this.prevHashReversed, - this.generationTransaction.coinbase[0].toString('hex'), - this.generationTransaction.coinbase[1].toString('hex'), + this.generationTransaction[0].toString('hex'), + this.generationTransaction[1].toString('hex'), this.merkleBranch, binpack.packInt32(this.rpcData.version, 'big').toString('hex'), this.rpcData.bits, diff --git a/lib/transactions.js b/lib/transactions.js index 495a7d7..113dfe6 100644 --- a/lib/transactions.js +++ b/lib/transactions.js @@ -4,6 +4,7 @@ var buffertools = require('buffertools'); var util = require('./util.js'); +/* function Transaction(params){ var version = params.version || 1, @@ -38,6 +39,7 @@ function TransactionInput(params){ this.toBuffer = function(){ sigScriptBuffer = sigScript.toBuffer(); + console.log('scriptSig length ' + sigScriptBuffer.length); return Buffer.concat([ util.uint256BufferFromHash(prevOutHash), binpack.packUInt32(prevOutIndex, 'little'), @@ -79,9 +81,9 @@ function ScriptSig(params){ util.serializeString('/nodeStratum/') ]); } - }; + var Generation = exports.Generation = function Generation(rpcData, publicKey, extraNoncePlaceholder){ var tx = new Transaction({ @@ -107,4 +109,71 @@ var Generation = exports.Generation = function Generation(rpcData, publicKey, ex this.transaction = tx; this.coinbase = [p1, p2]; +}; +*/ + + +/* + ^^^^ The above code was a bit slow. The below code is uglier but optimized. + */ + + + +/* +Creating this function required tons of trial and error and reversing existing +pool server code. I went to write a good comment describing how it works in detail but +at this point I don't even know.. + +For some (probably outdated and incorrect) documentation about whats kinda going on here, +see: https://en.bitcoin.it/wiki/Protocol_specification#tx + */ + +exports.CreateGeneration = function(rpcData, publicKey, extraNoncePlaceholder){ + + var txVersion = 1; + var txLockTime = 0; + + var txInPrevOutHash = 0; + var txInPrevOutIndex = Math.pow(2, 32) - 1; + var txInSequence = 0; + + var scriptSigPart1 = Buffer.concat([ + util.serializeNumber(rpcData.height), + new Buffer(rpcData.coinbaseaux.flags, 'hex'), + util.serializeNumber(Date.now() / 1000 | 0), + new Buffer([extraNoncePlaceholder.length]) + ]); + + var scriptSigPart2 = util.serializeString('/nodeStratum/'); + + + var p1 = Buffer.concat([ + binpack.packUInt32(txVersion, 'little'), + util.varIntBuffer(1), + + //transaction input + util.uint256BufferFromHash(txInPrevOutHash), + binpack.packUInt32(txInPrevOutIndex, 'little'), + util.varIntBuffer(scriptSigPart1.length + extraNoncePlaceholder.length + scriptSigPart2.length), + scriptSigPart1 + ]); + + var p2 = Buffer.concat([ + scriptSigPart2, + binpack.packUInt32(txInSequence), + //end transaction input + + util.varIntBuffer(1), + + //transaction output + binpack.packInt64(rpcData.coinbasevalue, 'little'), + util.varIntBuffer(publicKey.length), + publicKey, + //end transaction ouput + + binpack.packUInt32(txLockTime, 'little') + ]); + + return [p1, p2]; + }; \ No newline at end of file