diff --git a/bench/chacha.js b/bench/chacha.js index 0674546c..ade92e07 100644 --- a/bench/chacha.js +++ b/bench/chacha.js @@ -1,36 +1,38 @@ 'use strict'; var chachapoly = require('../lib/crypto/chachapoly'); +var crypto = require('../lib/crypto/crypto'); var bench = require('./bench'); +var i, chacha, iv, poly, key, data, end; console.log('note: rate measured in kb/s'); -var chacha = new chachapoly.ChaCha20(); -var iv = new Buffer('0102030405060708', 'hex'); +chacha = new chachapoly.ChaCha20(); +iv = new Buffer('0102030405060708', 'hex'); chacha.init(iv, 0); -var data = new Buffer(32); -for (var i = 0; i < 32; i++) +data = new Buffer(32); +for (i = 0; i < 32; i++) data[i] = i; -var end = bench('encrypt'); -for (var i = 0; i < 1000000; i++) +end = bench('encrypt'); +for (i = 0; i < 1000000; i++) chacha.encrypt(data); end(i * 32 / 1024); -var poly = new chachapoly.Poly1305(); -var key = new Buffer('000102030405060708090a0b0c0d0e0f', 'hex'); +poly = new chachapoly.Poly1305(); +key = new Buffer('000102030405060708090a0b0c0d0e0f', 'hex'); poly.init(key); -var data = new Buffer(32); -for (var i = 0; i < 32; i++) +data = new Buffer(32); +for (i = 0; i < 32; i++) data[i] = i & 0xff; -var end = bench('update'); -for (var i = 0; i < 1000000; i++) +end = bench('update'); +for (i = 0; i < 1000000; i++) poly.update(data); end(i * 32 / 1024); -var end = bench('finish'); -for (var i = 0; i < 1000000; i++) { +end = bench('finish'); +for (i = 0; i < 1000000; i++) { poly.init(key); poly.update(data); poly.finish(); @@ -38,8 +40,7 @@ for (var i = 0; i < 1000000; i++) { end(i * 32 / 1024); // For reference: -var crypto = require('../lib/crypto/crypto'); -var end = bench('sha256'); -for (var i = 0; i < 1000000; i++) +end = bench('sha256'); +for (i = 0; i < 1000000; i++) crypto.hash256(data); end(i * 32 / 1024); diff --git a/bench/coin.js b/bench/coin.js index 69bff5b8..4a4f9748 100644 --- a/bench/coin.js +++ b/bench/coin.js @@ -1,44 +1,38 @@ 'use strict'; -var BN = require('bn.js'); -var constants = require('../lib/protocol/constants'); -var util = require('../lib/utils/util'); -var assert = require('assert'); -var scriptTypes = constants.scriptTypes; -var bench = require('./bench'); var fs = require('fs'); +var assert = require('assert'); +var util = require('../lib/utils/util'); var Coins = require('../lib/blockchain/coins'); var TX = require('../lib/primitives/tx'); +var bench = require('./bench'); var wtx = fs.readFileSync(__dirname + '/../test/data/wtx.hex', 'utf8'); +var i, j, coins, raw, end; + wtx = TX.fromRaw(wtx.trim(), 'hex'); +coins = Coins.fromTX(wtx); -var coins = Coins.fromTX(wtx); -var raw; -//raw = coins.toRaw(); -//console.log(Coins.fromRaw(raw)); - -var end = bench('serialize'); -for (var i = 0; i < 10000; i++) +end = bench('serialize'); +for (i = 0; i < 10000; i++) raw = coins.toRaw(); end(i); -var end = bench('parse'); -for (var i = 0; i < 10000; i++) +end = bench('parse'); +for (i = 0; i < 10000; i++) Coins.fromRaw(raw); end(i); -var end = bench('parse-single'); -var hash = wtx.hash('hex'); -for (var i = 0; i < 10000; i++) +end = bench('parse-single'); +hash = wtx.hash('hex'); +for (i = 0; i < 10000; i++) Coins.parseCoin(raw, hash, 5); end(i); -var coins = Coins.fromRaw(raw); -var end = bench('get'); -var j; +coins = Coins.fromRaw(raw); +end = bench('get'); -for (var i = 0; i < 10000; i++) - for (var j = 0; j < coins.outputs.length; j++) +for (i = 0; i < 10000; i++) + for (j = 0; j < coins.outputs.length; j++) coins.get(j); end(i * coins.outputs.length); diff --git a/bench/mnemonic.js b/bench/mnemonic.js index ce29dd22..21662cb0 100644 --- a/bench/mnemonic.js +++ b/bench/mnemonic.js @@ -1,19 +1,17 @@ 'use strict'; -var BN = require('bn.js'); -var bcoin = require('../').set('main'); -var constants = bcoin.constants; -var util = bcoin.util; var assert = require('assert'); var bench = require('./bench'); -var Mnemonic = bcoin.hd.Mnemonic; +var HD = require('../lib/hd'); +var Mnemonic = require('../lib/hd/mnemonic'); -var key = bcoin.hd.fromMnemonic(); +var key = HD.fromMnemonic(); var phrase = key.mnemonic.getPhrase(); +var i, end; assert.equal(Mnemonic.fromPhrase(phrase).getPhrase(), phrase); -var end = bench('fromPhrase'); -for (var i = 0; i < 10000; i++) +end = bench('fromPhrase'); +for (i = 0; i < 10000; i++) Mnemonic.fromPhrase(phrase); end(i); diff --git a/bench/script.js b/bench/script.js index 44d94a2c..435e503e 100644 --- a/bench/script.js +++ b/bench/script.js @@ -1,17 +1,14 @@ 'use strict'; -var BN = require('bn.js'); -var bcoin = require('../').set('main'); -var constants = bcoin.constants; -var util = bcoin.util; -var assert = require('assert'); -var scriptTypes = constants.scriptTypes; -var opcodes = constants.opcodes; -var bench = require('./bench'); var fs = require('fs'); -var Script = bcoin.script; - -bcoin.cache(); +var assert = require('assert'); +var constants = require('../lib/protocol/constants'); +var util = require('../lib/utils/util'); +var crypto = require('../lib/crypto/crypto'); +var Script = require('../lib/script/script'); +var bench = require('./bench'); +var opcodes = constants.opcodes; +var i, hashes, end; Script.prototype.fromPubkeyhashOld = function fromScripthash(hash) { assert(Buffer.isBuffer(hash) && hash.length === 20); @@ -28,16 +25,16 @@ Script.fromPubkeyhashOld = function fromScripthash(hash) { return new Script().fromPubkeyhashOld(hash); }; -var hashes = []; -for (var i = 0; i < 100000; i++) - hashes.push(bcoin.crypto.randomBytes(20)); +hashes = []; +for (i = 0; i < 100000; i++) + hashes.push(crypto.randomBytes(20)); -var end = bench('old'); -for (var i = 0; i < hashes.length; i++) +end = bench('old'); +for (i = 0; i < hashes.length; i++) Script.fromPubkeyhashOld(hashes[i]); end(i); -var end = bench('hash'); -for (var i = 0; i < hashes.length; i++) +end = bench('hash'); +for (i = 0; i < hashes.length; i++) Script.fromPubkeyhash(hashes[i]); end(i); diff --git a/bench/tx.js b/bench/tx.js index 15dee5cc..e27c19e6 100644 --- a/bench/tx.js +++ b/bench/tx.js @@ -1,102 +1,116 @@ 'use strict'; -var BN = require('bn.js'); -var bcoin = require('../').set('main'); -var constants = bcoin.constants; -var util = bcoin.util; -var assert = require('assert'); -var scriptTypes = constants.scriptTypes; -var bench = require('./bench'); var fs = require('fs'); +var assert = require('assert'); +var Block = require('../lib/primitives/block'); +var Address = require('../lib/primitives/address'); +var TX = require('../lib/primitives/tx'); +var MTX = require('../lib/primitives/mtx'); +var Coin = require('../lib/primitives/coin'); +var CoinView = require('../lib/blockchain/coinview'); +var constants = require('../lib/protocol/constants'); +var crypto = require('../lib/crypto/crypto'); +var util = require('../lib/utils/util'); +var bench = require('./bench'); -bcoin.cache(); - -var block = bcoin.block.fromJSON(require('../test/data/block300025.json')); -var btx = block.txs[397]; +var json = require('../test/data/block300025.json'); +var block = Block.fromJSON(json); +var btx = { tx: block.txs[397], view: new CoinView() }; var tx1 = parseTX('../test/data/tx3.hex'); -var tx4 = parseTX('../test/data/tx4.hex'); var wtx = fs.readFileSync(__dirname + '/../test/data/wtx.hex', 'utf8'); -wtx = new Buffer(wtx.trim(), 'hex'); -var tx; +var i, tx, raw, end, flags, input; -function parseTX(file) { - file = fs.readFileSync(__dirname + '/' + file, 'utf8').trim().split(/\n+/); - var tx = bcoin.tx.fromRaw(file.shift().trim(), 'hex'); - for (var i = 0; i < file.length; i++) { - var coin = bcoin.tx.fromRaw(file[i].trim(), 'hex'); - tx.fillCoins(coin); - } - return tx; +wtx = new Buffer(wtx.trim(), 'hex'); + +tx = json.txs[397]; +for (i = 0; i < tx.inputs.length; i++) { + input = tx.inputs[i]; + btx.view.addCoin(Coin.fromJSON(input.coin)); } -var end = bench('parse'); -for (var i = 0; i < 1000; i++) - tx = bcoin.tx.fromRaw(wtx); +function parseTX(file) { + var data = fs.readFileSync(__dirname + '/' + file, 'utf8'); + var parts = data.trim().split(/\n+/); + var raw = parts[0]; + var tx = TX.fromRaw(raw.trim(), 'hex'); + var view = new CoinView(); + var i, prev; + + for (i = 1; i < parts.length; i++) { + raw = parts[i]; + prev = TX.fromRaw(raw.trim(), 'hex'); + view.addTX(prev, -1); + } + + return { tx: tx, view: view }; +} + +end = bench('parse'); +for (i = 0; i < 1000; i++) + tx = TX.fromRaw(wtx); end(i); -var end = bench('serialize'); -var raw; - -for (var i = 0; i < 1000; i++) { +end = bench('serialize'); +for (i = 0; i < 1000; i++) { tx._raw = null; raw = tx.toRaw(); } end(i); -var end = bench('hash'); -for (var i = 0; i < 3000; i++) { - tx1.hash(); - tx1._hash = null; +end = bench('hash'); +for (i = 0; i < 3000; i++) { + tx1.tx.hash(); + tx1.tx._hash = null; } end(i); -var end = bench('witness hash'); -for (var i = 0; i < 3000; i++) { +end = bench('witness hash'); +for (i = 0; i < 3000; i++) { tx.witnessHash(); tx._whash = null; } end(i); -var end = bench('fee'); -for (var i = 0; i < 1000; i++) - tx.getFee(); -end(i); - -var end = bench('sanity'); -for (var i = 0; i < 1000; i++) +end = bench('sanity'); +for (i = 0; i < 1000; i++) tx.isSane(); end(i); -var end = bench('input hashes'); -for (var i = 0; i < 1000; i++) - tx.getInputHashes('hex'); +end = bench('input hashes'); +for (i = 0; i < 1000; i++) + tx.getInputHashes(null, 'hex'); end(i); -var end = bench('output hashes'); -for (var i = 0; i < 1000; i++) +end = bench('output hashes'); +for (i = 0; i < 1000; i++) tx.getOutputHashes('hex'); end(i); -var end = bench('all hashes'); -for (var i = 0; i < 1000; i++) - tx.getHashes('hex'); +end = bench('all hashes'); +for (i = 0; i < 1000; i++) + tx.getHashes(null, 'hex'); end(i); -var end = bench('verify'); -for (var i = 0; i < 3000; i++) - tx1.verify(constants.flags.VERIFY_P2SH); -end(i * tx1.inputs.length); +end = bench('verify'); +for (i = 0; i < 3000; i++) + tx1.tx.verify(tx1.view, constants.flags.VERIFY_P2SH); +end(i * tx1.tx.inputs.length); -var flags = constants.flags.VERIFY_P2SH | constants.flags.VERIFY_DERSIG; -var end = bench('verify multisig'); -for (var i = 0; i < 3000; i++) - btx.verify(flags); -end(i * btx.inputs.length); +end = bench('fee'); +for (i = 0; i < 1000; i++) + tx1.tx.getFee(tx1.view); +end(i); -var tx = bcoin.mtx(); +flags = constants.flags.VERIFY_P2SH | constants.flags.VERIFY_DERSIG; +end = bench('verify multisig'); +for (i = 0; i < 3000; i++) + btx.tx.verify(btx.view, flags); +end(i * btx.tx.inputs.length); -for (var i = 0; i < 100; i++) { +tx = new MTX(); + +for (i = 0; i < 100; i++) { tx.addInput({ prevout: { hash: constants.NULL_HASH, @@ -104,28 +118,28 @@ for (var i = 0; i < 100; i++) { }, script: [ new Buffer(9), - bcoin.crypto.randomBytes(33) + crypto.randomBytes(33) ] }); tx.addOutput({ - address: bcoin.address.fromHash(bcoin.crypto.randomBytes(20)), + address: Address.fromHash(crypto.randomBytes(20)), value: 0 }); } tx = tx.toTX(); -var end = bench('input hashes'); -for (var i = 0; i < 1000; i++) - tx.getInputHashes('hex'); +end = bench('input hashes'); +for (i = 0; i < 1000; i++) + tx.getInputHashes(null, 'hex'); end(i); -var end = bench('output hashes'); -for (var i = 0; i < 1000; i++) +end = bench('output hashes'); +for (i = 0; i < 1000; i++) tx.getOutputHashes('hex'); end(i); -var end = bench('all hashes'); -for (var i = 0; i < 1000; i++) - tx.getHashes('hex'); +end = bench('all hashes'); +for (i = 0; i < 1000; i++) + tx.getHashes(null, 'hex'); end(i); diff --git a/bench/walletdb.js b/bench/walletdb.js index 0f9d1be1..646674e0 100644 --- a/bench/walletdb.js +++ b/bench/walletdb.js @@ -1,16 +1,13 @@ 'use strict'; -var BN = require('bn.js'); -var bcoin = require('../').set('main'); -var constants = bcoin.constants; -var util = bcoin.util; var assert = require('assert'); -var scriptTypes = constants.scriptTypes; +var util = require('../lib/utils/util'); var bench = require('./bench'); var co = require('../lib/utils/co'); var crypto = require('../lib/crypto/crypto'); - -bcoin.cache(); +var WalletDB = require('../lib/wallet/walletdb'); +var MTX = require('../lib/primitives/mtx'); +var walletdb, runBench; function dummy() { var hash = crypto.randomBytes(32).toString('hex'); @@ -18,32 +15,18 @@ function dummy() { prevout: { hash: hash, index: 0 - }, - coin: { - version: 1, - height: 0, - value: 50460 * 4, - script: new bcoin.script(), - coinbase: false, - hash: hash, - index: 0 - }, - script: new bcoin.script(), - witness: new bcoin.witness(), - sequence: 0xffffffff + } }; } -var walletdb = new bcoin.walletdb({ +walletdb = new WalletDB({ name: 'wallet-test', - // location: __dirname + '/../walletdb-bench', - // db: 'leveldb' db: 'memory', resolution: false, verify: false }); -var runBench = co(function* runBench() { +runBench = co(function* runBench() { var i, j, wallet, addrs, jobs, end; var result, tx, options; @@ -81,7 +64,7 @@ var runBench = co(function* runBench() { // TX deposit jobs = []; for (i = 0; i < 10000; i++) { - tx = bcoin.mtx() + tx = MTX() .addInput(dummy()) .addOutput(addrs[(i + 0) % addrs.length], 50460) .addOutput(addrs[(i + 1) % addrs.length], 50460) @@ -99,7 +82,7 @@ var runBench = co(function* runBench() { // TX redemption jobs = []; for (i = 0; i < 10000; i++) { - tx = bcoin.mtx() + tx = MTX() .addInput(tx, 0) .addInput(tx, 1) .addInput(tx, 2) diff --git a/lib/primitives/tx.js b/lib/primitives/tx.js index 55cba977..7b9a322d 100644 --- a/lib/primitives/tx.js +++ b/lib/primitives/tx.js @@ -920,10 +920,11 @@ TX.prototype._getInputAddresses = function getInputAddresses(view) { TX.prototype._getOutputAddresses = function getOutputAddresses() { var table = {}; var addrs = []; - var i, address, hash; + var i, output, address, hash; for (i = 0; i < this.outputs.length; i++) { - address = this.outputs[i].getAddress(); + output = this.outputs[i]; + address = output.getAddress(); if (!address) continue;