У меня проблема с фильтрами Блума при использовании сообщения getdata .
Насколько я понимаю BIP 37, устанавливая фильтр Блума на соединение с помощью сообщения loadfilter с установленным флагом BLOOM_UPDATE_P2PUBKEY_ONLY , отвечающий клиент автоматически вставляет все точки выхода (TXID и выходной индекс) в фильтр Блума транзакций, соответствующих фильтру. Однако, когда я пытаюсь сделать именно это, узел только когда-либо отправляет транзакции, содержащие выходные данные, НА адрес, который я фильтрую, и никогда не отправляет транзакции, содержащие выходные данные ОТ адреса, для которого я фильтрую.
Мой подход заключается в следующем:
Отправьте сообщение filterload , содержащее фильтр (как показано во фрагменте кода wireshark ниже).
Bitcoin protocol
Packet magic: 0xf9beb4d9
Command name: filterload
Payload Length: 261
Payload checksum: 0x2bb02c45
Filterload message
Filter
Count: 251
Data: 000000040004010000000100000000000000020000400000...
nHashFunc: 13
nTweak: 0x1a689ff4
nFlags: BLOOM_UPDATE_P2PUBKEY_ONLY (0x02)
Отправьте сообщение getdata с хешем всех блоков, содержащих транзакции, в кошелек и из кошелька (который я идентифицировал в обозревателе блоков с целью тестирования). Инвентаризации имеют тип MSG_FILTERED_BLOCK .
Узел отвечает следующими сообщениями по порядку:
MerkleBlock: 000000000000000001201ab2679db7c87a432967c060596bad0ac093dac94111
Tx:......... 187b00588e8d7844c405da9a15d78dbd7ebb9b2887fb5aace6651719fede923e
Tx:......... dbbca0d839435ac77db65378a9607d17b0aa965f3027d84dcf0ee5115dc8d32f
Tx:......... 17c12f45956082a913c0c862d573cf067fa5ee96ba5b954914371da6bef51f7f
Tx:......... 36cce25d34a5da0f7d69253743eae7bb7c576e5543d0eb16db0f72967edb4bc6
Tx:......... 6ea48c6286b1691cd1ecec271a3f52a3fe099467bb6c926b41ba8942e21d4aa6
MerkleBlock: 0000000000000000049ee67931f6d4970a7d06b14b8aadd406223ab65efe5025
MerkleBlock: 0000000000000000019f3fc2c8da43e8a81373ae189ace4caec6c59969f46ff6
MerkleBlock: 000000000000000000f67dad206798db2e6c5dffec84d213397784be894e66fa
5 транзакций в списке верны, так как содержат выходные данные, нацеленные на указанный кошелек. Однако блок 0000000000000000019f3... содержит транзакции с входами из указанного кошелька, но за сообщением merkleblock этого блока не следуют эти транзакции. Не должен ли узел добавить выходные данные этих 5 транзакций в фильтр Блума и тем самым сопоставить более поздние транзакции, содержащие входные данные, указывающие на них?
Я подтвердил, что узел владеет соответствующими транзакциями. Если я загружаю фильтр вручную, добавляя выходы самостоятельно, это работает как задумано.
Я неправильно понимаю, как используется BIP 37?
BLOOM_UPDATE_P2PUBKEY_ONLY означает, что фильтр обновляется только с помощью outpoints, когда совпадающая транзакция является pay-to-pubkey или голой мультиподписью, а не p2pkh или другими. Я не знаю, почему, хотя то, что вы пытаетесь сделать, очень распространено.
Вас также может заинтересовать эта работа в Bitcoin XT, которая позволяет обновлять фильтр с любыми неподтвержденными предками соответствующей транзакции (чтобы лучше оценить перспективы ее подтверждения).
Ф. Мэдсен