aboutsummaryrefslogtreecommitdiffstats
path: root/ethchain/state_transition.go
diff options
context:
space:
mode:
authorobscuren <geffobscura@gmail.com>2014-06-13 22:06:27 +0800
committerobscuren <geffobscura@gmail.com>2014-06-13 22:06:27 +0800
commit81245473486dd680b7121d4b227ca8a57d07b4b1 (patch)
tree0462828a95c3c1af684dc32fdcc15b26772fe762 /ethchain/state_transition.go
parentc734dde982c4ce778afa074e94efb09e552dbd84 (diff)
downloaddexon-81245473486dd680b7121d4b227ca8a57d07b4b1.tar
dexon-81245473486dd680b7121d4b227ca8a57d07b4b1.tar.gz
dexon-81245473486dd680b7121d4b227ca8a57d07b4b1.tar.bz2
dexon-81245473486dd680b7121d4b227ca8a57d07b4b1.tar.lz
dexon-81245473486dd680b7121d4b227ca8a57d07b4b1.tar.xz
dexon-81245473486dd680b7121d4b227ca8a57d07b4b1.tar.zst
dexon-81245473486dd680b7121d4b227ca8a57d07b4b1.zip
Moving a head closer to interop
Diffstat (limited to 'ethchain/state_transition.go')
-rw-r--r--ethchain/state_transition.go32
1 files changed, 24 insertions, 8 deletions
diff --git a/ethchain/state_transition.go b/ethchain/state_transition.go
index 1256d019c..a080c5602 100644
--- a/ethchain/state_transition.go
+++ b/ethchain/state_transition.go
@@ -116,7 +116,7 @@ func (self *StateTransition) TransitionState() (err error) {
defer func() {
if r := recover(); r != nil {
ethutil.Config.Log.Infoln(r)
- err = fmt.Errorf("%v", r)
+ err = fmt.Errorf("state transition err %v", r)
}
}()
@@ -126,41 +126,51 @@ func (self *StateTransition) TransitionState() (err error) {
receiver *StateObject
)
+ // Make sure this transaction's nonce is correct
if sender.Nonce != tx.Nonce {
return NonceError(tx.Nonce, sender.Nonce)
}
+ // Increment the nonce for the next transaction
sender.Nonce += 1
+ // Pre-pay gas / Buy gas of the coinbase account
if err = self.BuyGas(); err != nil {
return err
}
+ // Get the receiver (TODO fix this, if coinbase is the receiver we need to save/retrieve)
receiver = self.Receiver()
+ // Transaction gas
if err = self.UseGas(GasTx); err != nil {
return err
}
+ // Pay data gas
dataPrice := big.NewInt(int64(len(tx.Data)))
dataPrice.Mul(dataPrice, GasData)
if err = self.UseGas(dataPrice); err != nil {
return err
}
- if receiver == nil { // Contract
+ // If the receiver is nil it's a contract (\0*32).
+ if receiver == nil {
+ // Create a new state object for the contract
receiver = self.MakeStateObject(self.state, tx)
if receiver == nil {
return fmt.Errorf("ERR. Unable to create contract with transaction %v", tx)
}
}
+ // Transfer value from sender to receiver
if err = self.transferValue(sender, receiver); err != nil {
return err
}
+ // Process the init code and create 'valid' contract
if tx.CreatesContract() {
- fmt.Println(Disassemble(receiver.Init()))
+ //fmt.Println(Disassemble(receiver.Init()))
// Evaluate the initialization script
// and use the return value as the
// script section for the state object.
@@ -173,6 +183,10 @@ func (self *StateTransition) TransitionState() (err error) {
receiver.script = code
}
+ // Return remaining gas
+ remaining := new(big.Int).Mul(self.gas, tx.GasPrice)
+ sender.AddAmount(remaining)
+
self.state.UpdateStateObject(sender)
self.state.UpdateStateObject(receiver)
@@ -184,12 +198,14 @@ func (self *StateTransition) transferValue(sender, receiver *StateObject) error
return fmt.Errorf("Insufficient funds to transfer value. Req %v, has %v", self.tx.Value, sender.Amount)
}
- // Subtract the amount from the senders account
- sender.SubAmount(self.tx.Value)
- // Add the amount to receivers account which should conclude this transaction
- receiver.AddAmount(self.tx.Value)
+ if self.tx.Value.Cmp(ethutil.Big0) > 0 {
+ // Subtract the amount from the senders account
+ sender.SubAmount(self.tx.Value)
+ // Add the amount to receivers account which should conclude this transaction
+ receiver.AddAmount(self.tx.Value)
- ethutil.Config.Log.Debugf("%x => %x (%v) %x\n", sender.Address()[:4], receiver.Address()[:4], self.tx.Value, self.tx.Hash())
+ ethutil.Config.Log.Debugf("%x => %x (%v) %x\n", sender.Address()[:4], receiver.Address()[:4], self.tx.Value, self.tx.Hash())
+ }
return nil
}