Skip to content

Commit 1508a23

Browse files
committed
Minor updates on gas and removed/refactored old code.
1 parent f5b8f3d commit 1508a23

File tree

6 files changed

+53
-40
lines changed

6 files changed

+53
-40
lines changed

core/block_manager.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,7 @@ done:
142142
receipt := types.NewReceipt(state.Root(), cumulative)
143143
receipt.SetLogs(state.Logs())
144144
receipt.Bloom = types.CreateBloom(types.Receipts{receipt})
145+
chainlogger.Debugln(receipt)
145146

146147
// Notify all subscribers
147148
if !transientProcess {
@@ -214,7 +215,8 @@ func (sm *BlockManager) ProcessWithParent(block, parent *types.Block) (td *big.I
214215

215216
receiptSha := types.DeriveSha(receipts)
216217
if bytes.Compare(receiptSha, block.ReceiptSha) != 0 {
217-
chainlogger.Debugln(receipts)
218+
//chainlogger.Debugf("validating receipt root. received=%x got=%x", block.ReceiptSha, receiptSha)
219+
fmt.Printf("%x\n", ethutil.Encode(receipts))
218220
err = fmt.Errorf("validating receipt root. received=%x got=%x", block.ReceiptSha, receiptSha)
219221
return
220222
}

core/execution.go

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package core
33
import (
44
"fmt"
55
"math/big"
6+
"time"
67

78
"github.com/ethereum/go-ethereum/state"
89
"github.com/ethereum/go-ethereum/vm"
@@ -12,7 +13,6 @@ type Execution struct {
1213
env vm.Environment
1314
address, input []byte
1415
Gas, price, value *big.Int
15-
object *state.StateObject
1616
SkipTransfer bool
1717
}
1818

@@ -35,8 +35,6 @@ func (self *Execution) exec(code, contextAddr []byte, caller vm.ClosureRef) (ret
3535
env := self.env
3636
evm := vm.New(env, vm.DebugVmTy)
3737

38-
chainlogger.Debugf("pre state %x\n", env.State().Root())
39-
4038
if env.Depth() == vm.MaxCallDepth {
4139
// Consume all gas (by not returning it) and return a depth error
4240
return nil, vm.DepthError{}
@@ -55,13 +53,12 @@ func (self *Execution) exec(code, contextAddr []byte, caller vm.ClosureRef) (ret
5553
}
5654

5755
snapshot := env.State().Copy()
58-
defer func() {
59-
env.State().Set(snapshot)
60-
chainlogger.Debugf("post state %x\n", env.State().Root())
61-
}()
62-
63-
self.object = to
56+
start := time.Now()
6457
ret, err = evm.Run(to, caller, code, self.value, self.Gas, self.price, self.input)
58+
if err != nil {
59+
env.State().Set(snapshot)
60+
}
61+
chainlogger.Debugf("vm took %v\n", time.Since(start))
6562

6663
return
6764
}

core/state_transition.go

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -186,13 +186,13 @@ func (self *StateTransition) TransitionState() (ret []byte, err error) {
186186
vmenv := self.VmEnv()
187187
var ref vm.ClosureRef
188188
if MessageCreatesContract(msg) {
189-
self.rec = MakeContract(msg, self.state)
190-
191-
ret, err, ref = vmenv.Create(sender, self.rec.Address(), self.msg.Data(), self.gas, self.gasPrice, self.value)
189+
contract := MakeContract(msg, self.state)
190+
ret, err, ref = vmenv.Create(sender, contract.Address(), self.msg.Data(), self.gas, self.gasPrice, self.value)
192191
if err == nil {
193192
dataGas := big.NewInt(int64(len(ret)))
194193
dataGas.Mul(dataGas, vm.GasCreateByte)
195194
if err = self.UseGas(dataGas); err == nil {
195+
//self.state.SetCode(ref.Address(), ret)
196196
ref.SetCode(ret)
197197
}
198198
}
@@ -218,20 +218,19 @@ func MakeContract(msg Message, state *state.StateDB) *state.StateObject {
218218
}
219219

220220
func (self *StateTransition) RefundGas() {
221-
coinbaseSub := new(big.Int).Set(self.gas)
221+
coinbase, sender := self.Coinbase(), self.From()
222+
// Return remaining gas
223+
remaining := new(big.Int).Mul(self.gas, self.msg.GasPrice())
224+
sender.AddAmount(remaining)
225+
222226
uhalf := new(big.Int).Div(self.GasUsed(), ethutil.Big2)
223227
for addr, ref := range self.state.Refunds() {
224228
refund := ethutil.BigMin(uhalf, ref)
225-
coinbaseSub.Add(self.gas, refund)
229+
self.gas.Add(self.gas, refund)
226230
self.state.AddBalance([]byte(addr), refund.Mul(refund, self.msg.GasPrice()))
227231
}
228232

229-
coinbase, sender := self.Coinbase(), self.From()
230-
coinbase.RefundGas(coinbaseSub, self.msg.GasPrice())
231-
232-
// Return remaining gas
233-
remaining := new(big.Int).Mul(self.gas, self.msg.GasPrice())
234-
sender.AddAmount(remaining)
233+
coinbase.RefundGas(self.gas, self.msg.GasPrice())
235234
}
236235

237236
func (self *StateTransition) GasUsed() *big.Int {

state/state.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,13 @@ func (self *StateDB) GetCode(addr []byte) []byte {
9494
return nil
9595
}
9696

97+
func (self *StateDB) SetCode(addr, code []byte) {
98+
stateObject := self.GetStateObject(addr)
99+
if stateObject != nil {
100+
stateObject.SetCode(code)
101+
}
102+
}
103+
97104
func (self *StateDB) GetState(a, b []byte) []byte {
98105
stateObject := self.GetStateObject(a)
99106
if stateObject != nil {

vm/environment.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package vm
22

33
import (
44
"errors"
5+
"fmt"
56
"math/big"
67

78
"github.com/ethereum/go-ethereum/ethutil"
@@ -74,3 +75,7 @@ func (self *Log) Data() []byte {
7475
func (self *Log) RlpData() interface{} {
7576
return []interface{}{self.address, ethutil.ByteSliceToInterface(self.topics), self.data}
7677
}
78+
79+
func (self *Log) String() string {
80+
return fmt.Sprintf("[A=%x T=%x D=%x]", self.address, self.topics, self.data)
81+
}

vm/vm_debug.go

Lines changed: 22 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -108,13 +108,13 @@ func (self *DebugVm) Run(me, caller ClosureRef, code []byte, value, gas, price *
108108
}
109109
)
110110

111+
vmlogger.Debugf("(%d) (%x) %x (code=%d) gas: %v (d) %x\n", self.env.Depth(), caller.Address()[:4], closure.Address(), len(code), closure.Gas, callData)
112+
111113
// Don't bother with the execution if there's no code.
112114
if len(code) == 0 {
113115
return closure.Return(nil), nil
114116
}
115117

116-
vmlogger.Debugf("(%d) (%x) %x gas: %v (d) %x\n", self.env.Depth(), caller.Address()[:4], closure.Address(), closure.Gas, callData)
117-
118118
for {
119119
prevStep = step
120120
// The base for all big integer arithmetic
@@ -134,6 +134,7 @@ func (self *DebugVm) Run(me, caller ClosureRef, code []byte, value, gas, price *
134134
addStepGasUsage(GasStep)
135135

136136
var newMemSize *big.Int = ethutil.Big0
137+
var additionalGas *big.Int = new(big.Int)
137138
// Stack Check, memory resize & gas phase
138139
switch op {
139140
// Stack checks only
@@ -213,22 +214,24 @@ func (self *DebugVm) Run(me, caller ClosureRef, code []byte, value, gas, price *
213214
newMemSize = calcMemSize(stack.Peek(), stack.data[stack.Len()-2])
214215
case SHA3:
215216
require(2)
216-
217217
gas.Set(GasSha)
218-
219218
newMemSize = calcMemSize(stack.Peek(), stack.data[stack.Len()-2])
219+
additionalGas.Set(stack.data[stack.Len()-2])
220220
case CALLDATACOPY:
221221
require(2)
222222

223223
newMemSize = calcMemSize(stack.Peek(), stack.data[stack.Len()-3])
224+
additionalGas.Set(stack.data[stack.Len()-3])
224225
case CODECOPY:
225226
require(3)
226227

227228
newMemSize = calcMemSize(stack.Peek(), stack.data[stack.Len()-3])
229+
additionalGas.Set(stack.data[stack.Len()-3])
228230
case EXTCODECOPY:
229231
require(4)
230232

231233
newMemSize = calcMemSize(stack.data[stack.Len()-2], stack.data[stack.Len()-4])
234+
additionalGas.Set(stack.data[stack.Len()-4])
232235
case CALL, CALLCODE:
233236
require(7)
234237
gas.Set(GasCall)
@@ -245,20 +248,23 @@ func (self *DebugVm) Run(me, caller ClosureRef, code []byte, value, gas, price *
245248
newMemSize = calcMemSize(stack.data[stack.Len()-2], stack.data[stack.Len()-3])
246249
}
247250

251+
switch op {
252+
case CALLDATACOPY, CODECOPY, EXTCODECOPY:
253+
additionalGas.Add(additionalGas, u256(31))
254+
additionalGas.Div(additionalGas, u256(32))
255+
addStepGasUsage(additionalGas)
256+
case SHA3:
257+
additionalGas.Add(additionalGas, u256(31))
258+
additionalGas.Div(additionalGas, u256(32))
259+
additionalGas.Mul(additionalGas, GasSha3Byte)
260+
addStepGasUsage(additionalGas)
261+
}
262+
248263
if newMemSize.Cmp(ethutil.Big0) > 0 {
249264
newMemSize.Add(newMemSize, u256(31))
250265
newMemSize.Div(newMemSize, u256(32))
251266
newMemSize.Mul(newMemSize, u256(32))
252267

253-
switch op {
254-
case CALLDATACOPY, CODECOPY, EXTCODECOPY:
255-
addStepGasUsage(new(big.Int).Div(newMemSize, u256(32)))
256-
case SHA3:
257-
g := new(big.Int).Div(newMemSize, u256(32))
258-
g.Mul(g, GasSha3Byte)
259-
addStepGasUsage(g)
260-
}
261-
262268
if newMemSize.Cmp(u256(int64(mem.Len()))) > 0 {
263269
memGasUsage := new(big.Int).Sub(newMemSize, u256(int64(mem.Len())))
264270
memGasUsage.Mul(GasMemory, memGasUsage)
@@ -643,9 +649,7 @@ func (self *DebugVm) Run(me, caller ClosureRef, code []byte, value, gas, price *
643649
case CODECOPY, EXTCODECOPY:
644650
var code []byte
645651
if op == EXTCODECOPY {
646-
addr := stack.Pop().Bytes()
647-
648-
code = statedb.GetCode(addr)
652+
code = statedb.GetCode(stack.Pop().Bytes())
649653
} else {
650654
code = closure.Code
651655
}
@@ -663,12 +667,11 @@ func (self *DebugVm) Run(me, caller ClosureRef, code []byte, value, gas, price *
663667
} else if cOff+l > size {
664668
l = uint64(math.Min(float64(cOff+l), float64(size)))
665669
}
666-
667670
codeCopy := code[cOff : cOff+l]
668671

669672
mem.Set(mOff, l, codeCopy)
670673

671-
self.Printf(" => [%v, %v, %v] %x", mOff, cOff, l, code[cOff:cOff+l])
674+
self.Printf(" => [%v, %v, %v] %x", mOff, cOff, l, codeCopy)
672675
case GASPRICE:
673676
stack.Push(closure.Price)
674677

@@ -891,7 +894,7 @@ func (self *DebugVm) Run(me, caller ClosureRef, code []byte, value, gas, price *
891894
size, offset := stack.Popn()
892895
ret := mem.Get(offset.Int64(), size.Int64())
893896

894-
self.Printf(" => (%d) 0x%x", len(ret), ret).Endl()
897+
self.Printf(" => [%v, %v] (%d) 0x%x", offset, size, len(ret), ret).Endl()
895898

896899
return closure.Return(ret), nil
897900
case SUICIDE:

0 commit comments

Comments
 (0)