func NewStateObject(address common.Address, db trie.Database) *StateObject { object := &StateObject{ db: db, address: address, balance: new(big.Int), dirty: true, codeHash: emptyCodeHash, storage: make(Storage), } object.trie, _ = trie.NewSecure(common.Hash{}, db) return object }
// Create a new state from a given trie func New(root common.Hash, db ethdb.Database) (*StateDB, error) { tr, err := trie.NewSecure(root, db) if err != nil { return nil, err } return &StateDB{ db: db, trie: tr, stateObjects: make(map[string]*StateObject), refund: new(big.Int), logs: make(map[common.Hash]vm.Logs), }, nil }
// FastSyncCommitHead sets the current head block to the one defined by the hash // irrelevant what the chain contents were prior. func (self *BlockChain) FastSyncCommitHead(hash common.Hash) error { // Make sure that both the block as well at its state trie exists block := self.GetBlock(hash) if block == nil { return fmt.Errorf("non existent block [%x…]", hash[:4]) } if _, err := trie.NewSecure(block.Root(), self.chainDb); err != nil { return err } // If all checks out, manually set the head block self.mu.Lock() self.currentBlock = block self.mu.Unlock() glog.V(logger.Info).Infof("committed block #%d [%x…] as new head", block.Number(), hash[:4]) return nil }
// DecodeObject decodes an RLP-encoded state object. func DecodeObject(address common.Address, db trie.Database, data []byte) (*StateObject, error) { var ( obj = &StateObject{address: address, db: db, storage: make(Storage)} ext extStateObject err error ) if err = rlp.DecodeBytes(data, &ext); err != nil { return nil, err } if obj.trie, err = trie.NewSecure(ext.Root, db); err != nil { return nil, err } if !bytes.Equal(ext.CodeHash, emptyCodeHash) { if obj.code, err = db.Get(ext.CodeHash); err != nil { return nil, fmt.Errorf("can't find code for hash %x: %v", ext.CodeHash, err) } } obj.nonce = ext.Nonce obj.balance = ext.Balance obj.codeHash = ext.CodeHash return obj, nil }