core, trie: new trie
This commit is contained in:
@ -90,15 +90,13 @@ type StateObject struct {
|
||||
|
||||
func NewStateObject(address common.Address, db ethdb.Database) *StateObject {
|
||||
object := &StateObject{db: db, address: address, balance: new(big.Int), gasPool: new(big.Int), dirty: true}
|
||||
object.trie = trie.NewSecure((common.Hash{}).Bytes(), db)
|
||||
object.trie, _ = trie.NewSecure(common.Hash{}, db)
|
||||
object.storage = make(Storage)
|
||||
object.gasPool = new(big.Int)
|
||||
|
||||
return object
|
||||
}
|
||||
|
||||
func NewStateObjectFromBytes(address common.Address, data []byte, db ethdb.Database) *StateObject {
|
||||
// TODO clean me up
|
||||
var extobject struct {
|
||||
Nonce uint64
|
||||
Balance *big.Int
|
||||
@ -107,7 +105,13 @@ func NewStateObjectFromBytes(address common.Address, data []byte, db ethdb.Datab
|
||||
}
|
||||
err := rlp.Decode(bytes.NewReader(data), &extobject)
|
||||
if err != nil {
|
||||
fmt.Println(err)
|
||||
glog.Errorf("can't decode state object %x: %v", address, err)
|
||||
return nil
|
||||
}
|
||||
trie, err := trie.NewSecure(extobject.Root, db)
|
||||
if err != nil {
|
||||
// TODO: bubble this up or panic
|
||||
glog.Errorf("can't create account trie with root %x: %v", extobject.Root[:], err)
|
||||
return nil
|
||||
}
|
||||
|
||||
@ -115,11 +119,10 @@ func NewStateObjectFromBytes(address common.Address, data []byte, db ethdb.Datab
|
||||
object.nonce = extobject.Nonce
|
||||
object.balance = extobject.Balance
|
||||
object.codeHash = extobject.CodeHash
|
||||
object.trie = trie.NewSecure(extobject.Root[:], db)
|
||||
object.trie = trie
|
||||
object.storage = make(map[string]common.Hash)
|
||||
object.gasPool = new(big.Int)
|
||||
object.code, _ = db.Get(extobject.CodeHash)
|
||||
|
||||
return object
|
||||
}
|
||||
|
||||
|
@ -49,12 +49,20 @@ type StateDB struct {
|
||||
|
||||
// Create a new state from a given trie
|
||||
func New(root common.Hash, db ethdb.Database) *StateDB {
|
||||
trie := trie.NewSecure(root[:], db)
|
||||
return &StateDB{root: root, db: db, trie: trie, stateObjects: make(map[string]*StateObject), refund: new(big.Int), logs: make(map[common.Hash]Logs)}
|
||||
}
|
||||
|
||||
func (self *StateDB) PrintRoot() {
|
||||
self.trie.Trie.PrintRoot()
|
||||
tr, err := trie.NewSecure(root, db)
|
||||
if err != nil {
|
||||
// TODO: bubble this up
|
||||
tr, _ = trie.NewSecure(common.Hash{}, db)
|
||||
glog.Errorf("can't create state trie with root %x: %v", root[:], err)
|
||||
}
|
||||
return &StateDB{
|
||||
root: root,
|
||||
db: db,
|
||||
trie: tr,
|
||||
stateObjects: make(map[string]*StateObject),
|
||||
refund: new(big.Int),
|
||||
logs: make(map[common.Hash]Logs),
|
||||
}
|
||||
}
|
||||
|
||||
func (self *StateDB) StartRecord(thash, bhash common.Hash, ti int) {
|
||||
@ -304,7 +312,7 @@ func (self *StateDB) Set(state *StateDB) {
|
||||
}
|
||||
|
||||
func (s *StateDB) Root() common.Hash {
|
||||
return common.BytesToHash(s.trie.Root())
|
||||
return s.trie.Hash()
|
||||
}
|
||||
|
||||
// Syncs the trie and all siblings
|
||||
@ -348,7 +356,7 @@ func (self *StateDB) SyncIntermediate() {
|
||||
|
||||
// SyncObjects syncs the changed objects to the trie
|
||||
func (self *StateDB) SyncObjects() {
|
||||
self.trie = trie.NewSecure(self.root[:], self.db)
|
||||
self.trie, _ = trie.NewSecure(self.root, self.db)
|
||||
|
||||
self.refund = new(big.Int)
|
||||
|
||||
|
@ -17,8 +17,9 @@
|
||||
package types
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
|
||||
"github.com/ethereum/go-ethereum/common"
|
||||
"github.com/ethereum/go-ethereum/ethdb"
|
||||
"github.com/ethereum/go-ethereum/rlp"
|
||||
"github.com/ethereum/go-ethereum/trie"
|
||||
)
|
||||
@ -29,12 +30,12 @@ type DerivableList interface {
|
||||
}
|
||||
|
||||
func DeriveSha(list DerivableList) common.Hash {
|
||||
db, _ := ethdb.NewMemDatabase()
|
||||
trie := trie.New(nil, db)
|
||||
keybuf := new(bytes.Buffer)
|
||||
trie := new(trie.Trie)
|
||||
for i := 0; i < list.Len(); i++ {
|
||||
key, _ := rlp.EncodeToBytes(uint(i))
|
||||
trie.Update(key, list.GetRlp(i))
|
||||
keybuf.Reset()
|
||||
rlp.Encode(keybuf, uint(i))
|
||||
trie.Update(keybuf.Bytes(), list.GetRlp(i))
|
||||
}
|
||||
|
||||
return common.BytesToHash(trie.Root())
|
||||
return trie.Hash()
|
||||
}
|
||||
|
Reference in New Issue
Block a user