Merge pull request #13 from kleetus/script

Script
This commit is contained in:
Braydon Fuller 2015-07-09 13:23:07 -04:00
commit b9aa8a4d4f
7 changed files with 122 additions and 308 deletions

14
bin/build-bindings Executable file
View File

@ -0,0 +1,14 @@
#!/bin/bash
set -e
root_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/.."
cd "${root_dir}"
debug=
if test x"$1" = x'debug'; then
debug=--d
fi
node-gyp ${debug} rebuild

View File

@ -1,5 +1,5 @@
#!/bin/bash
set -e
set -e
root_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/.."
cd "${root_dir}"
@ -9,67 +9,64 @@ os_dir=$(./platform/os.sh osdir)
#set the LD_LIBRARY_PATH for the linux clients.
export LD_LIBRARY_PATH="${root_dir}/libbitcoind/src/leveldb":"${os_dir}":$LD_LIBRARY_PATH
if test -e "${os_dir}/libbitcoind.so" || test -e "${os_dir}/libbitcoind.dylib"; then
read -r -p 'libbitcoind already built. Rebuild? (Y/n): ' choice
if test x"$choice" != x'y' -a x"$choice" != x'Y'; then
echo 'libbitcoind ready.'
debug=
if test x"$1" = x'debug'; then
debug=--enable-debug
fi
btc_dir="${root_dir}/libbitcoind"
echo "Using BTC directory: ${btc_dir}"
rm -f "${os_dir}/libbitcoind.*"
only_make=false
if [ -d "${root_dir}/libbitcoind" ]; then
echo "Running make inside libbitcoind (assuming you've previously patched and configured libbitcoind)..."
cd "${btc_dir}"
only_make=true
else
echo "Removing cloning, patching, and building libbitcoind..."
fi
if [ "${only_make}" = false ]; then
if test -e "${root_dir/PATCH_VERSION}"; then
tag=`cat "${root_dir}/PATCH_VERSION" | xargs`
else
echo "no tag file found, please create it in the root of the project as so: 'echo \"v0.10.2\" > PATCH_VERSION'"
exit 0
fi
rm -rf libbitcoind
rm -f "${os_dir}/libbitcoind.*"
fi
if [ -d "${root_dir}/libbitcoind" ]; then
read -r -p "libbitcoind (bitcoind repo) exists, would you like to remove it? (Y/n): " choice
if [ "$choice" = "y" -o "$choice" = "Y" ]; then
rm -rf "${root_dir}/libbitcoind"
else
echo "ok you chose not to remove the bitcoin repo, exiting...bu bye!"
echo "attempting to checkout tag: ${tag} of bitcoin from github..."
git clone --depth 1 --branch "${tag}" git://github.com/bitcoin/bitcoin.git libbitcoind
cd "${btc_dir}"
echo '../patch-bitcoin.sh' "${btc_dir}"
../bin/patch-bitcoin "${btc_dir}"
if ! test -d .git; then
echo 'Please point this script to an upstream bitcoin git repo.'
exit 1
fi
fi
#read the PATCH VERSION
if test -e "${root_dir/PATCH_VERSION}"; then
tag=`cat "$root_dir/PATCH_VERSION" | xargs`
else
echo "no tag file found, please create it in the root of the project as so: 'echo \"v0.10.2\" > PATCH_VERSION'"
exit 0
echo './autogen.sh'
./autogen.sh
options=`cat ${root_dir}/bin/config_options.sh`
full_options="${options}${os_dir} ${debug}"
echo "running the configure script with the following options:\n :::[\"${full_options}\"]:::"
${full_options}
fi
echo "attempting to checkout tag: $tag of bitcoin from github..."
git clone --depth 1 --branch "${tag}" git://github.com/bitcoin/bitcoin.git libbitcoind
btc_dir="${root_dir}/libbitcoind"
echo "Found BTC directory: $btc_dir"
echo './patch-bitcoin.sh' "$btc_dir"
./bin/patch-bitcoin "$btc_dir"
cd "$btc_dir"
if ! test -d .git; then
echo 'Please point this script to an upstream bitcoin git repo.'
exit 1
fi
echo './autogen.sh'
./autogen.sh
options=`cat ${root_dir}/bin/config_options.sh`
full_options="${options}${os_dir}"
echo "running the configure script with the following options:\n :::[\"${full_options}\"]:::"
$full_options
echo 'make V=1'
make V=1
make V=1
ext=$($root_dir/platform/os.sh ext)
echo 'Copying libbitcoind.{so|dylib} to its appropriate location.'
if test -e "${root_dir}/libbitcoind/src/.libs/libbitcoind.${ext}"; then
if test -e "${root_dir}/libbitcoind/src/.libs/libbitcoind.${ext}"; then
if [ "$ext" = "dylib" ]; then
cp "${root_dir}/libbitcoind/src/.libs/libbitcoind.0.dylib" "${os_dir}/"
cp "${root_dir}/libbitcoind/src/.libs/libbitcoind.dylib" "${os_dir}/"
else
cp "${root_dir}/libbitcoind/src/.libs/libbitcoind.so" "${os_dir}/"
cp "${root_dir}/libbitcoind/src/.libs/libbitcoind.so.0" "${os_dir}/"
cp "${root_dir}/libbitcoind/src/.libs/libbitcoind.so.0.0.0" "${os_dir}/"
cp -P "${root_dir}"/libbitcoind/src/.libs/libbitcoind.so* "${os_dir}/"
fi
fi

View File

@ -1,2 +1,2 @@
./configure --enable-tests=no --enable-daemonlib --with-gui=no --without-qt --without-miniupnpc --without-bdb --enable-debug --disable-wallet --without-utils --prefix=
./configure --enable-tests=no --enable-daemonlib --with-gui=no --without-qt --without-miniupnpc --without-bdb --disable-wallet --without-utils --prefix=

View File

@ -20,7 +20,7 @@ index 0000000..9623c59
--- /dev/null
+++ b/config_me.sh
@@ -0,0 +1 @@
+./configure --enable-tests=no --enable-daemonlib --with-gui=no --without-qt --without-miniupnpc --without-bdb --enable-debug --disable-wallet --without-utils --prefix=/home/k/source/bitcoind.js/platform/debian
+./configure --enable-tests=no --enable-daemonlib --with-gui=no --without-qt --without-miniupnpc --without-bdb --enable-debug --disable-wallet --without-utils
diff --git a/configure.ac b/configure.ac
index 579035f..cd20489 100644
--- a/configure.ac
@ -28,7 +28,7 @@ index 579035f..cd20489 100644
@@ -126,6 +126,12 @@ AC_ARG_ENABLE([reduce-exports],
[use_reduce_exports=$enableval],
[use_reduce_exports=auto])
+AC_ARG_ENABLE([daemonlib],
+ [AS_HELP_STRING([--enable-daemonlib],
+ [compile all of bitcoind as a library (default is no)])],
@ -45,13 +45,13 @@ index 579035f..cd20489 100644
+ if test x$use_daemonlib = xno; then
+ AX_CHECK_COMPILE_FLAG([-fPIE],[HARDENED_CXXFLAGS="$HARDENED_CXXFLAGS -fPIE"])
+ fi
AX_CHECK_PREPROC_FLAG([-D_FORTIFY_SOURCE=2],[
AX_CHECK_PREPROC_FLAG([-U_FORTIFY_SOURCE],[
@@ -422,7 +431,7 @@ if test x$use_hardening != xno; then
AX_CHECK_LINK_FLAG([[-Wl,-z,relro]], [HARDENED_LDFLAGS="$HARDENED_LDFLAGS -Wl,-z,relro"])
AX_CHECK_LINK_FLAG([[-Wl,-z,now]], [HARDENED_LDFLAGS="$HARDENED_LDFLAGS -Wl,-z,now"])
- if test x$TARGET_OS != xwindows; then
+ if test x$TARGET_OS != xwindows -a x$use_daemonlib = xno; then
# All windows code is PIC, forcing it on just adds useless compile warnings
@ -60,7 +60,7 @@ index 579035f..cd20489 100644
@@ -440,6 +449,17 @@ if test x$use_hardening != xno; then
OBJCXXFLAGS="$CXXFLAGS"
fi
+AC_DEFINE([ENABLE_DAEMONLIB],[0],[Enable daemonlib.])
+AM_CONDITIONAL([ENABLE_DAEMONLIB],[false])
+if test x$use_daemonlib != xno; then
@ -78,7 +78,7 @@ index 579035f..cd20489 100644
@@ -485,7 +505,7 @@ AC_LINK_IFELSE([AC_LANG_SOURCE([
]
)
-if test x$use_reduce_exports != xno; then
+if test x$use_reduce_exports != xno -a x$use_daemonlib = xno; then
AX_CHECK_COMPILE_FLAG([-fvisibility=hidden],[RE_CXXFLAGS="-fvisibility=hidden"],
@ -87,7 +87,7 @@ index 579035f..cd20489 100644
@@ -496,6 +516,13 @@ if test x$use_reduce_exports != xno; then
])
fi
+AC_MSG_CHECKING([whether to compile as daemonlib])
+if test x$use_daemonlib != xno; then
+ AC_MSG_RESULT([yes])
@ -105,9 +105,9 @@ index 81b16d1..d05c91a 100644
@@ -1,6 +1,7 @@
DIST_SUBDIRS = secp256k1
AM_LDFLAGS = $(PTHREAD_CFLAGS) $(LIBTOOL_LDFLAGS)
+lib_LTLIBRARIES =
if EMBEDDED_LEVELDB
LEVELDB_CPPFLAGS += -I$(srcdir)/leveldb/include
@@ -15,6 +16,10 @@ $(LIBLEVELDB) $(LIBMEMENV):
@ -119,12 +119,12 @@ index 81b16d1..d05c91a 100644
+ @echo "Building the LevelDB shared library..." && $(MAKE) -C ./leveldb
+
endif
BITCOIN_CONFIG_INCLUDES=-I$(builddir)/config
@@ -49,16 +54,16 @@ BITCOIN_INCLUDES += $(BDB_CPPFLAGS)
EXTRA_LIBRARIES += libbitcoin_wallet.a
endif
-if BUILD_BITCOIN_LIBS
-lib_LTLIBRARIES = libbitcoinconsensus.la
-LIBBITCOIN_CONSENSUS=libbitcoinconsensus.la
@ -135,7 +135,7 @@ index 81b16d1..d05c91a 100644
+LIBBITCOIN_CONSENSUS =
bin_PROGRAMS =
TESTS =
+if BUILD_BITCOIN_LIBS
+lib_LTLIBRARIES += libbitcoinconsensus.la
+LIBBITCOIN_CONSENSUS += libbitcoinconsensus.la
@ -152,7 +152,7 @@ index 81b16d1..d05c91a 100644
+else
+lib_LTLIBRARIES += libbitcoind.la
+endif
.PHONY: FORCE
# bitcoin core #
@@ -156,8 +164,9 @@ obj/build.h: FORCE
@ -160,7 +160,7 @@ index 81b16d1..d05c91a 100644
@$(top_srcdir)/share/genbuild.sh $(abs_top_builddir)/src/obj/build.h \
$(abs_top_srcdir)
-libbitcoin_util_a-clientversion.$(OBJEXT): obj/build.h
+libbitcoin_util_a-clientversion.$(OBJEXT): obj/build.h
+clientversion.cpp: obj/build.h
# server: shared between bitcoind and bitcoin-qt
@ -184,12 +184,12 @@ index 81b16d1..d05c91a 100644
+libbitcoind_la_SOURCES += $(libbitcoin_server_a_SOURCES)
+libbitcoind_la_SOURCES += $(crypto_libbitcoin_crypto_a_SOURCES)
+libbitcoind_la_SOURCES += $(univalue_libbitcoin_univalue_a_SOURCES)
if TARGET_WINDOWS
bitcoind_SOURCES += bitcoind-res.rc
+libbitcoind_la_SOURCES += bitcoind-res.rc
endif
bitcoind_LDADD += $(BOOST_LIBS) $(BDB_LIBS) $(SSL_LIBS) $(CRYPTO_LIBS) $(MINIUPNPC_LIBS)
bitcoind_CPPFLAGS = $(BITCOIN_INCLUDES)
bitcoind_LDFLAGS = $(RELDFLAGS) $(AM_LDFLAGS) $(LIBTOOL_APP_LDFLAGS)
@ -197,7 +197,7 @@ index 81b16d1..d05c91a 100644
+libbitcoind_la_CPPFLAGS = $(BITCOIN_INCLUDES)
+libbitcoind_la_LDFLAGS = -lleveldb -L./leveldb $(RELDFLAGS) -no-undefined
+libbitcoind_la_DEPENDENCIES = $(LIBSECP256K1) LIBLEVELDB_SHARED $(MEMOBJ)
# bitcoin-cli binary #
bitcoin_cli_LDADD = \
diff --git a/src/bitcoind.cpp b/src/bitcoind.cpp
@ -207,23 +207,23 @@ index be7757b..0eb62d8 100644
@@ -15,6 +15,9 @@
#include <boost/filesystem.hpp>
#include <boost/thread.hpp>
+#if ENABLE_DAEMONLIB
+extern void DetectShutdownThread(boost::thread_group* threadGroup);
+#endif
/* Introduction text for doxygen: */
/*! \mainpage Developer documentation
@@ -175,6 +178,7 @@ bool AppInit(int argc, char* argv[])
return fRet;
}
+#if !ENABLE_DAEMONLIB
int main(int argc, char* argv[])
{
SetupEnvironment();
@@ -184,3 +188,4 @@ int main(int argc, char* argv[])
return (AppInit(argc, argv) ? 0 : 1);
}
+#endif
@ -232,9 +232,9 @@ index f2f7ac6..9106580 100644
--- a/src/init.h
+++ b/src/init.h
@@ -17,6 +17,11 @@ class thread_group;
extern CWallet* pwalletMain;
+#if ENABLE_DAEMONLIB
+#include <boost/filesystem/path.hpp>
+#include <boost/thread/mutex.hpp>
@ -249,24 +249,24 @@ index 2bd2cad..490ba66 100644
+++ b/src/leveldb/Makefile
@@ -103,7 +103,7 @@ check: all $(PROGRAMS) $(TESTS)
for t in $(TESTS); do echo "***** Running $$t"; ./$$t || exit 1; done
clean:
- -rm -f $(PROGRAMS) $(BENCHMARKS) $(LIBRARY) $(SHARED) $(MEMENVLIBRARY) */*.o */*/*.o ios-x86/*/*.o ios-arm/*/*.o build_config.mk
+ -rm -f $(PROGRAMS) $(BENCHMARKS) $(LIBRARY) $(SHARED) $(MEMENVLIBRARY) */*.o */*/*.lo helpers/memenv/.deps/*.Plo helpers/memenv/.deps/*.Tpo */*/*.o ios-x86/*/*.o ios-arm/*/*.o build_config.mk
-rm -rf ios-x86/* ios-arm/*
$(LIBRARY): $(LIBOBJECTS)
@@ -192,6 +192,10 @@ $(MEMENVLIBRARY) : $(MEMENVOBJECTS)
rm -f $@
$(AR) -rs $@ $(MEMENVOBJECTS)
+helpers/memenv/memenv.lo: helpers/memenv/memenv.cc
+ -mkdir -p helpers/memenv/.deps
+ /bin/bash ../../libtool --tag=CXX --mode=compile $(CXX) $(CXXFLAGS) $(CFLAGS) -fPIC -MT $@ -MD -MP -MF helpers/memenv/.deps/memenv.Tpo -c -o $@ $<
+
memenv_test : helpers/memenv/memenv_test.o $(MEMENVLIBRARY) $(LIBRARY) $(TESTHARNESS)
$(CXX) $(LDFLAGS) helpers/memenv/memenv_test.o $(MEMENVLIBRARY) $(LIBRARY) $(TESTHARNESS) -o $@ $(LIBS)
diff --git a/src/leveldbwrapper.h b/src/leveldbwrapper.h
index 4247920..c75c63c 100644
--- a/src/leveldbwrapper.h
@ -274,14 +274,14 @@ index 4247920..c75c63c 100644
@@ -29,10 +29,16 @@ class CLevelDBBatch
{
friend class CLevelDBWrapper;
+#if ENABLE_DAEMONLIB
+public:
+#else
private:
+#endif
leveldb::WriteBatch batch;
+#if !ENABLE_DAEMONLIB
public:
+#endif
@ -289,7 +289,7 @@ index 4247920..c75c63c 100644
void Write(const K& key, const V& value)
{
@@ -63,7 +69,11 @@ public:
class CLevelDBWrapper
{
+#if ENABLE_DAEMONLIB
@ -299,17 +299,17 @@ index 4247920..c75c63c 100644
+#endif
//! custom environment this database is using (may be NULL in case of default environment)
leveldb::Env* penv;
@@ -85,7 +95,9 @@ private:
//! the database itself
leveldb::DB* pdb;
+#if !ENABLE_DAEMONLIB
public:
+#endif
CLevelDBWrapper(const boost::filesystem::path& path, size_t nCacheSize, bool fMemory = false, bool fWipe = false);
~CLevelDBWrapper();
--
--
2.3.2 (Apple Git-55)

View File

@ -1,27 +1,19 @@
#!/usr/bin/env node
'use strict';
/**
* bitcoind.js example
*/
process.title = 'bitcoind.js';
var util = require('util');
var fs = require('fs');
var argv = require('optimist').argv;
var rimraf = require('rimraf');
var assert = require('assert');
/**
* bitcoind
*/
if (fs.existsSync(process.env.HOME + '/.libbitcoind-example')) {
rimraf.sync(process.env.HOME + '/.libbitcoind-example');
}
var bitcoind = require('../')({
directory: '~/.libbitcoind-example'
directory: process.env.BITCOINDJS_DIR || '~/.bitcoin'
});
bitcoind.on('error', function(err) {
@ -30,149 +22,4 @@ bitcoind.on('error', function(err) {
bitcoind.on('open', function(status) {
bitcoind.log('status="%s"', status);
if (argv.list) {
return;
}
if (argv.blocks) {
return getBlocks(bitcoind);
}
function assertHex(obj) {
// Hash
if (obj.txid) {
assert.equal(obj.hash, obj.getHash('hex'));
} else {
assert.equal(obj.hash, obj.getHash('hex'));
}
// Hex
if (obj.txid) {
assert.equal(obj.hex, obj.toHex());
} else {
assert.equal(obj.hex, obj.toHex());
}
}
if (argv['on-block']) {
return bitcoind.on('block', function callee(block) {
if (block.tx.length === 1) return;
bitcoind.log('Found Block:');
bitcoind.log(block);
return assertHex(block);
});
}
if (argv['on-tx']) {
bitcoind.on('tx', function(tx) {
bitcoind.log('Found TX:');
bitcoind.log(tx);
return assertHex(tx);
});
bitcoind.on('mptx', function(mptx) {
bitcoind.log('Found mempool TX:');
bitcoind.log(mptx);
return assertHex(mptx);
});
return;
}
if (argv.broadcast) {
// Help propagate transactions
return bitcoind.once('tx', function(tx) {
bitcoind.log('Broadcasting TX...');
return tx.broadcast(function(err, hash, tx) {
if (err) throw err;
bitcoind.log('TX Hash: %s', hash);
return bitcoind.log(tx);
});
});
}
// Test fromHex:
if (argv['from-hex']) {
var block = bitcoind.block(testBlock);
assert.equal(block.hash, '0000000000013b8ab2cd513b0261a14096412195a72a0c4827d229dcc7e0f7af');
assert.equal(block.merkleroot, '2fda58e5959b0ee53c5253da9b9f3c0c739422ae04946966991cf55895287552');
bitcoind.log('Block:');
bitcoind.log(block);
var tx = bitcoind.tx(testTx);
assert.equal(tx.txid, 'b4749f017444b051c44dfd2720e88f314ff94f3dd6d56d40ef65854fcd7fff6b');
bitcoind.log('Transaction:');
bitcoind.log(tx);
return;
}
// Test all digest packets:
if (argv['packets']) {
bitcoind.on('digest', function(packet) {
return bitcoind.log(packet);
});
return;
}
argv['on-block'] = true;
setTimeout(function() {
bitcoind.on('block', function callee(block) {
if (!argv['on-block']) {
return bitcoind.removeListener('block', callee);
}
bitcoind.log('Found Block:');
bitcoind.log(block);
return assertHex(block);
});
bitcoind.once('block', function(block) {
setTimeout(function() {
argv['on-block'] = false;
bitcoind.log(bitcoind.getInfo());
bitcoind.log(bitcoind.getPeerInfo());
bitcoind.once('version', function(version) {
bitcoind.log('VERSION packet:');
bitcoind.log(version);
});
bitcoind.once('addr', function(addr) {
bitcoind.log('ADDR packet:');
bitcoind.log(addr);
});
}, 8000);
});
}, 2000);
return;
});
/**
* Helpers
*/
function getBlocks(bitcoind) {
return setTimeout(function() {
return (function next(hash) {
return bitcoind.getBlock(hash, function(err, block) {
if (err) return bitcoind.log(err.message);
bitcoind.log(block);
if (argv['get-tx'] && block.tx.length && block.tx[0].txid) {
var txid = block.tx[0].txid;
// XXX Dies with a segfault
// bitcoind.getTx(txid, hash, function(err, tx) {
bitcoind.getTx(txid, function(err, tx) {
if (err) return bitcoind.log(err.message);
bitcoind.log('TX -----------------------------------------------------');
bitcoind.log(tx);
bitcoind.log('/TX ----------------------------------------------------');
});
}
if (block.nextblockhash) {
setTimeout(next.bind(null, block.nextblockhash), 500);
}
});
})(genesisBlock);
}, 1000);
}

View File

@ -6,7 +6,7 @@
var net = require('net');
var EventEmitter = require('events').EventEmitter;
var bitcoindjs = require('../build/Debug/bitcoindjs.node');
var bitcoindjs = require('bindings')('bitcoindjs.node');
var util = require('util');
var fs = require('fs');
var mkdirp = require('mkdirp');
@ -196,65 +196,7 @@ Bitcoin.prototype.start = function(options, callback) {
bitcoindjs.start(options, function(err, status) {
self._started = true;
// Poll for queued packets
setInterval(function() {
var packets = bitcoindjs.hookPackets();
if (!packets) {
if (self.debug) {
self.error('Error polling packet queue.');
}
return;
}
if (!packets.length) {
return;
}
self.emit('_packets', packets);
packets.forEach(function(packet) {
setImmediate(function() {
self.emit('raw:' + packet.name, packet);
self.emit('raw', packet);
if (packet.name === 'addr') {
self.emit(packet.name, packet.addresses);
self.emit('digest', packet.addresses);
return;
}
if (packet.name === 'block') {
var block = self.block(packet.block);
self.emit(packet.name, block);
self.emit('digest', block);
block.tx.forEach(function(tx) {
setImmediate(function() {
tx = self.tx(tx);
self.emit('tx', tx);
self.emit('digest', tx);
});
});
return;
}
if (packet.name === 'tx') {
var tx = self.tx(packet.tx);
var name = packet.name;
if (!packet.tx.blockhash) {
name = 'mptx';
}
self.emit(name, tx);
self.emit('digest', tx);
return;
}
self.emit(packet.name, packet);
self.emit('digest', packet);
});
});
}, 50);
// Poll for queued packet
[sigint, sighup, sigquit].forEach(function(signal) {
process.on(signal.name, signal.listener = function() {
if (process.listeners(signal.name).length > 1) {

View File

@ -1,31 +1,45 @@
{
"name": "bitcoind.js",
"description": "Node binding for bitcoind",
"author": "Christopher Jeffrey",
"author": "BitPay <dev@bitpay.com>",
"version": "0.0.8",
"main": "./index.js",
"repository": "git://github.com/chjj/bitcoind.js.git",
"homepage": "https://github.com/chjj/bitcoind.js",
"repository": "git://github.com/bitpay/bitcoind.js.git",
"homepage": "https://github.com/bitpay/bitcoind.js",
"bugs": {
"url": "https://github.com/chjj/bitcoind.js/issues"
"url": "https://github.com/bitpay/bitcoind.js/issues"
},
"contributors": [
{
"name": "Christopher Jeffrey"
},
{
"name": "Braydon Fuller",
"email": "braydon@bitpay.com"
},
{
"name": "Chris Kleeschulte",
"email": "chrisk@bitpay.com"
}
],
"scripts": {
"preinstall": "./bin/build-libbitcoind remote",
"start": "export LD_LIBRARY_PATH=`./platform/os.sh osdir` && node example"
"preinstall": "./bin/build-libbitcoind",
"install": "./bin/build-bindings",
"start": "export LD_LIBRARY_PATH=`./platform/os.sh osdir` && node example",
"debug_install": "./bin/build-libbitcoind debug && ./bin/build-bindings debug"
},
"tags": [
"bitcoin",
"bitcoind"
],
"dependencies": {
"nan": "1.3.0",
"bindings": "^1.2.1",
"mkdirp": "0.5.0",
"nan": "1.3.0",
"tiny": "0.0.10"
},
"devDependencies": {
"mocha": "~1.16.2",
"optimist": "0.6.0",
"rimraf": "2.2.8",
"async": "1.2.1",
"benchmark": "1.0.0"
}