Cleaned up

Removed the unneeded address watch mechanism. State manager's transient
state should now take care of this.
This commit is contained in:
obscuren 2014-05-08 18:41:45 +02:00
parent d709815106
commit e8fb965ccb
2 changed files with 11 additions and 51 deletions

@ -25,24 +25,16 @@ type EthManager interface {
type StateManager struct { type StateManager struct {
// Mutex for locking the block processor. Blocks can only be handled one at a time // Mutex for locking the block processor. Blocks can only be handled one at a time
mutex sync.Mutex mutex sync.Mutex
// Canonical block chain // Canonical block chain
bc *BlockChain bc *BlockChain
// States for addresses. You can watch any address
// at any given time
stateObjectCache *StateObjectCache
// Stack for processing contracts // Stack for processing contracts
stack *Stack stack *Stack
// non-persistent key/value memory storage // non-persistent key/value memory storage
mem map[string]*big.Int mem map[string]*big.Int
// Proof of work used for validating
Pow PoW Pow PoW
// The ethereum manager interface
Ethereum EthManager Ethereum EthManager
SecondaryBlockProcessor BlockProcessor
// The managed states // The managed states
// Processor state. Anything processed will be applied to this // Processor state. Anything processed will be applied to this
// state // state
@ -54,19 +46,18 @@ type StateManager struct {
// it could be used for setting account nonces without effecting // it could be used for setting account nonces without effecting
// the main states. // the main states.
transState *State transState *State
// Manifest for keeping changes regarding state objects. See `notify`
manifest *Manifest manifest *Manifest
} }
func NewStateManager(ethereum EthManager) *StateManager { func NewStateManager(ethereum EthManager) *StateManager {
sm := &StateManager{ sm := &StateManager{
stack: NewStack(), stack: NewStack(),
mem: make(map[string]*big.Int), mem: make(map[string]*big.Int),
Pow: &EasyPow{}, Pow: &EasyPow{},
Ethereum: ethereum, Ethereum: ethereum,
stateObjectCache: NewStateObjectCache(), bc: ethereum.BlockChain(),
bc: ethereum.BlockChain(), manifest: NewManifest(),
manifest: NewManifest(),
} }
sm.procState = ethereum.BlockChain().CurrentBlock.State() sm.procState = ethereum.BlockChain().CurrentBlock.State()
sm.transState = sm.procState.Copy() sm.transState = sm.procState.Copy()
@ -193,12 +184,6 @@ func (sm *StateManager) ProcessBlock(block *Block, dontReact bool) error {
// Add the block to the chain // Add the block to the chain
sm.bc.Add(block) sm.bc.Add(block)
// If there's a block processor present, pass in the block for further
// processing
if sm.SecondaryBlockProcessor != nil {
sm.SecondaryBlockProcessor.ProcessBlock(block)
}
ethutil.Config.Log.Infof("[STATE] Added block #%d (%x)\n", block.BlockInfo().Number, block.Hash()) ethutil.Config.Log.Infof("[STATE] Added block #%d (%x)\n", block.BlockInfo().Number, block.Hash())
if dontReact == false { if dontReact == false {
sm.Ethereum.Reactor().Post("newBlock", block) sm.Ethereum.Reactor().Post("newBlock", block)

@ -160,33 +160,8 @@ func (c *StateObject) RlpDecode(data []byte) {
c.script = decoder.Get(3).Bytes() c.script = decoder.Get(3).Bytes()
} }
// The cached state and state object cache are helpers which will give you somewhat // Storage change object. Used by the manifest for notifying changes to
// control over the nonce. When creating new transactions you're interested in the 'next' // the sub channels.
// nonce rather than the current nonce. This to avoid creating invalid-nonce transactions.
type StateObjectCache struct {
cachedObjects map[string]*CachedStateObject
}
func NewStateObjectCache() *StateObjectCache {
return &StateObjectCache{cachedObjects: make(map[string]*CachedStateObject)}
}
func (s *StateObjectCache) Add(addr []byte, object *StateObject) *CachedStateObject {
state := &CachedStateObject{Nonce: object.Nonce, Object: object}
s.cachedObjects[string(addr)] = state
return state
}
func (s *StateObjectCache) Get(addr []byte) *CachedStateObject {
return s.cachedObjects[string(addr)]
}
type CachedStateObject struct {
Nonce uint64
Object *StateObject
}
type StorageState struct { type StorageState struct {
StateAddress []byte StateAddress []byte
Address []byte Address []byte