From 0f074777e75f8898a69665d964d4b47ada30a9c9 Mon Sep 17 00:00:00 2001 From: Christopher Jeffrey Date: Mon, 15 Dec 2014 16:08:19 -0800 Subject: [PATCH] work on exposing bloom filters for bitcore. --- src/bitcoindjs.cc | 170 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 170 insertions(+) diff --git a/src/bitcoindjs.cc b/src/bitcoindjs.cc index be3530f5..4d7fd97e 100644 --- a/src/bitcoindjs.cc +++ b/src/bitcoindjs.cc @@ -2495,6 +2495,176 @@ async_block_time_after(uv_work_t *req) { delete req; } +/home/chjj/work/node_modules/bitcore/lib/Bloom.js +/home/chjj/bitcoin/src/bloom.cpp +/home/chjj/bitcoin/src/bloom.h + +static const unsigned int MAX_BLOOM_FILTER_SIZE = 36000; // bytes +static const unsigned int MAX_HASH_FUNCS = 50; + +/** + * BloomCreate() + * bitcoindjs.createBloom() + * Create bloom filter + */ + +NAN_METHOD(BloomCreate) { + NanScope(); + + // if (SHUTTING_DOWN()) NanReturnValue(Undefined()); + +var LN2SQUARED = 0.4804530139182014246671025263266649717305529515945455; +var LN2 = 0.6931471805599453094172321214581765680755001343602552; +var bit_mask = [0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80]; + + if (args.Length() > 0) { + return NanThrowError( + "Usage: bitcoindjs.bloomCreate()"); + } + + Local filter = NanNew(); + + CBloomFilter cfilter; + + CDataStream ssFilter(SER_NETWORK, PROTOCOL_VERSION); + ssFilter << cfilter; + std::string strHex = HexStr(ssBlock.begin(), ssBlock.end()); + filter->Set(NanNew("hex"), NanNew(strHex)); + + filter->Set(NanNew("data"), NanNew()); + filter->Set(NanNew("hashFuncs"), NanNew(0)); + + NanReturnValue(filter); +} + +NAN_METHOD(BloomHash) { + NanScope(); + + // if (SHUTTING_DOWN()) NanReturnValue(Undefined()); + + if (args.Length() > 1) { + return NanThrowError( + "Usage: bitcoindjs.bloomHash(filter)"); + } + + CBloomFilter cfilter; + String::AsciiValue hex_string_(jstx->Get(NanNew("hex"))->ToString()); + std::string hex_string = *hex_string_; + + CDataStream ssData(ParseHex(hex_string), SER_NETWORK, PROTOCOL_VERSION); + try { + ssData >> cfilter; + } catch (std::exception &e) { + NanThrowError("Bad BloomFilter decode"); + return; + } + + std::vector vDataToHash; + unsigned int nHashNum = 0; + cfilter.Hash(nHashNum, vDataToHash); + + NanReturnValue(NanNew(vDataToHash)); +} + +NAN_METHOD(BloomInsert) { + NanScope(); + + // if (SHUTTING_DOWN()) NanReturnValue(Undefined()); + + if (args.Length() < 2) { + return NanThrowError( + "Usage: bitcoindjs.bloomInsert(filter, hash)"); + } + + Local filter = Local::Cast(args[0]); + + String::Utf8Value s_(args[1]->ToString()); + std::string js_hash = std::string(*s_); + uint256 hash(js_hash); + + CBloomFilter cfilter; + String::AsciiValue hex_string_(filter->Get(NanNew("hex"))->ToString()); + std::string hex_string = *hex_string_; + + CDataStream ssData(ParseHex(hex_string), SER_NETWORK, PROTOCOL_VERSION); + try { + ssData >> cfilter; + } catch (std::exception &e) { + NanThrowError("Bad BloomFilter decode"); + return; + } + + //vector vKey; + //COutPoint outpoint; + //uint256 hash; + cfilter.insert(hash); + + CDataStream ss(SER_NETWORK, PROTOCOL_VERSION); + ss << cfilter; + std::string strHex = HexStr(ss.begin(), ss.end()); + + if (cfilter.isFull) NanReturnValue(NanNew(false)); + if (!cfilter.isEmpty) NanReturnValue(NanNew(true)); + + NanReturnValue(NanNew(true)); +} + +NAN_METHOD(BloomContains) { + NanScope(); + + // if (SHUTTING_DOWN()) NanReturnValue(Undefined()); + + if (args.Length() < 1) { + return NanThrowError( + "Usage: bitcoindjs.bloomContains(vKey)"); + } + + CBloomFilter cfilter; + String::AsciiValue hex_string_(jstx->Get(NanNew("hex"))->ToString()); + std::string hex_string = *hex_string_; + + CDataStream ssData(ParseHex(hex_string), SER_NETWORK, PROTOCOL_VERSION); + try { + ssData >> cfilter; + } catch (std::exception &e) { + NanThrowError("Bad BloomFilter decode"); + return; + } + + vector vKey; + bool contained = cfilter.contains(vKey); + + NanReturnValue(NanNew(contained)); +} + +NAN_METHOD(BloomSize) { + NanScope(); + + // if (SHUTTING_DOWN()) NanReturnValue(Undefined()); + + if (args.Length() > 0) { + return NanThrowError( + "Usage: bitcoindjs.bloomSize()"); + } + + CBloomFilter cfilter; + String::AsciiValue hex_string_(jstx->Get(NanNew("hex"))->ToString()); + std::string hex_string = *hex_string_; + + CDataStream ssData(ParseHex(hex_string), SER_NETWORK, PROTOCOL_VERSION); + try { + ssData >> cfilter; + } catch (std::exception &e) { + NanThrowError("Bad BloomFilter decode"); + return; + } + + bool size_ok = cfilter.IsWithinSizeConstraints(); + NanReturnValue(NanNew(size_ok)); +} + + + /** * GetLastFileIndex() * bitcoindjs.getLastFileIndex()