parent
a4dd13de15
commit
65c711b278
|
@ -35,8 +35,8 @@ module.exports = function(grunt) {
|
||||||
livereload: true,
|
livereload: true,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
js2: {
|
assets: {
|
||||||
files: ['public/src/**/*.js'],
|
files: ['public/src/**/*.js', 'public/**/*.css'],
|
||||||
tasks: ['compile'],
|
tasks: ['compile'],
|
||||||
options: {
|
options: {
|
||||||
livereload: true,
|
livereload: true,
|
||||||
|
|
|
@ -7,8 +7,6 @@ require('classtool');
|
||||||
function spec() {
|
function spec() {
|
||||||
var util = require('util');
|
var util = require('util');
|
||||||
var RpcClient = require('bitcore/RpcClient').class();
|
var RpcClient = require('bitcore/RpcClient').class();
|
||||||
var bitutil = require('bitcore/util/util');
|
|
||||||
var Address = require('bitcore/Address').class();
|
|
||||||
var Script = require('bitcore/Script').class();
|
var Script = require('bitcore/Script').class();
|
||||||
var networks = require('bitcore/networks');
|
var networks = require('bitcore/networks');
|
||||||
var async = require('async');
|
var async = require('async');
|
||||||
|
@ -219,42 +217,6 @@ function spec() {
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
// TODO. replace with
|
|
||||||
// Script.prototype.getAddrStrs if that one get merged in bitcore
|
|
||||||
HistoricSync.prototype.getAddrStr = function(s) {
|
|
||||||
var self = this;
|
|
||||||
|
|
||||||
var addrStrs = [];
|
|
||||||
var type = s.classify();
|
|
||||||
var addr;
|
|
||||||
|
|
||||||
switch(type) {
|
|
||||||
case Script.TX_PUBKEY:
|
|
||||||
var chunk = s.captureOne();
|
|
||||||
addr = new Address(self.network.addressPubkey, bitutil.sha256ripe160(chunk));
|
|
||||||
addrStrs = [ addr.toString() ];
|
|
||||||
break;
|
|
||||||
case Script.TX_PUBKEYHASH:
|
|
||||||
addr = new Address(self.network.addressPubkey, s.captureOne());
|
|
||||||
addrStrs = [ addr.toString() ];
|
|
||||||
break;
|
|
||||||
case Script.TX_SCRIPTHASH:
|
|
||||||
addr = new Address(self.network.addressScript, s.captureOne());
|
|
||||||
addrStrs = [ addr.toString() ];
|
|
||||||
break;
|
|
||||||
case Script.TX_MULTISIG:
|
|
||||||
var chunks = s.capture();
|
|
||||||
chunks.forEach(function(chunk) {
|
|
||||||
var a = new Address(self.network.addressPubkey, bitutil.sha256ripe160(chunk));
|
|
||||||
addrStrs.push(a.toString());
|
|
||||||
});
|
|
||||||
break;
|
|
||||||
case Script.TX_UNKNOWN:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return addrStrs;
|
|
||||||
};
|
|
||||||
|
|
||||||
HistoricSync.prototype.getBlockFromFile = function(cb) {
|
HistoricSync.prototype.getBlockFromFile = function(cb) {
|
||||||
var self = this;
|
var self = this;
|
||||||
|
@ -285,7 +247,7 @@ function spec() {
|
||||||
|
|
||||||
|
|
||||||
var s = new Script(o.s);
|
var s = new Script(o.s);
|
||||||
var addrs = self.getAddrStr(s);
|
var addrs = self.sync.getAddrStr(s);
|
||||||
|
|
||||||
// support only for p2pubkey p2pubkeyhash and p2sh
|
// support only for p2pubkey p2pubkeyhash and p2sh
|
||||||
if (addrs.length === 1) {
|
if (addrs.length === 1) {
|
||||||
|
|
|
@ -6,6 +6,7 @@ function spec() {
|
||||||
var CoinConst = require('bitcore/const');
|
var CoinConst = require('bitcore/const');
|
||||||
var coinUtil = require('bitcore/util/util');
|
var coinUtil = require('bitcore/util/util');
|
||||||
var Sync = require('./Sync').class();
|
var Sync = require('./Sync').class();
|
||||||
|
var Script = require('bitcore/Script').class();
|
||||||
var Peer = require('bitcore/Peer').class();
|
var Peer = require('bitcore/Peer').class();
|
||||||
var config = require('../config/config');
|
var config = require('../config/config');
|
||||||
var networks = require('bitcore/networks');
|
var networks = require('bitcore/networks');
|
||||||
|
@ -51,8 +52,23 @@ function spec() {
|
||||||
};
|
};
|
||||||
|
|
||||||
PeerSync.prototype.handleTx = function(info) {
|
PeerSync.prototype.handleTx = function(info) {
|
||||||
|
var self =this;
|
||||||
var tx = info.message.tx.getStandardizedObject();
|
var tx = info.message.tx.getStandardizedObject();
|
||||||
console.log('[p2p_sync] Handle tx: ' + tx.hash);
|
console.log('[p2p_sync] Handle tx: ' + tx.hash);
|
||||||
|
tx.time = tx.time || Math.round(new Date().getTime() / 1000);
|
||||||
|
|
||||||
|
var to=0;
|
||||||
|
info.message.tx.outs.forEach( function(o) {
|
||||||
|
var s = new Script(o.s);
|
||||||
|
var addrs = self.sync.getAddrStr(s);
|
||||||
|
|
||||||
|
// support only for p2pubkey p2pubkeyhash and p2sh
|
||||||
|
if (addrs.length === 1) {
|
||||||
|
tx.out[to].addrStr = addrs[0];
|
||||||
|
tx.out[to].n = to;
|
||||||
|
}
|
||||||
|
to++;
|
||||||
|
});
|
||||||
|
|
||||||
this.sync.storeTxs([tx], function(err) {
|
this.sync.storeTxs([tx], function(err) {
|
||||||
if (err) {
|
if (err) {
|
||||||
|
|
44
lib/Sync.js
44
lib/Sync.js
|
@ -6,7 +6,12 @@ require('classtool');
|
||||||
function spec() {
|
function spec() {
|
||||||
var sockets = require('../app/controllers/socket.js');
|
var sockets = require('../app/controllers/socket.js');
|
||||||
var BlockDb = require('./BlockDb').class();
|
var BlockDb = require('./BlockDb').class();
|
||||||
|
var bitutil = require('bitcore/util/util');
|
||||||
|
var Address = require('bitcore/Address').class();
|
||||||
var TransactionDb = require('./TransactionDb').class();
|
var TransactionDb = require('./TransactionDb').class();
|
||||||
|
var config = require('../config/config');
|
||||||
|
var networks = require('bitcore/networks');
|
||||||
|
var Script = require('bitcore/Script').class();
|
||||||
var async = require('async');
|
var async = require('async');
|
||||||
|
|
||||||
|
|
||||||
|
@ -18,6 +23,7 @@ function spec() {
|
||||||
self.opts = opts;
|
self.opts = opts;
|
||||||
this.bDb = new BlockDb(opts);
|
this.bDb = new BlockDb(opts);
|
||||||
this.txDb = new TransactionDb(opts);
|
this.txDb = new TransactionDb(opts);
|
||||||
|
this.network = config.network === 'testnet' ? networks.testnet: networks.livenet;
|
||||||
return cb();
|
return cb();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -276,6 +282,44 @@ function spec() {
|
||||||
return cb(err);
|
return cb(err);
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// TODO. replace with
|
||||||
|
// Script.prototype.getAddrStrs if that one get merged in bitcore
|
||||||
|
Sync.prototype.getAddrStr = function(s) {
|
||||||
|
var self = this;
|
||||||
|
|
||||||
|
var addrStrs = [];
|
||||||
|
var type = s.classify();
|
||||||
|
var addr;
|
||||||
|
|
||||||
|
switch(type) {
|
||||||
|
case Script.TX_PUBKEY:
|
||||||
|
var chunk = s.captureOne();
|
||||||
|
addr = new Address(self.network.addressPubkey, bitutil.sha256ripe160(chunk));
|
||||||
|
addrStrs = [ addr.toString() ];
|
||||||
|
break;
|
||||||
|
case Script.TX_PUBKEYHASH:
|
||||||
|
addr = new Address(self.network.addressPubkey, s.captureOne());
|
||||||
|
addrStrs = [ addr.toString() ];
|
||||||
|
break;
|
||||||
|
case Script.TX_SCRIPTHASH:
|
||||||
|
addr = new Address(self.network.addressScript, s.captureOne());
|
||||||
|
addrStrs = [ addr.toString() ];
|
||||||
|
break;
|
||||||
|
case Script.TX_MULTISIG:
|
||||||
|
var chunks = s.capture();
|
||||||
|
chunks.forEach(function(chunk) {
|
||||||
|
var a = new Address(self.network.addressPubkey, bitutil.sha256ripe160(chunk));
|
||||||
|
addrStrs.push(a.toString());
|
||||||
|
});
|
||||||
|
break;
|
||||||
|
case Script.TX_UNKNOWN:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return addrStrs;
|
||||||
|
};
|
||||||
return Sync;
|
return Sync;
|
||||||
}
|
}
|
||||||
module.defineClass(spec);
|
module.defineClass(spec);
|
||||||
|
|
|
@ -442,13 +442,7 @@ function spec(b) {
|
||||||
.write(next_out);
|
.write(next_out);
|
||||||
},
|
},
|
||||||
function (err) {
|
function (err) {
|
||||||
if (err) {
|
return p_c(err);
|
||||||
if (!err.message.match(/E11000/)) {
|
|
||||||
console.log('ERR at TX %s: %s', tx.txid, err);
|
|
||||||
return cb(err);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return p_c();
|
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
// Parse Outputs
|
// Parse Outputs
|
||||||
|
|
|
@ -557,3 +557,24 @@ h1, h2, h3, h4, h5, h6, .h1, .h2, .h3, .h4, .h5, .h6 {
|
||||||
width: 20%;
|
width: 20%;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@keyframes rotateThis {
|
||||||
|
from { transform: scale( 1 ) rotate( 0deg ); }
|
||||||
|
to { transform: scale( 1 ) rotate( 360deg ); }
|
||||||
|
}
|
||||||
|
|
||||||
|
@-webkit-keyframes rotateThis {
|
||||||
|
from { -webkit-transform: scale( 1 ) rotate( 0deg ); }
|
||||||
|
to { -webkit-transform: scale( 1 ) rotate( 360deg ); }
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-rotate {
|
||||||
|
animation-name: rotateThis;
|
||||||
|
animation-duration: 2s;
|
||||||
|
animation-iteration-count: infinite;
|
||||||
|
animation-timing-function: linear;
|
||||||
|
-webkit-animation-name: rotateThis;
|
||||||
|
-webkit-animation-duration: 2s;
|
||||||
|
-webkit-animation-iteration-count: infinite;
|
||||||
|
-webkit-animation-timing-function: linear;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -42,8 +42,31 @@
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
|
<h2>Last Block</h2>
|
||||||
|
<table class="table" style="table-layout: fixed" data-ng-controller="StatusController" data-ng-init="getStatus('LastBlockHash')">
|
||||||
|
<thead data-ng-include src="'/views/includes/infoStatus.html'"> </thead>
|
||||||
|
<tr>
|
||||||
|
<td>Last Block Hash (Bitcoind)</td>
|
||||||
|
<td class="text-right ellipsis"><a href="/block/{{lastblockhash}}">{{lastblockhash}}</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Current Blockchain Tip(Insight)</td>
|
||||||
|
<td class="text-right ellipsis"><a href="/block/{{syncTipHash}}">{{syncTipHash}}</a></td>
|
||||||
|
|
||||||
|
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
|
||||||
<h2>Transaction Output Set Information</h2>
|
<h2>Transaction Output Set Information</h2>
|
||||||
<table class="table" style="table-layout: fixed" data-ng-controller="StatusController" data-ng-init="getStatus('TxOutSetInfo')">
|
|
||||||
|
<div data-ng-controller="StatusController">
|
||||||
|
<button data-ng-click="txoutLoading=1;getStatus('TxOutSetInfo')" class="btn btn-default" data-ng-show="!txoutsetinfo.height">
|
||||||
|
Show Transaction Output data
|
||||||
|
<span data-ng-show="txoutLoading" class="glyphicon glyphicon-refresh icon-rotate"></span>
|
||||||
|
</button >
|
||||||
|
|
||||||
|
<table class="table" data-ng-show="txoutsetinfo.height" style="table-layout: fixed" >
|
||||||
<thead data-ng-include src="'/views/includes/infoStatus.html'"> </thead>
|
<thead data-ng-include src="'/views/includes/infoStatus.html'"> </thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
<tr>
|
<tr>
|
||||||
|
@ -76,23 +99,12 @@
|
||||||
</tr>
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
|
</div>
|
||||||
|
|
||||||
<h2>Last Block</h2>
|
|
||||||
<table class="table" style="table-layout: fixed" data-ng-controller="StatusController" data-ng-init="getStatus('LastBlockHash')">
|
|
||||||
<thead data-ng-include src="'/views/includes/infoStatus.html'"> </thead>
|
|
||||||
<tr>
|
|
||||||
<td>Last Block Hash (Bitcoind)</td>
|
|
||||||
<td class="text-right ellipsis"><a href="/block/{{lastblockhash}}">{{lastblockhash}}</a></td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>Current Blockchain Tip(Insight)</td>
|
|
||||||
<td class="text-right ellipsis"><a href="/block/{{syncTipHash}}">{{syncTipHash}}</a></td>
|
|
||||||
|
|
||||||
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
</div> <!-- END OF COL-8 -->
|
</div> <!-- END OF COL-8 -->
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<div class="col-xs-12 col-md-4 col-gray">
|
<div class="col-xs-12 col-md-4 col-gray">
|
||||||
<h2>Bitcoin node information</h2>
|
<h2>Bitcoin node information</h2>
|
||||||
<table class="table" data-ng-controller="StatusController" data-ng-init="getStatus('Info')">
|
<table class="table" data-ng-controller="StatusController" data-ng-init="getStatus('Info')">
|
||||||
|
@ -118,11 +130,7 @@
|
||||||
<td>Connections to other nodes</td>
|
<td>Connections to other nodes</td>
|
||||||
<td class="text-right">{{info.connections}}</td>
|
<td class="text-right">{{info.connections}}</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td>Proxy setting</td>
|
|
||||||
<td class="text-right">{{info.proxy}}</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>Mining Difficulty</td>
|
<td>Mining Difficulty</td>
|
||||||
<td class="text-right">{{info.difficulty}}</td>
|
<td class="text-right">{{info.difficulty}}</td>
|
||||||
</tr>
|
</tr>
|
||||||
|
@ -131,16 +139,8 @@
|
||||||
<td class="text-right">{{info.testnet}}</td>
|
<td class="text-right">{{info.testnet}}</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td>Keypool Oldest Date</td>
|
<td>Proxy setting</td>
|
||||||
<td class="text-right">{{info.keypoololdest*1000 | date:'medium' }}</td>
|
<td class="text-right">{{info.proxy}}</td>
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>Keypool Size</td>
|
|
||||||
<td class="text-right">{{info.keypoolsize}}</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>Default Transaction Fee (BTC)</td>
|
|
||||||
<td class="text-right">{{info.paytxfee}}</td>
|
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td>Info Errors</td>
|
<td>Info Errors</td>
|
||||||
|
|
|
@ -35,8 +35,6 @@ async.series([
|
||||||
function(cb) {
|
function(cb) {
|
||||||
|
|
||||||
if (typeof program.smart === 'undefined' || parseInt(program.smart) ) {
|
if (typeof program.smart === 'undefined' || parseInt(program.smart) ) {
|
||||||
|
|
||||||
console.log('[sync.js.38]'); //TODO
|
|
||||||
historicSync.smartImport({
|
historicSync.smartImport({
|
||||||
destroy: program.destroy,
|
destroy: program.destroy,
|
||||||
},cb);
|
},cb);
|
||||||
|
|
Loading…
Reference in New Issue