sync for blocks
This commit is contained in:
commit
4425b43f2f
21
.editorconfig
Normal file
21
.editorconfig
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
# EditorConfig helps developers define and maintain consistent
|
||||||
|
# coding styles between different editors and IDEs
|
||||||
|
# editorconfig.org
|
||||||
|
|
||||||
|
root = true
|
||||||
|
|
||||||
|
|
||||||
|
[*]
|
||||||
|
|
||||||
|
# Change these settings to your own preference
|
||||||
|
indent_style = space
|
||||||
|
indent_size = 2
|
||||||
|
|
||||||
|
# We recommend you to keep these unchanged
|
||||||
|
end_of_line = lf
|
||||||
|
charset = utf-8
|
||||||
|
trim_trailing_whitespace = true
|
||||||
|
insert_final_newline = true
|
||||||
|
|
||||||
|
[*.md]
|
||||||
|
trim_trailing_whitespace = false
|
||||||
1
.gitignore
vendored
1
.gitignore
vendored
@ -14,6 +14,7 @@ results
|
|||||||
|
|
||||||
npm-debug.log
|
npm-debug.log
|
||||||
node_modules
|
node_modules
|
||||||
|
.nodemonignore
|
||||||
|
|
||||||
.DS_Store
|
.DS_Store
|
||||||
public/lib/*
|
public/lib/*
|
||||||
|
|||||||
40
.jshintrc
Normal file
40
.jshintrc
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
{
|
||||||
|
"node": true, // Enable globals available when code is running inside of the NodeJS runtime environment.
|
||||||
|
"browser": true, // Standard browser globals e.g. `window`, `document`.
|
||||||
|
"esnext": true, // Allow ES.next specific features such as `const` and `let`.
|
||||||
|
"bitwise": false, // Prohibit bitwise operators (&, |, ^, etc.).
|
||||||
|
"camelcase": false, // Permit only camelcase for `var` and `object indexes`.
|
||||||
|
"curly": false, // Require {} for every new block or scope.
|
||||||
|
"eqeqeq": true, // Require triple equals i.e. `===`.
|
||||||
|
"immed": true, // Require immediate invocations to be wrapped in parens e.g. `( function(){}() );`
|
||||||
|
"latedef": true, // Prohibit variable use before definition.
|
||||||
|
"newcap": true, // Require capitalization of all constructor functions e.g. `new F()`.
|
||||||
|
"noarg": true, // Prohibit use of `arguments.caller` and `arguments.callee`.
|
||||||
|
"quotmark": "single", // Define quotes to string values.
|
||||||
|
"regexp": true, // Prohibit `.` and `[^...]` in regular expressions.
|
||||||
|
"undef": true, // Require all non-global variables be declared before they are used.
|
||||||
|
"unused": true, // Warn unused variables.
|
||||||
|
"strict": true, // Require `use strict` pragma in every file.
|
||||||
|
"trailing": true, // Prohibit trailing whitespaces.
|
||||||
|
"smarttabs": false, // Suppresses warnings about mixed tabs and spaces
|
||||||
|
"globals": { // Globals variables.
|
||||||
|
"angular": true
|
||||||
|
},
|
||||||
|
"predef": [ // Extra globals.
|
||||||
|
"define",
|
||||||
|
"require",
|
||||||
|
"exports",
|
||||||
|
"module",
|
||||||
|
"describe",
|
||||||
|
"before",
|
||||||
|
"beforeEach",
|
||||||
|
"after",
|
||||||
|
"afterEach",
|
||||||
|
"it",
|
||||||
|
"inject",
|
||||||
|
"expect"
|
||||||
|
],
|
||||||
|
"indent": 2, // Specify indentation spacing
|
||||||
|
"devel": true, // Allow development statements e.g. `console.log();`.
|
||||||
|
"noempty": true // Prohibit use of empty blocks.
|
||||||
|
}
|
||||||
94
Gruntfile.js
Normal file
94
Gruntfile.js
Normal file
@ -0,0 +1,94 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
module.exports = function(grunt) {
|
||||||
|
// Project Configuration
|
||||||
|
grunt.initConfig({
|
||||||
|
pkg: grunt.file.readJSON('package.json'),
|
||||||
|
watch: {
|
||||||
|
jade: {
|
||||||
|
files: ['app/views/**'],
|
||||||
|
options: {
|
||||||
|
livereload: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
js: {
|
||||||
|
files: ['Gruntfile.js', 'server.js', 'app/**/*.js', 'public/js/**'],
|
||||||
|
tasks: ['jshint'],
|
||||||
|
options: {
|
||||||
|
livereload: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
html: {
|
||||||
|
files: ['public/views/**'],
|
||||||
|
options: {
|
||||||
|
livereload: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
css: {
|
||||||
|
files: ['public/css/**'],
|
||||||
|
options: {
|
||||||
|
livereload: true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
jshint: {
|
||||||
|
all: {
|
||||||
|
src: ['Gruntfile.js', 'server.js', 'app/**/*.js', 'public/js/**'],
|
||||||
|
options: {
|
||||||
|
jshintrc: true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
nodemon: {
|
||||||
|
dev: {
|
||||||
|
options: {
|
||||||
|
file: 'server.js',
|
||||||
|
args: [],
|
||||||
|
ignoredFiles: ['public/**'],
|
||||||
|
watchedExtensions: ['js'],
|
||||||
|
nodeArgs: ['--debug'],
|
||||||
|
delayTime: 1,
|
||||||
|
env: {
|
||||||
|
PORT: 3000
|
||||||
|
},
|
||||||
|
cwd: __dirname
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
concurrent: {
|
||||||
|
tasks: ['nodemon', 'watch'],
|
||||||
|
options: {
|
||||||
|
logConcurrentOutput: true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
mochaTest: {
|
||||||
|
options: {
|
||||||
|
reporter: 'spec',
|
||||||
|
require: 'server.js'
|
||||||
|
},
|
||||||
|
src: ['test/*.js']
|
||||||
|
},
|
||||||
|
env: {
|
||||||
|
test: {
|
||||||
|
NODE_ENV: 'test'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
//Load NPM tasks
|
||||||
|
grunt.loadNpmTasks('grunt-contrib-watch');
|
||||||
|
grunt.loadNpmTasks('grunt-contrib-jshint');
|
||||||
|
grunt.loadNpmTasks('grunt-mocha-test');
|
||||||
|
grunt.loadNpmTasks('grunt-nodemon');
|
||||||
|
grunt.loadNpmTasks('grunt-concurrent');
|
||||||
|
grunt.loadNpmTasks('grunt-env');
|
||||||
|
|
||||||
|
//Making grunt default to force in order not to break the project.
|
||||||
|
grunt.option('force', true);
|
||||||
|
|
||||||
|
//Default task(s).
|
||||||
|
grunt.registerTask('default', ['jshint', 'concurrent']);
|
||||||
|
|
||||||
|
//Test task.
|
||||||
|
grunt.registerTask('test', ['env:test', 'mochaTest']);
|
||||||
|
};
|
||||||
@ -2,6 +2,13 @@ mystery
|
|||||||
=======
|
=======
|
||||||
|
|
||||||
|
|
||||||
|
## Install
|
||||||
|
|
||||||
|
- sudo npm -g i grunt-cli
|
||||||
|
- npm i
|
||||||
|
- grunt
|
||||||
|
|
||||||
|
|
||||||
## bitcoind configuration
|
## bitcoind configuration
|
||||||
|
|
||||||
There is a bitcoind configuration sample at:
|
There is a bitcoind configuration sample at:
|
||||||
|
|||||||
@ -2,5 +2,30 @@
|
|||||||
.container
|
.container
|
||||||
p.text-muted Place sticky footer content here.
|
p.text-muted Place sticky footer content here.
|
||||||
|
|
||||||
script(type='text/javascript', src='/lib/jquery/jquery.min.js')
|
//script(type='text/javascript', src='/lib/jquery/jquery.min.js')
|
||||||
script(type='text/javascript', src='/lib/bootstrap/dist/js/bootstrap.min.js')
|
//script(type='text/javascript', src='/lib/bootstrap/dist/js/bootstrap.min.js')
|
||||||
|
|
||||||
|
//AngularJS
|
||||||
|
script(type='text/javascript', src='/lib/angular/angular.js')
|
||||||
|
script(type='text/javascript', src='/lib/angular-cookies/angular-cookies.js')
|
||||||
|
script(type='text/javascript', src='/lib/angular-resource/angular-resource.js')
|
||||||
|
script(type='text/javascript', src='/lib/angular-route/angular-route.js')
|
||||||
|
|
||||||
|
//Angular UI
|
||||||
|
script(type='text/javascript', src='/lib/angular-bootstrap/ui-bootstrap.js')
|
||||||
|
script(type='text/javascript', src='/lib/angular-bootstrap/ui-bootstrap-tpls.js')
|
||||||
|
script(type='text/javascript', src='/lib/angular-ui-utils/ui-utils.js')
|
||||||
|
|
||||||
|
//Application Init
|
||||||
|
script(type='text/javascript', src='/js/app.js')
|
||||||
|
script(type='text/javascript', src='/js/config.js')
|
||||||
|
script(type='text/javascript', src='/js/directives.js')
|
||||||
|
script(type='text/javascript', src='/js/filters.js')
|
||||||
|
|
||||||
|
//Application Services
|
||||||
|
script(type='text/javascript', src='/js/services/global.js')
|
||||||
|
|
||||||
|
//Application Controllers
|
||||||
|
script(type='text/javascript', src='/js/controllers/index.js')
|
||||||
|
script(type='text/javascript', src='/js/controllers/header.js')
|
||||||
|
script(type='text/javascript', src='/js/init.js')
|
||||||
|
|||||||
@ -1,17 +1 @@
|
|||||||
.navbar.navbar-default.navbar-fixed-top(role='navigation')
|
.navbar.navbar-default.navbar-fixed-top(data-ng-include="'views/header.html'", role='navigation')
|
||||||
.container
|
|
||||||
.navbar-header
|
|
||||||
button.navbar-toggle(type='button', data-toggle='collapse', data-target='.navbar-collapse')
|
|
||||||
span.sr-only Toggle navigation
|
|
||||||
span.icon-bar
|
|
||||||
span.icon-bar
|
|
||||||
span.icon-bar
|
|
||||||
a.navbar-brand(href='#') Mystery
|
|
||||||
.collapse.navbar-collapse
|
|
||||||
ul.nav.navbar-nav
|
|
||||||
li.active
|
|
||||||
a(href='#') Home
|
|
||||||
li
|
|
||||||
a(href='#about') About
|
|
||||||
li
|
|
||||||
a(href='#contact') Contact
|
|
||||||
|
|||||||
@ -1,24 +1,25 @@
|
|||||||
extends layouts/default
|
extends layouts/default
|
||||||
|
|
||||||
block content
|
block content
|
||||||
.page-header
|
section.container(data-ng-view)
|
||||||
h1 Hello BitPay!
|
|
||||||
p ˈmɪst(ə)ri/'
|
|
||||||
| noun
|
|
||||||
audio(src="https://ssl.gstatic.com/dictionary/static/sounds/de/0/mystery.mp3",preload="auto",data-dobid="aud",id="aud")
|
|
||||||
button(onclick="document.getElementById('aud').play()") Play
|
|
||||||
|
|
||||||
ol
|
section.container
|
||||||
li
|
p ˈmɪst(ə)ri/'
|
||||||
strong something that is difficult or impossible to understand or explain.
|
| noun
|
||||||
p "the mysteries of outer space"
|
audio(src="https://ssl.gstatic.com/dictionary/static/sounds/de/0/mystery.mp3",preload="auto",data-dobid="aud",id="aud")
|
||||||
| synonyms: puzzle, enigma, conundrum, riddle, secret, unsolved problem, problem, question, question mark, closed book; secrecy or obscurity.
|
button(onclick="document.getElementById('aud').play()") Play
|
||||||
p "much of her past is shrouded in mystery"
|
|
||||||
| synonyms: secrecy, darkness, obscurity, ambiguity, ambiguousness, uncertainty, impenetrability, vagueness, nebulousness; More
|
ol
|
||||||
li
|
li
|
||||||
strong a person or thing whose identity or nature is puzzling or unknown.
|
strong something that is difficult or impossible to understand or explain.
|
||||||
p "‘He's a bit of a mystery,’ said Nina"
|
p "the mysteries of outer space"
|
||||||
li
|
| synonyms: puzzle, enigma, conundrum, riddle, secret, unsolved problem, problem, question, question mark, closed book; secrecy or obscurity.
|
||||||
strong a novel, play, or film dealing with a puzzling crime, especially a murder.
|
p "much of her past is shrouded in mystery"
|
||||||
p "the 1920s murder mystery, The Ghost Train"
|
| synonyms: secrecy, darkness, obscurity, ambiguity, ambiguousness, uncertainty, impenetrability, vagueness, nebulousness; More
|
||||||
| synonyms: thriller, detective story/novel, murder story; More
|
li
|
||||||
|
strong a person or thing whose identity or nature is puzzling or unknown.
|
||||||
|
p "‘He's a bit of a mystery,’ said Nina"
|
||||||
|
li
|
||||||
|
strong a novel, play, or film dealing with a puzzling crime, especially a murder.
|
||||||
|
p "the 1920s murder mystery, The Ghost Train"
|
||||||
|
| synonyms: thriller, detective story/novel, murder story; More
|
||||||
|
|||||||
@ -4,6 +4,5 @@ html(lang='en', xmlns='http://www.w3.org/1999/xhtml')
|
|||||||
body
|
body
|
||||||
#wrap
|
#wrap
|
||||||
include ../includes/navbar
|
include ../includes/navbar
|
||||||
section.container
|
block content
|
||||||
block content
|
|
||||||
include ../includes/foot
|
include ../includes/foot
|
||||||
|
|||||||
@ -2,6 +2,13 @@
|
|||||||
"name": "Mystery",
|
"name": "Mystery",
|
||||||
"version": "0.0.1",
|
"version": "0.0.1",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"bootstrap": "3.0.3"
|
"angular": "latest",
|
||||||
|
"angular-resource": "latest",
|
||||||
|
"angular-cookies": "latest",
|
||||||
|
"angular-mocks": "latest",
|
||||||
|
"angular-route": "latest",
|
||||||
|
"bootstrap": "3.0.3",
|
||||||
|
"angular-bootstrap": "0.9.0",
|
||||||
|
"angular-ui-utils": "0.1.0"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
30
package.json
30
package.json
@ -7,10 +7,12 @@
|
|||||||
"email": "ryan@bitpay.com"
|
"email": "ryan@bitpay.com"
|
||||||
},
|
},
|
||||||
"repository": "git://github.com/bitpay/mystery.git",
|
"repository": "git://github.com/bitpay/mystery.git",
|
||||||
"contributors": [{
|
"contributors": [
|
||||||
"name": "Matias Alejo Garcia",
|
{
|
||||||
"email": "ematiu@gmail.com"
|
"name": "Matias Alejo Garcia",
|
||||||
}],
|
"email": "ematiu@gmail.com"
|
||||||
|
}
|
||||||
|
],
|
||||||
"bugs": {
|
"bugs": {
|
||||||
"url": "https://github.com/bitpay/mystery/issues"
|
"url": "https://github.com/bitpay/mystery/issues"
|
||||||
},
|
},
|
||||||
@ -29,6 +31,7 @@
|
|||||||
"node": "*"
|
"node": "*"
|
||||||
},
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
|
"start": "node node_modules/grunt-cli/bin/grunt",
|
||||||
"postinstall": "node node_modules/bower/bin/bower install"
|
"postinstall": "node node_modules/bower/bin/bower install"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
@ -39,6 +42,23 @@
|
|||||||
"lodash": "~2.4.1",
|
"lodash": "~2.4.1",
|
||||||
"bower": "~1.2.8",
|
"bower": "~1.2.8",
|
||||||
"bitcore": "*",
|
"bitcore": "*",
|
||||||
"buffertools": "*"
|
"buffertools": "*",
|
||||||
|
"grunt": "~0.4.2",
|
||||||
|
"grunt-cli": "~0.1.11",
|
||||||
|
"grunt-env": "~0.4.1",
|
||||||
|
"grunt-contrib-jshint": "~0.8.0",
|
||||||
|
"grunt-contrib-watch": "~0.5.3",
|
||||||
|
"grunt-concurrent": "~0.4.2",
|
||||||
|
"grunt-nodemon": "~0.1.2",
|
||||||
|
"grunt-mocha-test": "~0.8.1",
|
||||||
|
"should": "~2.1.1"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"grunt-contrib-watch": "latest",
|
||||||
|
"grunt-contrib-jshint": "latest",
|
||||||
|
"grunt-nodemon": "latest",
|
||||||
|
"grunt-concurrent": "latest",
|
||||||
|
"grunt-mocha-test": "latest",
|
||||||
|
"should": "latest"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
5
public/js/app.js
Executable file
5
public/js/app.js
Executable file
@ -0,0 +1,5 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
angular.module('mystery', ['ngCookies', 'ngResource', 'ngRoute', 'ui.bootstrap', 'ui.route', 'mystery.system']);
|
||||||
|
|
||||||
|
angular.module('mystery.system', []);
|
||||||
21
public/js/config.js
Executable file
21
public/js/config.js
Executable file
@ -0,0 +1,21 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
//Setting up route
|
||||||
|
angular.module('mystery').config(['$routeProvider',
|
||||||
|
function($routeProvider) {
|
||||||
|
$routeProvider.
|
||||||
|
when('/', {
|
||||||
|
templateUrl: 'views/index.html'
|
||||||
|
}).
|
||||||
|
otherwise({
|
||||||
|
redirectTo: '/'
|
||||||
|
});
|
||||||
|
}
|
||||||
|
]);
|
||||||
|
|
||||||
|
//Setting HTML5 Location Mode
|
||||||
|
angular.module('mystery').config(['$locationProvider',
|
||||||
|
function($locationProvider) {
|
||||||
|
$locationProvider.hashPrefix('!');
|
||||||
|
}
|
||||||
|
]);
|
||||||
15
public/js/controllers/header.js
Executable file
15
public/js/controllers/header.js
Executable file
@ -0,0 +1,15 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
angular.module('mystery.system').controller('HeaderController', ['$scope', 'Global', function ($scope, Global) {
|
||||||
|
$scope.global = Global;
|
||||||
|
|
||||||
|
$scope.menu = [{
|
||||||
|
'title': 'Articles',
|
||||||
|
'link': 'articles'
|
||||||
|
}, {
|
||||||
|
'title': 'Create New Article',
|
||||||
|
'link': 'articles/create'
|
||||||
|
}];
|
||||||
|
|
||||||
|
$scope.isCollapsed = false;
|
||||||
|
}]);
|
||||||
5
public/js/controllers/index.js
Executable file
5
public/js/controllers/index.js
Executable file
@ -0,0 +1,5 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
angular.module('mystery.system').controller('IndexController', ['$scope', 'Global', function ($scope, Global) {
|
||||||
|
$scope.global = Global;
|
||||||
|
}]);
|
||||||
1
public/js/directives.js
Executable file
1
public/js/directives.js
Executable file
@ -0,0 +1 @@
|
|||||||
|
'use strict';
|
||||||
1
public/js/filters.js
Executable file
1
public/js/filters.js
Executable file
@ -0,0 +1 @@
|
|||||||
|
'use strict';
|
||||||
9
public/js/init.js
Executable file
9
public/js/init.js
Executable file
@ -0,0 +1,9 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
angular.element(document).ready(function() {
|
||||||
|
//Fixing facebook bug with redirect
|
||||||
|
if (window.location.hash === '#_=_') window.location.hash = '#!';
|
||||||
|
|
||||||
|
//Then init the app
|
||||||
|
angular.bootstrap(document, ['mystery']);
|
||||||
|
});
|
||||||
14
public/js/services/global.js
Executable file
14
public/js/services/global.js
Executable file
@ -0,0 +1,14 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
//Global service for global variables
|
||||||
|
angular.module('mystery.system').factory('Global', [
|
||||||
|
function() {
|
||||||
|
var _this = this;
|
||||||
|
_this._data = {
|
||||||
|
user: window.user,
|
||||||
|
authenticated: !! window.user
|
||||||
|
};
|
||||||
|
|
||||||
|
return _this._data;
|
||||||
|
}
|
||||||
|
]);
|
||||||
18
public/views/header.html
Executable file
18
public/views/header.html
Executable file
@ -0,0 +1,18 @@
|
|||||||
|
<div class="container" data-ng-controller="HeaderController">
|
||||||
|
<div class="navbar-header">
|
||||||
|
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
|
||||||
|
<span class="sr-only">Toggle navigation</span>
|
||||||
|
<span class="icon-bar"></span>
|
||||||
|
<span class="icon-bar"></span>
|
||||||
|
<span class="icon-bar"></span>
|
||||||
|
</button>
|
||||||
|
<a class="navbar-brand" href="#">Mystery</a>
|
||||||
|
</div>
|
||||||
|
<div class="collapse navbar-collapse">
|
||||||
|
<ul class="nav navbar-nav">
|
||||||
|
<li class="active"><a href="#">Home</a></li>
|
||||||
|
<li><a href="#about">About</a></li>
|
||||||
|
<li><a href="#contact">Contact</a></li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
5
public/views/index.html
Normal file
5
public/views/index.html
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
<section data-ng-controller="IndexController">
|
||||||
|
<div class="page-header">
|
||||||
|
<h1>Hello BitPay!</h1>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
4
test/mocha.opts
Normal file
4
test/mocha.opts
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
--require should
|
||||||
|
-R spec
|
||||||
|
--ui bdd
|
||||||
|
|
||||||
9
test/test.js
Normal file
9
test/test.js
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
var assert = require("assert")
|
||||||
|
describe('Array', function(){
|
||||||
|
describe('#indexOf()', function(){
|
||||||
|
it('should return -1 when the value is not present', function(){
|
||||||
|
assert.equal(-1, [1,2,3].indexOf(5));
|
||||||
|
assert.equal(-1, [1,2,3].indexOf(0));
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
||||||
57
util/sync.js
57
util/sync.js
@ -11,15 +11,19 @@ var config = require('../config/config');
|
|||||||
var mongoose = require('mongoose');
|
var mongoose = require('mongoose');
|
||||||
|
|
||||||
var networkName = process.argv[2] || 'testnet';
|
var networkName = process.argv[2] || 'testnet';
|
||||||
var genesisBlockHash = networks.testnet.genesisBlock.hash.reverse().toString('hex');
|
var network = networkName == 'testnet' ? networks.testnet : networks.livenet;
|
||||||
|
|
||||||
|
|
||||||
function syncBlocks(blockHash) {
|
function getNextBlock(blockHash,cb) {
|
||||||
|
|
||||||
|
if ( !blockHash ) {
|
||||||
|
console.log("done");
|
||||||
|
return cb();
|
||||||
|
}
|
||||||
|
|
||||||
rpc.getBlock(blockHash, function(err, blockInfo) {
|
rpc.getBlock(blockHash, function(err, blockInfo) {
|
||||||
if (err) {
|
if (err) {
|
||||||
console.log(err);
|
return cb(err);
|
||||||
throw(err);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( ! ( blockInfo.result.height % 1000) )
|
if ( ! ( blockInfo.result.height % 1000) )
|
||||||
@ -27,25 +31,39 @@ function syncBlocks(blockHash) {
|
|||||||
|
|
||||||
Block.create( blockInfo.result, function(err, inBlock) {
|
Block.create( blockInfo.result, function(err, inBlock) {
|
||||||
|
|
||||||
if (err && err.toString().match(/E11000/)) {
|
// E11000 => already exists
|
||||||
// console.log("\twas there. Skipping");
|
if (err && ! err.toString().match(/E11000/)) {
|
||||||
return syncBlocks(blockInfo.result.nextblockhash);
|
return cb(err);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (err) throw(err);
|
return getNextBlock(blockInfo.result.nextblockhash);
|
||||||
|
|
||||||
if (inBlock.nextblockhash && ! inBlock.nextblockhash.match(/^0+$/) ) {
|
|
||||||
syncBlocks(inBlock.nextblockhash)
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
mongoose.connection.close();
|
|
||||||
}
|
|
||||||
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function syncBlocks(network, cb) {
|
||||||
|
|
||||||
|
Block.findOne({}, {}, { sort: { 'height' : -1 } }, function(err, block) {
|
||||||
|
if (err) {
|
||||||
|
return cb(err);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
var nextHash =
|
||||||
|
block && block.hash
|
||||||
|
? block.hash
|
||||||
|
: network.genesisBlock.hash.reverse().toString('hex')
|
||||||
|
;
|
||||||
|
|
||||||
|
|
||||||
|
console.log('Starting at hash' + nextHash);
|
||||||
|
getNextBlock(nextHash, cb);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
mongoose.connect(config.db);
|
mongoose.connect(config.db);
|
||||||
|
|
||||||
@ -55,9 +73,12 @@ var rpc = new RpcClient(config.bitcoind);
|
|||||||
|
|
||||||
db.on('error', console.error.bind(console, 'connection error:'));
|
db.on('error', console.error.bind(console, 'connection error:'));
|
||||||
db.once('open', function callback () {
|
db.once('open', function callback () {
|
||||||
|
syncBlocks(network, function(err) {
|
||||||
syncBlocks(genesisBlockHash);
|
if (err) {
|
||||||
|
console.log(err);
|
||||||
|
}
|
||||||
|
mongoose.connection.close();
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user