From 34098edb93fe3105e0932afa2a38b078417ac754 Mon Sep 17 00:00:00 2001 From: Ethan Buchman Date: Tue, 14 Apr 2015 19:26:55 -0700 Subject: [PATCH] state: fireEvents flag on ExecTx and fixes for GetAccount --- state/block_cache.go | 6 ++++-- state/execution.go | 5 ++++- state/state_test.go | 2 +- state/tx_cache.go | 8 ++++++-- 4 files changed, 15 insertions(+), 6 deletions(-) diff --git a/state/block_cache.go b/state/block_cache.go index c900accc7..c9e0348bf 100644 --- a/state/block_cache.go +++ b/state/block_cache.go @@ -53,7 +53,9 @@ func (cache *BlockCache) GetAccount(addr []byte) *ac.Account { return acc } else { acc = cache.backend.GetAccount(addr) - cache.accounts[string(addr)] = accountInfo{acc, nil, false, false} + if acc != nil { + cache.accounts[string(addr)] = accountInfo{acc, nil, false, false} + } return acc } } @@ -187,7 +189,7 @@ func (cache *BlockCache) Sync() { } } else { if acc == nil { - panic(Fmt("Account should not be nil for addr: %X", acc.Address)) + panic(Fmt("Account should not be nil for addr: %x", addrStr)) } if storage != nil { newStorageRoot := storage.Save() diff --git a/state/execution.go b/state/execution.go index 0d687768e..1a89fecce 100644 --- a/state/execution.go +++ b/state/execution.go @@ -296,6 +296,8 @@ func ExecTx(blockCache *BlockCache, tx_ types.Tx, runCall, fireEvents bool) erro // TODO: do something with fees fees := uint64(0) _s := blockCache.State() // hack to access validators and event switch. + nilSwitch := _s.evsw == nil + fireEvents = fireEvents && !nilSwitch // Exec tx switch tx := tx_.(type) { @@ -424,7 +426,8 @@ func ExecTx(blockCache *BlockCache, tx_ types.Tx, runCall, fireEvents bool) erro txCache.UpdateAccount(caller) // because we adjusted by input above, and bumped nonce maybe. txCache.UpdateAccount(callee) // because we adjusted by input above. - vmach := vm.NewVM(txCache, params, caller.Address) + vmach := vm.NewVM(txCache, params, caller.Address, account.SignBytes(tx)) + vmach.SetEventSwitch(_s.evsw) // NOTE: Call() transfers the value from caller to callee iff call succeeds. ret, err := vmach.Call(caller, callee, code, tx.Data, value, &gas) diff --git a/state/state_test.go b/state/state_test.go index 5f2990652..58a673195 100644 --- a/state/state_test.go +++ b/state/state_test.go @@ -12,7 +12,7 @@ import ( func execTxWithState(state *State, tx types.Tx, runCall bool) error { cache := NewBlockCache(state) - err := ExecTx(cache, tx, runCall) + err := ExecTx(cache, tx, runCall, false) if err != nil { return err } else { diff --git a/state/tx_cache.go b/state/tx_cache.go index d4188db3c..425a1f816 100644 --- a/state/tx_cache.go +++ b/state/tx_cache.go @@ -30,9 +30,13 @@ func (cache *TxCache) GetAccount(addr Word256) *vm.Account { acc, removed := vmUnpack(cache.accounts[addr]) if removed { return nil - } else { - return acc + } else if acc == nil { + acc2 := cache.backend.GetAccount(addr.Prefix(20)) + if acc2 != nil { + return toVMAccount(acc2) + } } + return acc } func (cache *TxCache) UpdateAccount(acc *vm.Account) {