From 896020b202702cba7009559f93a21e1a77deaf1b Mon Sep 17 00:00:00 2001 From: zenywallet Date: Mon, 11 Jun 2018 00:02:44 +0900 Subject: [PATCH] rocksdb test --- Db.js | 276 +++++++++++++++++++++++ index.js | 138 ++++++++---- package-lock.json | 557 ++++++++++++++++++++++++++++++++++++++++++++++ package.json | 5 +- 4 files changed, 930 insertions(+), 46 deletions(-) create mode 100644 Db.js diff --git a/Db.js b/Db.js new file mode 100644 index 0000000..81f4b24 --- /dev/null +++ b/Db.js @@ -0,0 +1,276 @@ +var rocksdb = require('level-packager')(require('rocksdb')); +var fs = require('fs-extra'); + +var prefix = { + blocks: 0x00, // height = hash, time + txouts: 0x01, // txid, n = value, [address, ..] + unspents: 0x02 // address, txid, n = value +}; + +var rocksdb_opts = { + keyEncoding: 'binary', + valueEncoding: 'binary' +}; + +var uint8 = function(val) { + var v = new Buffer(1); + v.writeUInt8(val); + return v; +} + +var uint32 = function(val) { + var v = new Buffer(4); + v.writeUInt32BE(val); + return v; +} + +var uint64 = function(val) { + var v = new Buffer(8); + v.writeUInt32BE(Math.floor(val / 0x100000000), 0); + v.writeInt32BE(val & -1, 4); + return v; +} + +var hex = function(val) { + return Buffer.from(val, 'hex'); +} + +var str = function(val) { + return Buffer.from(val, 'ascii'); +} + +var txid_min = hex('0000000000000000000000000000000000000000000000000000000000000000'); +var txid_max = hex('ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff'); +var uint32_min = uint32(0); +var uint32_max = uint32(0xffffffff); + +function Db(opts) { + var homepath = process.env.HOME || process.env.HOMEPATH || process.env.USERPROFILE; + var blockpath = homepath + '/.blockstor/blocks'; + fs.mkdirsSync(blockpath); + var db = rocksdb(blockpath, rocksdb_opts); + var self = this; + + this.put = function(key, val) { + return new Promise(function(resolve, reject) { + db.put(key, val, function(err) { + if(err) { + reject(err); + return; + } + resolve(); + }); + }); + } + + this.get = function(key, cb) { + return new Promise(function(resolve, reject) { + db.get(key, function(err, res) { + if(err) { + if(err.name == 'NotFoundError') { + resolve(null); + } else { + reject(err); + } + return; + } + if(cb) { + resolve(cb(res)); + } else { + resolve(res); + } + }); + }); + } + + this.del = function(key) { + return new Promise(function(resolve, reject) { + db.del(key, function(err) { + if(err) { + reject(err); + return; + } + resolve(); + }); + }); + } + + this.close = function() { + return new Promise(function(resolve, reject) { + db.close(function(err) { + if(err) { + reject(err); + return; + } + resolve(); + }); + }); + } + + this.setBlockHash = function(height, hash, time) { + var key = Buffer.concat([ + uint8(prefix.blocks), + uint32(height) + ]); + var val = Buffer.concat([ + hex(hash), + uint32(time) + ]); + return self.put(key, val); + } + + this.getBlockHash = function(height) { + var key = Buffer.concat([ + uint8(prefix.blocks), + uint32(height) + ]); + return self.get(key, function(res) { + return {hash: res.slice(0, 32).toString('hex'), time: res.readUInt32BE(32)}; + }); + } + + this.delBlockHash = function(height) { + var key = Buffer.concat([ + uint8(prefix.blocks), + uint32(height) + ]); + return self.del(key); + } + + this.setTxout = function(txid, n, value, addresses) { + var key = Buffer.concat([ + uint8(prefix.txouts), + hex(txid), + uint32(n) + ]); + var val = Buffer.concat([ + uint64(value), + str(addresses.join(',')) + ]); + return self.put(key, val); + } + + this.getTxout = function(txid, n) { + var key = Buffer.concat([ + uint8(prefix.txouts), + hex(txid), + uint32(n) + ]); + return self.get(key, function(res) { + return {value: res.readUInt32BE(0) * 0x100000000 + res.readUInt32BE(4), addresses: res.slice(8).toString().split(',')}; + }); + } + + this.delTxout = function(txid, n) { + var key = Buffer.concat([ + uint8(prefix.txouts), + hex(txid), + uint32(n) + ]); + return self.del(key); + } + + this.setUnspent = function(address, txid, n, value) { + var key = Buffer.concat([ + uint8(prefix.unspents), + str(address), + hex(txid), + uint32(n) + ]); + var val = Buffer.concat([ + uint64(value) + ]); + return self.put(key, val); + } + + this.getUnspent = function(address, txid, n) { // address, [txid, n] + if(txid && n) { + var key = Buffer.concat([ + uint8(prefix.unspents), + str(address), + hex(txid), + uint32(n) + ]); + return self.get(key, function(res) { + return res.readUInt32BE(0); + }); + } else { + var p_unspent = uint8(prefix.unspents); + var str_addr = str(address); + var start = Buffer.concat([ + p_unspent, + str_addr, + txid_min, + uint32_min + ]); + var end = Buffer.concat([ + p_unspent, + str_addr, + txid_max, + uint32_max + ]); + + var unspents = []; + return new Promise(function(resolve, reject) { + db.createReadStream({ + gte: start, + lte: end + }).on('data', function(res) { + var len = res.key.length; + var key = res.key; + unspents.push({ + txid: res.key.slice(len - 36, len - 4).toString('hex'), + n: res.key.slice(len - 4, len + 1).readUInt32BE(0), + value: res.value.readUInt32BE(0) * 0x100000000 + res.value.readUInt32BE(4) + }); + }).on('error', function(err) { + reject(err); + }).on('close', function() { + reject(null); + }).on('end', function() { + resolve(unspents); + }); + }); + } + } + + this.delUnspent = function(address, txid, n) { + var key = Buffer.concat([ + uint8(prefix.unspents), + str(address), + hex(txid), + uint32(n) + ]); + return self.del(key); + } + + this.getLastBlockHeight = function() { + return new Promise(function(resolve, reject) { + var start = Buffer.concat([ + uint8(prefix.blocks), + uint32_min + ]); + var end = Buffer.concat([ + uint8(prefix.blocks), + uint32_max + ]); + var last_height = null; + db.createReadStream({ + gte: start, + lte: end, + reverse: true, + limit: 1 + }).on('data', function(res) { + last_height = res.key.slice(1).readUInt32BE(0); + }).on('error', function(err) { + reject(err); + }).on('close', function() { + reject(null); + }).on('end', function() { + resolve(last_height); + }); + }); + } +} + +module.exports = Db; diff --git a/index.js b/index.js index f2ab720..3b87e48 100644 --- a/index.js +++ b/index.js @@ -1,7 +1,7 @@ var opts = require('config'); var Rpc = require('./Rpc'); var bitcoin = require('bitcoinjs-lib'); - +var Db = require('./Db'); var rpc = new Rpc(opts); rpc.cb = function(cmd, err, res) { if(err) { @@ -9,6 +9,7 @@ rpc.cb = function(cmd, err, res) { } return res; } +var db = new Db(opts); bitcoin.networks['bitzeny'] = { messagePrefix: '\u0018Bitzeny Signed Message:\n', @@ -24,59 +25,106 @@ bitcoin.networks['bitzeny'] = { var network = bitcoin.networks['bitzeny']; +async function txins(tx, txid, txins_cb) { + await Promise.all(tx.ins.map(async function(input) { + var in_txid = input.hash.reverse().toString('hex'); + var n = input.index; + if(n != 0xffffffff) { + var txout = await db.getTxout(in_txid, n); + if(!txout) { + throw('ERROR: Txout not found ' + in_txid + ' ' + n); + } + + await txins_cb(in_txid, n, txout); + } + })); +} + +async function txouts(tx, txid, txouts_cb) { + await Promise.all(tx.outs.map(async function(output, n) { + var amount = output.value; + var address = null; + try { + address = bitcoin.address.fromOutputScript(output.script, network); + } catch(ex) {} + + if(address) { + await txouts_cb(txid, n, amount, [address]); + } else { + var addresses = []; + var chunks = bitcoin.script.decompile(output.script); + for(var k in chunks) { + var chunk = chunks[k]; + if(Buffer.isBuffer(chunk) && chunk.length !== 1) { + try { + address = bitcoin.ECPair.fromPublicKeyBuffer(chunk, network).getAddress(); + addresses.push(address); + } catch(ex) {} + } + } + if(addresses.length > 0) { + await txouts_cb(txid, n, amount, addresses); + } else { + address = '#' + txid + '-' + n; + await txouts_cb(txid, n, amount, [address]); + } + } + })); +} + +async function txs_parser(block, txs_cb, txins_cb, txouts_cb) { + var txids = []; + await Promise.all(block.transactions.map(async function(tx, i) { + var txid = tx.getId(); + txids[i] = txid; + await txs_cb(txid); + await txouts(tx, txid, txouts_cb); + })); + + await Promise.all(block.transactions.map(async function(tx, i) { + await txins(tx, txids[i], txins_cb); + })); +} + + ;(async function() { var blockcount = await rpc.getBlockCount(); console.log(blockcount); - for(var i = blockcount - 9; i <= blockcount; i++) { - console.log('--- block #' + i); - var hash = await rpc.getBlockHash(i); + var last_height = await db.getLastBlockHeight() || 0; + console.log(last_height); + + for(var height = last_height; height <= blockcount; height++) { + var hash = await rpc.getBlockHash(height); var rawblock = await rpc.getBlock(hash, false); var block = bitcoin.Block.fromHex(rawblock); + var time = block.timestamp; - block.transactions.map(function(tx, i) { - var txid = tx.getHash(); - var txid_str = txid.reverse().toString('hex'); - console.log('--- txid ' + txid_str); + await db.setBlockHash(height, hash, time); - tx.ins.map(function(input) { - var in_txid = input.hash; - var n = input.index; - - if(n != 0xffffffff) { - console.log('in: ' + in_txid.reverse().toString('hex') + '-' + n); + await txs_parser(block, + async function txs(txid) { + }, + async function txins(txid, n, txout) { + for(var i in txout.addresses) { + var address = txout.addresses[i]; + await db.delUnspent(address, txid, n); } - }); - - tx.outs.map(function(output, n) { - var amount = output.value; - var address = null; - try { - address = bitcoin.address.fromOutputScript(output.script, network); - } catch(ex) {} - - if(address) { - console.log('out: ' + txid_str + '-' + n + ' ' + amount + ' ' + address); - } else { - var addresses = []; - var chunks = bitcoin.script.decompile(output.script); - for(var k in chunks) { - var chunk = chunks[k]; - if(Buffer.isBuffer(chunk) && chunk.length !== 1) { - try { - address = bitcoin.ECPair.fromPublicKeyBuffer(chunk, network).getAddress(); - addresses.push(address); - } catch(ex) {} - } - } - if(addresses.length > 0) { - console.log('out: ' + txid_str + '-' + n + ' ' + amount + ' ' + addresses.join(',')); - } else { - address = '#' + txid_str + '-' + n; - console.log('out: ' + txid_str + '-' + n + ' ' + amount + ' ' + address); - } + }, + async function txouts(txid, n, amount, addresses) { + await db.setTxout(txid, n, amount, addresses); + + for(var i in addresses) { + var address = addresses[i]; + await db.setUnspent(address, txid, n, amount); } - }); - }); + } + ); + + if(height % 100 == 0) { + console.log(height); + } } + + //console.log(await db.getUnspent('some address here!')); })(); diff --git a/package-lock.json b/package-lock.json index 6951a99..ecf2bda 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,6 +4,33 @@ "lockfileVersion": 1, "requires": true, "dependencies": { + "abstract-leveldown": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-5.0.0.tgz", + "integrity": "sha512-5mU5P1gXtsMIXg65/rsYGsi93+MlogXZ9FA8JnwKurHQg64bfXwGYVdVdijNTVNOlAsuIiOwHdvFFD5JqCJQ7A==", + "requires": { + "xtend": "4.0.1" + } + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" + }, + "are-we-there-yet": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", + "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", + "requires": { + "delegates": "1.0.0", + "readable-stream": "2.3.6" + } + }, "base-x": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.4.tgz", @@ -22,6 +49,11 @@ "resolved": "https://registry.npmjs.org/bigi/-/bigi-1.4.2.tgz", "integrity": "sha1-nGZalfiLiwj8Bc/XMfVhhZ1yWCU=" }, + "bindings": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.3.0.tgz", + "integrity": "sha512-DpLh5EzMR2kzvX1KIlVC0VkC3iZtHKTgdtZ0a3pglBZdaQFjt5S9g9xd1lE+YvXyfd6mtCeRnrUfOLYiTMlNSw==" + }, "bip66": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/bip66/-/bip66-1.1.5.tgz", @@ -62,6 +94,15 @@ "wif": "2.0.6" } }, + "bl": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.2.tgz", + "integrity": "sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==", + "requires": { + "readable-stream": "2.3.6", + "safe-buffer": "5.1.2" + } + }, "bs58": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", @@ -79,6 +120,30 @@ "create-hash": "1.2.0" } }, + "buffer-alloc": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", + "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", + "requires": { + "buffer-alloc-unsafe": "1.1.0", + "buffer-fill": "1.0.0" + } + }, + "buffer-alloc-unsafe": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", + "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==" + }, + "buffer-fill": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", + "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=" + }, + "chownr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.0.1.tgz", + "integrity": "sha1-4qdQQqlVGQi+vSW4Uj1fl2nXkYE=" + }, "cipher-base": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", @@ -88,6 +153,11 @@ "safe-buffer": "5.1.2" } }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" + }, "config": { "version": "1.30.0", "resolved": "https://registry.npmjs.org/config/-/config-1.30.0.tgz", @@ -97,6 +167,16 @@ "os-homedir": "1.0.2" } }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, "create-hash": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", @@ -122,6 +202,38 @@ "sha.js": "2.4.11" } }, + "decompress-response": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", + "requires": { + "mimic-response": "1.0.0" + } + }, + "deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" + }, + "deferred-leveldown": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/deferred-leveldown/-/deferred-leveldown-4.0.2.tgz", + "integrity": "sha512-5fMC8ek8alH16QiV0lTCis610D1Zt1+LA4MS4d63JgS32lrCjTFDUFz2ao09/j2I4Bqb5jL4FZYwu7Jz0XO1ww==", + "requires": { + "abstract-leveldown": "5.0.0", + "inherits": "2.0.3" + } + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" + }, + "detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=" + }, "ecurve": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/ecurve/-/ecurve-1.0.6.tgz", @@ -131,6 +243,89 @@ "safe-buffer": "5.1.2" } }, + "encoding-down": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/encoding-down/-/encoding-down-5.0.3.tgz", + "integrity": "sha512-grBSxdQBY6xNkMJoqXWUUsqneXyxcBk966OWbSF6FHjLRv1FiExseSM0poga7aZDC0TziUMCzQDo8NnLJ5Rvlw==", + "requires": { + "abstract-leveldown": "5.0.0", + "inherits": "2.0.3", + "level-codec": "9.0.0", + "level-errors": "2.0.0", + "xtend": "4.0.1" + } + }, + "end-of-stream": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", + "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", + "requires": { + "once": "1.4.0" + } + }, + "errno": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", + "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", + "requires": { + "prr": "1.0.1" + } + }, + "expand-template": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-1.1.1.tgz", + "integrity": "sha512-cebqLtV8KOZfw0UI8TEFWxtczxxC1jvyUvx6H4fyp1K1FN7A4Q+uggVUlOsI1K8AGU0rwOGqP8nCapdrw8CYQg==" + }, + "fast-future": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/fast-future/-/fast-future-1.0.2.tgz", + "integrity": "sha1-hDWpqqAteSSNF9cE52JZMB2ZKAo=" + }, + "fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" + }, + "fs-extra": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-6.0.1.tgz", + "integrity": "sha512-GnyIkKhhzXZUWFCaJzvyDLEEgDkPfb4/TPvJCJVuS8MWZgoSsErf++QpiAlDnKFcqhRlm+tIOcencCjyJE6ZCA==", + "requires": { + "graceful-fs": "4.1.11", + "jsonfile": "4.0.0", + "universalify": "0.1.1" + } + }, + "gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "requires": { + "aproba": "1.2.0", + "console-control-strings": "1.1.0", + "has-unicode": "2.0.1", + "object-assign": "4.1.1", + "signal-exit": "3.0.2", + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wide-align": "1.1.3" + } + }, + "github-from-package": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", + "integrity": "sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4=" + }, + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" + }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" + }, "hash-base": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", @@ -145,11 +340,80 @@ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "requires": { + "number-is-nan": "1.0.1" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, "json5": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/json5/-/json5-0.4.0.tgz", "integrity": "sha1-BUNS5MTIDIbAkjh31EneF2pzLI0=" }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "requires": { + "graceful-fs": "4.1.11" + } + }, + "level-codec": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/level-codec/-/level-codec-9.0.0.tgz", + "integrity": "sha512-OIpVvjCcZNP5SdhcNupnsI1zo5Y9Vpm+k/F1gfG5kXrtctlrwanisakweJtE0uA0OpLukRfOQae+Fg0M5Debhg==" + }, + "level-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/level-errors/-/level-errors-2.0.0.tgz", + "integrity": "sha512-AmY4HCp9h3OiU19uG+3YWkdELgy05OTP/r23aNHaQKWv8DO787yZgsEuGVkoph40uwN+YdUKnANlrxSsoOaaxg==", + "requires": { + "errno": "0.1.7" + } + }, + "level-iterator-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/level-iterator-stream/-/level-iterator-stream-2.0.0.tgz", + "integrity": "sha512-TWOYw8HR5mhj6xwoVLo0yu26RPL6v28KgvhK1kY1CJf9LyL+rJXjx99zhORTYhN9ysOBIH+iaxAiqRteA+C1/g==", + "requires": { + "inherits": "2.0.3", + "readable-stream": "2.3.6", + "xtend": "4.0.1" + } + }, + "level-packager": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/level-packager/-/level-packager-3.1.0.tgz", + "integrity": "sha512-UxVEfK5WH0u0InR3WxTCSAroiorAGKzXWZT6i+nBjambmvINuXFUsFx2Ai3UIjUUtnyWhluv42jMlzUZCsAk9A==", + "requires": { + "encoding-down": "5.0.3", + "levelup": "3.0.1" + } + }, + "levelup": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/levelup/-/levelup-3.0.1.tgz", + "integrity": "sha512-TrrLDPC/BfP35ei2uK+L6Cc7kpI1NxIChwp+BUB6jrHG3A8gtrr9jx1UZ9bi2w1O6VN7jYO4LUoq1iKRP5AREg==", + "requires": { + "deferred-leveldown": "4.0.2", + "level-errors": "2.0.0", + "level-iterator-stream": "2.0.0", + "xtend": "4.0.1" + } + }, "md5.js": { "version": "1.3.4", "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.4.tgz", @@ -164,11 +428,124 @@ "resolved": "https://registry.npmjs.org/merkle-lib/-/merkle-lib-2.0.10.tgz", "integrity": "sha1-grjbrnXieneFOItz+ddyXQ9vMyY=" }, + "mimic-response": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.0.tgz", + "integrity": "sha1-3z02Uqc/3ta5sLJBRub9BSNTRY4=" + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "requires": { + "minimist": "0.0.8" + }, + "dependencies": { + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + } + } + }, + "nan": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.10.0.tgz", + "integrity": "sha512-bAdJv7fBLhWC+/Bls0Oza+mvTaNQtP+1RyhhhvD95pgUJz6XM5IzgmxOkItJ9tkoCiplvAnXI1tNmmUD/eScyA==" + }, + "node-abi": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.4.1.tgz", + "integrity": "sha512-pUlswqpHQ7zGPI9lGjZ4XDNIEUDbHxsltfIRb7dTnYdhgHWHOcB0MLZKLoCz6UMcGzSPG5wGl1HODZVQAUsH6w==", + "requires": { + "semver": "5.5.0" + } + }, + "noop-logger": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/noop-logger/-/noop-logger-0.1.1.tgz", + "integrity": "sha1-lKKxYzxPExdVMAfYlm/Q6EG2pMI=" + }, + "npmlog": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "requires": { + "are-we-there-yet": "1.1.5", + "console-control-strings": "1.1.0", + "gauge": "2.7.4", + "set-blocking": "2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1.0.2" + } + }, "os-homedir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" }, + "prebuild-install": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-4.0.0.tgz", + "integrity": "sha512-7tayxeYboJX0RbVzdnKyGl2vhQRWr6qfClEXDhOkXjuaOKCw2q8aiuFhONRYVsG/czia7KhpykIlI2S2VaPunA==", + "requires": { + "detect-libc": "1.0.3", + "expand-template": "1.1.1", + "github-from-package": "0.0.0", + "minimist": "1.2.0", + "mkdirp": "0.5.1", + "node-abi": "2.4.1", + "noop-logger": "0.1.1", + "npmlog": "4.1.2", + "os-homedir": "1.0.2", + "pump": "2.0.1", + "rc": "1.2.8", + "simple-get": "2.8.1", + "tar-fs": "1.16.2", + "tunnel-agent": "0.6.0", + "which-pm-runs": "1.0.0" + } + }, + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" + }, + "prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=" + }, + "pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "requires": { + "end-of-stream": "1.4.1", + "once": "1.4.0" + } + }, "pushdata-bitcoin": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/pushdata-bitcoin/-/pushdata-bitcoin-1.0.1.tgz", @@ -185,6 +562,31 @@ "safe-buffer": "5.1.2" } }, + "rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "requires": { + "deep-extend": "0.6.0", + "ini": "1.3.5", + "minimist": "1.2.0", + "strip-json-comments": "2.0.1" + } + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "2.0.0", + "safe-buffer": "5.1.2", + "string_decoder": "1.1.1", + "util-deprecate": "1.0.2" + } + }, "ripemd160": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", @@ -194,11 +596,33 @@ "inherits": "2.0.3" } }, + "rocksdb": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/rocksdb/-/rocksdb-3.0.1.tgz", + "integrity": "sha512-H60hxTOHBiW5fSlbfMiFCqpDMPnqqUDUpbv9fnw1xExTHv7tuhizQFoCTowEALsOHE7suzUTNaUVemwJtx+BoA==", + "requires": { + "abstract-leveldown": "5.0.0", + "bindings": "1.3.0", + "fast-future": "1.0.2", + "nan": "2.10.0", + "prebuild-install": "4.0.0" + } + }, "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, + "semver": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", + "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==" + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + }, "sha.js": { "version": "2.4.11", "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", @@ -208,11 +632,121 @@ "safe-buffer": "5.1.2" } }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" + }, + "simple-concat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.0.tgz", + "integrity": "sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY=" + }, + "simple-get": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-2.8.1.tgz", + "integrity": "sha512-lSSHRSw3mQNUGPAYRqo7xy9dhKmxFXIjLjp4KHpf99GEH2VH7C3AM+Qfx6du6jhfUi6Vm7XnbEVEf7Wb6N8jRw==", + "requires": { + "decompress-response": "3.3.0", + "once": "1.4.0", + "simple-concat": "1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "5.1.2" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "2.1.1" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" + }, + "tar-fs": { + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-1.16.2.tgz", + "integrity": "sha512-LdknWjPEiZC1nOBwhv0JBzfJBGPJar08dZg2rwZe0ZTLQoRGEzgrl7vF3qUEkCHpI/wN9e7RyCuDhMsJUCLPPQ==", + "requires": { + "chownr": "1.0.1", + "mkdirp": "0.5.1", + "pump": "1.0.3", + "tar-stream": "1.6.1" + }, + "dependencies": { + "pump": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pump/-/pump-1.0.3.tgz", + "integrity": "sha512-8k0JupWme55+9tCVE+FS5ULT3K6AbgqrGa58lTT49RpyfwwcGedHqaC5LlQNdEAumn/wFsu6aPwkuPMioy8kqw==", + "requires": { + "end-of-stream": "1.4.1", + "once": "1.4.0" + } + } + } + }, + "tar-stream": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.1.tgz", + "integrity": "sha512-IFLM5wp3QrJODQFPm6/to3LJZrONdBY/otxcvDIQzu217zKye6yVR3hhi9lAjrC2Z+m/j5oDxMPb1qcd8cIvpA==", + "requires": { + "bl": "1.2.2", + "buffer-alloc": "1.2.0", + "end-of-stream": "1.4.1", + "fs-constants": "1.0.0", + "readable-stream": "2.3.6", + "to-buffer": "1.1.1", + "xtend": "4.0.1" + } + }, + "to-buffer": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz", + "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==" + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "requires": { + "safe-buffer": "5.1.2" + } + }, "typeforce": { "version": "1.12.0", "resolved": "https://registry.npmjs.org/typeforce/-/typeforce-1.12.0.tgz", "integrity": "sha512-fvnkvueAOFLhtAqDgIA/wMP21SMwS/NQESFKZuwVrj5m/Ew6eK2S0z0iB++cwtROPWDOhaT6OUfla8UwMw4Adg==" }, + "universalify": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.1.tgz", + "integrity": "sha1-+nG63UQ3r0wUiEHjs7Fl+enlkLc=" + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, "varuint-bitcoin": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/varuint-bitcoin/-/varuint-bitcoin-1.1.0.tgz", @@ -221,6 +755,19 @@ "safe-buffer": "5.1.2" } }, + "which-pm-runs": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.0.0.tgz", + "integrity": "sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs=" + }, + "wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "requires": { + "string-width": "1.0.2" + } + }, "wif": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/wif/-/wif-2.0.6.tgz", @@ -228,6 +775,16 @@ "requires": { "bs58check": "2.1.1" } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" } } } diff --git a/package.json b/package.json index 5462581..0a0e2e5 100644 --- a/package.json +++ b/package.json @@ -23,6 +23,9 @@ "dependencies": { "bitcoin": "^3.0.1", "bitcoinjs-lib": "^3.3.2", - "config": "^1.30.0" + "config": "^1.30.0", + "fs-extra": "^6.0.1", + "level-packager": "^3.1.0", + "rocksdb": "^3.0.1" } }