eth, trie: removed key prefixing from state entries & merge db fix

Fixed database merge strategy to use the correct database. Due to a copy
paste fail when doing type evaluation the same database was being
iterated (chain), all others were ignored.

Removed state prefixing because {H(code): code} is stored in the same
database as the rest of the state.
This commit is contained in:
Jeffrey Wilcke 2015-08-13 20:44:03 +02:00
parent a89cfe92cc
commit b8ca0a830e
3 changed files with 19 additions and 21 deletions

View File

@ -45,7 +45,6 @@ import (
"github.com/ethereum/go-ethereum/p2p" "github.com/ethereum/go-ethereum/p2p"
"github.com/ethereum/go-ethereum/p2p/discover" "github.com/ethereum/go-ethereum/p2p/discover"
"github.com/ethereum/go-ethereum/p2p/nat" "github.com/ethereum/go-ethereum/p2p/nat"
"github.com/ethereum/go-ethereum/trie"
"github.com/ethereum/go-ethereum/whisper" "github.com/ethereum/go-ethereum/whisper"
) )
@ -738,48 +737,53 @@ func mergeDatabases(datadir string, newdb func(path string) (common.Database, er
} }
defer database.Close() defer database.Close()
glog.Infoln("Merging blockchain database...") // Migrate blocks
chainDb, err := newdb(chainPath) chainDb, err := newdb(chainPath)
if err != nil { if err != nil {
return fmt.Errorf("state db err: %v", err) return fmt.Errorf("state db err: %v", err)
} }
defer chainDb.Close() defer chainDb.Close()
if db, ok := chainDb.(*ethdb.LDBDatabase); ok { if chain, ok := chainDb.(*ethdb.LDBDatabase); ok {
it := db.NewIterator() glog.Infoln("Merging blockchain database...")
it := chain.NewIterator()
for it.Next() { for it.Next() {
database.Put(it.Key(), it.Value()) database.Put(it.Key(), it.Value())
} }
it.Release()
} }
glog.Infoln("Merging state database...") // Migrate state
state := filepath.Join(datadir, "state") stateDb, err := newdb(filepath.Join(datadir, "state"))
stateDb, err := newdb(state)
if err != nil { if err != nil {
return fmt.Errorf("state db err: %v", err) return fmt.Errorf("state db err: %v", err)
} }
defer stateDb.Close() defer stateDb.Close()
if db, ok := chainDb.(*ethdb.LDBDatabase); ok { if state, ok := stateDb.(*ethdb.LDBDatabase); ok {
it := db.NewIterator() glog.Infoln("Merging state database...")
it := state.NewIterator()
for it.Next() { for it.Next() {
database.Put(append(trie.StatePre, it.Key()...), it.Value()) database.Put(it.Key(), it.Value())
} }
it.Release()
} }
glog.Infoln("Merging transaction database...") // Migrate transaction / receipts
extra := filepath.Join(datadir, "extra") extraDb, err := newdb(filepath.Join(datadir, "extra"))
extraDb, err := newdb(extra)
if err != nil { if err != nil {
return fmt.Errorf("state db err: %v", err) return fmt.Errorf("state db err: %v", err)
} }
defer extraDb.Close() defer extraDb.Close()
if db, ok := chainDb.(*ethdb.LDBDatabase); ok { if extra, ok := extraDb.(*ethdb.LDBDatabase); ok {
it := db.NewIterator() glog.Infoln("Merging transaction database...")
it := extra.NewIterator()
for it.Next() { for it.Next() {
database.Put(it.Key(), it.Value()) database.Put(it.Key(), it.Value())
} }
it.Release()
} }
return nil return nil

View File

@ -38,8 +38,6 @@ func NewCache(backend Backend) *Cache {
} }
func (self *Cache) Get(key []byte) []byte { func (self *Cache) Get(key []byte) []byte {
key = append(StatePre, key...)
data := self.store[string(key)] data := self.store[string(key)]
if data == nil { if data == nil {
data, _ = self.backend.Get(key) data, _ = self.backend.Get(key)
@ -49,8 +47,6 @@ func (self *Cache) Get(key []byte) []byte {
} }
func (self *Cache) Put(key []byte, data []byte) { func (self *Cache) Put(key []byte, data []byte) {
key = append(StatePre, key...)
self.batch.Put(key, data) self.batch.Put(key, data)
self.store[string(key)] = data self.store[string(key)] = data
} }

View File

@ -27,8 +27,6 @@ import (
"github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/crypto"
) )
var StatePre = []byte("state-")
func ParanoiaCheck(t1 *Trie, backend Backend) (bool, *Trie) { func ParanoiaCheck(t1 *Trie, backend Backend) (bool, *Trie) {
t2 := New(nil, backend) t2 := New(nil, backend)