From 944169a4848c1d218c359dfbfd0030a210f66ed3 Mon Sep 17 00:00:00 2001 From: Christopher Jeffrey Date: Tue, 16 Dec 2014 12:35:41 -0800 Subject: [PATCH] revisit bloom filters. --- src/bitcoindjs.cc | 77 ++++++++++++++++++++++++++++++----------------- 1 file changed, 50 insertions(+), 27 deletions(-) diff --git a/src/bitcoindjs.cc b/src/bitcoindjs.cc index 4d7fd97e..4c425750 100644 --- a/src/bitcoindjs.cc +++ b/src/bitcoindjs.cc @@ -2495,9 +2495,10 @@ 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 +#if 0 +// ~/work/node_modules/bitcore/lib/Bloom.js +// ~/bitcoin/src/bloom.cpp +// ~/bitcoin/src/bloom.h static const unsigned int MAX_BLOOM_FILTER_SIZE = 36000; // bytes static const unsigned int MAX_HASH_FUNCS = 50; @@ -2513,13 +2514,20 @@ NAN_METHOD(BloomCreate) { // 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) { + if (args.Length() < 1) { return NanThrowError( - "Usage: bitcoindjs.bloomCreate()"); + "Usage: bitcoindjs.bloomCreate(options)"); + } + + Local options = Local::Cast(args[0]); + Local data = NanNew(); + Local nhash = NanNew(0); + + if (options->Get(NanNew("data"))->IsArray()) { + data = options->Get(NanNew("data")); + } + if (options->Get(NanNew("hashFuncs"))->IsNumber()) { + nhash = options->Get(NanNew("hashFuncs")); } Local filter = NanNew(); @@ -2531,8 +2539,8 @@ var bit_mask = [0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80]; 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)); + filter->Set(NanNew("data"), data); + filter->Set(NanNew("hashFuncs"), nhash); NanReturnValue(filter); } @@ -2542,13 +2550,15 @@ NAN_METHOD(BloomHash) { // if (SHUTTING_DOWN()) NanReturnValue(Undefined()); - if (args.Length() > 1) { + if (args.Length() < 1) { return NanThrowError( "Usage: bitcoindjs.bloomHash(filter)"); } + Local filter = Local::Cast(args[0]); + CBloomFilter cfilter; - String::AsciiValue hex_string_(jstx->Get(NanNew("hex"))->ToString()); + String::AsciiValue hex_string_(filter->Get(NanNew("hex"))->ToString()); std::string hex_string = *hex_string_; CDataStream ssData(ParseHex(hex_string), SER_NETWORK, PROTOCOL_VERSION); @@ -2560,7 +2570,10 @@ NAN_METHOD(BloomHash) { } std::vector vDataToHash; - unsigned int nHashNum = 0; + CDataStream ss(ParseHex(hex_string), SER_NETWORK, PROTOCOL_VERSION); + ss >> vDataToHash; + + unsigned int nHashNum = filter->Get(NanNew("hashFuncs"))->ToUint32(); cfilter.Hash(nHashNum, vDataToHash); NanReturnValue(NanNew(vDataToHash)); @@ -2603,10 +2616,12 @@ NAN_METHOD(BloomInsert) { ss << cfilter; std::string strHex = HexStr(ss.begin(), ss.end()); - if (cfilter.isFull) NanReturnValue(NanNew(false)); - if (!cfilter.isEmpty) NanReturnValue(NanNew(true)); + filter->Set(NanNew("hex"), NanNew(strHex)); - NanReturnValue(NanNew(true)); + if (cfilter.isFull) NanReturnValue(NanNew(false)); + if (!cfilter.isEmpty) NanReturnValue(filter); + + NanReturnValue(filter); } NAN_METHOD(BloomContains) { @@ -2614,13 +2629,19 @@ NAN_METHOD(BloomContains) { // if (SHUTTING_DOWN()) NanReturnValue(Undefined()); - if (args.Length() < 1) { + if (args.Length() < 2) { return NanThrowError( - "Usage: bitcoindjs.bloomContains(vKey)"); + "Usage: bitcoindjs.bloomContains(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_(jstx->Get(NanNew("hex"))->ToString()); + String::AsciiValue hex_string_(filter->Get(NanNew("hex"))->ToString()); std::string hex_string = *hex_string_; CDataStream ssData(ParseHex(hex_string), SER_NETWORK, PROTOCOL_VERSION); @@ -2631,8 +2652,9 @@ NAN_METHOD(BloomContains) { return; } - vector vKey; - bool contained = cfilter.contains(vKey); + //vector vKey; + //bool contained = cfilter.contains(vKey); + bool contained = cfilter.contains(hash); NanReturnValue(NanNew(contained)); } @@ -2642,13 +2664,15 @@ NAN_METHOD(BloomSize) { // if (SHUTTING_DOWN()) NanReturnValue(Undefined()); - if (args.Length() > 0) { + if (args.Length() < 1) { return NanThrowError( - "Usage: bitcoindjs.bloomSize()"); + "Usage: bitcoindjs.bloomSize(filter)"); } + Local filter = Local::Cast(args[0]); + CBloomFilter cfilter; - String::AsciiValue hex_string_(jstx->Get(NanNew("hex"))->ToString()); + String::AsciiValue hex_string_(filter->Get(NanNew("hex"))->ToString()); std::string hex_string = *hex_string_; CDataStream ssData(ParseHex(hex_string), SER_NETWORK, PROTOCOL_VERSION); @@ -2662,8 +2686,7 @@ NAN_METHOD(BloomSize) { bool size_ok = cfilter.IsWithinSizeConstraints(); NanReturnValue(NanNew(size_ok)); } - - +#endif /** * GetLastFileIndex()