55 "math/big"
66
77 "github.com/ethereum/go-ethereum/core/types"
8+ "github.com/ethereum/go-ethereum/crypto"
9+ "github.com/ethereum/go-ethereum/ethutil"
810 "github.com/ethereum/go-ethereum/state"
911 "github.com/ethereum/go-ethereum/vm"
1012)
@@ -27,18 +29,50 @@ import (
2729 */
2830type StateTransition struct {
2931 coinbase , receiver []byte
30- tx * types. Transaction
32+ msg Message
3133 gas , gasPrice * big.Int
3234 value * big.Int
3335 data []byte
3436 state * state.StateDB
3537 block * types.Block
3638
3739 cb , rec , sen * state.StateObject
40+
41+ Env vm.Environment
42+ }
43+
44+ type Message interface {
45+ Hash () []byte
46+
47+ CreatesContract () bool
48+
49+ From () []byte
50+ To () []byte
51+
52+ GasValue () * big.Int
53+ GasPrice () * big.Int
54+ Gas () * big.Int
55+ Value () * big.Int
56+
57+ Nonce () uint64
58+ Data () []byte
3859}
3960
40- func NewStateTransition (coinbase * state.StateObject , tx * types.Transaction , state * state.StateDB , block * types.Block ) * StateTransition {
41- return & StateTransition {coinbase .Address (), tx .Recipient , tx , new (big.Int ), new (big.Int ).Set (tx .GasPrice ), tx .Value , tx .Data , state , block , coinbase , nil , nil }
61+ func AddressFromMessage (msg Message ) []byte {
62+ // Generate a new address
63+ return crypto .Sha3 (ethutil .NewValue ([]interface {}{msg .From (), msg .Nonce ()}).Encode ())[12 :]
64+ }
65+
66+ func NewStateTransition (coinbase * state.StateObject , msg Message , state * state.StateDB , block * types.Block ) * StateTransition {
67+ return & StateTransition {coinbase .Address (), msg .To (), msg , new (big.Int ), new (big.Int ).Set (msg .GasPrice ()), msg .Value (), msg .Data (), state , block , coinbase , nil , nil , nil }
68+ }
69+
70+ func (self * StateTransition ) VmEnv () vm.Environment {
71+ if self .Env == nil {
72+ self .Env = NewEnv (self .state , self .msg , self .block )
73+ }
74+
75+ return self .Env
4276}
4377
4478func (self * StateTransition ) Coinbase () * state.StateObject {
@@ -49,25 +83,25 @@ func (self *StateTransition) Coinbase() *state.StateObject {
4983 self .cb = self .state .GetOrNewStateObject (self .coinbase )
5084 return self .cb
5185}
52- func (self * StateTransition ) Sender () * state.StateObject {
86+ func (self * StateTransition ) From () * state.StateObject {
5387 if self .sen != nil {
5488 return self .sen
5589 }
5690
57- self .sen = self .state .GetOrNewStateObject (self .tx . Sender ())
91+ self .sen = self .state .GetOrNewStateObject (self .msg . From ())
5892
5993 return self .sen
6094}
61- func (self * StateTransition ) Receiver () * state.StateObject {
62- if self .tx != nil && self .tx .CreatesContract () {
95+ func (self * StateTransition ) To () * state.StateObject {
96+ if self .msg != nil && self .msg .CreatesContract () {
6397 return nil
6498 }
6599
66100 if self .rec != nil {
67101 return self .rec
68102 }
69103
70- self .rec = self .state .GetOrNewStateObject (self .tx . Recipient )
104+ self .rec = self .state .GetOrNewStateObject (self .msg . To () )
71105 return self .rec
72106}
73107
@@ -87,41 +121,41 @@ func (self *StateTransition) AddGas(amount *big.Int) {
87121func (self * StateTransition ) BuyGas () error {
88122 var err error
89123
90- sender := self .Sender ()
91- if sender .Balance ().Cmp (self .tx .GasValue ()) < 0 {
92- return fmt .Errorf ("Insufficient funds to pre-pay gas. Req %v, has %v" , self .tx .GasValue (), sender .Balance ())
124+ sender := self .From ()
125+ if sender .Balance ().Cmp (self .msg .GasValue ()) < 0 {
126+ return fmt .Errorf ("Insufficient funds to pre-pay gas. Req %v, has %v" , self .msg .GasValue (), sender .Balance ())
93127 }
94128
95129 coinbase := self .Coinbase ()
96- err = coinbase .BuyGas (self .tx .Gas , self .tx .GasPrice )
130+ err = coinbase .BuyGas (self .msg .Gas () , self .msg .GasPrice () )
97131 if err != nil {
98132 return err
99133 }
100134
101- self .AddGas (self .tx .Gas )
102- sender .SubAmount (self .tx .GasValue ())
135+ self .AddGas (self .msg .Gas () )
136+ sender .SubAmount (self .msg .GasValue ())
103137
104138 return nil
105139}
106140
107141func (self * StateTransition ) RefundGas () {
108- coinbase , sender := self .Coinbase (), self .Sender ()
109- coinbase .RefundGas (self .gas , self .tx .GasPrice )
142+ coinbase , sender := self .Coinbase (), self .From ()
143+ coinbase .RefundGas (self .gas , self .msg .GasPrice () )
110144
111145 // Return remaining gas
112- remaining := new (big.Int ).Mul (self .gas , self .tx .GasPrice )
146+ remaining := new (big.Int ).Mul (self .gas , self .msg .GasPrice () )
113147 sender .AddAmount (remaining )
114148}
115149
116150func (self * StateTransition ) preCheck () (err error ) {
117151 var (
118- tx = self .tx
119- sender = self .Sender ()
152+ msg = self .msg
153+ sender = self .From ()
120154 )
121155
122156 // Make sure this transaction's nonce is correct
123- if sender .Nonce != tx .Nonce {
124- return NonceError (tx .Nonce , sender .Nonce )
157+ if sender .Nonce != msg .Nonce () {
158+ return NonceError (msg .Nonce () , sender .Nonce )
125159 }
126160
127161 // Pre-pay gas / Buy gas of the coinbase account
@@ -133,16 +167,16 @@ func (self *StateTransition) preCheck() (err error) {
133167}
134168
135169func (self * StateTransition ) TransitionState () (err error ) {
136- statelogger .Debugf ("(~) %x\n " , self .tx .Hash ())
170+ statelogger .Debugf ("(~) %x\n " , self .msg .Hash ())
137171
138172 // XXX Transactions after this point are considered valid.
139173 if err = self .preCheck (); err != nil {
140174 return
141175 }
142176
143177 var (
144- tx = self .tx
145- sender = self .Sender ()
178+ msg = self .msg
179+ sender = self .From ()
146180 )
147181
148182 defer self .RefundGas ()
@@ -169,15 +203,15 @@ func (self *StateTransition) TransitionState() (err error) {
169203 }
170204
171205 var ret []byte
172- vmenv := NewEnv ( self .state , self . tx , self . block )
206+ vmenv := self .VmEnv ( )
173207 var ref vm.ClosureRef
174- if tx .CreatesContract () {
175- self .rec = MakeContract (tx , self .state )
208+ if msg .CreatesContract () {
209+ self .rec = MakeContract (msg , self .state )
176210
177- ret , err , ref = vmenv .Create (sender , self .rec .Address (), self .tx .Data , self .gas , self .gasPrice , self .value )
211+ ret , err , ref = vmenv .Create (sender , self .rec .Address (), self .msg .Data () , self .gas , self .gasPrice , self .value )
178212 ref .SetCode (ret )
179213 } else {
180- ret , err = vmenv .Call (self .Sender (), self .Receiver ().Address (), self .tx .Data , self .gas , self .gasPrice , self .value )
214+ ret , err = vmenv .Call (self .From (), self .To ().Address (), self .msg .Data () , self .gas , self .gasPrice , self .value )
181215 }
182216 if err != nil {
183217 statelogger .Debugln (err )
@@ -187,11 +221,11 @@ func (self *StateTransition) TransitionState() (err error) {
187221}
188222
189223// Converts an transaction in to a state object
190- func MakeContract (tx * types. Transaction , state * state.StateDB ) * state.StateObject {
191- addr := tx . CreationAddress ( state )
224+ func MakeContract (msg Message , state * state.StateDB ) * state.StateObject {
225+ addr := AddressFromMessage ( msg )
192226
193227 contract := state .GetOrNewStateObject (addr )
194- contract .InitCode = tx .Data
228+ contract .InitCode = msg .Data ()
195229
196230 return contract
197231}
0 commit comments