Wallet

BIP 37 自動過濾器更新不插入輸出

  • May 12, 2021

使用getdata消息時,我遇到了布隆過濾器問題。

據我了解 BIP 37,使用設置了標誌BLOOM_UPDATE_P2PUBKEY_ONLY的****loadfilter消息在連接上設置布隆過濾器,響應客戶端會自動將所有出點(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)
  1. 向錢包發送包含交易的所有區塊的雜湊值的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 表示僅當匹配的交易是 pay-to-pubkey 或裸 multisig,而不是 p2pkh 或其他時,才使用 outpoints 更新過濾器。我不知道為什麼,因為您嘗試做的事情很常見。

您可能還對比特幣 XT 中的這項工作感興趣,它允許使用匹配交易的任何未確認祖先更新過濾器(以更好地評估其確認前景)。

引用自:https://bitcoin.stackexchange.com/questions/43989