aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorobscuren <geffobscura@gmail.com>2014-05-09 00:26:46 +0800
committerobscuren <geffobscura@gmail.com>2014-05-09 00:26:46 +0800
commitd709815106824a3469b5f4152fd32705d7d142d4 (patch)
treedb68e4b228f0a46e73a0ca841beacf87e92a68af
parentf0440e85dc306f270666e3aee1fe419b684a2ae8 (diff)
downloaddexon-d709815106824a3469b5f4152fd32705d7d142d4.tar.gz
dexon-d709815106824a3469b5f4152fd32705d7d142d4.tar.zst
dexon-d709815106824a3469b5f4152fd32705d7d142d4.zip
Added trans state and removed watch address etc
The transient state can be used to test out changes before committing them to the proc state. The transient state is currently being used by the gui to support proper nonce updating without having to wait for a block. This used to be done by a cached state mechanism which can now safely by removed.
-rw-r--r--ethchain/state_manager.go24
-rw-r--r--ethchain/transaction_pool.go3
-rw-r--r--ethpub/pub.go14
3 files changed, 21 insertions, 20 deletions
diff --git a/ethchain/state_manager.go b/ethchain/state_manager.go
index b8a893d15..fb5753ab3 100644
--- a/ethchain/state_manager.go
+++ b/ethchain/state_manager.go
@@ -50,6 +50,10 @@ type StateManager struct {
// Comparative state it used for comparing and validating end
// results
compState *State
+ // Transiently state. The trans state isn't ever saved, validated and
+ // it could be used for setting account nonces without effecting
+ // the main states.
+ transState *State
manifest *Manifest
}
@@ -65,6 +69,8 @@ func NewStateManager(ethereum EthManager) *StateManager {
manifest: NewManifest(),
}
sm.procState = ethereum.BlockChain().CurrentBlock.State()
+ sm.transState = sm.procState.Copy()
+
return sm
}
@@ -72,22 +78,8 @@ func (sm *StateManager) ProcState() *State {
return sm.procState
}
-// Watches any given address and puts it in the address state store
-func (sm *StateManager) WatchAddr(addr []byte) *CachedStateObject {
- //XXX account := sm.bc.CurrentBlock.state.GetAccount(addr)
- account := sm.procState.GetAccount(addr)
-
- return sm.stateObjectCache.Add(addr, account)
-}
-
-func (sm *StateManager) GetAddrState(addr []byte) *CachedStateObject {
- account := sm.stateObjectCache.Get(addr)
- if account == nil {
- a := sm.procState.GetAccount(addr)
- account = &CachedStateObject{Nonce: a.Nonce, Object: a}
- }
-
- return account
+func (sm *StateManager) TransState() *State {
+ return sm.transState
}
func (sm *StateManager) BlockChain() *BlockChain {
diff --git a/ethchain/transaction_pool.go b/ethchain/transaction_pool.go
index 72836d6cb..56deae0c6 100644
--- a/ethchain/transaction_pool.go
+++ b/ethchain/transaction_pool.go
@@ -148,8 +148,7 @@ func (pool *TxPool) ValidateTransaction(tx *Transaction) error {
}
// Get the sender
- accountState := pool.Ethereum.StateManager().GetAddrState(tx.Sender())
- sender := accountState.Object
+ sender := pool.Ethereum.StateManager().procState.GetAccount(tx.Sender())
totAmount := new(big.Int).Add(tx.Value, new(big.Int).Mul(TxFee, TxFeeRat))
// Make sure there's enough in the sender's account. Having insufficient
diff --git a/ethpub/pub.go b/ethpub/pub.go
index 5e7792a9f..f7e641b35 100644
--- a/ethpub/pub.go
+++ b/ethpub/pub.go
@@ -92,7 +92,14 @@ func (lib *PEthereum) createTx(key, recipient, valueStr, gasStr, gasPriceStr, in
hash = ethutil.FromHex(recipient)
}
- keyPair, err := ethchain.NewKeyPairFromSec([]byte(ethutil.FromHex(key)))
+ var keyPair *ethchain.KeyPair
+ var err error
+ if key[0:2] == "0x" {
+ keyPair, err = ethchain.NewKeyPairFromSec([]byte(ethutil.FromHex(key[0:2])))
+ } else {
+ keyPair, err = ethchain.NewKeyPairFromSec([]byte(ethutil.FromHex(key)))
+ }
+
if err != nil {
return nil, err
}
@@ -132,8 +139,11 @@ func (lib *PEthereum) createTx(key, recipient, valueStr, gasStr, gasPriceStr, in
tx = ethchain.NewTransactionMessage(hash, value, gas, gasPrice, ethutil.FromHex(initStr))
}
- acc := lib.stateManager.GetAddrState(keyPair.Address())
+ acc := lib.stateManager.TransState().GetStateObject(keyPair.Address())
+ //acc := lib.stateManager.GetAddrState(keyPair.Address())
tx.Nonce = acc.Nonce
+ lib.stateManager.TransState().SetStateObject(acc)
+
tx.Sign(keyPair.PrivateKey)
lib.txPool.QueueTransaction(tx)