aboutsummaryrefslogtreecommitdiffstats
path: root/eth/backend.go
diff options
context:
space:
mode:
authorJeffrey Wilcke <geffobscura@gmail.com>2015-10-12 23:58:51 +0800
committerJeffrey Wilcke <geffobscura@gmail.com>2015-10-17 03:28:59 +0800
commit6dc14788a238f3e0ec786c6c04d476a3b957e645 (patch)
tree8f3f5f91506bc4c7532543043add1eaea3fd28e7 /eth/backend.go
parent30f057aaf9891fb37f82d94c24b8aa35d388e07b (diff)
downloadgo-tangerine-6dc14788a238f3e0ec786c6c04d476a3b957e645.tar
go-tangerine-6dc14788a238f3e0ec786c6c04d476a3b957e645.tar.gz
go-tangerine-6dc14788a238f3e0ec786c6c04d476a3b957e645.tar.bz2
go-tangerine-6dc14788a238f3e0ec786c6c04d476a3b957e645.tar.lz
go-tangerine-6dc14788a238f3e0ec786c6c04d476a3b957e645.tar.xz
go-tangerine-6dc14788a238f3e0ec786c6c04d476a3b957e645.tar.zst
go-tangerine-6dc14788a238f3e0ec786c6c04d476a3b957e645.zip
core, eth/filters, miner, xeth: Optimised log filtering
Log filtering is now using a MIPmap like approach where addresses of logs are added to a mapped bloom bin. The current levels for the MIP are in ranges of 1.000.000, 500.000, 100.000, 50.000, 1.000. Logs are therefor filtered in batches of 1.000.
Diffstat (limited to 'eth/backend.go')
-rw-r--r--eth/backend.go46
1 files changed, 46 insertions, 0 deletions
diff --git a/eth/backend.go b/eth/backend.go
index 83eefca5b..f703b4ac0 100644
--- a/eth/backend.go
+++ b/eth/backend.go
@@ -47,6 +47,7 @@ import (
"github.com/ethereum/go-ethereum/p2p"
"github.com/ethereum/go-ethereum/p2p/discover"
"github.com/ethereum/go-ethereum/p2p/nat"
+ "github.com/ethereum/go-ethereum/rlp"
"github.com/ethereum/go-ethereum/whisper"
)
@@ -288,6 +289,9 @@ func New(config *Config) (*Ethereum, error) {
if err := upgradeChainDatabase(chainDb); err != nil {
return nil, err
}
+ if err := addMipmapBloomBins(chainDb); err != nil {
+ return nil, err
+ }
dappDb, err := newdb(filepath.Join(config.DataDir, "dapp"))
if err != nil {
@@ -769,3 +773,45 @@ func upgradeChainDatabase(db ethdb.Database) error {
}
return nil
}
+
+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
+}