aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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)