c775dc4a94
254c85b687bench: Benchmark GCS filter creation and matching. (Jim Posen)f33b717a85blockfilter: Optimization on compilers with int128 support. (Jim Posen)97b64d67dablockfilter: Unit test against BIP 158 test vectors. (Jim Posen)a4afb9cadbblockfilter: Additional helper methods to compute hash and header. (Jim Posen)cd09c7925bblockfilter: Serialization methods on BlockFilter. (Jim Posen)c1855f6052blockfilter: Construction of basic block filters. (Jim Posen)53e7874e07blockfilter: Simple test for GCSFilter construction and Match. (Jim Posen)558c536e35blockfilter: Implement GCSFilter Match methods. (Jim Posen)cf70b55005blockfilter: Implement GCSFilter constructors. (Jim Posen)c454f0ac63blockfilter: Declare GCSFilter class for BIP 158 impl. (Jim Posen)9b622dc722streams: Unit tests for BitStreamReader and BitStreamWriter. (Jim Posen)fe943f99bfstreams: Implement BitStreamReader/Writer classes. (Jim Posen)87f2d9ee43streams: Unit test for VectorReader class. (Jim Posen)947133dec9streams: Create VectorReader stream interface for vectors. (Jim Posen) Pull request description: This implements the compact block filter construction in [BIP 158](https://github.com/bitcoin/bips/blob/master/bip-0158.mediawiki). The code is not used anywhere in the Bitcoin Core code base yet. The next step towards [BIP 157](https://github.com/bitcoin/bips/blob/master/bip-0157.mediawiki) support would be to create an indexing module similar to `TxIndex` that constructs the basic and extended filters for each validated block. ### Filter Sizes [Here](https://gateway.ipfs.io/ipfs/QmRqaAAQZ5ZX5eqxP7J2R1MzFrc2WDdKSWJEKtQzyawqog) is a CSV of filter sizes for blocks in the main chain. As you can see below, the ratio of filter size to block size drops after the first ~150,000 blocks:  The reason for the relatively large filter sizes is that Golomb-coded sets only achieve good compression with a sufficient number of elements. Empirically, the average element size with 100 elements is 14% larger than with 10,000 elements. The ratio of filter size to block size is computed without witness data for basic filters. Here is a summary table of filter size ratios *for blocks after height 150,000*: | Stat | Filter Type | |-------|--------------| | Weighted Size Ratio Mean | 0.0198 | | Size Ratio Mean | 0.0224 | | Size Ratio Std Deviation | 0.0202 | | Mean Element Size (bits) | 21.145 | | Approx Theoretical Min Element Size (bits) | 21.025 | Tree-SHA512: 2d045fbfc3fc45490ecb9b08d2f7e4dbbe7cd8c1c939f06bbdb8e8aacfe4c495cdb67c820e52520baebbf8a8305a0efd8e59d3fa8e367574a4b830509a39223f