Trie's are no longer referenced directly but through State instead

This commit is contained in:
obscuren
2014-03-03 11:03:16 +01:00
parent d2bc57cd34
commit bfed1c7cac
4 changed files with 63 additions and 74 deletions

View File

@ -5,16 +5,46 @@ import (
"math/big"
)
// States within the ethereum protocol are used to store anything
// within the merkle trie. States take care of caching and storing
// nested states. It's the general query interface to retrieve:
// * Contracts
// * Accounts
type State struct {
// The trie for this structure
trie *ethutil.Trie
// Nested states
states map[string]*State
}
// Create a new state from a given trie
func NewState(trie *ethutil.Trie) *State {
return &State{trie: trie}
return &State{trie: trie, states: make(map[string]*State)}
}
// Resets the trie and all siblings
func (s *State) Reset() {
s.trie.Undo()
// Reset all nested states
for _, state := range s.states {
state.Reset()
}
}
// Syncs the trie and all siblings
func (s *State) Sync() {
s.trie.Sync()
// Sync all nested states
for _, state := range s.states {
state.Sync()
}
}
// Purges the current trie.
func (s *State) Purge() int {
return s.trie.NewIterator().Purge()
}
func (s *State) GetContract(addr []byte) *Contract {
@ -23,9 +53,28 @@ func (s *State) GetContract(addr []byte) *Contract {
return nil
}
// Whet get contract is called the retrieved value might
// be an account. The StateManager uses this to check
// to see if the address a tx was sent to is a contract
// or an account
value := ethutil.NewValueFromBytes([]byte(data))
if value.Len() == 2 {
return nil
}
// build contract
contract := &Contract{}
contract.RlpDecode([]byte(data))
// Check if there's a cached state for this contract
cachedState := s.states[string(addr)]
if cachedState != nil {
contract.state = cachedState
} else {
// If it isn't cached, cache the state
s.states[string(addr)] = contract.state
}
return contract
}