Автоматическое обновление фильтра BIP 37 не вставляет выходные данные

У меня проблема с фильтрами Блума при использовании сообщения getdata .

Насколько я понимаю BIP 37, устанавливая фильтр Блума на соединение с помощью сообщения loadfilter с установленным флагом BLOOM_UPDATE_P2PUBKEY_ONLY , отвечающий клиент автоматически вставляет все точки выхода (TXID и выходной индекс) в фильтр Блума транзакций, соответствующих фильтру. Однако, когда я пытаюсь сделать именно это, узел только когда-либо отправляет транзакции, содержащие выходные данные, НА адрес, который я фильтрую, и никогда не отправляет транзакции, содержащие выходные данные ОТ адреса, для которого я фильтрую.

Мой подход заключается в следующем:

  1. Добавьте в фильтр Блума следующий открытый ключ: 1JbFvyaMyHHmvvjc54h4YARq3uoX2ZZ4Qj (выбирается случайным образом).
  2. Отправьте сообщение 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)
    
  3. Отправьте сообщение 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?

Ответы (1)

BLOOM_UPDATE_P2PUBKEY_ONLY означает, что фильтр обновляется только с помощью outpoints, когда совпадающая транзакция является pay-to-pubkey или голой мультиподписью, а не p2pkh или другими. Я не знаю, почему, хотя то, что вы пытаетесь сделать, очень распространено.

Вас также может заинтересовать эта работа в Bitcoin XT, которая позволяет обновлять фильтр с любыми неподтвержденными предками соответствующей транзакции (чтобы лучше оценить перспективы ее подтверждения).

Большое спасибо. Я не заметил, что там написано P2PUBKEY, а не P2PUBKEYHASH. Глупо с моей стороны.