diff --git a/lib/bitcoind.js b/lib/bitcoind.js index 86f1a6f2..308a0f32 100644 --- a/lib/bitcoind.js +++ b/lib/bitcoind.js @@ -881,6 +881,11 @@ exports.bitcoind = bitcoin; exports.native = bitcoindjs; exports.bitcoindjs = bitcoindjs; +bitcoindjs.Block = Block; +bitcoindjs.Transaction = Transaction; +bitcoindjs.blockToHex = Block.toHex; +bitcoindjs.txToHex = Transaction.toHex; + exports.Block = Block; exports.block = Block; diff --git a/src/bitcoindjs.cc b/src/bitcoindjs.cc index cb2aacbb..3919411b 100644 --- a/src/bitcoindjs.cc +++ b/src/bitcoindjs.cc @@ -124,6 +124,8 @@ extern CWallet *pwalletMain; using namespace node; using namespace v8; +Handle bitcoindjs_obj; + NAN_METHOD(StartBitcoind); NAN_METHOD(IsStopping); NAN_METHOD(IsStopped); @@ -217,10 +219,16 @@ static void async_wallet_sendfrom_after(uv_work_t *req); static inline void -ctx_to_js(const CTransaction& tx, uint256 hashBlock, Local entry); +ctx_to_jstx(const CTransaction& tx, uint256 hashBlock, Local entry); static inline void -cblock_to_js(const CBlock& block, const CBlockIndex* blockindex, Local obj); +cblock_to_jsblock(const CBlock& block, const CBlockIndex* blockindex, Local obj); + +static inline void +jsblock_to_cblock(Local jsblock, CBlock& cblock); + +static inline void +jstx_to_ctx(Local jstx, CTransaction& ctx); extern "C" void init(Handle); @@ -659,7 +667,7 @@ async_get_block_after(uv_work_t *req) { const CBlockIndex* blockindex = data->result_blockindex; Local obj = NanNew(); - cblock_to_js(block, blockindex, obj); + cblock_to_jsblock(block, blockindex, obj); const unsigned argc = 2; Local argv[argc] = { @@ -778,7 +786,7 @@ async_get_tx_after(uv_work_t *req) { Local entry = NanNew(); entry->Set(NanNew("hex"), NanNew(strHex)); - ctx_to_js(tx, hashBlock, entry); + ctx_to_jstx(tx, hashBlock, entry); const unsigned argc = 2; Local argv[argc] = { @@ -875,7 +883,7 @@ async_poll_blocks_after(uv_work_t *req) { CBlock block; if (ReadBlockFromDisk(block, pindex)) { Local obj = NanNew(); - cblock_to_js(block, pindex, obj); + cblock_to_jsblock(block, pindex, obj); blocks->Set(j, obj); j++; } @@ -963,7 +971,7 @@ async_poll_mempool_after(uv_work_t *req) { for (; it != mempool.mapTx.end(); it++) { const CTransaction& tx = it->second.GetTx(); Local entry = NanNew(); - ctx_to_js(tx, 0, entry); + ctx_to_jstx(tx, 0, entry); txs->Set(ti, entry); ti++; } @@ -974,7 +982,7 @@ async_poll_mempool_after(uv_work_t *req) { for (; it != mempool.mapNextTx.end(); it++) { const CTransaction tx = *it->second.ptx; Local entry = NanNew(); - ctx_to_js(tx, 0, entry); + ctx_to_jstx(tx, 0, entry); txs->Set(ti, entry); ti++; } @@ -1058,6 +1066,8 @@ async_broadcast_tx(uv_work_t *req) { fOwnOnly = true; } + // jstx_to_ctx(jstx, ctx); + try { ssData >> tx; } catch (std::exception &e) { @@ -1110,11 +1120,12 @@ async_broadcast_tx_after(uv_work_t *req) { node::FatalException(try_catch); } } else { + // jstx_to_ctx(jstx, ctx); CDataStream ssData(ParseHex(data->tx_hex), SER_NETWORK, PROTOCOL_VERSION); CTransaction tx; ssData >> tx; Local entry = NanNew(); - ctx_to_js(tx, 0, entry); + ctx_to_jstx(tx, 0, entry); const unsigned argc = 3; Local argv[argc] = { @@ -1152,6 +1163,7 @@ NAN_METHOD(VerifyBlock) { String::Utf8Value block_hex_(js_block->Get(NanNew("hex"))->ToString()); std::string block_hex = std::string(*block_hex_); + // jsblock_to_cblock(jsblock, cblock); CBlock block; CDataStream ssData(ParseHex(block_hex), SER_NETWORK, PROTOCOL_VERSION); ssData >> block; @@ -1179,6 +1191,7 @@ NAN_METHOD(VerifyTransaction) { String::Utf8Value tx_hex_(js_tx->Get(NanNew("hex"))->ToString()); std::string tx_hex = std::string(*tx_hex_); + // jstx_to_ctx(jstx, ctx); CTransaction tx; CDataStream ssData(ParseHex(tx_hex), SER_NETWORK, PROTOCOL_VERSION); ssData >> tx; @@ -1847,7 +1860,7 @@ NAN_METHOD(WalletSetTxFee) { */ static inline void -cblock_to_js(const CBlock& block, const CBlockIndex* blockindex, Local obj) { +cblock_to_jsblock(const CBlock& block, const CBlockIndex* blockindex, Local obj) { obj->Set(NanNew("hash"), NanNew(block.GetHash().GetHex().c_str())); CMerkleTx txGen(block.vtx[0]); txGen.SetMerkleBranch(&block); @@ -1970,7 +1983,7 @@ cblock_to_js(const CBlock& block, const CBlockIndex* blockindex, Local o } static inline void -ctx_to_js(const CTransaction& tx, uint256 hashBlock, Local entry) { +ctx_to_jstx(const CTransaction& tx, uint256 hashBlock, Local entry) { CDataStream ssTx(SER_NETWORK, PROTOCOL_VERSION); ssTx << tx; std::string strHex = HexStr(ssTx.begin(), ssTx.end()); @@ -2057,6 +2070,44 @@ ctx_to_js(const CTransaction& tx, uint256 hashBlock, Local entry) { } } +static inline void +jsblock_to_cblock(Local jsblock, CBlock& cblock) { + const unsigned argc = 1; + Local argv[argc] = { + Local::New(jsblock) + }; + Local block_hex__ = bitcoindjs_obj->Get("blockToHex")->Call(Context::GetCurrent()->Global(), argc, argv); + + String::Utf8Value block_hex_(block_hex__->ToString()); + std::string block_hex = std::string(*block_hex_); + + CDataStream ssData(ParseHex(block_hex), SER_NETWORK, PROTOCOL_VERSION); + try { + ssData >> cblock; + } catch (std::exception &e) { + return NanThrowError("Block decode failed"); + } +} + +static inline void +jstx_to_ctx(Local jstx, CTransaction& ctx) { + const unsigned argc = 1; + Local argv[argc] = { + Local::New(jstx) + }; + Local tx_hex__ = bitcoindjs_obj->Get("txToHex")->Call(Context::GetCurrent()->Global(), argc, argv); + + String::Utf8Value tx_hex_(tx_hex__->ToString()); + std::string tx_hex = std::string(*tx_hex_); + + CDataStream ssData(ParseHex(tx_hex), SER_NETWORK, PROTOCOL_VERSION); + try { + ssData >> ctx; + } catch (std::exception &e) { + return NanThrowError("TX decode failed"); + } +} + /** * Init */ @@ -2064,6 +2115,9 @@ ctx_to_js(const CTransaction& tx, uint256 hashBlock, Local entry) { extern "C" void init(Handle target) { NanScope(); + + bitcoindjs_obj = target; + NODE_SET_METHOD(target, "start", StartBitcoind); NODE_SET_METHOD(target, "stop", StopBitcoind); NODE_SET_METHOD(target, "stopping", IsStopping);