forked from bitcoin/bitcoin
-
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathbloom_tests.cpp
526 lines (411 loc) · 76.5 KB
/
bloom_tests.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
// Copyright (c) 2012-2019 The Bitcoin Core developers
// Copyright (c) 2017-2020 The LitecoinZ Core developers
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
#include <bloom.h>
#include <clientversion.h>
#include <key.h>
#include <key_io.h>
#include <merkleblock.h>
#include <primitives/block.h>
#include <random.h>
#include <serialize.h>
#include <streams.h>
#include <uint256.h>
#include <util/system.h>
#include <util/strencodings.h>
#include <test/setup_common.h>
#include <vector>
#include <boost/test/unit_test.hpp>
BOOST_FIXTURE_TEST_SUITE(bloom_tests, BasicTestingSetup)
BOOST_AUTO_TEST_CASE(bloom_create_insert_serialize)
{
CBloomFilter filter(3, 0.01, 0, BLOOM_UPDATE_ALL);
filter.insert(ParseHex("99108ad8ed9bb6274d3980bab5a85c048f0950c8"));
BOOST_CHECK_MESSAGE( filter.contains(ParseHex("99108ad8ed9bb6274d3980bab5a85c048f0950c8")), "Bloom filter doesn't contain just-inserted object!");
// One bit different in first byte
BOOST_CHECK_MESSAGE(!filter.contains(ParseHex("19108ad8ed9bb6274d3980bab5a85c048f0950c8")), "Bloom filter contains something it shouldn't!");
filter.insert(ParseHex("b5a2c786d9ef4658287ced5914b37a1b4aa32eee"));
BOOST_CHECK_MESSAGE(filter.contains(ParseHex("b5a2c786d9ef4658287ced5914b37a1b4aa32eee")), "Bloom filter doesn't contain just-inserted object (2)!");
filter.insert(ParseHex("b9300670b4c5366e95b2699e8b18bc75e5f729c5"));
BOOST_CHECK_MESSAGE(filter.contains(ParseHex("b9300670b4c5366e95b2699e8b18bc75e5f729c5")), "Bloom filter doesn't contain just-inserted object (3)!");
CDataStream stream(SER_NETWORK, PROTOCOL_VERSION);
stream << filter;
std::vector<unsigned char> vch = ParseHex("03614e9b050000000000000001");
std::vector<char> expected(vch.size());
for (unsigned int i = 0; i < vch.size(); i++)
expected[i] = (char)vch[i];
BOOST_CHECK_EQUAL_COLLECTIONS(stream.begin(), stream.end(), expected.begin(), expected.end());
BOOST_CHECK_MESSAGE( filter.contains(ParseHex("99108ad8ed9bb6274d3980bab5a85c048f0950c8")), "Bloom filter doesn't contain just-inserted object!");
filter.clear();
BOOST_CHECK_MESSAGE( !filter.contains(ParseHex("99108ad8ed9bb6274d3980bab5a85c048f0950c8")), "Bloom filter should be empty!");
}
BOOST_AUTO_TEST_CASE(bloom_create_insert_serialize_with_tweak)
{
// Same test as bloom_create_insert_serialize, but we add a nTweak of 100
CBloomFilter filter(3, 0.01, 2147483649UL, BLOOM_UPDATE_ALL);
filter.insert(ParseHex("99108ad8ed9bb6274d3980bab5a85c048f0950c8"));
BOOST_CHECK_MESSAGE( filter.contains(ParseHex("99108ad8ed9bb6274d3980bab5a85c048f0950c8")), "Bloom filter doesn't contain just-inserted object!");
// One bit different in first byte
BOOST_CHECK_MESSAGE(!filter.contains(ParseHex("19108ad8ed9bb6274d3980bab5a85c048f0950c8")), "Bloom filter contains something it shouldn't!");
filter.insert(ParseHex("b5a2c786d9ef4658287ced5914b37a1b4aa32eee"));
BOOST_CHECK_MESSAGE(filter.contains(ParseHex("b5a2c786d9ef4658287ced5914b37a1b4aa32eee")), "Bloom filter doesn't contain just-inserted object (2)!");
filter.insert(ParseHex("b9300670b4c5366e95b2699e8b18bc75e5f729c5"));
BOOST_CHECK_MESSAGE(filter.contains(ParseHex("b9300670b4c5366e95b2699e8b18bc75e5f729c5")), "Bloom filter doesn't contain just-inserted object (3)!");
CDataStream stream(SER_NETWORK, PROTOCOL_VERSION);
stream << filter;
std::vector<unsigned char> vch = ParseHex("03ce4299050000000100008001");
std::vector<char> expected(vch.size());
for (unsigned int i = 0; i < vch.size(); i++)
expected[i] = (char)vch[i];
BOOST_CHECK_EQUAL_COLLECTIONS(stream.begin(), stream.end(), expected.begin(), expected.end());
}
BOOST_AUTO_TEST_CASE(bloom_create_insert_key)
{
std::string strSecret = std::string("5Kg1gnAjaLfKiwhhPpGS3QfRg2m6awQvaj98JCZBZQ5SuS2F15C");
CKey key = DecodeSecret(strSecret);
CPubKey pubkey = key.GetPubKey();
std::vector<unsigned char> vchPubKey(pubkey.begin(), pubkey.end());
CBloomFilter filter(2, 0.001, 0, BLOOM_UPDATE_ALL);
filter.insert(vchPubKey);
uint160 hash = pubkey.GetID();
filter.insert(std::vector<unsigned char>(hash.begin(), hash.end()));
CDataStream stream(SER_NETWORK, PROTOCOL_VERSION);
stream << filter;
std::vector<unsigned char> vch = ParseHex("038fc16b080000000000000001");
std::vector<char> expected(vch.size());
for (unsigned int i = 0; i < vch.size(); i++)
expected[i] = (char)vch[i];
BOOST_CHECK_EQUAL_COLLECTIONS(stream.begin(), stream.end(), expected.begin(), expected.end());
}
BOOST_AUTO_TEST_CASE(bloom_match)
{
// Random real transaction (b4749f017444b051c44dfd2720e88f314ff94f3dd6d56d40ef65854fcd7fff6b)
CDataStream stream(ParseHex("01000000010b26e9b7735eb6aabdf358bab62f9816a21ba9ebdb719d5299e88607d722c190000000008b4830450220070aca44506c5cef3a16ed519d7c3c39f8aab192c4e1c90d065f37b8a4af6141022100a8e160b856c2d43d27d8fba71e5aef6405b8643ac4cb7cb3c462aced7f14711a0141046d11fee51b0e60666d5049a9101a72741df480b96ee26488a4d3466b95c9a40ac5eeef87e10a5cd336c19a84565f80fa6c547957b7700ff4dfbdefe76036c339ffffffff021bff3d11000000001976a91404943fdd508053c75000106d3bc6e2754dbcff1988ac2f15de00000000001976a914a266436d2965547608b9e15d9032a7b9d64fa43188ac00000000"), SER_DISK, CLIENT_VERSION);
CTransaction tx(deserialize, stream);
// and one which spends it (e2769b09e784f32f62ef849763d4f45b98e07ba658647343b915ff832b110436)
unsigned char ch[] = {0x01, 0x00, 0x00, 0x00, 0x01, 0x6b, 0xff, 0x7f, 0xcd, 0x4f, 0x85, 0x65, 0xef, 0x40, 0x6d, 0xd5, 0xd6, 0x3d, 0x4f, 0xf9, 0x4f, 0x31, 0x8f, 0xe8, 0x20, 0x27, 0xfd, 0x4d, 0xc4, 0x51, 0xb0, 0x44, 0x74, 0x01, 0x9f, 0x74, 0xb4, 0x00, 0x00, 0x00, 0x00, 0x8c, 0x49, 0x30, 0x46, 0x02, 0x21, 0x00, 0xda, 0x0d, 0xc6, 0xae, 0xce, 0xfe, 0x1e, 0x06, 0xef, 0xdf, 0x05, 0x77, 0x37, 0x57, 0xde, 0xb1, 0x68, 0x82, 0x09, 0x30, 0xe3, 0xb0, 0xd0, 0x3f, 0x46, 0xf5, 0xfc, 0xf1, 0x50, 0xbf, 0x99, 0x0c, 0x02, 0x21, 0x00, 0xd2, 0x5b, 0x5c, 0x87, 0x04, 0x00, 0x76, 0xe4, 0xf2, 0x53, 0xf8, 0x26, 0x2e, 0x76, 0x3e, 0x2d, 0xd5, 0x1e, 0x7f, 0xf0, 0xbe, 0x15, 0x77, 0x27, 0xc4, 0xbc, 0x42, 0x80, 0x7f, 0x17, 0xbd, 0x39, 0x01, 0x41, 0x04, 0xe6, 0xc2, 0x6e, 0xf6, 0x7d, 0xc6, 0x10, 0xd2, 0xcd, 0x19, 0x24, 0x84, 0x78, 0x9a, 0x6c, 0xf9, 0xae, 0xa9, 0x93, 0x0b, 0x94, 0x4b, 0x7e, 0x2d, 0xb5, 0x34, 0x2b, 0x9d, 0x9e, 0x5b, 0x9f, 0xf7, 0x9a, 0xff, 0x9a, 0x2e, 0xe1, 0x97, 0x8d, 0xd7, 0xfd, 0x01, 0xdf, 0xc5, 0x22, 0xee, 0x02, 0x28, 0x3d, 0x3b, 0x06, 0xa9, 0xd0, 0x3a, 0xcf, 0x80, 0x96, 0x96, 0x8d, 0x7d, 0xbb, 0x0f, 0x91, 0x78, 0xff, 0xff, 0xff, 0xff, 0x02, 0x8b, 0xa7, 0x94, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x19, 0x76, 0xa9, 0x14, 0xba, 0xde, 0xec, 0xfd, 0xef, 0x05, 0x07, 0x24, 0x7f, 0xc8, 0xf7, 0x42, 0x41, 0xd7, 0x3b, 0xc0, 0x39, 0x97, 0x2d, 0x7b, 0x88, 0xac, 0x40, 0x94, 0xa8, 0x02, 0x00, 0x00, 0x00, 0x00, 0x19, 0x76, 0xa9, 0x14, 0xc1, 0x09, 0x32, 0x48, 0x3f, 0xec, 0x93, 0xed, 0x51, 0xf5, 0xfe, 0x95, 0xe7, 0x25, 0x59, 0xf2, 0xcc, 0x70, 0x43, 0xf9, 0x88, 0xac, 0x00, 0x00, 0x00, 0x00, 0x00};
std::vector<unsigned char> vch(ch, ch + sizeof(ch) -1);
CDataStream spendStream(vch, SER_DISK, CLIENT_VERSION);
CTransaction spendingTx(deserialize, spendStream);
CBloomFilter filter(10, 0.000001, 0, BLOOM_UPDATE_ALL);
filter.insert(uint256S("0xb4749f017444b051c44dfd2720e88f314ff94f3dd6d56d40ef65854fcd7fff6b"));
BOOST_CHECK_MESSAGE(filter.IsRelevantAndUpdate(tx), "Simple Bloom filter didn't match tx hash");
filter = CBloomFilter(10, 0.000001, 0, BLOOM_UPDATE_ALL);
// byte-reversed tx hash
filter.insert(ParseHex("6bff7fcd4f8565ef406dd5d63d4ff94f318fe82027fd4dc451b04474019f74b4"));
BOOST_CHECK_MESSAGE(filter.IsRelevantAndUpdate(tx), "Simple Bloom filter didn't match manually serialized tx hash");
filter = CBloomFilter(10, 0.000001, 0, BLOOM_UPDATE_ALL);
filter.insert(ParseHex("30450220070aca44506c5cef3a16ed519d7c3c39f8aab192c4e1c90d065f37b8a4af6141022100a8e160b856c2d43d27d8fba71e5aef6405b8643ac4cb7cb3c462aced7f14711a01"));
BOOST_CHECK_MESSAGE(filter.IsRelevantAndUpdate(tx), "Simple Bloom filter didn't match input signature");
filter = CBloomFilter(10, 0.000001, 0, BLOOM_UPDATE_ALL);
filter.insert(ParseHex("046d11fee51b0e60666d5049a9101a72741df480b96ee26488a4d3466b95c9a40ac5eeef87e10a5cd336c19a84565f80fa6c547957b7700ff4dfbdefe76036c339"));
BOOST_CHECK_MESSAGE(filter.IsRelevantAndUpdate(tx), "Simple Bloom filter didn't match input pub key");
filter = CBloomFilter(10, 0.000001, 0, BLOOM_UPDATE_ALL);
filter.insert(ParseHex("04943fdd508053c75000106d3bc6e2754dbcff19"));
BOOST_CHECK_MESSAGE(filter.IsRelevantAndUpdate(tx), "Simple Bloom filter didn't match output address");
BOOST_CHECK_MESSAGE(filter.IsRelevantAndUpdate(spendingTx), "Simple Bloom filter didn't add output");
filter = CBloomFilter(10, 0.000001, 0, BLOOM_UPDATE_ALL);
filter.insert(ParseHex("a266436d2965547608b9e15d9032a7b9d64fa431"));
BOOST_CHECK_MESSAGE(filter.IsRelevantAndUpdate(tx), "Simple Bloom filter didn't match output address");
filter = CBloomFilter(10, 0.000001, 0, BLOOM_UPDATE_ALL);
filter.insert(COutPoint(uint256S("0x90c122d70786e899529d71dbeba91ba216982fb6ba58f3bdaab65e73b7e9260b"), 0));
BOOST_CHECK_MESSAGE(filter.IsRelevantAndUpdate(tx), "Simple Bloom filter didn't match COutPoint");
filter = CBloomFilter(10, 0.000001, 0, BLOOM_UPDATE_ALL);
COutPoint prevOutPoint(uint256S("0x90c122d70786e899529d71dbeba91ba216982fb6ba58f3bdaab65e73b7e9260b"), 0);
{
std::vector<unsigned char> data(32 + sizeof(unsigned int));
memcpy(data.data(), prevOutPoint.hash.begin(), 32);
memcpy(data.data()+32, &prevOutPoint.n, sizeof(unsigned int));
filter.insert(data);
}
BOOST_CHECK_MESSAGE(filter.IsRelevantAndUpdate(tx), "Simple Bloom filter didn't match manually serialized COutPoint");
filter = CBloomFilter(10, 0.000001, 0, BLOOM_UPDATE_ALL);
filter.insert(uint256S("00000009e784f32f62ef849763d4f45b98e07ba658647343b915ff832b110436"));
BOOST_CHECK_MESSAGE(!filter.IsRelevantAndUpdate(tx), "Simple Bloom filter matched random tx hash");
filter = CBloomFilter(10, 0.000001, 0, BLOOM_UPDATE_ALL);
filter.insert(ParseHex("0000006d2965547608b9e15d9032a7b9d64fa431"));
BOOST_CHECK_MESSAGE(!filter.IsRelevantAndUpdate(tx), "Simple Bloom filter matched random address");
filter = CBloomFilter(10, 0.000001, 0, BLOOM_UPDATE_ALL);
filter.insert(COutPoint(uint256S("0x90c122d70786e899529d71dbeba91ba216982fb6ba58f3bdaab65e73b7e9260b"), 1));
BOOST_CHECK_MESSAGE(!filter.IsRelevantAndUpdate(tx), "Simple Bloom filter matched COutPoint for an output we didn't care about");
filter = CBloomFilter(10, 0.000001, 0, BLOOM_UPDATE_ALL);
filter.insert(COutPoint(uint256S("0x000000d70786e899529d71dbeba91ba216982fb6ba58f3bdaab65e73b7e9260b"), 0));
BOOST_CHECK_MESSAGE(!filter.IsRelevantAndUpdate(tx), "Simple Bloom filter matched COutPoint for an output we didn't care about");
}
BOOST_AUTO_TEST_CASE(merkle_block_1)
{
CBlock block = getBlock13b8a();
CBloomFilter filter(10, 0.000001, 0, BLOOM_UPDATE_ALL);
// Match the last transaction
filter.insert(uint256S("0xbb29c4c583f34cfb7aa8acbd1b350a6fe6fb753c1cbf3293d2d16bea2d49a525"));
CMerkleBlock merkleBlock(block, filter);
BOOST_CHECK_EQUAL(merkleBlock.header.GetHash().GetHex(), block.GetHash().GetHex());
BOOST_CHECK_EQUAL(merkleBlock.vMatchedTxn.size(), 1U);
std::pair<unsigned int, uint256> pair = merkleBlock.vMatchedTxn[0];
BOOST_CHECK(merkleBlock.vMatchedTxn[0].second == uint256S("0xbb29c4c583f34cfb7aa8acbd1b350a6fe6fb753c1cbf3293d2d16bea2d49a525"));
BOOST_CHECK(merkleBlock.vMatchedTxn[0].first == 1);
std::vector<uint256> vMatched;
std::vector<unsigned int> vIndex;
BOOST_CHECK(merkleBlock.txn.ExtractMatches(vMatched, vIndex) == block.hashMerkleRoot);
BOOST_CHECK(vMatched.size() == merkleBlock.vMatchedTxn.size());
for (unsigned int i = 0; i < vMatched.size(); i++)
BOOST_CHECK(vMatched[i] == merkleBlock.vMatchedTxn[i].second);
// Also match the 1st transaction
filter.insert(uint256S("0xcf042805bd51092595a82dbc79045d602e15ddc633e63093cb7546fdd186e751"));
merkleBlock = CMerkleBlock(block, filter);
BOOST_CHECK(merkleBlock.header.GetHash() == block.GetHash());
BOOST_CHECK(merkleBlock.vMatchedTxn.size() == 2);
BOOST_CHECK(merkleBlock.vMatchedTxn[1] == pair);
BOOST_CHECK(merkleBlock.vMatchedTxn[0].second == uint256S("0xcf042805bd51092595a82dbc79045d602e15ddc633e63093cb7546fdd186e751"));
BOOST_CHECK(merkleBlock.vMatchedTxn[0].first == 0);
BOOST_CHECK(merkleBlock.txn.ExtractMatches(vMatched, vIndex) == block.hashMerkleRoot);
BOOST_CHECK(vMatched.size() == merkleBlock.vMatchedTxn.size());
for (unsigned int i = 0; i < vMatched.size(); i++)
BOOST_CHECK(vMatched[i] == merkleBlock.vMatchedTxn[i].second);
}
BOOST_AUTO_TEST_CASE(merkle_block_2)
{
// Random real block (0000005817bbfac27f4887fc711b6dfa707e6433a464fe722770e37c80f9daca)
// With 3 txes
CBlock block;
CDataStream stream(ParseHex("04000000c870abc154df6727adc5ab1a1958927c336475953d7d6882f75f3f8a50000000cab66b074d885c2adf8042412bb6855a34b482d7823f27f6fe6c1c3fdd0be6f00000000000000000000000000000000000000000000000000000000000000000954f5f5a5113671d7800004f575a8ad89116b49c14144f981524654e000000000000000000000000fd40050000e3e5e6d593534ac0545c8c41611537221ee30019d5aa21811784b1ca2256f49aeca1dfc40abee3710ba0acce0b290fb5845ff3495fd6770dd003782af426c0e43d10207aa38b51241030d4cb4166f52f97a704e32be5378d58a6edb1713bb916f2e96d14b1ea822c7439efc8d0255cfcee499754679ba2a4eebfde5f0a6c35cce3cd7ed7e88e832c7d6cedc25e84b679a11b85ba3ec5a3bc655f87e2bdda28cf3d39b4ff12f900bc7bc759c8db62f2f003feeb2991051d217048cf1526a7ad3e21eb41cb9e5437b9dd335e5e205a38a0090804158f964addf3c2e4a9d7b356ca12efb34a2a1076f0f90b5dfa6f3fa7c7eb774ee45f0a6a58a5c408da20f4422c7311d686d37ffe321e6a206459aea33ac6adcfc559233d3ab576dbdfda562dbf6dbdee670e504e80c351925d6e0162296fc98a9e069f3ddafd5293ed823ad537d5e003b582e02fb079765a4f14250812c237b3a00fc1aee144832ff1fbea34b19e5f5d17247d89d5f4d587d56fe1836615285d6019ef490116a51afe05362043c763d3b39a5d5071cba755a5f61a56535a491cc316f5ff74526951f299f45b722e270ab5d0f0b26cd8238f8af7bda64396e5f37af1038a2199af77e0194b251486621f444d06a9774336c2c80ed70678e78b8924e801067766ca797dc910b0f7ab16c0fbdc3b6bdf27ad89553e39e1f36787295fcda7098f1cf743987083cbe641f4646c02c6684ef686985bb14de1172e5fa1eb1c888d585c51af7a4ebc0c281e880d1d504bb2f6e3a2d348947462b905a229460d2f0086fe3532eed3ce7bd420a3dce569e8f5be62581a8bdae698a6638de09b12ac8016e0b15f3858f4bf37be7b259c91dacff3e35536732ba50a07c6951f6926c5c6e4bed969cbc422186695e3f1f63f93564cd12b93669146f0e5f9d08ea439d77ed6715d303c7c6801b559a242d74ddbe3eab27dab776438db98d49574370d1e1e0b12625317d5e74eb8f6a23293e8f9769709d103b416c66827f29e814238a95369075d4e5aa32977e44f6c110d45fbd66457c6c83f19c8d00fe3da033b915f651dbdb6f49e898a4b5fa4da90d8fc2be20d67d453e78c01a945d4d3de87aae75680f3794feb05e9cef7175944a9a11211853754f1c9f69a51d38515aecb95225a794cd500f461a354f8c9b3c5bec947026a6dfc6817c6293e890368e0e5291e1b5db5d21121cb0fdd48a4b9d1604743e128e5a8fdc8713b4b730c8d9cb72f8bfb25540022c5e861ca1313cc58be36304dbb7a5e124359cd0ae4188976ce2941bb74f3d40681f5cf1c187199853850fd4cd4fa3dd071926f5913bc5f1cf80b619082ab4324414a3d45c409f70f910ae638608464eb0b8421413205ff39f13e4ebaa5221802d1369d5e93b4f882c288c57853f92940cc395a01e22d924feab25bb01ce1cd3b1d77c4c87007077b1d43299fead8648f2a8aa47e8e291022dd54db38a906900247fe04bdd8496ab4fbccd81ee98f2f178dea1c6e4ff9bdea1497f8f468ee4dd86ad686575a6d1802967840d35a2dd375beb04fd2b6ada03cfc13dd0a0d2ea66da18631fdd4fb579c7bdb4945f0dcd163fa10eb741b1f07ab817d2c46e3d83e8f732e3efea70228a6b6c4c36014834956486ed662d8621f51dc2db904e1325ff8c6908ca69aa14e5fe7fff2b72c7bbd8307168497674575f073a7f35804a2fe410b76301ea219304b574eec3e67ab27e2a60ba920a0c8b4ab0bc63c48e5af2eee5bb7845268a4d0fc0792562f77e6710a4ad39d23a646dfe3fd76fc927ca18a50fe5329d713e2b4ccbbd12c77e90cc3e224aba12555c1f85dca227d7bdc71ede85bdf9c1263b42a96e2c6561d2d5a5bef8b23d69ee9f709564ccc796ac6079afc7f85900301000000010000000000000000000000000000000000000000000000000000000000000000ffffffff31027017005a2d4e4f4d50212068747470733a2f2f6769746875622e636f6d2f6a6f7368756179616275742f7a2d6e6f6d70ffffffff0216696d29010000001976a91457bc5e7e48328d84194f57667425ae26357bfb3a88ac80969800000000001976a914cc9fee1128f4cfe550cf6a30e76fe9fc7804a0ba88ac00000000010000000322f25ac543879bec4af292d454e8745ea21ebfca809310b65ecd9e02425584e6000000006a4730440220356dc942205d79bd4cf973d088bc039b370398b9aff83d0eb030e0050c36521f02206591dc9df35af29b7590f45ac9ade93023ad5ec440b71ed6c2b6c278f22086c90121021e75588e72a450e155ee7847afd136759a24680562e57dc208c4bf1793d73d7ffeffffffe93b4560e86b8e32cc6046f62d21f5f0f947f7aa66f6922d75502b610c2b1bb5080000006b483045022100a5628be89c7e36af5ee8e1f1cb107a38c9097c9520c65b94a0a1354adc7505840220502a04e02a5efd96866abe0ee7f7f7cedd24db40f8550ee51a5f2d03b8765511012102b4d402c0af6174ab065a486a80ea1789d7c5efbf298da41716765feff8a44bb1feffffffcc9805817e2fc8a65c3602310ac6bc901b63245f0075bb9c106c31f427bf6c96140000006a47304402202f0a16076989da98faf0b3cc0ac1e0e36df934f1c935d60a6f272efc96626dcf0220751ee9d43dc20c089f0d5d294be8b7012b439630b47e7d25e966d53779a85738012102c95714769090b78aead3ab3b3e47ca03ec22c01c0e11f1220637994ca87fd80bfeffffff1e74d09605000000001976a914a8c164358208c869ea4021e85a007d853366227188ac59a77a05000000001976a914261592f28c2b580017b2d32179bb43481b42837988acc3666f06000000001976a914642353deaff4e6cd13d8b0a59c203fd90f119cc088aca515082e000000001976a91445aed15b5868e3111565fbbde6b15cf230b4f14f88acf982f54b000000001976a914d4482e10230f301d2b4e8520b7731a0491b4ae4388ace244ca71010000001976a91482f8ca0c42ae43c55f04e158f375cf89d4d42a6e88acb7572fa2000000001976a914504db139ff2cf1dedc733f654c6c75ecc794cb6188acb48e9e7d010000001976a914c919839c9bd3e61a7bc2e23c79a3b848b219dd7288accc10a275000000001976a9140dfcba5a588f4468cc774cb319a48e57abe71cff88acaaabe309000000001976a914417d3abf7f74014ed35135f589e982430affb5ec88ac68df7674000000001976a91462dd778f35a41873885864ea35cc03d3a88309eb88ac6bbf2c10000000001976a9149ebb2b219d0f217f5ac49ddd86b5bfdedb264bc588ac43466b0b000000001976a9141a22cf4371d33ec4100749dc45199e30fb9e6f5288ac3163e87c000000001976a914da96f3d2d3c92f59f97f6927eb77070f0fcac47988ac4ca93a03000000001976a914b9e516ad2b01fd6bdc272c77e19f2f33a4e187eb88ac8801fe07000000001976a914e0b0f6b9f742d008ab38e4e4439800da46f660fb88ac1435863e000000001976a9148bf6928de7024d82ead56890e5470f8851ffaaf388ac6ce47c13000000001976a91442b5a8c8477daf5c8cc6ce5ee5c6a110b5ba52c288ac807e7510000000001976a914c8cb5f5e3993bac959721afe54fa122c7e9524f388acbfe65c1f000000001976a91486eba783cd90484614a6dcb7c00a0299ddc0687388ac376aee34000000001976a9141c1905fd4cb295adcf6d4ee97a90904acac6552c88ac7120ee09000000001976a914d77212e54c182608b2e3e33e03a9687b96c20b1088ac1eacb118000000001976a9142e83ac6bfd786484ce938594f726fe06b23e0f4088acc827ff05000000001976a9144bad3912eba43489376d45779f92b7b6ff2c2efe88ac1687ca11000000001976a91454058d2ae49b5b14eda41b2e1ca3cdcf80c9e54f88ac6581f303000000001976a914ef1f6f1d54f2be2bb05827b9a14a678f89e2f9db88ac4ab51200000000001976a914c307886e6864598da62fb3bc373c7839a069ef9188ac37ed8b26000000001976a9140009c3a082578e8d135cf763903590a711d8912488ac04dff410000000001976a9140ba325d08efe82f3d6b02dca8bbc5e49a025b0f888ac21902317000000001976a9145f26183c785124c81cc47e50dc26be9266d8661188ac6517000001000000020977c57bff9f84b72084e1754c6ea7d60504d794634c28d01c189bf6f0f138a9000000006b483045022100c74514a11a13c41c007bc5db5e68d261af4d91504c9fae2312b02534f0ae5af302202568b947925d93f814f82ffe893c7f10358b8bf436cc00d4a7e67a76d5e844e00121032a5c7a47b81d9f924afcca8c59111f8ea17ff91f7303f06845a8415df0ba66cdfeffffffd7d5e3d0831ee35ddd025d0f43f7982a39379ec1799197b1e79a7eb11c599218070000006a47304402205104f40d4ed17f95f4887584921f4b9ae82018ba62e649617294e7d0e3aa02f50220313a7cd2d5a9fd1b1eb4032df73bec3bf4439917a918481a4c5d396a1994e28d01210366c43bcb72f9f9f8ff7a480f85750c80b981aae2c94b6c49a1676cda859184b9feffffff3267044b06000000001976a914fa92f42c61b5deaf1ed5c7c153d00fe78b16f69088ac03e4b700000000001976a9145c630477dda5f7d02293bf3363d6dd0f6064d9f588ac2a6d4504000000001976a9146a2a5ceccb047f67df4804b265243998798ef15188ac062fea09000000001976a914e1257636645fd023403970fadc9aae95171cb37088accccbce05000000001976a9141c5f6197dc06262c8a0ae55503d04a35c16174a388ace2d6b607000000001976a9149a8290608ffcbb9412f36c9e49103c94f4d0485088ac9590a006000000001976a91431985f6a89a872ac0e0282a5f4f0508d45aee1ad88ac7aabda00000000001976a914fe581bcc5d2230cb82405052b1fec4064616aa7c88acd0b56f01000000001976a914ceb8712840da5222efdef888144fde7f5cf9173888acf8aa7102000000001976a91407940b12b9f5e5a6122364b3c237c8a7409a655688ac50744a01000000001976a914ad6f5e4db525bc4ed38ab6efd32f913d1bd3825288ac8140ff00000000001976a914e6c05a94351ad9d8eb582a7951ac740026ada90488ac90720f1c000000001976a914eeeb579cf590e177e2ffbd1e7fc9c05dc130767a88acf99cce00000000001976a914d309ca78a520d48daaa3d94bb7114db24ad2249188accc798b0a000000001976a9145b909b9105f86a675857d614df3577914f1cf6ed88acdceb8601000000001976a91420864de6072be6104cc4facdd26cc9d9a3ecf58888acca63ee01000000001976a91420399423d01aa56bce8f90c366681ceff3232c3188ac1fa1820f000000001976a9147d9b3b5e33b791ba30400f38eb1b6f2f0a3a656b88ac11bc9900000000001976a91490f153192f3215f5847c32d53421638340e5475388ac87eb5303000000001976a9143f1aee3de18fea3a42bacb8caff1dd250cc0598a88acc2316a29010000001976a914e5a85ea568066d68dfc15f22f25ea8fa2de1228a88ac1be85a04000000001976a914ad74ff2e0f0b255c35a79af7df9513c0baf95ea288ac672bad10000000001976a9146478eee30b67d8b0e543c0f174fb14e2d7f3e85c88ac2973b51c000000001976a914aa49296b731dc10d3a675a2a061b71c54c6cecdb88ac6aaf240d000000001976a914be5f3c038eb9fecb2da32541efb3a9da0af7e7dc88ac7811e819000000001976a9142ed5102e5c9f0b976894b3abd48f9bbb62f1677988acb400de07000000001976a914c3c31102b03b4fa7a8080d0efa3f72717c9a5f4188ac1be0380f000000001976a914b443961a9d4d54f14bde254bf5746db1d0cbd3dd88ac5c99d729000000001976a914e36fcc972f6fb6f98cde7655ffdeab38a3d4516188ac9c038506000000001976a9143cd7794529d4361ed1f8c3aff746d356e808016488ac32d5aa0b000000001976a9141c1905fd4cb295adcf6d4ee97a90904acac6552c88ac4cd24012000000001976a9147a83bdf320a82fec1194cc46fd20c8c20891872e88ac8f7ee209000000001976a914e8752ee36b50a68a5666acc9b61452cf8157700b88ac98b20b06000000001976a9144c86615a2a602ded6d46afc9ad7e7e4f10a272b688ac23e1a202000000001976a9142e83ac6bfd786484ce938594f726fe06b23e0f4088ac50c33603000000001976a9145b2479c67e009acf1f662d5bfe9b380711b7eb1988acfef67212000000001976a9146504ad2fbef7f68db4b3c387aa6f24751b914b4288ac38233009000000001976a9140ba325d08efe82f3d6b02dca8bbc5e49a025b0f888ac2c4adc0a000000001976a914ed6169132ca28ccfd8e09bde09e1a4e839c50e0988ac1db93f07000000001976a914e260b287b6321f44c309db79e61009cc233682e088ac2c62300c000000001976a91466354bf4d5001b4019fa5f58791eb1bb778ecbec88ac98c0960a000000001976a914244b72b73d7acea0bed9ccc72f9d0c09749ff5d188ac16c35db2000000001976a914d58781f2068f9a7bf7b0b1f81735b51f4ae9f7b188ac7def6a1c000000001976a91496d8ce3ad2fbf4621776023779ca5f085f9da49288acd56dc80a000000001976a91486eba783cd90484614a6dcb7c00a0299ddc0687388ace74b300e000000001976a91476285707f7909c4bd9a890af85eba71f69e5900e88acbb7d2612000000001976a9144ea1a85472e7727f35b6f58dd8066bc4f1266bb288ac85970f0f000000001976a9149340ffc60b8f4ebf528a55c9173c8295d948170488ac993d650e000000001976a91424b4dc903abe7cb06f9c48b44316fac13ebd6aaf88ac242e960f000000001976a9147ee99d2d2208c8d67c2ad95f20bad5e91a9c759388ac64170000"), SER_NETWORK, PROTOCOL_VERSION);
stream >> block;
CBloomFilter filter(10, 0.000001, 0, BLOOM_UPDATE_ALL);
// Match the first transaction
filter.insert(uint256S("0x3dd14005e33207042f3ecb9ac198bf137297ae4dbec84c515bbc6f73d09af774"));
CMerkleBlock merkleBlock(block, filter);
BOOST_CHECK(merkleBlock.header.GetHash() == block.GetHash());
BOOST_CHECK(merkleBlock.vMatchedTxn.size() == 1);
std::pair<unsigned int, uint256> pair = merkleBlock.vMatchedTxn[0];
BOOST_CHECK(merkleBlock.vMatchedTxn[0].second == uint256S("0x3dd14005e33207042f3ecb9ac198bf137297ae4dbec84c515bbc6f73d09af774"));
BOOST_CHECK(merkleBlock.vMatchedTxn[0].first == 0);
std::vector<uint256> vMatched;
std::vector<unsigned int> vIndex;
BOOST_CHECK(merkleBlock.txn.ExtractMatches(vMatched, vIndex) == block.hashMerkleRoot);
BOOST_CHECK(vMatched.size() == merkleBlock.vMatchedTxn.size());
for (unsigned int i = 0; i < vMatched.size(); i++)
BOOST_CHECK(vMatched[i] == merkleBlock.vMatchedTxn[i].second);
// Match an output from the second transaction (the pubkey for address L1BDVRhZHkwpNcyxwt33NFYZPE3M5LCzcjb)
// This should match the third transaction because it spends the output matched
// It also matches the fourth transaction, which spends to the pubkey again
filter.insert(ParseHex("261592f28c2b580017b2d32179bb43481b428379"));
merkleBlock = CMerkleBlock(block, filter);
BOOST_CHECK(merkleBlock.header.GetHash() == block.GetHash());
BOOST_CHECK(merkleBlock.vMatchedTxn.size() == 2);
BOOST_CHECK(pair == merkleBlock.vMatchedTxn[0]);
BOOST_CHECK(merkleBlock.vMatchedTxn[1].second == uint256S("0xde8ace7950d2204eb216481e21b2bf5aeb53633a1fc384140267b8246c1b12bf"));
BOOST_CHECK(merkleBlock.vMatchedTxn[1].first == 1);
BOOST_CHECK(merkleBlock.txn.ExtractMatches(vMatched, vIndex) == block.hashMerkleRoot);
BOOST_CHECK(vMatched.size() == merkleBlock.vMatchedTxn.size());
for (unsigned int i = 0; i < vMatched.size(); i++)
BOOST_CHECK(vMatched[i] == merkleBlock.vMatchedTxn[i].second);
}
BOOST_AUTO_TEST_CASE(merkle_block_2_with_update_none)
{
// Random real block (0000005817bbfac27f4887fc711b6dfa707e6433a464fe722770e37c80f9daca)
// With 3 txes
CBlock block;
CDataStream stream(ParseHex("04000000c870abc154df6727adc5ab1a1958927c336475953d7d6882f75f3f8a50000000cab66b074d885c2adf8042412bb6855a34b482d7823f27f6fe6c1c3fdd0be6f00000000000000000000000000000000000000000000000000000000000000000954f5f5a5113671d7800004f575a8ad89116b49c14144f981524654e000000000000000000000000fd40050000e3e5e6d593534ac0545c8c41611537221ee30019d5aa21811784b1ca2256f49aeca1dfc40abee3710ba0acce0b290fb5845ff3495fd6770dd003782af426c0e43d10207aa38b51241030d4cb4166f52f97a704e32be5378d58a6edb1713bb916f2e96d14b1ea822c7439efc8d0255cfcee499754679ba2a4eebfde5f0a6c35cce3cd7ed7e88e832c7d6cedc25e84b679a11b85ba3ec5a3bc655f87e2bdda28cf3d39b4ff12f900bc7bc759c8db62f2f003feeb2991051d217048cf1526a7ad3e21eb41cb9e5437b9dd335e5e205a38a0090804158f964addf3c2e4a9d7b356ca12efb34a2a1076f0f90b5dfa6f3fa7c7eb774ee45f0a6a58a5c408da20f4422c7311d686d37ffe321e6a206459aea33ac6adcfc559233d3ab576dbdfda562dbf6dbdee670e504e80c351925d6e0162296fc98a9e069f3ddafd5293ed823ad537d5e003b582e02fb079765a4f14250812c237b3a00fc1aee144832ff1fbea34b19e5f5d17247d89d5f4d587d56fe1836615285d6019ef490116a51afe05362043c763d3b39a5d5071cba755a5f61a56535a491cc316f5ff74526951f299f45b722e270ab5d0f0b26cd8238f8af7bda64396e5f37af1038a2199af77e0194b251486621f444d06a9774336c2c80ed70678e78b8924e801067766ca797dc910b0f7ab16c0fbdc3b6bdf27ad89553e39e1f36787295fcda7098f1cf743987083cbe641f4646c02c6684ef686985bb14de1172e5fa1eb1c888d585c51af7a4ebc0c281e880d1d504bb2f6e3a2d348947462b905a229460d2f0086fe3532eed3ce7bd420a3dce569e8f5be62581a8bdae698a6638de09b12ac8016e0b15f3858f4bf37be7b259c91dacff3e35536732ba50a07c6951f6926c5c6e4bed969cbc422186695e3f1f63f93564cd12b93669146f0e5f9d08ea439d77ed6715d303c7c6801b559a242d74ddbe3eab27dab776438db98d49574370d1e1e0b12625317d5e74eb8f6a23293e8f9769709d103b416c66827f29e814238a95369075d4e5aa32977e44f6c110d45fbd66457c6c83f19c8d00fe3da033b915f651dbdb6f49e898a4b5fa4da90d8fc2be20d67d453e78c01a945d4d3de87aae75680f3794feb05e9cef7175944a9a11211853754f1c9f69a51d38515aecb95225a794cd500f461a354f8c9b3c5bec947026a6dfc6817c6293e890368e0e5291e1b5db5d21121cb0fdd48a4b9d1604743e128e5a8fdc8713b4b730c8d9cb72f8bfb25540022c5e861ca1313cc58be36304dbb7a5e124359cd0ae4188976ce2941bb74f3d40681f5cf1c187199853850fd4cd4fa3dd071926f5913bc5f1cf80b619082ab4324414a3d45c409f70f910ae638608464eb0b8421413205ff39f13e4ebaa5221802d1369d5e93b4f882c288c57853f92940cc395a01e22d924feab25bb01ce1cd3b1d77c4c87007077b1d43299fead8648f2a8aa47e8e291022dd54db38a906900247fe04bdd8496ab4fbccd81ee98f2f178dea1c6e4ff9bdea1497f8f468ee4dd86ad686575a6d1802967840d35a2dd375beb04fd2b6ada03cfc13dd0a0d2ea66da18631fdd4fb579c7bdb4945f0dcd163fa10eb741b1f07ab817d2c46e3d83e8f732e3efea70228a6b6c4c36014834956486ed662d8621f51dc2db904e1325ff8c6908ca69aa14e5fe7fff2b72c7bbd8307168497674575f073a7f35804a2fe410b76301ea219304b574eec3e67ab27e2a60ba920a0c8b4ab0bc63c48e5af2eee5bb7845268a4d0fc0792562f77e6710a4ad39d23a646dfe3fd76fc927ca18a50fe5329d713e2b4ccbbd12c77e90cc3e224aba12555c1f85dca227d7bdc71ede85bdf9c1263b42a96e2c6561d2d5a5bef8b23d69ee9f709564ccc796ac6079afc7f85900301000000010000000000000000000000000000000000000000000000000000000000000000ffffffff31027017005a2d4e4f4d50212068747470733a2f2f6769746875622e636f6d2f6a6f7368756179616275742f7a2d6e6f6d70ffffffff0216696d29010000001976a91457bc5e7e48328d84194f57667425ae26357bfb3a88ac80969800000000001976a914cc9fee1128f4cfe550cf6a30e76fe9fc7804a0ba88ac00000000010000000322f25ac543879bec4af292d454e8745ea21ebfca809310b65ecd9e02425584e6000000006a4730440220356dc942205d79bd4cf973d088bc039b370398b9aff83d0eb030e0050c36521f02206591dc9df35af29b7590f45ac9ade93023ad5ec440b71ed6c2b6c278f22086c90121021e75588e72a450e155ee7847afd136759a24680562e57dc208c4bf1793d73d7ffeffffffe93b4560e86b8e32cc6046f62d21f5f0f947f7aa66f6922d75502b610c2b1bb5080000006b483045022100a5628be89c7e36af5ee8e1f1cb107a38c9097c9520c65b94a0a1354adc7505840220502a04e02a5efd96866abe0ee7f7f7cedd24db40f8550ee51a5f2d03b8765511012102b4d402c0af6174ab065a486a80ea1789d7c5efbf298da41716765feff8a44bb1feffffffcc9805817e2fc8a65c3602310ac6bc901b63245f0075bb9c106c31f427bf6c96140000006a47304402202f0a16076989da98faf0b3cc0ac1e0e36df934f1c935d60a6f272efc96626dcf0220751ee9d43dc20c089f0d5d294be8b7012b439630b47e7d25e966d53779a85738012102c95714769090b78aead3ab3b3e47ca03ec22c01c0e11f1220637994ca87fd80bfeffffff1e74d09605000000001976a914a8c164358208c869ea4021e85a007d853366227188ac59a77a05000000001976a914261592f28c2b580017b2d32179bb43481b42837988acc3666f06000000001976a914642353deaff4e6cd13d8b0a59c203fd90f119cc088aca515082e000000001976a91445aed15b5868e3111565fbbde6b15cf230b4f14f88acf982f54b000000001976a914d4482e10230f301d2b4e8520b7731a0491b4ae4388ace244ca71010000001976a91482f8ca0c42ae43c55f04e158f375cf89d4d42a6e88acb7572fa2000000001976a914504db139ff2cf1dedc733f654c6c75ecc794cb6188acb48e9e7d010000001976a914c919839c9bd3e61a7bc2e23c79a3b848b219dd7288accc10a275000000001976a9140dfcba5a588f4468cc774cb319a48e57abe71cff88acaaabe309000000001976a914417d3abf7f74014ed35135f589e982430affb5ec88ac68df7674000000001976a91462dd778f35a41873885864ea35cc03d3a88309eb88ac6bbf2c10000000001976a9149ebb2b219d0f217f5ac49ddd86b5bfdedb264bc588ac43466b0b000000001976a9141a22cf4371d33ec4100749dc45199e30fb9e6f5288ac3163e87c000000001976a914da96f3d2d3c92f59f97f6927eb77070f0fcac47988ac4ca93a03000000001976a914b9e516ad2b01fd6bdc272c77e19f2f33a4e187eb88ac8801fe07000000001976a914e0b0f6b9f742d008ab38e4e4439800da46f660fb88ac1435863e000000001976a9148bf6928de7024d82ead56890e5470f8851ffaaf388ac6ce47c13000000001976a91442b5a8c8477daf5c8cc6ce5ee5c6a110b5ba52c288ac807e7510000000001976a914c8cb5f5e3993bac959721afe54fa122c7e9524f388acbfe65c1f000000001976a91486eba783cd90484614a6dcb7c00a0299ddc0687388ac376aee34000000001976a9141c1905fd4cb295adcf6d4ee97a90904acac6552c88ac7120ee09000000001976a914d77212e54c182608b2e3e33e03a9687b96c20b1088ac1eacb118000000001976a9142e83ac6bfd786484ce938594f726fe06b23e0f4088acc827ff05000000001976a9144bad3912eba43489376d45779f92b7b6ff2c2efe88ac1687ca11000000001976a91454058d2ae49b5b14eda41b2e1ca3cdcf80c9e54f88ac6581f303000000001976a914ef1f6f1d54f2be2bb05827b9a14a678f89e2f9db88ac4ab51200000000001976a914c307886e6864598da62fb3bc373c7839a069ef9188ac37ed8b26000000001976a9140009c3a082578e8d135cf763903590a711d8912488ac04dff410000000001976a9140ba325d08efe82f3d6b02dca8bbc5e49a025b0f888ac21902317000000001976a9145f26183c785124c81cc47e50dc26be9266d8661188ac6517000001000000020977c57bff9f84b72084e1754c6ea7d60504d794634c28d01c189bf6f0f138a9000000006b483045022100c74514a11a13c41c007bc5db5e68d261af4d91504c9fae2312b02534f0ae5af302202568b947925d93f814f82ffe893c7f10358b8bf436cc00d4a7e67a76d5e844e00121032a5c7a47b81d9f924afcca8c59111f8ea17ff91f7303f06845a8415df0ba66cdfeffffffd7d5e3d0831ee35ddd025d0f43f7982a39379ec1799197b1e79a7eb11c599218070000006a47304402205104f40d4ed17f95f4887584921f4b9ae82018ba62e649617294e7d0e3aa02f50220313a7cd2d5a9fd1b1eb4032df73bec3bf4439917a918481a4c5d396a1994e28d01210366c43bcb72f9f9f8ff7a480f85750c80b981aae2c94b6c49a1676cda859184b9feffffff3267044b06000000001976a914fa92f42c61b5deaf1ed5c7c153d00fe78b16f69088ac03e4b700000000001976a9145c630477dda5f7d02293bf3363d6dd0f6064d9f588ac2a6d4504000000001976a9146a2a5ceccb047f67df4804b265243998798ef15188ac062fea09000000001976a914e1257636645fd023403970fadc9aae95171cb37088accccbce05000000001976a9141c5f6197dc06262c8a0ae55503d04a35c16174a388ace2d6b607000000001976a9149a8290608ffcbb9412f36c9e49103c94f4d0485088ac9590a006000000001976a91431985f6a89a872ac0e0282a5f4f0508d45aee1ad88ac7aabda00000000001976a914fe581bcc5d2230cb82405052b1fec4064616aa7c88acd0b56f01000000001976a914ceb8712840da5222efdef888144fde7f5cf9173888acf8aa7102000000001976a91407940b12b9f5e5a6122364b3c237c8a7409a655688ac50744a01000000001976a914ad6f5e4db525bc4ed38ab6efd32f913d1bd3825288ac8140ff00000000001976a914e6c05a94351ad9d8eb582a7951ac740026ada90488ac90720f1c000000001976a914eeeb579cf590e177e2ffbd1e7fc9c05dc130767a88acf99cce00000000001976a914d309ca78a520d48daaa3d94bb7114db24ad2249188accc798b0a000000001976a9145b909b9105f86a675857d614df3577914f1cf6ed88acdceb8601000000001976a91420864de6072be6104cc4facdd26cc9d9a3ecf58888acca63ee01000000001976a91420399423d01aa56bce8f90c366681ceff3232c3188ac1fa1820f000000001976a9147d9b3b5e33b791ba30400f38eb1b6f2f0a3a656b88ac11bc9900000000001976a91490f153192f3215f5847c32d53421638340e5475388ac87eb5303000000001976a9143f1aee3de18fea3a42bacb8caff1dd250cc0598a88acc2316a29010000001976a914e5a85ea568066d68dfc15f22f25ea8fa2de1228a88ac1be85a04000000001976a914ad74ff2e0f0b255c35a79af7df9513c0baf95ea288ac672bad10000000001976a9146478eee30b67d8b0e543c0f174fb14e2d7f3e85c88ac2973b51c000000001976a914aa49296b731dc10d3a675a2a061b71c54c6cecdb88ac6aaf240d000000001976a914be5f3c038eb9fecb2da32541efb3a9da0af7e7dc88ac7811e819000000001976a9142ed5102e5c9f0b976894b3abd48f9bbb62f1677988acb400de07000000001976a914c3c31102b03b4fa7a8080d0efa3f72717c9a5f4188ac1be0380f000000001976a914b443961a9d4d54f14bde254bf5746db1d0cbd3dd88ac5c99d729000000001976a914e36fcc972f6fb6f98cde7655ffdeab38a3d4516188ac9c038506000000001976a9143cd7794529d4361ed1f8c3aff746d356e808016488ac32d5aa0b000000001976a9141c1905fd4cb295adcf6d4ee97a90904acac6552c88ac4cd24012000000001976a9147a83bdf320a82fec1194cc46fd20c8c20891872e88ac8f7ee209000000001976a914e8752ee36b50a68a5666acc9b61452cf8157700b88ac98b20b06000000001976a9144c86615a2a602ded6d46afc9ad7e7e4f10a272b688ac23e1a202000000001976a9142e83ac6bfd786484ce938594f726fe06b23e0f4088ac50c33603000000001976a9145b2479c67e009acf1f662d5bfe9b380711b7eb1988acfef67212000000001976a9146504ad2fbef7f68db4b3c387aa6f24751b914b4288ac38233009000000001976a9140ba325d08efe82f3d6b02dca8bbc5e49a025b0f888ac2c4adc0a000000001976a914ed6169132ca28ccfd8e09bde09e1a4e839c50e0988ac1db93f07000000001976a914e260b287b6321f44c309db79e61009cc233682e088ac2c62300c000000001976a91466354bf4d5001b4019fa5f58791eb1bb778ecbec88ac98c0960a000000001976a914244b72b73d7acea0bed9ccc72f9d0c09749ff5d188ac16c35db2000000001976a914d58781f2068f9a7bf7b0b1f81735b51f4ae9f7b188ac7def6a1c000000001976a91496d8ce3ad2fbf4621776023779ca5f085f9da49288acd56dc80a000000001976a91486eba783cd90484614a6dcb7c00a0299ddc0687388ace74b300e000000001976a91476285707f7909c4bd9a890af85eba71f69e5900e88acbb7d2612000000001976a9144ea1a85472e7727f35b6f58dd8066bc4f1266bb288ac85970f0f000000001976a9149340ffc60b8f4ebf528a55c9173c8295d948170488ac993d650e000000001976a91424b4dc903abe7cb06f9c48b44316fac13ebd6aaf88ac242e960f000000001976a9147ee99d2d2208c8d67c2ad95f20bad5e91a9c759388ac64170000"), SER_NETWORK, PROTOCOL_VERSION);
stream >> block;
CBloomFilter filter(10, 0.000001, 0, BLOOM_UPDATE_NONE);
// Match the first transaction
filter.insert(uint256S("0x3dd14005e33207042f3ecb9ac198bf137297ae4dbec84c515bbc6f73d09af774"));
CMerkleBlock merkleBlock(block, filter);
BOOST_CHECK(merkleBlock.header.GetHash() == block.GetHash());
BOOST_CHECK(merkleBlock.vMatchedTxn.size() == 1);
std::pair<unsigned int, uint256> pair = merkleBlock.vMatchedTxn[0];
BOOST_CHECK(merkleBlock.vMatchedTxn[0].second == uint256S("0x3dd14005e33207042f3ecb9ac198bf137297ae4dbec84c515bbc6f73d09af774"));
BOOST_CHECK(merkleBlock.vMatchedTxn[0].first == 0);
std::vector<uint256> vMatched;
std::vector<unsigned int> vIndex;
BOOST_CHECK(merkleBlock.txn.ExtractMatches(vMatched, vIndex) == block.hashMerkleRoot);
BOOST_CHECK(vMatched.size() == merkleBlock.vMatchedTxn.size());
for (unsigned int i = 0; i < vMatched.size(); i++)
BOOST_CHECK(vMatched[i] == merkleBlock.vMatchedTxn[i].second);
// Match an output from the second transaction (the pubkey for address L1BDVRhZHkwpNcyxwt33NFYZPE3M5LCzcjb)
// This should not match the third transaction though it spends the output matched
// It will match the fourth transaction, which has another pay-to-pubkey output to the same address
filter.insert(ParseHex("261592f28c2b580017b2d32179bb43481b428379"));
merkleBlock = CMerkleBlock(block, filter);
BOOST_CHECK(merkleBlock.header.GetHash() == block.GetHash());
BOOST_CHECK(merkleBlock.vMatchedTxn.size() == 2);
BOOST_CHECK(pair == merkleBlock.vMatchedTxn[0]);
BOOST_CHECK(merkleBlock.vMatchedTxn[1].second == uint256S("0xde8ace7950d2204eb216481e21b2bf5aeb53633a1fc384140267b8246c1b12bf"));
BOOST_CHECK(merkleBlock.vMatchedTxn[1].first == 1);
BOOST_CHECK(merkleBlock.txn.ExtractMatches(vMatched, vIndex) == block.hashMerkleRoot);
BOOST_CHECK(vMatched.size() == merkleBlock.vMatchedTxn.size());
for (unsigned int i = 0; i < vMatched.size(); i++)
BOOST_CHECK(vMatched[i] == merkleBlock.vMatchedTxn[i].second);
}
BOOST_AUTO_TEST_CASE(merkle_block_3_and_serialize)
{
// Random real block (000000120ad414907b803dae85ed85af5f1fc9b550f6f1b92d6e28482e3936de)
// With one tx
CBlock block;
CDataStream stream(ParseHex("04000000eca61d86ccf2fd776af57d22b3ae29a2d84587239a4f76e68e2329950a000000904d533e41f21911bac023e5f0aa32675a60d1cc650c95cf031b740a9fabb6fd0000000000000000000000000000000000000000000000000000000000000000e67d685abc74461d0800000f030000000000000000000000000000000000000000000000dc190000fd4005001cc5e437cc126e6c4c70fe03c28a3da1145d072e4108d6e64bd0e339dc70689f9ad07a429650fa59190f73e2dda80e720b0594f37068c59fd77f929ded2e17fb0539a5a0cb7f61bee28552f5b63d2dfedb036000a11eebce61aff76556161736c127725a8f734bbd1d266e6ada96eaeb306175f2d0652692ebe9fd616520469589175c4725d092f57fb0e2fc056890912afa389b3ebe95a17ba3564dc81ae6692af64e66f8604d08ffae3f10110e3cfd8762a88faaf366510c3a8fcf15326f44fae793f17ddba3fca1745d75b7dece0b4a153ac2414494a56580c214a149cb8ebd805038760a22986eaa7a8efc929287130a5849d68a6853d38feb0eaa08fdb3a18e9b2a6ab56ca77b9cb68883353e7d34d0dc3cca3a1f83dbc0e445b76d34756f0d8c76a41284616475deb3b3ae6bd1be0f7fe295d17a76097c1ee1b3cbf5b67ad7ee2f7435a762340588ba4c7329020498ea090694c521d3a1ea936bf416dc72fdac1b1fcac487095a7ab1128e9569ca3eae5e3a5cde874b0301752b7488c0d71fb27056f19359be53f73d97d5079bad5e4a57f8c348b5f22ff59f8f8d90c0b8d14d15f8e643db1b8e7fe4bd33847a65f2a551f6d9d22e340587510215f8c1dd6305ed4cf78a8a35443aa4c243111fb2a4ae515bc4e0a46364b728055c617ec65a4bdff69a1bba8d39fafe35ce99f1da7176da3568b103080caea65c9026f0268067e4e927355f823495862348666e5e892299854c35e16070a55d84214d5d760e5b437e782eb13f7fc634d2c1f5fc2a8d8a76f780289e157c80e079d3442bc6104f5b701222ea970cf70660b0d87410a23ec8e5c424f5c4ae830b997b89a20e609ce25088df47d190a509f8c3fa71c9e9fa18af08b2a2b6e59c4701f9d9816d6e9740ddc16dba5ede0af220b9dd5995eb8cd9b3294664e50e79edf6a45a00e4f67a10c963393c78e0244ef6285cbae4f1dc984c0d0cf094960f23b46bf4c9d6ba2185ee9df87cca01e837f04b53a9ed7df643e7b4b863d9b435f00089206a218603e47b49bd7342e4fd53e5b27be5d7673f034dd2aa76271791c0c247bd0e54aa6f1dc0595ed20b890c883439fb61d423b66b25384ec5dc842fa6fd0b2c44c7bda1921f8f7d5964a1e9d1f746699ae57113b229a96d1b5ac133abd3557be0ce4666419c21ce0795978bc9fa4769e8e5f13ebf99948b07ce7ca88b17b5d71c0eaa95d157b5960391b365ced5aff7cc440dcb64cbf0b42c9fc2bda4ef9b35bdfe7bcf985e154f8036928d191445219fc56f77715f27c8667f6d82173c71f49cccb1855f8ba34b22adf7b21a9eb4f9336b125beab427a01559e1b8cda6d2ccde3dbfd5d2011aca6a7fc61965a950f344595cf790979663ff32ce2283172a231ed1ed86aea2a7744744b5abc25cabb40159d5ba6889055860d380229a5f97565d8dd592e2138502ecc8a00bd705e3535683d89c9eea527bb2093ebd367cbad99481f0f266cc807d97d747191b2d0a41873c823bd332ecbb701534574780bde3c05c52ee02d64aceebe8b9736cc889d56567d4ca864eb74f91128a0eb74a25e689e314215cc78ef38147c5ae33ed0574a9afae5eaa6b15646a5f1dddd20b004fff92fa05bdf7e7c9cb035bfea8a7a4b75b8d0702a81e8375046be6ac1cfae4b5e5e8f0e3dd709f592fed560ab80e003462658d31867b8398d13c7a04ea86e9dc98cf115abcfb6285a47f247cb270b55e3e79b1e459ab863a9d5e4ebee4d7733b55c4354ec368ff1cf59e19040cb50b053bdb95ff0b7b657b362f3f579af3fe24eb2214ab0fdbef0f7ba4eae823a3cfea128ff5fd0d1d1456a2d34113335726d0d18409ee70b1a22b9f478321b50f01ae606a6d9db7c4976e3121276c2d9ce7010101000000010000000000000000000000000000000000000000000000000000000000000000ffffffff31021627005a2d4e4f4d50212068747470733a2f2f6769746875622e636f6d2f6a6f7368756179616275742f7a2d6e6f6d70ffffffff02008d380c010000001976a91482c11e3e18a4033b59a6e0bab12f862f76881aff88ac0065cd1d000000001976a914e3e3b25a494bb954a258ea4118c303568c306e3b88ac00000000"), SER_NETWORK, PROTOCOL_VERSION);
stream >> block;
CBloomFilter filter(10, 0.000001, 0, BLOOM_UPDATE_ALL);
// Match the only transaction
filter.insert(uint256S("0xfdb6ab9f0a741b03cf950c65ccd1605a6732aaf0e523c0ba1119f2413e534d90"));
CMerkleBlock merkleBlock(block, filter);
BOOST_CHECK(merkleBlock.header.GetHash() == block.GetHash());
BOOST_CHECK(merkleBlock.vMatchedTxn.size() == 1);
BOOST_CHECK(merkleBlock.vMatchedTxn[0].second == uint256S("0xfdb6ab9f0a741b03cf950c65ccd1605a6732aaf0e523c0ba1119f2413e534d90"));
BOOST_CHECK(merkleBlock.vMatchedTxn[0].first == 0);
std::vector<uint256> vMatched;
std::vector<unsigned int> vIndex;
BOOST_CHECK(merkleBlock.txn.ExtractMatches(vMatched, vIndex) == block.hashMerkleRoot);
BOOST_CHECK(vMatched.size() == merkleBlock.vMatchedTxn.size());
for (unsigned int i = 0; i < vMatched.size(); i++)
BOOST_CHECK(vMatched[i] == merkleBlock.vMatchedTxn[i].second);
CDataStream merkleStream(SER_NETWORK, PROTOCOL_VERSION);
merkleStream << merkleBlock;
std::vector<unsigned char> vch = ParseHex("04000000eca61d86ccf2fd776af57d22b3ae29a2d84587239a4f76e68e2329950a000000904d533e41f21911bac023e5f0aa32675a60d1cc650c95cf031b740a9fabb6fd0000000000000000000000000000000000000000000000000000000000000000e67d685abc74461d0800000f030000000000000000000000000000000000000000000000dc190000fd4005001cc5e437cc126e6c4c70fe03c28a3da1145d072e4108d6e64bd0e339dc70689f9ad07a429650fa59190f73e2dda80e720b0594f37068c59fd77f929ded2e17fb0539a5a0cb7f61bee28552f5b63d2dfedb036000a11eebce61aff76556161736c127725a8f734bbd1d266e6ada96eaeb306175f2d0652692ebe9fd616520469589175c4725d092f57fb0e2fc056890912afa389b3ebe95a17ba3564dc81ae6692af64e66f8604d08ffae3f10110e3cfd8762a88faaf366510c3a8fcf15326f44fae793f17ddba3fca1745d75b7dece0b4a153ac2414494a56580c214a149cb8ebd805038760a22986eaa7a8efc929287130a5849d68a6853d38feb0eaa08fdb3a18e9b2a6ab56ca77b9cb68883353e7d34d0dc3cca3a1f83dbc0e445b76d34756f0d8c76a41284616475deb3b3ae6bd1be0f7fe295d17a76097c1ee1b3cbf5b67ad7ee2f7435a762340588ba4c7329020498ea090694c521d3a1ea936bf416dc72fdac1b1fcac487095a7ab1128e9569ca3eae5e3a5cde874b0301752b7488c0d71fb27056f19359be53f73d97d5079bad5e4a57f8c348b5f22ff59f8f8d90c0b8d14d15f8e643db1b8e7fe4bd33847a65f2a551f6d9d22e340587510215f8c1dd6305ed4cf78a8a35443aa4c243111fb2a4ae515bc4e0a46364b728055c617ec65a4bdff69a1bba8d39fafe35ce99f1da7176da3568b103080caea65c9026f0268067e4e927355f823495862348666e5e892299854c35e16070a55d84214d5d760e5b437e782eb13f7fc634d2c1f5fc2a8d8a76f780289e157c80e079d3442bc6104f5b701222ea970cf70660b0d87410a23ec8e5c424f5c4ae830b997b89a20e609ce25088df47d190a509f8c3fa71c9e9fa18af08b2a2b6e59c4701f9d9816d6e9740ddc16dba5ede0af220b9dd5995eb8cd9b3294664e50e79edf6a45a00e4f67a10c963393c78e0244ef6285cbae4f1dc984c0d0cf094960f23b46bf4c9d6ba2185ee9df87cca01e837f04b53a9ed7df643e7b4b863d9b435f00089206a218603e47b49bd7342e4fd53e5b27be5d7673f034dd2aa76271791c0c247bd0e54aa6f1dc0595ed20b890c883439fb61d423b66b25384ec5dc842fa6fd0b2c44c7bda1921f8f7d5964a1e9d1f746699ae57113b229a96d1b5ac133abd3557be0ce4666419c21ce0795978bc9fa4769e8e5f13ebf99948b07ce7ca88b17b5d71c0eaa95d157b5960391b365ced5aff7cc440dcb64cbf0b42c9fc2bda4ef9b35bdfe7bcf985e154f8036928d191445219fc56f77715f27c8667f6d82173c71f49cccb1855f8ba34b22adf7b21a9eb4f9336b125beab427a01559e1b8cda6d2ccde3dbfd5d2011aca6a7fc61965a950f344595cf790979663ff32ce2283172a231ed1ed86aea2a7744744b5abc25cabb40159d5ba6889055860d380229a5f97565d8dd592e2138502ecc8a00bd705e3535683d89c9eea527bb2093ebd367cbad99481f0f266cc807d97d747191b2d0a41873c823bd332ecbb701534574780bde3c05c52ee02d64aceebe8b9736cc889d56567d4ca864eb74f91128a0eb74a25e689e314215cc78ef38147c5ae33ed0574a9afae5eaa6b15646a5f1dddd20b004fff92fa05bdf7e7c9cb035bfea8a7a4b75b8d0702a81e8375046be6ac1cfae4b5e5e8f0e3dd709f592fed560ab80e003462658d31867b8398d13c7a04ea86e9dc98cf115abcfb6285a47f247cb270b55e3e79b1e459ab863a9d5e4ebee4d7733b55c4354ec368ff1cf59e19040cb50b053bdb95ff0b7b657b362f3f579af3fe24eb2214ab0fdbef0f7ba4eae823a3cfea128ff5fd0d1d1456a2d34113335726d0d18409ee70b1a22b9f478321b50f01ae606a6d9db7c4976e3121276c2d9ce7010100000001904d533e41f21911bac023e5f0aa32675a60d1cc650c95cf031b740a9fabb6fd0101");
std::vector<char> expected(vch.size());
for (unsigned int i = 0; i < vch.size(); i++)
expected[i] = (char)vch[i];
BOOST_CHECK_EQUAL_COLLECTIONS(expected.begin(), expected.end(), merkleStream.begin(), merkleStream.end());
}
BOOST_AUTO_TEST_CASE(merkle_block_4)
{
// Random real block (00000029a1ce401cc0cb0f8f28fece1be233e0db83a2c06ec6fbc7166b6560e5)
// With 3 txes
CBlock block;
CDataStream stream(ParseHex("04000000aa17706f092a5d60423bf204b8e68c401db5391172dcfee867416015160000004038afdc99225031c4222adef7447eb59868dab5eba022394932ef4f0a3090bb0000000000000000000000000000000000000000000000000000000000000000448f685a08b4441d07fffed7f43add00000000000000000000000000000000000000000000000002fd400500b2556173a3926136c0f5a4633ba8b7627e3b6bf80e1b1c9d2658745d69889239ebccc8969f1afb34af021f53396fceb2c8aa943231c51bc306b3993b898525d71cf404981dc6efc1d3199a1be5de3a4373621606ba51e496573785ee29e629d0543f499967bee251103a669dd257b2492f0755287bdae52dca2d559cc7105c2db4944fb274826e619f676aaf4128d539e66931bc025b005b00618e3df39988c68141f0cedb172d05d45c613f0982d65dd8b06d0e068310be683bf2a030b617fca2108ec89bb0e744fb64663b39bdbb88611c35ccd1efebba11bd4412954f66b15a45a73658f0321e8401cad2d917539ee44f0726fa7944af98be8f1a6eae29e1abdfd3e81226477d73e64ed7871840ef36762cae5cec41d5e957f3e8b14ae4ade71b5e51ee24528fecd16aeb0d60b242c0f6547d35f74b1514e2293c6e59728e0e6a783022d370b63c9dd3827bfbac06b1db103c5eb438f67e32fc26efb5b9d6520eda0909e52921ae5dd535a695620c707eb93d99dc722fff0f92fabd870b5d6a947be27010cfdd4d56687e64413a371691dadeb12d13bd145c6a485ce645cb78cbe10e74fd410415b2d31b9e561f6ef5075e8fc17c4aaa1a0c510cb735485bb9eea439c3d7c3ed4acad1fbec14420f2d41c56cfa78487305aa56923505f79795a95b0fbf9f7b7c9eb9ef1707d9bc409b8616a43204060abf57e6c525b41b8196145c30f67059efaf30eb2f1411a6dda5ae70e1e56e73e958fa8855fbfb7606331a1e3470249ca2f9f3245752197fd542ae0dbaa0d634d0ae9d44981f6be497f4ef69fc0eee7be0741e3c190fab37620bb40efad2071f993b7a72f5021b2a9e5d7ef7056eee3ec7c712175afce20a8eabe29e68c920a6b228fd98a79d8f08274a74bf291f51259f3b2b40626e652d107bb29212799712d569af740b3c50c301d7863c81288eef45c6835fdaef5621b4b5d3d389264ca397619f65d509bbe5f1973cd763c1931fb07e02d5298841ee033580b2658d81448caad691380e2d094ca6fb2c19f5d7c54eb1f0f8f09c5d1a671c23730de62e1628520d15163db4b5c9dd9221a6793d8d352e47f9d574d4b22bc8226351af5f57a507405fcb722543e6ac91ed8d4fa2081464086eb14a09fc1841322c5d5e2c264fb5d8aeed933c52d0bf3e0c94b45813040247852259ce91171f04b73cb9cd496e4f34c7bd6cde93f4eba6abd1690578ede654b067180f7a1bdf084a45334d19c5a1e44d9473ce70d11217603f5bcb22f13c6bbbdb8fc55f3d59b96e4f7e6ec517bd23121c160db009194fcfba7c31e4795942668b24fe8c7127ae85d79cecbcef8071889a3ff2a6de4e1fd72bca1dd91d0a48cfd671561ff93343ce846e5789b47b478b8c1788ca3c2237f6798bb3536f16f747869e13ad05e226fd4a4a20b27b8670607917bd3478c93471120eb86093ce0f017df2ec1109afb51f6a387e38c4f21833c1f0a05075f38ca618c4f0d00ae772a8fced3d1f2edf09e04b6fddbe9345c71eb3ca1dacd6579f3509be450f311caf8751c682397814f512fa92ded60d4f74afcb0d6b11abda5105efea4719d58dcebe4fd90aa2e57e0b968e0d48dce0e677eb529e58bfd4001e0d9fe8a25346449bae16112c1ccdd6bd0656174710139e6bbecc87f03563773251963261b98a20d41c2f27206dae131809cdc0fb14666d448c63ac833ed70e1e016fcd64578e46cc133766d67badfafb11ba7cc5712456dfc17d821dfb7cc9deba6d6d931c3e5dd6222c18e2cf805d602d87f71336927c6429787d35e64240996fe4f7dc0bdb503bd46f85e20b25afa77bdf462d7133baf152238e993d3432446f0e45991ebb27ba37a4f7ce8ccea98bb956c4100fd5183eb5b61f99a80301000000010000000000000000000000000000000000000000000000000000000000000000ffffffff31023127005a2d4e4f4d50212068747470733a2f2f6769746875622e636f6d2f6a6f7368756179616275742f7a2d6e6f6d70ffffffff02c3656d29010000001976a91457bc5e7e48328d84194f57667425ae26357bfb3a88ac80969800000000001976a914cc9fee1128f4cfe550cf6a30e76fe9fc7804a0ba88ac00000000010000000145792ef0882bf2cc97827d4b25211ae8c40daf0ccee1bbcef6dda82c62f420a6000000006a473044022019ae8bddd7c6605c770c4c570eb6773ff1c590b62d8d9d2da6b0d1f3b08c1a9e02203084cbb536b52af89024b24d6ec2d18b748a9be37a71480e1e976fe9afed91840121021e75588e72a450e155ee7847afd136759a24680562e57dc208c4bf1793d73d7ffeffffff3ce0ad7501000000001976a914f73cb27f2f92294e86a108fcd68ea73af2d1080788ac86febe00000000001976a9146f108c188b5007b607d191d34aa825c23fad6e3488ac17452002000000001976a91486eba783cd90484614a6dcb7c00a0299ddc0687388acc8741a01000000001976a914bdb8a9b676fe11bc1e4614aec1e5751c62d6788c88acc9730301000000001976a9149238fa8aaa94f94e3cdbc29939b2a35b01a960a888acefe0c804000000001976a91454058d2ae49b5b14eda41b2e1ca3cdcf80c9e54f88ac444cc608000000001976a914612130d2320415c3435297ea971aa2573375649c88acf550c200000000001976a914fe581bcc5d2230cb82405052b1fec4064616aa7c88acc0614b01000000001976a914b846c937e9c5e4d6b0fa27ec3f05ef8a47e6889688ac5f4eaa00000000001976a914ad1b69aec152214e7e4d210155c55b0eaf9e431d88acbfe30002000000001976a914e8752ee36b50a68a5666acc9b61452cf8157700b88ac3b3ed800000000001976a9147d65987cba70bcf4746be097a873ad369e1402f788ac832a4506000000001976a91448ad203811322f400d29083bdb1c2a970ff29d1288ac92279e01000000001976a914e6ee0c4d2c2abc9d43d5fb9fa592682064be2adf88ac5c4c6803000000001976a9146a924043b62b1685d47982491e7b3c7a1b1a38bd88ac0277f000000000001976a91488b182efc126a70e16b66e9c3e689bf8786243d088ac5627b300000000001976a914b42586cc644dc660007a787d734edadcb0ad956f88ac14c01101000000001976a914440e83611500fe554094023a1cce72959f05f32d88aca128b800000000001976a914dd0ea3fbf74f48a7bdafa618244806acbe0d517588ace51e3508000000001976a9140dfcba5a588f4468cc774cb319a48e57abe71cff88ac8f0d3504000000001976a914c919839c9bd3e61a7bc2e23c79a3b848b219dd7288ac34a68e04000000001976a9145b7cd317cfb23b47c07c373379a8bb50bcb4bd8088ac3bcc0001000000001976a914ceb8712840da5222efdef888144fde7f5cf9173888ac59523101000000001976a91481c13d590093a2847a442a92485785df629984f488aca540b101000000001976a91494f87418f9207e0e6f0805f94efe3e06c1597e1e88ac5d26034a090000001976a914f1c56a073de98711f8f5e31f58622b48c3d42e0788ac8136c802000000001976a914fd6b52f7de0fa28c0a5d1e2ca006363ebe7f418488ace8bc3401000000001976a914521365158d02eb30ea2041015987119df7dc09d688ac9d1c5102000000001976a9142a79d35b60303bae1c0e397e8f9b87e2fea88dab88acc78cdf00000000001976a9143187d18ba7c4a5e8024dd5b1678be281d939706588acfca8f001000000001976a914015ccc6b621ebbf316ed6be6be1f14339afc32e188ac1f8a8301000000001976a91418e064dff196933006cdb18eba4dc2af1246aff588acaca40a01000000001976a9142510e3e23e0214f33d443d8cfa8e8237c4d0cd6d88acbd3e7203000000001976a914b58804f9fb14b3be47beb4ea4678af5f6b653cb988acd93e9e03000000001976a9147816a5327a44045808aff135884fdd598b06087e88aca69d5a02000000001976a9146817832cead1e4dafb1f306f88221e006b03640088ac3114fd04000000001976a914dabcdbea7d95c29f32ca61fcdf429adac551b10f88ac4d715e15000000001976a914a0f5a5e258cc068f0e5a855ebc05bc465913cd9b88ac2ee7cd00000000001976a914ff4214072578da90b21c37c2cfeeb08573fdc46a88ac2c571e02000000001976a914154360b9aa74405e1a76cbd03415cb9a02f3ca5b88ac7dc59f02000000001976a9148f0b89be27850f7d6ee4ba943f5b8dbb8bc7434188acec02d201000000001976a914369169190becf18342e037ac05579964aa28640288ac95cff001000000001976a91478bbef2eb2b60c0deffd39fbcc061a552432859088acc1dd320a000000001976a914df02cf9c511dfca6d38779d183d024bfd6c4163088acbd975e09000000001976a9148e5701942305c2a1c5cc2121e44c195d0b46744488ac04cb410e000000001976a914469ef64a0673b2f41b8e0021bf8d62c2ee65124a88ac7d022808000000001976a914b5c696207b855adcdc8a14ff22a103a5cbb9140888ac07aa3412000000001976a9147ec5688a7000fb5b1afd12ac4e211b5345ae37ea88ac256feb16000000001976a914cf82e1fb881e376b7e7498e49e909dd3862d2fed88ace8cd9008000000001976a914afca38105bb85adba80864de0d82604dca18e35288acc62b160c000000001976a9148f8f0c2105c0ff6d784ffda5ddfb57781745f46d88acf49e2708000000001976a91477d1ba5dba345b31c327c1662b36750cde20b04b88acdd856302000000001976a9144735dc62837157f28df040af1de57c02e34efce388ac6a793406000000001976a91474e23160d629125fcae27cee6ad01f93527ec78f88ac72ba8f08000000001976a9147dc8434480550516ceb1134d20e294e10a30fcb588acde43d804000000001976a914d0a7e91f63be1e7b8cb22e783d232eb578f801cf88acb32fc420000000001976a9142f681e4913a1e7b684141f175e56cd10c699b09388ac915f1805000000001976a9142e1523ba4cc2940e21b3ae3ba0cb13e743c84af188acdb1d8404000000001976a914a2633a4b99da50b8613bcbc4f6396d8c3a15028988acd91fa104000000001976a91458275c2c1782c029fd165fbc05c2fc4f2e7a1f9188ac262700000100000001f087db6323b732e127ad02ebeaed5bd3c3dd99ca00af0d73e2aef037bf2931e7000000006b483045022100fbfd9080dec7fb58525ccc5ab24c61e705ac34464935a53686ec0350b53ebcb402204dee1d356cb44690a1f8a5e1d119555b4a7e75264b1c579737a443ae123e3542012103d284a61e5fec14fd67a31a06fe34c0d02b5a355cf73938685a2ef5add4f9004efeffffff083accfa15000000001976a9147bc00ed80eba267fd056183b54df7d4c9d27759488ac2ec91b2c000000001976a9149cd056d39d38908b2c83c782964cef703f1a879e88ac7a2e1f24000000001976a914c7075fc6b5e08c1209048d5a9e91772db8971de888ac1e8da124000000001976a91484ba687063b2e739d9efd042c78c70ef43d427cc88accab5ce1f000000001976a9143c70d3abe37761f39a3b05f7baebe26d7d5a84f288ac3e02f660000000001976a9145166b403e1c6215b2d034df7a8867839e6da5dd488ac9d34a80a000000001976a914d84015d77fdb088b35ced6ed1609fa6be2da2d0688ac4dec4312000000001976a914dcba0153332a56a7fbfe9d9aad25d951a00d42c488ac26270000"), SER_NETWORK, PROTOCOL_VERSION);
stream >> block;
CBloomFilter filter(10, 0.000001, 0, BLOOM_UPDATE_ALL);
// Match the last transaction
filter.insert(uint256S("0x3163f31706b76116c675b773e9de2d40de0fbb4393fb63e6cd869793b347beda"));
CMerkleBlock merkleBlock(block, filter);
BOOST_CHECK(merkleBlock.header.GetHash() == block.GetHash());
BOOST_CHECK(merkleBlock.vMatchedTxn.size() == 1);
std::pair<unsigned int, uint256> pair = merkleBlock.vMatchedTxn[0];
BOOST_CHECK(merkleBlock.vMatchedTxn[0].second == uint256S("0x3163f31706b76116c675b773e9de2d40de0fbb4393fb63e6cd869793b347beda"));
BOOST_CHECK(merkleBlock.vMatchedTxn[0].first == 2);
std::vector<uint256> vMatched;
std::vector<unsigned int> vIndex;
BOOST_CHECK(merkleBlock.txn.ExtractMatches(vMatched, vIndex) == block.hashMerkleRoot);
BOOST_CHECK(vMatched.size() == merkleBlock.vMatchedTxn.size());
for (unsigned int i = 0; i < vMatched.size(); i++)
BOOST_CHECK(vMatched[i] == merkleBlock.vMatchedTxn[i].second);
// Also match the 2nd transaction
filter.insert(uint256S("0x005d7aeb6e7a8705c970119187b22b9c03553b0b6ecddd48253b53f8c84feabe"));
merkleBlock = CMerkleBlock(block, filter);
BOOST_CHECK(merkleBlock.header.GetHash() == block.GetHash());
BOOST_CHECK(merkleBlock.vMatchedTxn.size() == 2);
BOOST_CHECK(merkleBlock.vMatchedTxn[0].second == uint256S("0x005d7aeb6e7a8705c970119187b22b9c03553b0b6ecddd48253b53f8c84feabe"));
BOOST_CHECK(merkleBlock.vMatchedTxn[0].first == 1);
BOOST_CHECK(merkleBlock.vMatchedTxn[1] == pair);
BOOST_CHECK(merkleBlock.txn.ExtractMatches(vMatched, vIndex) == block.hashMerkleRoot);
BOOST_CHECK(vMatched.size() == merkleBlock.vMatchedTxn.size());
for (unsigned int i = 0; i < vMatched.size(); i++)
BOOST_CHECK(vMatched[i] == merkleBlock.vMatchedTxn[i].second);
}
BOOST_AUTO_TEST_CASE(merkle_block_4_test_p2pubkey_only)
{
// Random real block (00000029a1ce401cc0cb0f8f28fece1be233e0db83a2c06ec6fbc7166b6560e5)
// With 3 txes
CBlock block;
CDataStream stream(ParseHex("04000000aa17706f092a5d60423bf204b8e68c401db5391172dcfee867416015160000004038afdc99225031c4222adef7447eb59868dab5eba022394932ef4f0a3090bb0000000000000000000000000000000000000000000000000000000000000000448f685a08b4441d07fffed7f43add00000000000000000000000000000000000000000000000002fd400500b2556173a3926136c0f5a4633ba8b7627e3b6bf80e1b1c9d2658745d69889239ebccc8969f1afb34af021f53396fceb2c8aa943231c51bc306b3993b898525d71cf404981dc6efc1d3199a1be5de3a4373621606ba51e496573785ee29e629d0543f499967bee251103a669dd257b2492f0755287bdae52dca2d559cc7105c2db4944fb274826e619f676aaf4128d539e66931bc025b005b00618e3df39988c68141f0cedb172d05d45c613f0982d65dd8b06d0e068310be683bf2a030b617fca2108ec89bb0e744fb64663b39bdbb88611c35ccd1efebba11bd4412954f66b15a45a73658f0321e8401cad2d917539ee44f0726fa7944af98be8f1a6eae29e1abdfd3e81226477d73e64ed7871840ef36762cae5cec41d5e957f3e8b14ae4ade71b5e51ee24528fecd16aeb0d60b242c0f6547d35f74b1514e2293c6e59728e0e6a783022d370b63c9dd3827bfbac06b1db103c5eb438f67e32fc26efb5b9d6520eda0909e52921ae5dd535a695620c707eb93d99dc722fff0f92fabd870b5d6a947be27010cfdd4d56687e64413a371691dadeb12d13bd145c6a485ce645cb78cbe10e74fd410415b2d31b9e561f6ef5075e8fc17c4aaa1a0c510cb735485bb9eea439c3d7c3ed4acad1fbec14420f2d41c56cfa78487305aa56923505f79795a95b0fbf9f7b7c9eb9ef1707d9bc409b8616a43204060abf57e6c525b41b8196145c30f67059efaf30eb2f1411a6dda5ae70e1e56e73e958fa8855fbfb7606331a1e3470249ca2f9f3245752197fd542ae0dbaa0d634d0ae9d44981f6be497f4ef69fc0eee7be0741e3c190fab37620bb40efad2071f993b7a72f5021b2a9e5d7ef7056eee3ec7c712175afce20a8eabe29e68c920a6b228fd98a79d8f08274a74bf291f51259f3b2b40626e652d107bb29212799712d569af740b3c50c301d7863c81288eef45c6835fdaef5621b4b5d3d389264ca397619f65d509bbe5f1973cd763c1931fb07e02d5298841ee033580b2658d81448caad691380e2d094ca6fb2c19f5d7c54eb1f0f8f09c5d1a671c23730de62e1628520d15163db4b5c9dd9221a6793d8d352e47f9d574d4b22bc8226351af5f57a507405fcb722543e6ac91ed8d4fa2081464086eb14a09fc1841322c5d5e2c264fb5d8aeed933c52d0bf3e0c94b45813040247852259ce91171f04b73cb9cd496e4f34c7bd6cde93f4eba6abd1690578ede654b067180f7a1bdf084a45334d19c5a1e44d9473ce70d11217603f5bcb22f13c6bbbdb8fc55f3d59b96e4f7e6ec517bd23121c160db009194fcfba7c31e4795942668b24fe8c7127ae85d79cecbcef8071889a3ff2a6de4e1fd72bca1dd91d0a48cfd671561ff93343ce846e5789b47b478b8c1788ca3c2237f6798bb3536f16f747869e13ad05e226fd4a4a20b27b8670607917bd3478c93471120eb86093ce0f017df2ec1109afb51f6a387e38c4f21833c1f0a05075f38ca618c4f0d00ae772a8fced3d1f2edf09e04b6fddbe9345c71eb3ca1dacd6579f3509be450f311caf8751c682397814f512fa92ded60d4f74afcb0d6b11abda5105efea4719d58dcebe4fd90aa2e57e0b968e0d48dce0e677eb529e58bfd4001e0d9fe8a25346449bae16112c1ccdd6bd0656174710139e6bbecc87f03563773251963261b98a20d41c2f27206dae131809cdc0fb14666d448c63ac833ed70e1e016fcd64578e46cc133766d67badfafb11ba7cc5712456dfc17d821dfb7cc9deba6d6d931c3e5dd6222c18e2cf805d602d87f71336927c6429787d35e64240996fe4f7dc0bdb503bd46f85e20b25afa77bdf462d7133baf152238e993d3432446f0e45991ebb27ba37a4f7ce8ccea98bb956c4100fd5183eb5b61f99a80301000000010000000000000000000000000000000000000000000000000000000000000000ffffffff31023127005a2d4e4f4d50212068747470733a2f2f6769746875622e636f6d2f6a6f7368756179616275742f7a2d6e6f6d70ffffffff02c3656d29010000001976a91457bc5e7e48328d84194f57667425ae26357bfb3a88ac80969800000000001976a914cc9fee1128f4cfe550cf6a30e76fe9fc7804a0ba88ac00000000010000000145792ef0882bf2cc97827d4b25211ae8c40daf0ccee1bbcef6dda82c62f420a6000000006a473044022019ae8bddd7c6605c770c4c570eb6773ff1c590b62d8d9d2da6b0d1f3b08c1a9e02203084cbb536b52af89024b24d6ec2d18b748a9be37a71480e1e976fe9afed91840121021e75588e72a450e155ee7847afd136759a24680562e57dc208c4bf1793d73d7ffeffffff3ce0ad7501000000001976a914f73cb27f2f92294e86a108fcd68ea73af2d1080788ac86febe00000000001976a9146f108c188b5007b607d191d34aa825c23fad6e3488ac17452002000000001976a91486eba783cd90484614a6dcb7c00a0299ddc0687388acc8741a01000000001976a914bdb8a9b676fe11bc1e4614aec1e5751c62d6788c88acc9730301000000001976a9149238fa8aaa94f94e3cdbc29939b2a35b01a960a888acefe0c804000000001976a91454058d2ae49b5b14eda41b2e1ca3cdcf80c9e54f88ac444cc608000000001976a914612130d2320415c3435297ea971aa2573375649c88acf550c200000000001976a914fe581bcc5d2230cb82405052b1fec4064616aa7c88acc0614b01000000001976a914b846c937e9c5e4d6b0fa27ec3f05ef8a47e6889688ac5f4eaa00000000001976a914ad1b69aec152214e7e4d210155c55b0eaf9e431d88acbfe30002000000001976a914e8752ee36b50a68a5666acc9b61452cf8157700b88ac3b3ed800000000001976a9147d65987cba70bcf4746be097a873ad369e1402f788ac832a4506000000001976a91448ad203811322f400d29083bdb1c2a970ff29d1288ac92279e01000000001976a914e6ee0c4d2c2abc9d43d5fb9fa592682064be2adf88ac5c4c6803000000001976a9146a924043b62b1685d47982491e7b3c7a1b1a38bd88ac0277f000000000001976a91488b182efc126a70e16b66e9c3e689bf8786243d088ac5627b300000000001976a914b42586cc644dc660007a787d734edadcb0ad956f88ac14c01101000000001976a914440e83611500fe554094023a1cce72959f05f32d88aca128b800000000001976a914dd0ea3fbf74f48a7bdafa618244806acbe0d517588ace51e3508000000001976a9140dfcba5a588f4468cc774cb319a48e57abe71cff88ac8f0d3504000000001976a914c919839c9bd3e61a7bc2e23c79a3b848b219dd7288ac34a68e04000000001976a9145b7cd317cfb23b47c07c373379a8bb50bcb4bd8088ac3bcc0001000000001976a914ceb8712840da5222efdef888144fde7f5cf9173888ac59523101000000001976a91481c13d590093a2847a442a92485785df629984f488aca540b101000000001976a91494f87418f9207e0e6f0805f94efe3e06c1597e1e88ac5d26034a090000001976a914f1c56a073de98711f8f5e31f58622b48c3d42e0788ac8136c802000000001976a914fd6b52f7de0fa28c0a5d1e2ca006363ebe7f418488ace8bc3401000000001976a914521365158d02eb30ea2041015987119df7dc09d688ac9d1c5102000000001976a9142a79d35b60303bae1c0e397e8f9b87e2fea88dab88acc78cdf00000000001976a9143187d18ba7c4a5e8024dd5b1678be281d939706588acfca8f001000000001976a914015ccc6b621ebbf316ed6be6be1f14339afc32e188ac1f8a8301000000001976a91418e064dff196933006cdb18eba4dc2af1246aff588acaca40a01000000001976a9142510e3e23e0214f33d443d8cfa8e8237c4d0cd6d88acbd3e7203000000001976a914b58804f9fb14b3be47beb4ea4678af5f6b653cb988acd93e9e03000000001976a9147816a5327a44045808aff135884fdd598b06087e88aca69d5a02000000001976a9146817832cead1e4dafb1f306f88221e006b03640088ac3114fd04000000001976a914dabcdbea7d95c29f32ca61fcdf429adac551b10f88ac4d715e15000000001976a914a0f5a5e258cc068f0e5a855ebc05bc465913cd9b88ac2ee7cd00000000001976a914ff4214072578da90b21c37c2cfeeb08573fdc46a88ac2c571e02000000001976a914154360b9aa74405e1a76cbd03415cb9a02f3ca5b88ac7dc59f02000000001976a9148f0b89be27850f7d6ee4ba943f5b8dbb8bc7434188acec02d201000000001976a914369169190becf18342e037ac05579964aa28640288ac95cff001000000001976a91478bbef2eb2b60c0deffd39fbcc061a552432859088acc1dd320a000000001976a914df02cf9c511dfca6d38779d183d024bfd6c4163088acbd975e09000000001976a9148e5701942305c2a1c5cc2121e44c195d0b46744488ac04cb410e000000001976a914469ef64a0673b2f41b8e0021bf8d62c2ee65124a88ac7d022808000000001976a914b5c696207b855adcdc8a14ff22a103a5cbb9140888ac07aa3412000000001976a9147ec5688a7000fb5b1afd12ac4e211b5345ae37ea88ac256feb16000000001976a914cf82e1fb881e376b7e7498e49e909dd3862d2fed88ace8cd9008000000001976a914afca38105bb85adba80864de0d82604dca18e35288acc62b160c000000001976a9148f8f0c2105c0ff6d784ffda5ddfb57781745f46d88acf49e2708000000001976a91477d1ba5dba345b31c327c1662b36750cde20b04b88acdd856302000000001976a9144735dc62837157f28df040af1de57c02e34efce388ac6a793406000000001976a91474e23160d629125fcae27cee6ad01f93527ec78f88ac72ba8f08000000001976a9147dc8434480550516ceb1134d20e294e10a30fcb588acde43d804000000001976a914d0a7e91f63be1e7b8cb22e783d232eb578f801cf88acb32fc420000000001976a9142f681e4913a1e7b684141f175e56cd10c699b09388ac915f1805000000001976a9142e1523ba4cc2940e21b3ae3ba0cb13e743c84af188acdb1d8404000000001976a914a2633a4b99da50b8613bcbc4f6396d8c3a15028988acd91fa104000000001976a91458275c2c1782c029fd165fbc05c2fc4f2e7a1f9188ac262700000100000001f087db6323b732e127ad02ebeaed5bd3c3dd99ca00af0d73e2aef037bf2931e7000000006b483045022100fbfd9080dec7fb58525ccc5ab24c61e705ac34464935a53686ec0350b53ebcb402204dee1d356cb44690a1f8a5e1d119555b4a7e75264b1c579737a443ae123e3542012103d284a61e5fec14fd67a31a06fe34c0d02b5a355cf73938685a2ef5add4f9004efeffffff083accfa15000000001976a9147bc00ed80eba267fd056183b54df7d4c9d27759488ac2ec91b2c000000001976a9149cd056d39d38908b2c83c782964cef703f1a879e88ac7a2e1f24000000001976a914c7075fc6b5e08c1209048d5a9e91772db8971de888ac1e8da124000000001976a91484ba687063b2e739d9efd042c78c70ef43d427cc88accab5ce1f000000001976a9143c70d3abe37761f39a3b05f7baebe26d7d5a84f288ac3e02f660000000001976a9145166b403e1c6215b2d034df7a8867839e6da5dd488ac9d34a80a000000001976a914d84015d77fdb088b35ced6ed1609fa6be2da2d0688ac4dec4312000000001976a914dcba0153332a56a7fbfe9d9aad25d951a00d42c488ac26270000"), SER_NETWORK, PROTOCOL_VERSION);
stream >> block;
CBloomFilter filter(10, 0.000001, 0, BLOOM_UPDATE_P2PUBKEY_ONLY);
// Match the generation pubkey
filter.insert(ParseHex("57bc5e7e48328d84194f57667425ae26357bfb3a"));
// ...and the output address of the 2nd transaction
filter.insert(ParseHex("f73cb27f2f92294e86a108fcd68ea73af2d10807"));
CMerkleBlock merkleBlock(block, filter);
BOOST_CHECK(merkleBlock.header.GetHash() == block.GetHash());
// We should not match the generation outpoint
BOOST_CHECK(!filter.contains(COutPoint(uint256S("0x67367329779f977cfcdd678da283cc2a7cbe354f3397117f2d9dd51dadb786d5"), 0)));
// ... and not the 2nd transaction's output (its not pay-2-pubkey)
BOOST_CHECK(!filter.contains(COutPoint(uint256S("0x005d7aeb6e7a8705c970119187b22b9c03553b0b6ecddd48253b53f8c84feabe"), 0)));
}
BOOST_AUTO_TEST_CASE(merkle_block_4_test_update_none)
{
// Random real block (00000029a1ce401cc0cb0f8f28fece1be233e0db83a2c06ec6fbc7166b6560e5)
// With 3 txes
CBlock block;
CDataStream stream(ParseHex("04000000aa17706f092a5d60423bf204b8e68c401db5391172dcfee867416015160000004038afdc99225031c4222adef7447eb59868dab5eba022394932ef4f0a3090bb0000000000000000000000000000000000000000000000000000000000000000448f685a08b4441d07fffed7f43add00000000000000000000000000000000000000000000000002fd400500b2556173a3926136c0f5a4633ba8b7627e3b6bf80e1b1c9d2658745d69889239ebccc8969f1afb34af021f53396fceb2c8aa943231c51bc306b3993b898525d71cf404981dc6efc1d3199a1be5de3a4373621606ba51e496573785ee29e629d0543f499967bee251103a669dd257b2492f0755287bdae52dca2d559cc7105c2db4944fb274826e619f676aaf4128d539e66931bc025b005b00618e3df39988c68141f0cedb172d05d45c613f0982d65dd8b06d0e068310be683bf2a030b617fca2108ec89bb0e744fb64663b39bdbb88611c35ccd1efebba11bd4412954f66b15a45a73658f0321e8401cad2d917539ee44f0726fa7944af98be8f1a6eae29e1abdfd3e81226477d73e64ed7871840ef36762cae5cec41d5e957f3e8b14ae4ade71b5e51ee24528fecd16aeb0d60b242c0f6547d35f74b1514e2293c6e59728e0e6a783022d370b63c9dd3827bfbac06b1db103c5eb438f67e32fc26efb5b9d6520eda0909e52921ae5dd535a695620c707eb93d99dc722fff0f92fabd870b5d6a947be27010cfdd4d56687e64413a371691dadeb12d13bd145c6a485ce645cb78cbe10e74fd410415b2d31b9e561f6ef5075e8fc17c4aaa1a0c510cb735485bb9eea439c3d7c3ed4acad1fbec14420f2d41c56cfa78487305aa56923505f79795a95b0fbf9f7b7c9eb9ef1707d9bc409b8616a43204060abf57e6c525b41b8196145c30f67059efaf30eb2f1411a6dda5ae70e1e56e73e958fa8855fbfb7606331a1e3470249ca2f9f3245752197fd542ae0dbaa0d634d0ae9d44981f6be497f4ef69fc0eee7be0741e3c190fab37620bb40efad2071f993b7a72f5021b2a9e5d7ef7056eee3ec7c712175afce20a8eabe29e68c920a6b228fd98a79d8f08274a74bf291f51259f3b2b40626e652d107bb29212799712d569af740b3c50c301d7863c81288eef45c6835fdaef5621b4b5d3d389264ca397619f65d509bbe5f1973cd763c1931fb07e02d5298841ee033580b2658d81448caad691380e2d094ca6fb2c19f5d7c54eb1f0f8f09c5d1a671c23730de62e1628520d15163db4b5c9dd9221a6793d8d352e47f9d574d4b22bc8226351af5f57a507405fcb722543e6ac91ed8d4fa2081464086eb14a09fc1841322c5d5e2c264fb5d8aeed933c52d0bf3e0c94b45813040247852259ce91171f04b73cb9cd496e4f34c7bd6cde93f4eba6abd1690578ede654b067180f7a1bdf084a45334d19c5a1e44d9473ce70d11217603f5bcb22f13c6bbbdb8fc55f3d59b96e4f7e6ec517bd23121c160db009194fcfba7c31e4795942668b24fe8c7127ae85d79cecbcef8071889a3ff2a6de4e1fd72bca1dd91d0a48cfd671561ff93343ce846e5789b47b478b8c1788ca3c2237f6798bb3536f16f747869e13ad05e226fd4a4a20b27b8670607917bd3478c93471120eb86093ce0f017df2ec1109afb51f6a387e38c4f21833c1f0a05075f38ca618c4f0d00ae772a8fced3d1f2edf09e04b6fddbe9345c71eb3ca1dacd6579f3509be450f311caf8751c682397814f512fa92ded60d4f74afcb0d6b11abda5105efea4719d58dcebe4fd90aa2e57e0b968e0d48dce0e677eb529e58bfd4001e0d9fe8a25346449bae16112c1ccdd6bd0656174710139e6bbecc87f03563773251963261b98a20d41c2f27206dae131809cdc0fb14666d448c63ac833ed70e1e016fcd64578e46cc133766d67badfafb11ba7cc5712456dfc17d821dfb7cc9deba6d6d931c3e5dd6222c18e2cf805d602d87f71336927c6429787d35e64240996fe4f7dc0bdb503bd46f85e20b25afa77bdf462d7133baf152238e993d3432446f0e45991ebb27ba37a4f7ce8ccea98bb956c4100fd5183eb5b61f99a80301000000010000000000000000000000000000000000000000000000000000000000000000ffffffff31023127005a2d4e4f4d50212068747470733a2f2f6769746875622e636f6d2f6a6f7368756179616275742f7a2d6e6f6d70ffffffff02c3656d29010000001976a91457bc5e7e48328d84194f57667425ae26357bfb3a88ac80969800000000001976a914cc9fee1128f4cfe550cf6a30e76fe9fc7804a0ba88ac00000000010000000145792ef0882bf2cc97827d4b25211ae8c40daf0ccee1bbcef6dda82c62f420a6000000006a473044022019ae8bddd7c6605c770c4c570eb6773ff1c590b62d8d9d2da6b0d1f3b08c1a9e02203084cbb536b52af89024b24d6ec2d18b748a9be37a71480e1e976fe9afed91840121021e75588e72a450e155ee7847afd136759a24680562e57dc208c4bf1793d73d7ffeffffff3ce0ad7501000000001976a914f73cb27f2f92294e86a108fcd68ea73af2d1080788ac86febe00000000001976a9146f108c188b5007b607d191d34aa825c23fad6e3488ac17452002000000001976a91486eba783cd90484614a6dcb7c00a0299ddc0687388acc8741a01000000001976a914bdb8a9b676fe11bc1e4614aec1e5751c62d6788c88acc9730301000000001976a9149238fa8aaa94f94e3cdbc29939b2a35b01a960a888acefe0c804000000001976a91454058d2ae49b5b14eda41b2e1ca3cdcf80c9e54f88ac444cc608000000001976a914612130d2320415c3435297ea971aa2573375649c88acf550c200000000001976a914fe581bcc5d2230cb82405052b1fec4064616aa7c88acc0614b01000000001976a914b846c937e9c5e4d6b0fa27ec3f05ef8a47e6889688ac5f4eaa00000000001976a914ad1b69aec152214e7e4d210155c55b0eaf9e431d88acbfe30002000000001976a914e8752ee36b50a68a5666acc9b61452cf8157700b88ac3b3ed800000000001976a9147d65987cba70bcf4746be097a873ad369e1402f788ac832a4506000000001976a91448ad203811322f400d29083bdb1c2a970ff29d1288ac92279e01000000001976a914e6ee0c4d2c2abc9d43d5fb9fa592682064be2adf88ac5c4c6803000000001976a9146a924043b62b1685d47982491e7b3c7a1b1a38bd88ac0277f000000000001976a91488b182efc126a70e16b66e9c3e689bf8786243d088ac5627b300000000001976a914b42586cc644dc660007a787d734edadcb0ad956f88ac14c01101000000001976a914440e83611500fe554094023a1cce72959f05f32d88aca128b800000000001976a914dd0ea3fbf74f48a7bdafa618244806acbe0d517588ace51e3508000000001976a9140dfcba5a588f4468cc774cb319a48e57abe71cff88ac8f0d3504000000001976a914c919839c9bd3e61a7bc2e23c79a3b848b219dd7288ac34a68e04000000001976a9145b7cd317cfb23b47c07c373379a8bb50bcb4bd8088ac3bcc0001000000001976a914ceb8712840da5222efdef888144fde7f5cf9173888ac59523101000000001976a91481c13d590093a2847a442a92485785df629984f488aca540b101000000001976a91494f87418f9207e0e6f0805f94efe3e06c1597e1e88ac5d26034a090000001976a914f1c56a073de98711f8f5e31f58622b48c3d42e0788ac8136c802000000001976a914fd6b52f7de0fa28c0a5d1e2ca006363ebe7f418488ace8bc3401000000001976a914521365158d02eb30ea2041015987119df7dc09d688ac9d1c5102000000001976a9142a79d35b60303bae1c0e397e8f9b87e2fea88dab88acc78cdf00000000001976a9143187d18ba7c4a5e8024dd5b1678be281d939706588acfca8f001000000001976a914015ccc6b621ebbf316ed6be6be1f14339afc32e188ac1f8a8301000000001976a91418e064dff196933006cdb18eba4dc2af1246aff588acaca40a01000000001976a9142510e3e23e0214f33d443d8cfa8e8237c4d0cd6d88acbd3e7203000000001976a914b58804f9fb14b3be47beb4ea4678af5f6b653cb988acd93e9e03000000001976a9147816a5327a44045808aff135884fdd598b06087e88aca69d5a02000000001976a9146817832cead1e4dafb1f306f88221e006b03640088ac3114fd04000000001976a914dabcdbea7d95c29f32ca61fcdf429adac551b10f88ac4d715e15000000001976a914a0f5a5e258cc068f0e5a855ebc05bc465913cd9b88ac2ee7cd00000000001976a914ff4214072578da90b21c37c2cfeeb08573fdc46a88ac2c571e02000000001976a914154360b9aa74405e1a76cbd03415cb9a02f3ca5b88ac7dc59f02000000001976a9148f0b89be27850f7d6ee4ba943f5b8dbb8bc7434188acec02d201000000001976a914369169190becf18342e037ac05579964aa28640288ac95cff001000000001976a91478bbef2eb2b60c0deffd39fbcc061a552432859088acc1dd320a000000001976a914df02cf9c511dfca6d38779d183d024bfd6c4163088acbd975e09000000001976a9148e5701942305c2a1c5cc2121e44c195d0b46744488ac04cb410e000000001976a914469ef64a0673b2f41b8e0021bf8d62c2ee65124a88ac7d022808000000001976a914b5c696207b855adcdc8a14ff22a103a5cbb9140888ac07aa3412000000001976a9147ec5688a7000fb5b1afd12ac4e211b5345ae37ea88ac256feb16000000001976a914cf82e1fb881e376b7e7498e49e909dd3862d2fed88ace8cd9008000000001976a914afca38105bb85adba80864de0d82604dca18e35288acc62b160c000000001976a9148f8f0c2105c0ff6d784ffda5ddfb57781745f46d88acf49e2708000000001976a91477d1ba5dba345b31c327c1662b36750cde20b04b88acdd856302000000001976a9144735dc62837157f28df040af1de57c02e34efce388ac6a793406000000001976a91474e23160d629125fcae27cee6ad01f93527ec78f88ac72ba8f08000000001976a9147dc8434480550516ceb1134d20e294e10a30fcb588acde43d804000000001976a914d0a7e91f63be1e7b8cb22e783d232eb578f801cf88acb32fc420000000001976a9142f681e4913a1e7b684141f175e56cd10c699b09388ac915f1805000000001976a9142e1523ba4cc2940e21b3ae3ba0cb13e743c84af188acdb1d8404000000001976a914a2633a4b99da50b8613bcbc4f6396d8c3a15028988acd91fa104000000001976a91458275c2c1782c029fd165fbc05c2fc4f2e7a1f9188ac262700000100000001f087db6323b732e127ad02ebeaed5bd3c3dd99ca00af0d73e2aef037bf2931e7000000006b483045022100fbfd9080dec7fb58525ccc5ab24c61e705ac34464935a53686ec0350b53ebcb402204dee1d356cb44690a1f8a5e1d119555b4a7e75264b1c579737a443ae123e3542012103d284a61e5fec14fd67a31a06fe34c0d02b5a355cf73938685a2ef5add4f9004efeffffff083accfa15000000001976a9147bc00ed80eba267fd056183b54df7d4c9d27759488ac2ec91b2c000000001976a9149cd056d39d38908b2c83c782964cef703f1a879e88ac7a2e1f24000000001976a914c7075fc6b5e08c1209048d5a9e91772db8971de888ac1e8da124000000001976a91484ba687063b2e739d9efd042c78c70ef43d427cc88accab5ce1f000000001976a9143c70d3abe37761f39a3b05f7baebe26d7d5a84f288ac3e02f660000000001976a9145166b403e1c6215b2d034df7a8867839e6da5dd488ac9d34a80a000000001976a914d84015d77fdb088b35ced6ed1609fa6be2da2d0688ac4dec4312000000001976a914dcba0153332a56a7fbfe9d9aad25d951a00d42c488ac26270000"), SER_NETWORK, PROTOCOL_VERSION);
stream >> block;
CBloomFilter filter(10, 0.000001, 0, BLOOM_UPDATE_NONE);
// Match the generation pubkey
filter.insert(ParseHex("57bc5e7e48328d84194f57667425ae26357bfb3a"));
// ...and the output address of the 2nd transaction
filter.insert(ParseHex("f73cb27f2f92294e86a108fcd68ea73af2d10807"));
CMerkleBlock merkleBlock(block, filter);
BOOST_CHECK(merkleBlock.header.GetHash() == block.GetHash());
// We shouldn't match any outpoints (UPDATE_NONE)
BOOST_CHECK(!filter.contains(COutPoint(uint256S("0x67367329779f977cfcdd678da283cc2a7cbe354f3397117f2d9dd51dadb786d5"), 0)));
BOOST_CHECK(!filter.contains(COutPoint(uint256S("0x005d7aeb6e7a8705c970119187b22b9c03553b0b6ecddd48253b53f8c84feabe"), 0)));
}
static std::vector<unsigned char> RandomData()
{
uint256 r = InsecureRand256();
return std::vector<unsigned char>(r.begin(), r.end());
}
BOOST_AUTO_TEST_CASE(rolling_bloom)
{
SeedInsecureRand(/* deterministic */ true);
g_mock_deterministic_tests = true;
// last-100-entry, 1% false positive:
CRollingBloomFilter rb1(100, 0.01);
// Overfill:
static const int DATASIZE=399;
std::vector<unsigned char> data[DATASIZE];
for (int i = 0; i < DATASIZE; i++) {
data[i] = RandomData();
rb1.insert(data[i]);
}
// Last 100 guaranteed to be remembered:
for (int i = 299; i < DATASIZE; i++) {
BOOST_CHECK(rb1.contains(data[i]));
}
// false positive rate is 1%, so we should get about 100 hits if
// testing 10,000 random keys. We get worst-case false positive
// behavior when the filter is as full as possible, which is
// when we've inserted one minus an integer multiple of nElement*2.
unsigned int nHits = 0;
for (int i = 0; i < 10000; i++) {
if (rb1.contains(RandomData()))
++nHits;
}
// Expect about 100 hits
BOOST_CHECK_EQUAL(nHits, 75);
BOOST_CHECK(rb1.contains(data[DATASIZE-1]));
rb1.reset();
BOOST_CHECK(!rb1.contains(data[DATASIZE-1]));
// Now roll through data, make sure last 100 entries
// are always remembered:
for (int i = 0; i < DATASIZE; i++) {
if (i >= 100)
BOOST_CHECK(rb1.contains(data[i-100]));
rb1.insert(data[i]);
BOOST_CHECK(rb1.contains(data[i]));
}
// Insert 999 more random entries:
for (int i = 0; i < 999; i++) {
std::vector<unsigned char> d = RandomData();
rb1.insert(d);
BOOST_CHECK(rb1.contains(d));
}
// Sanity check to make sure the filter isn't just filling up:
nHits = 0;
for (int i = 0; i < DATASIZE; i++) {
if (rb1.contains(data[i]))
++nHits;
}
// Expect about 5 false positives
BOOST_CHECK_EQUAL(nHits, 6);
// last-1000-entry, 0.01% false positive:
CRollingBloomFilter rb2(1000, 0.001);
for (int i = 0; i < DATASIZE; i++) {
rb2.insert(data[i]);
}
// ... room for all of them:
for (int i = 0; i < DATASIZE; i++) {
BOOST_CHECK(rb2.contains(data[i]));
}
g_mock_deterministic_tests = false;
}
BOOST_AUTO_TEST_SUITE_END()