SPVはブルームフィルターを作成したら、フィルターの詳細をフルノードに伝える必要がある。
SPVはversionメッセージのオプションにあるリレーフラグを0にする。
その後、フルノードにブルームフィルターを伝える。設定コマンドはfilterload
0a4…0940: bit field, variable field
05000000: Hash count, 4bytes, little endian
63000000: Tweak, 4bytes, little-endian
00: Matched item flag
def filterload(self, flag=1): payload = encode_varint(self.size) payload += self.filter_bytes() payload += little_endian_to_int(self.function_count, 4) payload += little_endian_to_int(self.tweak, 4) payload += little_endian_to_int(flag, 1) return GenericMessage(b'filterload', payload)
### マークルブロックの取得
getdataでブルームフィルターを通過するトランザクションを要求する
02: Number of data items(varint)
03000000: Type of data item(tx, block, filtered block, compact block), little endian
30…00: Hash identifier
class GetDataMessage: command = b'getdata' def __int__(self): self.data = [] def add_data(self, data_type, identifier): self.data.append((data_type, identifier)) def serialize(self, identifier): result = encode_varint(len(self.data)) for data_type, identifier in self.data: result += int_to_little_endian(data_type, 4) result += identifier[::-1] return result