diff --git a/core/bloombits/generator.go b/core/bloombits/generator.go index 04a7f5146..540085450 100644 --- a/core/bloombits/generator.go +++ b/core/bloombits/generator.go @@ -49,21 +49,24 @@ func NewGenerator(sections uint) (*Generator, error) { // AddBloom takes a single bloom filter and sets the corresponding bit column // in memory accordingly. -func (b *Generator) AddBloom(bloom types.Bloom) error { +func (b *Generator) AddBloom(index uint, bloom types.Bloom) error { // Make sure we're not adding more bloom filters than our capacity if b.nextBit >= b.sections { return errSectionOutOfBounds } + if b.nextBit != index { + return errors.New("bloom filter with unexpected index") + } // Rotate the bloom and insert into our collection - byteMask := b.nextBit / 8 + byteIndex := b.nextBit / 8 bitMask := byte(1) << byte(7-b.nextBit%8) for i := 0; i < types.BloomBitLength; i++ { - bloomByteMask := types.BloomByteLength - 1 - i/8 + bloomByteIndex := types.BloomByteLength - 1 - i/8 bloomBitMask := byte(1) << byte(i%8) - if (bloom[bloomByteMask] & bloomBitMask) != 0 { - b.blooms[i][byteMask] |= bitMask + if (bloom[bloomByteIndex] & bloomBitMask) != 0 { + b.blooms[i][byteIndex] |= bitMask } } b.nextBit++ diff --git a/core/bloombits/generator_test.go b/core/bloombits/generator_test.go index f4aa9551c..f9bcef96e 100644 --- a/core/bloombits/generator_test.go +++ b/core/bloombits/generator_test.go @@ -44,7 +44,7 @@ func TestGenerator(t *testing.T) { t.Fatalf("failed to create bloombit generator: %v", err) } for i, bloom := range input { - if err := gen.AddBloom(bloom); err != nil { + if err := gen.AddBloom(uint(i), bloom); err != nil { t.Fatalf("bloom %d: failed to add: %v", i, err) } } diff --git a/eth/bloombits.go b/eth/bloombits.go index 02de408b0..32f6c7b31 100644 --- a/eth/bloombits.go +++ b/eth/bloombits.go @@ -122,7 +122,7 @@ func (b *BloomIndexer) Reset(section uint64) { // Process implements core.ChainIndexerBackend, adding a new header's bloom into // the index. func (b *BloomIndexer) Process(header *types.Header) { - b.gen.AddBloom(header.Bloom) + b.gen.AddBloom(uint(header.Number.Uint64()-b.section*b.size), header.Bloom) b.head = header.Hash() } diff --git a/eth/filters/bench_test.go b/eth/filters/bench_test.go index d994378fc..abbf4593e 100644 --- a/eth/filters/bench_test.go +++ b/eth/filters/bench_test.go @@ -98,7 +98,7 @@ func benchmarkBloomBits(b *testing.B, sectionSize uint64) { if header == nil { b.Fatalf("Error creating bloomBits data") } - bc.AddBloom(header.Bloom) + bc.AddBloom(uint(i-sectionIdx*sectionSize), header.Bloom) } sectionHead := core.GetCanonicalHash(db, (sectionIdx+1)*sectionSize-1) for i := 0; i < types.BloomBitLength; i++ {