refactor in Transaction db
This commit is contained in:
parent
013c2420d4
commit
bce9f7a0bb
|
@ -32,10 +32,10 @@ module.exports.broadcastTx = function(tx) {
|
||||||
// Outputs
|
// Outputs
|
||||||
var valueOut = 0;
|
var valueOut = 0;
|
||||||
tx.vout.forEach(function(o) {
|
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);
|
ios.sockets.in('inv').emit('tx', t);
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,12 +2,9 @@
|
||||||
|
|
||||||
var imports = require('soop').imports();
|
var imports = require('soop').imports();
|
||||||
var util = require('util');
|
var util = require('util');
|
||||||
var assert = require('assert');
|
|
||||||
var async = require('async');
|
var async = require('async');
|
||||||
|
|
||||||
var bitcore = require('bitcore');
|
var bitcore = require('bitcore');
|
||||||
var RpcClient = bitcore.RpcClient;
|
|
||||||
var Script = bitcore.Script;
|
|
||||||
var networks = bitcore.networks;
|
var networks = bitcore.networks;
|
||||||
var config = imports.config || require('../config/config');
|
var config = imports.config || require('../config/config');
|
||||||
var Sync = require('./Sync');
|
var Sync = require('./Sync');
|
||||||
|
@ -15,23 +12,7 @@ var sockets = require('../app/controllers/socket.js');
|
||||||
var BlockExtractor = require('./BlockExtractor.js');
|
var BlockExtractor = require('./BlockExtractor.js');
|
||||||
var buffertools = require('buffertools');
|
var buffertools = require('buffertools');
|
||||||
var bitcoreUtil = bitcore.util;
|
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 logger = require('./logger').logger;
|
||||||
var d = logger.log;
|
|
||||||
var info = logger.info;
|
var info = logger.info;
|
||||||
var error = logger.error;
|
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) {
|
HistoricSync.prototype.getStandardizedBlock = function(b) {
|
||||||
var self = this;
|
var self = this;
|
||||||
|
|
||||||
|
@ -192,7 +131,7 @@ HistoricSync.prototype.getStandardizedBlock = function(b) {
|
||||||
};
|
};
|
||||||
var isCoinBase = 1;
|
var isCoinBase = 1;
|
||||||
block.tx = b.txs.map(function(tx){
|
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;
|
isCoinBase=0;
|
||||||
return ret;
|
return ret;
|
||||||
});
|
});
|
||||||
|
|
|
@ -49,10 +49,8 @@ PeerSync.prototype.handleInv = function(info) {
|
||||||
|
|
||||||
PeerSync.prototype.handleTx = function(info) {
|
PeerSync.prototype.handleTx = function(info) {
|
||||||
var self =this;
|
var self =this;
|
||||||
var tx = info.message.tx.getStandardizedObject();
|
var tx = this.sync.txDb.getStandardizedTx(info.message.tx);
|
||||||
tx.outs = info.message.tx.outs;
|
console.log('[p2p_sync] Handle tx: ' + tx.txid);
|
||||||
tx.ins = info.message.tx.ins;
|
|
||||||
console.log('[p2p_sync] Handle tx: ' + tx.hash);
|
|
||||||
tx.time = tx.time || Math.round(new Date().getTime() / 1000);
|
tx.time = tx.time || Math.round(new Date().getTime() / 1000);
|
||||||
|
|
||||||
this.sync.storeTxs([tx], function(err) {
|
this.sync.storeTxs([tx], function(err) {
|
||||||
|
@ -62,9 +60,9 @@ PeerSync.prototype.handleTx = function(info) {
|
||||||
else {
|
else {
|
||||||
if (self.shouldBroadcast) {
|
if (self.shouldBroadcast) {
|
||||||
sockets.broadcastTx(tx);
|
sockets.broadcastTx(tx);
|
||||||
if (tx.addrsToEmit) {
|
if (tx.relatedAddrs) {
|
||||||
for(var ii in tx.addrsToEmit){
|
for(var ii in tx.relatedAddrs){
|
||||||
sockets.broadcastAddressTx(tx.addrsToEmit[ii], tx.txid);
|
sockets.broadcastAddressTx(tx.relatedAddrs[ii], tx.txid);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -76,9 +74,7 @@ PeerSync.prototype.handleTx = function(info) {
|
||||||
PeerSync.prototype.handleBlock = function(info) {
|
PeerSync.prototype.handleBlock = function(info) {
|
||||||
var self = this;
|
var self = this;
|
||||||
var block = info.message.block;
|
var block = info.message.block;
|
||||||
console.log('[PeerSync.js.78:block:]',block); //TODO
|
|
||||||
var blockHash = bitcoreUtil.formatHashFull(block.calcHash());
|
var blockHash = bitcoreUtil.formatHashFull(block.calcHash());
|
||||||
|
|
||||||
console.log('[p2p_sync] Handle block: %s (allowReorgs: %s)', blockHash, self.allowReorgs);
|
console.log('[p2p_sync] Handle block: %s (allowReorgs: %s)', blockHash, self.allowReorgs);
|
||||||
|
|
||||||
var tx_hashes = block.txs.map(function(tx) {
|
var tx_hashes = block.txs.map(function(tx) {
|
||||||
|
|
|
@ -28,15 +28,30 @@ var bitcore = require('bitcore'),
|
||||||
levelup = require('levelup'),
|
levelup = require('levelup'),
|
||||||
async = require('async'),
|
async = require('async'),
|
||||||
config = require('../config/config'),
|
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 logger = require('./logger').logger;
|
||||||
var d = logger.log;
|
|
||||||
var info = logger.info;
|
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);
|
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() {
|
var TransactionDb = function() {
|
||||||
TransactionDb.super(this, arguments);
|
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) {
|
TransactionDb.prototype.fillScriptPubKey = function(txouts, cb) {
|
||||||
var self=this;
|
var self=this;
|
||||||
// Complete utxo info
|
// Complete utxo info
|
||||||
|
@ -513,7 +571,9 @@ TransactionDb.prototype._addScript = function(tx) {
|
||||||
var relatedAddrs = [];
|
var relatedAddrs = [];
|
||||||
var dbScript = [];
|
var dbScript = [];
|
||||||
var ts = tx.time;
|
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)
|
// Input Outpoints (mark them as spent)
|
||||||
for(var ii in tx.vin) {
|
for(var ii in tx.vin) {
|
||||||
var i = tx.vin[ii];
|
var i = tx.vin[ii];
|
||||||
|
@ -560,7 +620,6 @@ TransactionDb.prototype.add = function(tx, blockhash, cb) {
|
||||||
|
|
||||||
TransactionDb.prototype._addManyFromObjs = function(txs, next) {
|
TransactionDb.prototype._addManyFromObjs = function(txs, next) {
|
||||||
var dbScript = [];
|
var dbScript = [];
|
||||||
|
|
||||||
for(var ii in txs){
|
for(var ii in txs){
|
||||||
var s = this._addScript(txs[ii]);
|
var s = this._addScript(txs[ii]);
|
||||||
dbScript = dbScript.concat(s);
|
dbScript = dbScript.concat(s);
|
||||||
|
|
Loading…
Reference in New Issue