Logs

乙太坊如何使用布隆過濾器?

  • October 9, 2017

如黃皮書所述:

**交易收據。**為了對有關交易的資訊進行編碼,可能有助於形成零知識證明或索引和搜尋,我們對每筆交易的收據進行編碼,其中包含有關其執行的某些資訊。每張收據,記為 BR

$$ i $$對於第 i 個事務)被放置在一個索引鍵的 trie 中,並且根記錄在頭中作為 He。 交易收據是四個項目的元組,包括交易後狀態,R,包含交易收據的區塊中使用的累積氣體,在交易發生後,Ru,通過執行交易創建的日誌集, Rl 和由這些日誌中的資訊組成的布隆過濾器, Rb:

R = (R;Ru;Rb;Rl)

任何人都可以詳細說明這個Rl(日誌)的結構以及Rb(bloom 過濾器)是如何建構的嗎?

我一直在對布隆過濾器進行一些研究,Broder 和 Mitzenmacher指出:

無論在哪裡使用列表或集合,並且空間非常寶貴,如果可以減輕誤報的影響,請考慮使用布隆過濾器。

那麼這與乙太坊的設計理性有什麼關係呢?

必須輕鬆搜尋乙太坊系統中的事件,以便應用程序可以過濾和顯示事件,包括歷史事件,而不會產生過多的成本。同時,儲存空間很昂貴,所以我們不想儲存很多重複的數據——比如事務列表,以及它們生成的日誌。存在日誌布隆過濾器來解決此問題。

當生成或驗證一個塊時,任何日誌記錄合約的地址,以及通過執行這些事務生成的日誌中的所有索引欄位都將添加到布隆過濾器中,該過濾器包含在塊頭中。實際日誌不包含在塊數據中,以節省空間。

當應用程序想要從給定合約或特定索引欄位(或兩者)中查找所有日誌條目時,節點可以快速掃描每個塊的標題,檢查布隆過濾器以查看它是否可能包含相關日誌。如果是,則節點重新執行該塊中的事務,重新生成日誌,並將相關的日誌返回給應用程序。

引用自:https://ethereum.stackexchange.com/questions/3418