From bce9f7a0bb9d2fde7d0a8c7c2d42fbf071e24c32 Mon Sep 17 00:00:00 2001 From: Matias Alejo Garcia Date: Sun, 25 May 2014 23:54:08 -0300 Subject: [PATCH] refactor in Transaction db --- app/controllers/socket.js | 4 +-- lib/HistoricSync.js | 63 +--------------------------------- lib/PeerSync.js | 14 +++----- lib/TransactionDb.js | 71 +++++++++++++++++++++++++++++++++++---- 4 files changed, 73 insertions(+), 79 deletions(-) diff --git a/app/controllers/socket.js b/app/controllers/socket.js index 8974837e..9ecd56f1 100644 --- a/app/controllers/socket.js +++ b/app/controllers/socket.js @@ -32,10 +32,10 @@ module.exports.broadcastTx = function(tx) { // Outputs var valueOut = 0; tx.vout.forEach(function(o) { - valueOut += o.value * util.COIN; + valueOut += o.valueSat; }); - t.valueOut = parseInt(valueOut) / util.COIN; + t.valueOut = (valueOut/util.COIN).toFixed(0); } ios.sockets.in('inv').emit('tx', t); } diff --git a/lib/HistoricSync.js b/lib/HistoricSync.js index 9cf0bcc0..4140a4f7 100644 --- a/lib/HistoricSync.js +++ b/lib/HistoricSync.js @@ -2,12 +2,9 @@ var imports = require('soop').imports(); var util = require('util'); -var assert = require('assert'); var async = require('async'); var bitcore = require('bitcore'); -var RpcClient = bitcore.RpcClient; -var Script = bitcore.Script; var networks = bitcore.networks; var config = imports.config || require('../config/config'); var Sync = require('./Sync'); @@ -15,23 +12,7 @@ var sockets = require('../app/controllers/socket.js'); var BlockExtractor = require('./BlockExtractor.js'); var buffertools = require('buffertools'); var bitcoreUtil = bitcore.util; -var Bignum = bitcore.Bignum; -var Script = bitcore.Script; -// This is 0.1.2 = > c++ version of base58-native - var base58 = require('base58-native').base58Check; - var encodedData = require('soop').load('bitcore/util/EncodedData',{ - base58: base58 - }); - var versionedData= require('soop').load('bitcore/util/VersionedData',{ - parent: encodedData - }); - -var Address = require('soop').load('bitcore/lib/Address',{ - parent: versionedData -}); - var logger = require('./logger').logger; -var d = logger.log; var info = logger.info; var error = logger.error; @@ -140,48 +121,6 @@ HistoricSync.prototype.getBlockFromRPC = function(cb) { }); }; -HistoricSync.prototype._fromBuffer = function (buf) { - var buf2 = buffertools.reverse(buf); - return parseInt(buf2.toString('hex'), 16); -}; - -HistoricSync.prototype.getStandardizedTx = function (tx, time, isCoinBase) { - var self = this; - tx.txid = bitcoreUtil.formatHashFull(tx.getHash()); - var ti=0; - - tx.vin = tx.ins.map(function(txin) { - var ret = {n: ti++}; - if (isCoinBase) { - ret.isCoinBase = true; - } else { - ret.txid = buffertools.reverse(new Buffer(txin.getOutpointHash())).toString('hex'); - ret.vout = txin.getOutpointIndex(); - } - return ret; - }); - - var to = 0; - tx.vout = tx.outs.map(function(txout) { - var val; - if (txout.s) { - var s = new Script(txout.s); - var addrs = new Address.fromScriptPubKey(s, config.network); - // support only for p2pubkey p2pubkeyhash and p2sh - if (addrs && addrs.length === 1) { - val = {addresses: [addrs[0].toString() ] }; - } - } - return { - valueSat: self._fromBuffer(txout.v), - scriptPubKey: val, - n: to++, - }; - }); - tx.time = time; - return tx; -}; - HistoricSync.prototype.getStandardizedBlock = function(b) { var self = this; @@ -192,7 +131,7 @@ HistoricSync.prototype.getStandardizedBlock = function(b) { }; var isCoinBase = 1; block.tx = b.txs.map(function(tx){ - var ret = self.getStandardizedTx(tx, b.timestamp, isCoinBase); + var ret = self.sync.txDb.getStandardizedTx(tx, b.timestamp, isCoinBase); isCoinBase=0; return ret; }); diff --git a/lib/PeerSync.js b/lib/PeerSync.js index c58474fb..348a4b36 100644 --- a/lib/PeerSync.js +++ b/lib/PeerSync.js @@ -49,10 +49,8 @@ PeerSync.prototype.handleInv = function(info) { PeerSync.prototype.handleTx = function(info) { var self =this; - var tx = info.message.tx.getStandardizedObject(); - tx.outs = info.message.tx.outs; - tx.ins = info.message.tx.ins; - console.log('[p2p_sync] Handle tx: ' + tx.hash); + var tx = this.sync.txDb.getStandardizedTx(info.message.tx); + console.log('[p2p_sync] Handle tx: ' + tx.txid); tx.time = tx.time || Math.round(new Date().getTime() / 1000); this.sync.storeTxs([tx], function(err) { @@ -62,9 +60,9 @@ PeerSync.prototype.handleTx = function(info) { else { if (self.shouldBroadcast) { sockets.broadcastTx(tx); - if (tx.addrsToEmit) { - for(var ii in tx.addrsToEmit){ - sockets.broadcastAddressTx(tx.addrsToEmit[ii], tx.txid); + if (tx.relatedAddrs) { + for(var ii in tx.relatedAddrs){ + sockets.broadcastAddressTx(tx.relatedAddrs[ii], tx.txid); } } } @@ -76,9 +74,7 @@ PeerSync.prototype.handleTx = function(info) { PeerSync.prototype.handleBlock = function(info) { var self = this; var block = info.message.block; -console.log('[PeerSync.js.78:block:]',block); //TODO var blockHash = bitcoreUtil.formatHashFull(block.calcHash()); - console.log('[p2p_sync] Handle block: %s (allowReorgs: %s)', blockHash, self.allowReorgs); var tx_hashes = block.txs.map(function(tx) { diff --git a/lib/TransactionDb.js b/lib/TransactionDb.js index ad3ef955..8cc37682 100644 --- a/lib/TransactionDb.js +++ b/lib/TransactionDb.js @@ -28,15 +28,30 @@ var bitcore = require('bitcore'), levelup = require('levelup'), async = require('async'), config = require('../config/config'), - assert = require('assert'); + assert = require('assert'), + Script = bitcore.Script, + bitcoreUtil = bitcore.util, + buffertools = require('buffertools'); var logger = require('./logger').logger; -var d = logger.log; var info = logger.info; -var warn = logger.warn; -var db = imports.db || levelup(config.leveldb + '/txs',{maxOpenFiles: MAX_OPEN_FILES} ); +var db = imports.db || levelup(config.leveldb + '/txs',{maxOpenFiles: MAX_OPEN_FILES} ); var PoolMatch = imports.poolMatch || require('soop').load('./PoolMatch',config); +// This is 0.1.2 = > c++ version of base58-native + var base58 = require('base58-native').base58Check; + var encodedData = require('soop').load('bitcore/util/EncodedData',{ + base58: base58 + }); + var versionedData= require('soop').load('bitcore/util/VersionedData',{ + parent: encodedData + }); + +var Address = require('soop').load('bitcore/lib/Address',{ + parent: versionedData +}); + + var TransactionDb = function() { TransactionDb.super(this, arguments); @@ -463,6 +478,49 @@ TransactionDb.prototype.fromAddr = function(addr, cb) { }); }; +TransactionDb.prototype._fromBuffer = function (buf) { + var buf2 = buffertools.reverse(buf); + return parseInt(buf2.toString('hex'), 16); +}; + +TransactionDb.prototype.getStandardizedTx = function (tx, time, isCoinBase) { + var self = this; + tx.txid = bitcoreUtil.formatHashFull(tx.getHash()); + var ti=0; + + tx.vin = tx.ins.map(function(txin) { + var ret = {n: ti++}; + if (isCoinBase) { + ret.isCoinBase = true; + } else { + ret.txid = buffertools.reverse(new Buffer(txin.getOutpointHash())).toString('hex'); + ret.vout = txin.getOutpointIndex(); + } + return ret; + }); + + var to = 0; + tx.vout = tx.outs.map(function(txout) { + var val; + if (txout.s) { + var s = new Script(txout.s); + var addrs = new Address.fromScriptPubKey(s, config.network); + // support only for p2pubkey p2pubkeyhash and p2sh + if (addrs && addrs.length === 1) { + val = {addresses: [addrs[0].toString() ] }; + } + } + return { + valueSat: self._fromBuffer(txout.v), + scriptPubKey: val, + n: to++, + }; + }); + tx.time = time; + return tx; +}; + + TransactionDb.prototype.fillScriptPubKey = function(txouts, cb) { var self=this; // Complete utxo info @@ -513,7 +571,9 @@ TransactionDb.prototype._addScript = function(tx) { var relatedAddrs = []; var dbScript = []; var ts = tx.time; - var txid = tx.txid; + var txid = tx.txid || tx.hash; +// var u=require('util'); +// console.log('[TransactionDb.js.518]', u.inspect(tx,{depth:10})); //TODO // Input Outpoints (mark them as spent) for(var ii in tx.vin) { var i = tx.vin[ii]; @@ -560,7 +620,6 @@ TransactionDb.prototype.add = function(tx, blockhash, cb) { TransactionDb.prototype._addManyFromObjs = function(txs, next) { var dbScript = []; - for(var ii in txs){ var s = this._addScript(txs[ii]); dbScript = dbScript.concat(s);