diff options
author | obscuren <geffobscura@gmail.com> | 2014-10-27 18:22:27 +0800 |
---|---|---|
committer | obscuren <geffobscura@gmail.com> | 2014-10-27 18:22:27 +0800 |
commit | 6623500c6b2e5fe9fa41a1ce75269955af6026e8 (patch) | |
tree | d866b09235dae04cc83993ca2eb0987c578b0a17 /ethchain | |
parent | 08c26ab8b0142778393924211188f0d06deef0ce (diff) | |
download | dexon-6623500c6b2e5fe9fa41a1ce75269955af6026e8.tar.gz dexon-6623500c6b2e5fe9fa41a1ce75269955af6026e8.tar.zst dexon-6623500c6b2e5fe9fa41a1ce75269955af6026e8.zip |
Implemented new bloom filter. Closes #156
Diffstat (limited to 'ethchain')
-rw-r--r-- | ethchain/bloom9.go | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/ethchain/bloom9.go b/ethchain/bloom9.go new file mode 100644 index 000000000..eef0a9d3f --- /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 +} |