diff --git a/ethchain/bloom9.go b/ethchain/bloom9.go new file mode 100644 index 0000000000..eef0a9d3fb --- /dev/null +++ b/ethchain/bloom9.go @@ -0,0 +1,38 @@ +package ethchain + +import "github.com/ethereum/go-ethereum/vm" + +func CreateBloom(txs Transactions) uint64 { + var bin uint64 + for _, tx := range txs { + bin |= logsBloom(tx.logs) + } + + return bin +} + +func logsBloom(logs []vm.Log) uint64 { + var bin uint64 + for _, log := range logs { + data := []byte{log.Address} + for _, topic := range log.Topics { + data = append(data, topic.Bytes()) + } + data = append(data, log.Data) + + for _, b := range data { + bin |= bloom9(b) + } + } + + return bin +} + +func bloom9(b []byte) uint64 { + var r uint64 + for _, i := range []int{0, 2, 4} { + r |= 1 << (b[i+1] + 256*(b[i]&1)) + } + + return r +}