Transactions

布隆過濾器中究竟包含什麼?

  • June 9, 2017

交易收據布隆過濾器中究竟包含哪些地址?我知道收據日誌中的每個“地址”都包括在內(事件簽名和索引事件參數也是如此)。

我有信心(但好奇我是否正確)交易中的tofrom地址不在收據的布隆過濾器中。

我也有信心(但再次好奇)事務可能“呼叫”到的任何地址包含在布隆過濾器中(在Parity–not sure about上geth)。

我不知道“contractAddress”欄位是否包含在合約創建中,也不知道是否包含獲勝礦工的地址。

是否有明確的文件(除了對布隆過濾器的極其困難的一段黃皮書描述)可以準確解釋哪些地址正在布隆,哪些不在布隆中?

[我必須查看此程式碼,因此如果以下內容不完整,您可能需要進一步探勘。(我我已經正確地遵循了。)這是 Geth 的實現。]

通過bloom9.go將接收日誌傳遞到CreateBloom().

func CreateBloom(receipts Receipts) Bloom {
   bin := new(big.Int)
   for _, receipt := range receipts {
       bin.Or(bin, LogsBloom(receipt.Logs))
   }

   return BytesToBloom(bin.Bytes())
}

從這里通用呼叫鍊是LogsBloom()-> bloom9()-> Keccak256(),可以在同一個文件中遵循。

這些函式中的第一個向我們展示了內容:日誌地址和主題列表。

func LogsBloom(logs []*Log) *big.Int {
   bin := new(big.Int)
   for _, log := range logs {
       bin.Or(bin, bloom9(log.Address.Bytes()))
       for _, b := range log.Topics {
           bin.Or(bin, bloom9(b[:]))
       }
   }

   return bin
}

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