Fixed coinbase copy in state
This commit is contained in:
parent
ed3424ff75
commit
0415e4a637
@ -61,6 +61,7 @@ func (self *State) UpdateStateObject(stateObject *StateObject) {
|
|||||||
addr := stateObject.Address()
|
addr := stateObject.Address()
|
||||||
|
|
||||||
ethutil.Config.Db.Put(ethcrypto.Sha3Bin(stateObject.Script()), stateObject.Script())
|
ethutil.Config.Db.Put(ethcrypto.Sha3Bin(stateObject.Script()), stateObject.Script())
|
||||||
|
fmt.Printf("balance %v %p\n", stateObject.Amount, stateObject)
|
||||||
|
|
||||||
self.trie.Update(string(addr), string(stateObject.RlpEncode()))
|
self.trie.Update(string(addr), string(stateObject.RlpEncode()))
|
||||||
|
|
||||||
@ -174,7 +175,7 @@ func (s *State) Reset() {
|
|||||||
func (s *State) Sync() {
|
func (s *State) Sync() {
|
||||||
// Sync all nested states
|
// Sync all nested states
|
||||||
for _, stateObject := range s.stateObjects {
|
for _, stateObject := range s.stateObjects {
|
||||||
s.UpdateStateObject(stateObject)
|
//s.UpdateStateObject(stateObject)
|
||||||
|
|
||||||
if stateObject.state == nil {
|
if stateObject.state == nil {
|
||||||
continue
|
continue
|
||||||
|
@ -120,7 +120,9 @@ func (self *StateManager) ProcessTransactions(coinbase *StateObject, state *Stat
|
|||||||
done:
|
done:
|
||||||
for i, tx := range txs {
|
for i, tx := range txs {
|
||||||
txGas := new(big.Int).Set(tx.Gas)
|
txGas := new(big.Int).Set(tx.Gas)
|
||||||
st := NewStateTransition(coinbase, tx, state, block)
|
|
||||||
|
cb := state.GetStateObject(coinbase.Address())
|
||||||
|
st := NewStateTransition(cb, tx, state, block)
|
||||||
//fmt.Printf("#%d\n", i+1)
|
//fmt.Printf("#%d\n", i+1)
|
||||||
err = st.TransitionState()
|
err = st.TransitionState()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -80,6 +80,7 @@ func NewStateObject(addr []byte) *StateObject {
|
|||||||
object := &StateObject{address: address, Amount: new(big.Int), gasPool: new(big.Int)}
|
object := &StateObject{address: address, Amount: new(big.Int), gasPool: new(big.Int)}
|
||||||
object.state = NewState(ethtrie.NewTrie(ethutil.Config.Db, ""))
|
object.state = NewState(ethtrie.NewTrie(ethutil.Config.Db, ""))
|
||||||
object.storage = make(Storage)
|
object.storage = make(Storage)
|
||||||
|
object.gasPool = new(big.Int)
|
||||||
|
|
||||||
return object
|
return object
|
||||||
}
|
}
|
||||||
@ -183,7 +184,7 @@ func (self *StateObject) Sync() {
|
|||||||
fmt.Printf("%x %x %x\n", self.Address(), []byte(key), value.Bytes())
|
fmt.Printf("%x %x %x\n", self.Address(), []byte(key), value.Bytes())
|
||||||
})
|
})
|
||||||
*/
|
*/
|
||||||
//fmt.Printf("%x @:%x\n", self.Address(), self.state.Root())
|
fmt.Printf("%x @:%x\n", self.Address(), self.state.Root())
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *StateObject) GetInstr(pc *big.Int) *ethutil.Value {
|
func (c *StateObject) GetInstr(pc *big.Int) *ethutil.Value {
|
||||||
@ -197,13 +198,13 @@ func (c *StateObject) GetInstr(pc *big.Int) *ethutil.Value {
|
|||||||
func (c *StateObject) AddAmount(amount *big.Int) {
|
func (c *StateObject) AddAmount(amount *big.Int) {
|
||||||
c.SetAmount(new(big.Int).Add(c.Amount, amount))
|
c.SetAmount(new(big.Int).Add(c.Amount, amount))
|
||||||
|
|
||||||
statelogger.DebugDetailf("%x: #%d %v (+ %v)\n", c.Address(), c.Nonce, c.Amount, amount)
|
statelogger.Debugf("%x: #%d %v (+ %v)\n", c.Address(), c.Nonce, c.Amount, amount)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *StateObject) SubAmount(amount *big.Int) {
|
func (c *StateObject) SubAmount(amount *big.Int) {
|
||||||
c.SetAmount(new(big.Int).Sub(c.Amount, amount))
|
c.SetAmount(new(big.Int).Sub(c.Amount, amount))
|
||||||
|
|
||||||
statelogger.DebugDetailf("%x: #%d %v (- %v)\n", c.Address(), c.Nonce, c.Amount, amount)
|
statelogger.Debugf("%x: #%d %v (- %v)\n", c.Address(), c.Nonce, c.Amount, amount)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *StateObject) SetAmount(amount *big.Int) {
|
func (c *StateObject) SetAmount(amount *big.Int) {
|
||||||
@ -266,6 +267,7 @@ func (self *StateObject) Copy() *StateObject {
|
|||||||
stateObject.script = ethutil.CopyBytes(self.script)
|
stateObject.script = ethutil.CopyBytes(self.script)
|
||||||
stateObject.initScript = ethutil.CopyBytes(self.initScript)
|
stateObject.initScript = ethutil.CopyBytes(self.initScript)
|
||||||
stateObject.storage = self.storage.Copy()
|
stateObject.storage = self.storage.Copy()
|
||||||
|
stateObject.gasPool.Set(self.gasPool)
|
||||||
|
|
||||||
return stateObject
|
return stateObject
|
||||||
}
|
}
|
||||||
@ -324,6 +326,7 @@ func (c *StateObject) RlpDecode(data []byte) {
|
|||||||
c.Amount = decoder.Get(1).BigInt()
|
c.Amount = decoder.Get(1).BigInt()
|
||||||
c.state = NewState(ethtrie.NewTrie(ethutil.Config.Db, decoder.Get(2).Interface()))
|
c.state = NewState(ethtrie.NewTrie(ethutil.Config.Db, decoder.Get(2).Interface()))
|
||||||
c.storage = make(map[string]*ethutil.Value)
|
c.storage = make(map[string]*ethutil.Value)
|
||||||
|
c.gasPool = new(big.Int)
|
||||||
|
|
||||||
c.ScriptHash = decoder.Get(3).Bytes()
|
c.ScriptHash = decoder.Get(3).Bytes()
|
||||||
|
|
||||||
|
@ -42,7 +42,7 @@ func (self *StateTransition) Coinbase() *StateObject {
|
|||||||
return self.cb
|
return self.cb
|
||||||
}
|
}
|
||||||
|
|
||||||
self.cb = self.state.GetAccount(self.coinbase)
|
self.cb = self.state.GetOrNewStateObject(self.coinbase)
|
||||||
return self.cb
|
return self.cb
|
||||||
}
|
}
|
||||||
func (self *StateTransition) Sender() *StateObject {
|
func (self *StateTransition) Sender() *StateObject {
|
||||||
@ -50,7 +50,7 @@ func (self *StateTransition) Sender() *StateObject {
|
|||||||
return self.sen
|
return self.sen
|
||||||
}
|
}
|
||||||
|
|
||||||
self.sen = self.state.GetAccount(self.tx.Sender())
|
self.sen = self.state.GetOrNewStateObject(self.tx.Sender())
|
||||||
|
|
||||||
return self.sen
|
return self.sen
|
||||||
}
|
}
|
||||||
@ -63,7 +63,7 @@ func (self *StateTransition) Receiver() *StateObject {
|
|||||||
return self.rec
|
return self.rec
|
||||||
}
|
}
|
||||||
|
|
||||||
self.rec = self.state.GetAccount(self.tx.Recipient)
|
self.rec = self.state.GetOrNewStateObject(self.tx.Recipient)
|
||||||
return self.rec
|
return self.rec
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -174,13 +174,16 @@ func (self *StateTransition) TransitionState() (err error) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
/* FIXME
|
if sender.Amount.Cmp(self.value) < 0 {
|
||||||
* If tx goes TO "0", goes OOG during init, reverse changes, but initial endowment should happen. The ether is lost forever
|
return fmt.Errorf("Insufficient funds to transfer value. Req %v, has %v", self.value, sender.Amount)
|
||||||
*/
|
}
|
||||||
var snapshot *State
|
|
||||||
|
|
||||||
|
var snapshot *State
|
||||||
// If the receiver is nil it's a contract (\0*32).
|
// If the receiver is nil it's a contract (\0*32).
|
||||||
if tx.CreatesContract() {
|
if tx.CreatesContract() {
|
||||||
|
// Subtract the (irreversible) amount from the senders account
|
||||||
|
sender.SubAmount(self.value)
|
||||||
|
|
||||||
snapshot = self.state.Copy()
|
snapshot = self.state.Copy()
|
||||||
|
|
||||||
// Create a new state object for the contract
|
// Create a new state object for the contract
|
||||||
@ -189,16 +192,17 @@ func (self *StateTransition) TransitionState() (err error) {
|
|||||||
if receiver == nil {
|
if receiver == nil {
|
||||||
return fmt.Errorf("Unable to create contract")
|
return fmt.Errorf("Unable to create contract")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Add the amount to receivers account which should conclude this transaction
|
||||||
|
receiver.AddAmount(self.value)
|
||||||
} else {
|
} else {
|
||||||
receiver = self.Receiver()
|
receiver = self.Receiver()
|
||||||
}
|
|
||||||
|
|
||||||
// Transfer value from sender to receiver
|
// Subtract the amount from the senders account
|
||||||
if err = self.transferValue(sender, receiver); err != nil {
|
sender.SubAmount(self.value)
|
||||||
return
|
// Add the amount to receivers account which should conclude this transaction
|
||||||
}
|
receiver.AddAmount(self.value)
|
||||||
|
|
||||||
if snapshot == nil {
|
|
||||||
snapshot = self.state.Copy()
|
snapshot = self.state.Copy()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -456,7 +456,7 @@ func (vm *Vm) RunClosure(closure *Closure) (ret []byte, err error) {
|
|||||||
case BYTE:
|
case BYTE:
|
||||||
require(2)
|
require(2)
|
||||||
val, th := stack.Popn()
|
val, th := stack.Popn()
|
||||||
if th.Cmp(big.NewInt(32)) < 0 {
|
if th.Cmp(big.NewInt(32)) < 0 && th.Cmp(big.NewInt(int64(len(val.Bytes())))) < 0 {
|
||||||
byt := big.NewInt(int64(val.Bytes()[th.Int64()]))
|
byt := big.NewInt(int64(val.Bytes()[th.Int64()]))
|
||||||
stack.Push(byt)
|
stack.Push(byt)
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user