@@ -31,6 +31,7 @@ type StateTransition struct {
31
31
coinbase , receiver []byte
32
32
msg Message
33
33
gas , gasPrice * big.Int
34
+ initialGas * big.Int
34
35
value * big.Int
35
36
data []byte
36
37
state * state.StateDB
@@ -47,7 +48,6 @@ type Message interface {
47
48
From () []byte
48
49
To () []byte
49
50
50
- GasValue () * big.Int
51
51
GasPrice () * big.Int
52
52
Gas () * big.Int
53
53
Value () * big.Int
@@ -65,8 +65,12 @@ func MessageCreatesContract(msg Message) bool {
65
65
return len (msg .To ()) == 0
66
66
}
67
67
68
+ func MessageGasValue (msg Message ) * big.Int {
69
+ return new (big.Int ).Mul (msg .Gas (), msg .GasPrice ())
70
+ }
71
+
68
72
func NewStateTransition (coinbase * state.StateObject , msg Message , state * state.StateDB , block * types.Block ) * StateTransition {
69
- 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 }
73
+ return & StateTransition {coinbase .Address (), msg .To (), msg , new (big.Int ), new (big.Int ).Set (msg .GasPrice ()), new (big. Int ), msg .Value (), msg .Data (), state , block , coinbase , nil , nil , nil }
70
74
}
71
75
72
76
func (self * StateTransition ) VmEnv () vm.Environment {
@@ -78,33 +82,16 @@ func (self *StateTransition) VmEnv() vm.Environment {
78
82
}
79
83
80
84
func (self * StateTransition ) Coinbase () * state.StateObject {
81
- if self .cb != nil {
82
- return self .cb
83
- }
84
-
85
- self .cb = self .state .GetOrNewStateObject (self .coinbase )
86
- return self .cb
85
+ return self .state .GetOrNewStateObject (self .coinbase )
87
86
}
88
87
func (self * StateTransition ) From () * state.StateObject {
89
- if self .sen != nil {
90
- return self .sen
91
- }
92
-
93
- self .sen = self .state .GetOrNewStateObject (self .msg .From ())
94
-
95
- return self .sen
88
+ return self .state .GetOrNewStateObject (self .msg .From ())
96
89
}
97
90
func (self * StateTransition ) To () * state.StateObject {
98
91
if self .msg != nil && MessageCreatesContract (self .msg ) {
99
92
return nil
100
93
}
101
-
102
- if self .rec != nil {
103
- return self .rec
104
- }
105
-
106
- self .rec = self .state .GetOrNewStateObject (self .msg .To ())
107
- return self .rec
94
+ return self .state .GetOrNewStateObject (self .msg .To ())
108
95
}
109
96
110
97
func (self * StateTransition ) UseGas (amount * big.Int ) error {
@@ -124,8 +111,8 @@ func (self *StateTransition) BuyGas() error {
124
111
var err error
125
112
126
113
sender := self .From ()
127
- if sender .Balance ().Cmp (self .msg . GasValue ( )) < 0 {
128
- return fmt .Errorf ("Insufficient funds to pre-pay gas. Req %v, has %v" , self .msg . GasValue ( ), sender .Balance ())
114
+ if sender .Balance ().Cmp (MessageGasValue ( self .msg )) < 0 {
115
+ return fmt .Errorf ("Insufficient funds to pre-pay gas. Req %v, has %v" , MessageGasValue ( self .msg ), sender .Balance ())
129
116
}
130
117
131
118
coinbase := self .Coinbase ()
@@ -135,20 +122,12 @@ func (self *StateTransition) BuyGas() error {
135
122
}
136
123
137
124
self .AddGas (self .msg .Gas ())
138
- sender .SubAmount (self .msg .GasValue ())
125
+ self .initialGas .Set (self .msg .Gas ())
126
+ sender .SubAmount (MessageGasValue (self .msg ))
139
127
140
128
return nil
141
129
}
142
130
143
- func (self * StateTransition ) RefundGas () {
144
- coinbase , sender := self .Coinbase (), self .From ()
145
- coinbase .RefundGas (self .gas , self .msg .GasPrice ())
146
-
147
- // Return remaining gas
148
- remaining := new (big.Int ).Mul (self .gas , self .msg .GasPrice ())
149
- sender .AddAmount (remaining )
150
- }
151
-
152
131
func (self * StateTransition ) preCheck () (err error ) {
153
132
var (
154
133
msg = self .msg
@@ -168,7 +147,7 @@ func (self *StateTransition) preCheck() (err error) {
168
147
return nil
169
148
}
170
149
171
- func (self * StateTransition ) TransitionState () (err error ) {
150
+ func (self * StateTransition ) TransitionState () (ret [] byte , err error ) {
172
151
statelogger .Debugf ("(~) %x\n " , self .msg .Hash ())
173
152
174
153
// XXX Transactions after this point are considered valid.
@@ -204,7 +183,6 @@ func (self *StateTransition) TransitionState() (err error) {
204
183
return
205
184
}
206
185
207
- var ret []byte
208
186
vmenv := self .VmEnv ()
209
187
var ref vm.ClosureRef
210
188
if MessageCreatesContract (msg ) {
@@ -231,3 +209,26 @@ func MakeContract(msg Message, state *state.StateDB) *state.StateObject {
231
209
232
210
return contract
233
211
}
212
+
213
+ func (self * StateTransition ) RefundGas () {
214
+ coinbaseSub := new (big.Int ).Set (self .gas )
215
+ uhalf := new (big.Int ).Div (self .GasUsed (), ethutil .Big2 )
216
+ for addr , refs := range self .state .Refunds () {
217
+ for _ , ref := range refs {
218
+ coinbaseSub .Add (self .gas , ref )
219
+ refund := ethutil .BigMin (uhalf , ref )
220
+ self .state .AddBalance ([]byte (addr ), refund .Mul (refund , self .msg .GasPrice ()))
221
+ }
222
+ }
223
+
224
+ coinbase , sender := self .Coinbase (), self .From ()
225
+ coinbase .RefundGas (coinbaseSub , self .msg .GasPrice ())
226
+
227
+ // Return remaining gas
228
+ remaining := new (big.Int ).Mul (self .gas , self .msg .GasPrice ())
229
+ sender .AddAmount (remaining )
230
+ }
231
+
232
+ func (self * StateTransition ) GasUsed () * big.Int {
233
+ return new (big.Int ).Sub (self .initialGas , self .gas )
234
+ }
0 commit comments