From 1c96756743206fa0301dccab1b51f28708dad6aa Mon Sep 17 00:00:00 2001 From: Matias Alejo Garcia Date: Mon, 6 Jan 2014 19:02:33 -0300 Subject: [PATCH 1/3] getblock working! --- config/env/development.js | 7 ++++++- config/routes.js | 6 ++++-- package.json | 1 + util/get_block.js | 12 +++++------- 4 files changed, 16 insertions(+), 10 deletions(-) diff --git a/config/env/development.js b/config/env/development.js index 0ef298cc..2ddf0dc0 100755 --- a/config/env/development.js +++ b/config/env/development.js @@ -4,5 +4,10 @@ module.exports = { db: "mongodb://localhost/mystery-dev", app: { name: "Mystery - Development" + }, + bitcoind: { + user: 'mystery', + pass: 'real_mystery', + protocol: 'http', } -} \ No newline at end of file +} diff --git a/config/routes.js b/config/routes.js index 182a2162..1f75a0ef 100644 --- a/config/routes.js +++ b/config/routes.js @@ -6,7 +6,9 @@ module.exports = function(app) { var index = require('../app/controllers/index'); app.get('/', index.render); - //TX routes - // + //Block routes + var blocks = require('model/app/controllers/blocks'); + app.get('/block/:block_hash', blocks.show); + }; diff --git a/package.json b/package.json index be95e6ec..0188d4d5 100644 --- a/package.json +++ b/package.json @@ -32,6 +32,7 @@ "postinstall": "node node_modules/bower/bin/bower install" }, "dependencies": { + "classtool": "*", "express": "~3.4.7", "jade": "~1.0.2", "mongoose": "~3.8.3", diff --git a/util/get_block.js b/util/get_block.js index 27880d8f..783d7cf7 100755 --- a/util/get_block.js +++ b/util/get_block.js @@ -1,17 +1,15 @@ #!/usr/bin/env node - - +process.env.NODE_ENV = process.env.NODE_ENV || 'development'; var RpcClient = require('../node_modules/bitcore/RpcClient').class(); +var config = require('../config/config'); + var block_hash = process.argv[2] || '0000000000b6288775bbd326bedf324ca8717a15191da58391535408205aada4'; -var rpc = new RpcClient({ - user: 'mystery', - pass: 'real_mystery', - protocol: 'http', -}); + +var rpc = new RpcClient(config.bitcoind); var block = rpc.getBlock(block_hash, function(err, block) { From e79e81fe4b4cb164959aa3f68728be4e5fc766d0 Mon Sep 17 00:00:00 2001 From: Matias Alejo Garcia Date: Mon, 6 Jan 2014 23:50:29 -0300 Subject: [PATCH 2/3] block syncing working! --- app/models/Block.js | 68 +++++++++++++++++++++++++++++++++++++++++++++ package.json | 3 +- util/sync.js | 64 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 134 insertions(+), 1 deletion(-) create mode 100644 app/models/Block.js create mode 100755 util/sync.js diff --git a/app/models/Block.js b/app/models/Block.js new file mode 100644 index 00000000..94404267 --- /dev/null +++ b/app/models/Block.js @@ -0,0 +1,68 @@ +'use strict'; + +/** + * Module dependencies. + */ +var mongoose = require('mongoose'), + Schema = mongoose.Schema; + + +/** + * Block Schema + */ +var BlockSchema = new Schema({ + hash: { + type: String, + index: true, + unique: true, + }, + size: Number, + confirmations: Number, + version: Number, + merkleroot: String, + tx: [ String ], + time: Date, + nonce: Number, + bits: String, + difficulty: Number, + chainwork: String, + previousblockhash: { + type: String, + index: true, + unique: true, + }, + nextblockhash: { + type: String, + index: true, + unique: true, + }, +}); + +/** + * Validations + */ + +/* +BlockSchema.path('title').validate(function(title) { + return title.length; +},'Title cannot be blank'); +*/ + +/** + * Statics + */ + +BlockSchema.statics.load = function(id, cb) { + this.findOne({ + _id: id + }).exec(cb); +}; + + +BlockSchema.statics.fromHash = function(hash, cb) { + this.findOne({ + hash: hash, + }).exec(cb); +}; + +module.exports = mongoose.model('Block', BlockSchema); diff --git a/package.json b/package.json index 0188d4d5..b235128d 100644 --- a/package.json +++ b/package.json @@ -38,6 +38,7 @@ "mongoose": "~3.8.3", "lodash": "~2.4.1", "bower": "~1.2.8", - "bitcore": "*" + "bitcore": "*", + "buffertools": "*" } } diff --git a/util/sync.js b/util/sync.js new file mode 100755 index 00000000..9fe5a5b2 --- /dev/null +++ b/util/sync.js @@ -0,0 +1,64 @@ +#!/usr/bin/env node + +process.env.NODE_ENV = process.env.NODE_ENV || 'development'; +require('buffertools').extend(); + +var RpcClient = require('../node_modules/bitcore/RpcClient').class(); +var networks = require('../node_modules/bitcore/networks'); + +var Block = require('../app/models/Block'); +var config = require('../config/config'); +var mongoose = require('mongoose'); + +var networkName = process.argv[2] || 'testnet'; +var genesisBlockHash = networks.testnet.genesisBlock.hash.reverse().toString('hex'); + + +function syncBlocks(blockHash) { + + rpc.getBlock(blockHash, function(err, blockInfo) { + if (err) { + console.log(err); + throw(err); + } + + if ( ! ( blockInfo.result.height % 1000) ) + console.log("Height:" + blockInfo.result.height); + + Block.create( blockInfo.result, function(err, inBlock) { + + if (err && err.toString().match(/E11000/)) { +// console.log("\twas there. Skipping"); + return syncBlocks(blockInfo.result.nextblockhash); + } + + if (err) throw(err); + + if (inBlock.nextblockhash && ! inBlock.nextblockhash.match(/^0+$/) ) { + syncBlocks(inBlock.nextblockhash) + } + else { + mongoose.connection.close(); + } + + }); + }); + +} + + +mongoose.connect(config.db); + +var db = mongoose.connection; +var rpc = new RpcClient(config.bitcoind); + + +db.on('error', console.error.bind(console, 'connection error:')); +db.once('open', function callback () { + + syncBlocks(genesisBlockHash); + +}); + + + From b1a439e688c67dce8e7fd79a3e1e6745eb57f830 Mon Sep 17 00:00:00 2001 From: Matias Alejo Garcia Date: Tue, 7 Jan 2014 09:11:01 -0300 Subject: [PATCH 3/3] add percentage status to sync --- util/sync.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/util/sync.js b/util/sync.js index 2cb5d5ee..78991deb 100755 --- a/util/sync.js +++ b/util/sync.js @@ -3,6 +3,7 @@ process.env.NODE_ENV = process.env.NODE_ENV || 'development'; require('buffertools').extend(); +var util = require('util'); var RpcClient = require('../node_modules/bitcore/RpcClient').class(); var networks = require('../node_modules/bitcore/networks'); @@ -26,8 +27,11 @@ function getNextBlock(blockHash,cb) { return cb(err); } - if ( ! ( blockInfo.result.height % 1000) ) - console.log("Height:" + blockInfo.result.height); + if ( ! ( blockInfo.result.height % 1000) ) { + var h = blockInfo.result.height, + d = blockInfo.result.confirmations; + console.log( util.format("Height: %d/%d [%d%%]", h, d, 100*h/(h+d))); + } Block.create( blockInfo.result, function(err, inBlock) {