対象となるすべてのトランザクションのスーパーセットを作成するのに十分な情報を、軽量クライアントSPVがフルノードに伝える。このスーパーセットを作成するのに、ブルームフィルターを使用する
### ブルームフィルターとは?
対象となり得るすべてのトランザクションを取り出すフィルター
フルノードはブルームフィルターを介してトランザクションを取り扱い、通過するトランザクションに関し、merkleblockコマンドを送信する
=> ハッシュ関数を使用して決定的に数を取得し、モジュロを使用してトランザクションを各入れ物に整理する
集合内の任意のデータに使用可能なコンピュータサイエンスにおける構造
L ビッグエンディアンの整数として解釈し、bit_field_sizeのモジュるを取る
from helper import hash256 bit_field_size = 10 bit_field = [0] * bit_field_size h = hash256(b'hello world') bit = int.from_bytes(h, 'big') % bit_field_size bit_field[bit] = 1 print(bit_field)
$ python3 test.py
[0, 0, 0, 0, 0, 0, 0, 0, 0, 1]
ブルームフィルターの構成要素は
– ビットフィールドのサイズ
– 使用されるハッシュ関数
– 対象の格納先を示すビットフィールド
複数のアイテムを持つブルームフィルター
from helper import hash256 bit_field_size = 10 bit_field = [0] * bit_field_size for item in (b'hello world', b'goodbye'): h = hash256(item) bit = int.from_bytes(h, 'big') % bit_field_size bit_field[bit] = 1 print(bit_field)
ハッシュ関数をh160にすると
from helper import hash256, hash160 bit_field_size = 10 bit_field = [0] * bit_field_size for item in (b'hello world', b'goodbye'): h = hash160(item) bit = int.from_bytes(h, 'big') % bit_field_size bit_field[bit] = 1 print(bit_field)
$ python3 test.py
[1, 1, 0, 0, 0, 0, 0, 0, 0, 0]
複数のブルームフィルターをビットフィールドを大幅に短縮できる
from helper import hash256, hash160 bit_field_size = 10 bit_field = [0] * bit_field_size for item in (b'hello world', b'goodbye'): for hash_function in (hash256, hash160): h = hash_function(item) bit = int.from_bytes(h, 'big') % bit_field_size bit_field[bit] = 1 print(bit_field)
$ python3 test.py
[1, 1, 1, 0, 0, 0, 0, 0, 0, 1]