refactor in Transaction db

This commit is contained in:
Matias Alejo Garcia 2014-05-25 23:54:08 -03:00
parent 013c2420d4
commit bce9f7a0bb
4 changed files with 73 additions and 79 deletions

View File

@ -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);
}

View File

@ -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;
});

View File

@ -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) {

View File

@ -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);