예제 #1
0
// Run filters logs with the current parameters set
func (self *Filter) Find() vm.Logs {
	latestBlock := core.GetBlock(self.db, core.GetHeadBlockHash(self.db))
	var beginBlockNo uint64 = uint64(self.begin)
	if self.begin == -1 {
		beginBlockNo = latestBlock.NumberU64()
	}
	var endBlockNo uint64 = uint64(self.end)
	if self.end == -1 {
		endBlockNo = latestBlock.NumberU64()
	}

	// if no addresses are present we can't make use of fast search which
	// uses the mipmap bloom filters to check for fast inclusion and uses
	// higher range probability in order to ensure at least a false positive
	if len(self.addresses) == 0 {
		return self.getLogs(beginBlockNo, endBlockNo)
	}
	return self.mipFind(beginBlockNo, endBlockNo, 0)
}
예제 #2
0
func addMipmapBloomBins(db ethdb.Database) (err error) {
	const mipmapVersion uint = 2

	// check if the version is set. We ignore data for now since there's
	// only one version so we can easily ignore it for now
	var data []byte
	data, _ = db.Get([]byte("setting-mipmap-version"))
	if len(data) > 0 {
		var version uint
		if err := rlp.DecodeBytes(data, &version); err == nil && version == mipmapVersion {
			return nil
		}
	}

	defer func() {
		if err == nil {
			var val []byte
			val, err = rlp.EncodeToBytes(mipmapVersion)
			if err == nil {
				err = db.Put([]byte("setting-mipmap-version"), val)
			}
			return
		}
	}()
	latestBlock := core.GetBlock(db, core.GetHeadBlockHash(db))
	if latestBlock == nil { // clean database
		return
	}

	tstart := time.Now()
	glog.V(logger.Info).Infoln("upgrading db log bloom bins")
	for i := uint64(0); i <= latestBlock.NumberU64(); i++ {
		hash := core.GetCanonicalHash(db, i)
		if (hash == common.Hash{}) {
			return fmt.Errorf("chain db corrupted. Could not find block %d.", i)
		}
		core.WriteMipmapBloom(db, i, core.GetBlockReceipts(db, hash))
	}
	glog.V(logger.Info).Infoln("upgrade completed in", time.Since(tstart))
	return nil
}