Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
G
Geth-Modification
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
张蕾
Geth-Modification
Commits
1508a23a
Commit
1508a23a
authored
Dec 20, 2014
by
obscuren
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Minor updates on gas and removed/refactored old code.
parent
f5b8f3d4
Changes
6
Show whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
53 additions
and
40 deletions
+53
-40
block_manager.go
core/block_manager.go
+3
-1
execution.go
core/execution.go
+6
-9
state_transition.go
core/state_transition.go
+10
-11
state.go
state/state.go
+7
-0
environment.go
vm/environment.go
+5
-0
vm_debug.go
vm/vm_debug.go
+22
-19
No files found.
core/block_manager.go
View file @
1508a23a
...
...
@@ -142,6 +142,7 @@ done:
receipt
:=
types
.
NewReceipt
(
state
.
Root
(),
cumulative
)
receipt
.
SetLogs
(
state
.
Logs
())
receipt
.
Bloom
=
types
.
CreateBloom
(
types
.
Receipts
{
receipt
})
chainlogger
.
Debugln
(
receipt
)
// Notify all subscribers
if
!
transientProcess
{
...
...
@@ -214,7 +215,8 @@ func (sm *BlockManager) ProcessWithParent(block, parent *types.Block) (td *big.I
receiptSha
:=
types
.
DeriveSha
(
receipts
)
if
bytes
.
Compare
(
receiptSha
,
block
.
ReceiptSha
)
!=
0
{
chainlogger
.
Debugln
(
receipts
)
//chainlogger.Debugf("validating receipt root. received=%x got=%x", block.ReceiptSha, receiptSha)
fmt
.
Printf
(
"%x
\n
"
,
ethutil
.
Encode
(
receipts
))
err
=
fmt
.
Errorf
(
"validating receipt root. received=%x got=%x"
,
block
.
ReceiptSha
,
receiptSha
)
return
}
...
...
core/execution.go
View file @
1508a23a
...
...
@@ -3,6 +3,7 @@ package core
import
(
"fmt"
"math/big"
"time"
"github.com/ethereum/go-ethereum/state"
"github.com/ethereum/go-ethereum/vm"
...
...
@@ -12,7 +13,6 @@ type Execution struct {
env
vm
.
Environment
address
,
input
[]
byte
Gas
,
price
,
value
*
big
.
Int
object
*
state
.
StateObject
SkipTransfer
bool
}
...
...
@@ -35,8 +35,6 @@ func (self *Execution) exec(code, contextAddr []byte, caller vm.ClosureRef) (ret
env
:=
self
.
env
evm
:=
vm
.
New
(
env
,
vm
.
DebugVmTy
)
chainlogger
.
Debugf
(
"pre state %x
\n
"
,
env
.
State
()
.
Root
())
if
env
.
Depth
()
==
vm
.
MaxCallDepth
{
// Consume all gas (by not returning it) and return a depth error
return
nil
,
vm
.
DepthError
{}
...
...
@@ -55,13 +53,12 @@ func (self *Execution) exec(code, contextAddr []byte, caller vm.ClosureRef) (ret
}
snapshot
:=
env
.
State
()
.
Copy
()
defer
func
()
{
env
.
State
()
.
Set
(
snapshot
)
chainlogger
.
Debugf
(
"post state %x
\n
"
,
env
.
State
()
.
Root
())
}()
self
.
object
=
to
start
:=
time
.
Now
()
ret
,
err
=
evm
.
Run
(
to
,
caller
,
code
,
self
.
value
,
self
.
Gas
,
self
.
price
,
self
.
input
)
if
err
!=
nil
{
env
.
State
()
.
Set
(
snapshot
)
}
chainlogger
.
Debugf
(
"vm took %v
\n
"
,
time
.
Since
(
start
))
return
}
...
...
core/state_transition.go
View file @
1508a23a
...
...
@@ -186,13 +186,13 @@ func (self *StateTransition) TransitionState() (ret []byte, err error) {
vmenv
:=
self
.
VmEnv
()
var
ref
vm
.
ClosureRef
if
MessageCreatesContract
(
msg
)
{
self
.
rec
=
MakeContract
(
msg
,
self
.
state
)
ret
,
err
,
ref
=
vmenv
.
Create
(
sender
,
self
.
rec
.
Address
(),
self
.
msg
.
Data
(),
self
.
gas
,
self
.
gasPrice
,
self
.
value
)
contract
:=
MakeContract
(
msg
,
self
.
state
)
ret
,
err
,
ref
=
vmenv
.
Create
(
sender
,
contract
.
Address
(),
self
.
msg
.
Data
(),
self
.
gas
,
self
.
gasPrice
,
self
.
value
)
if
err
==
nil
{
dataGas
:=
big
.
NewInt
(
int64
(
len
(
ret
)))
dataGas
.
Mul
(
dataGas
,
vm
.
GasCreateByte
)
if
err
=
self
.
UseGas
(
dataGas
);
err
==
nil
{
//self.state.SetCode(ref.Address(), ret)
ref
.
SetCode
(
ret
)
}
}
...
...
@@ -218,20 +218,19 @@ func MakeContract(msg Message, state *state.StateDB) *state.StateObject {
}
func
(
self
*
StateTransition
)
RefundGas
()
{
coinbaseSub
:=
new
(
big
.
Int
)
.
Set
(
self
.
gas
)
coinbase
,
sender
:=
self
.
Coinbase
(),
self
.
From
()
// Return remaining gas
remaining
:=
new
(
big
.
Int
)
.
Mul
(
self
.
gas
,
self
.
msg
.
GasPrice
())
sender
.
AddAmount
(
remaining
)
uhalf
:=
new
(
big
.
Int
)
.
Div
(
self
.
GasUsed
(),
ethutil
.
Big2
)
for
addr
,
ref
:=
range
self
.
state
.
Refunds
()
{
refund
:=
ethutil
.
BigMin
(
uhalf
,
ref
)
coinbaseSub
.
Add
(
self
.
gas
,
refund
)
self
.
gas
.
Add
(
self
.
gas
,
refund
)
self
.
state
.
AddBalance
([]
byte
(
addr
),
refund
.
Mul
(
refund
,
self
.
msg
.
GasPrice
()))
}
coinbase
,
sender
:=
self
.
Coinbase
(),
self
.
From
()
coinbase
.
RefundGas
(
coinbaseSub
,
self
.
msg
.
GasPrice
())
// Return remaining gas
remaining
:=
new
(
big
.
Int
)
.
Mul
(
self
.
gas
,
self
.
msg
.
GasPrice
())
sender
.
AddAmount
(
remaining
)
coinbase
.
RefundGas
(
self
.
gas
,
self
.
msg
.
GasPrice
())
}
func
(
self
*
StateTransition
)
GasUsed
()
*
big
.
Int
{
...
...
state/state.go
View file @
1508a23a
...
...
@@ -94,6 +94,13 @@ func (self *StateDB) GetCode(addr []byte) []byte {
return
nil
}
func
(
self
*
StateDB
)
SetCode
(
addr
,
code
[]
byte
)
{
stateObject
:=
self
.
GetStateObject
(
addr
)
if
stateObject
!=
nil
{
stateObject
.
SetCode
(
code
)
}
}
func
(
self
*
StateDB
)
GetState
(
a
,
b
[]
byte
)
[]
byte
{
stateObject
:=
self
.
GetStateObject
(
a
)
if
stateObject
!=
nil
{
...
...
vm/environment.go
View file @
1508a23a
...
...
@@ -2,6 +2,7 @@ package vm
import
(
"errors"
"fmt"
"math/big"
"github.com/ethereum/go-ethereum/ethutil"
...
...
@@ -74,3 +75,7 @@ func (self *Log) Data() []byte {
func
(
self
*
Log
)
RlpData
()
interface
{}
{
return
[]
interface
{}{
self
.
address
,
ethutil
.
ByteSliceToInterface
(
self
.
topics
),
self
.
data
}
}
func
(
self
*
Log
)
String
()
string
{
return
fmt
.
Sprintf
(
"[A=%x T=%x D=%x]"
,
self
.
address
,
self
.
topics
,
self
.
data
)
}
vm/vm_debug.go
View file @
1508a23a
...
...
@@ -108,13 +108,13 @@ func (self *DebugVm) Run(me, caller ClosureRef, code []byte, value, gas, price *
}
)
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
)
// Don't bother with the execution if there's no code.
if
len
(
code
)
==
0
{
return
closure
.
Return
(
nil
),
nil
}
vmlogger
.
Debugf
(
"(%d) (%x) %x gas: %v (d) %x
\n
"
,
self
.
env
.
Depth
(),
caller
.
Address
()[
:
4
],
closure
.
Address
(),
closure
.
Gas
,
callData
)
for
{
prevStep
=
step
// The base for all big integer arithmetic
...
...
@@ -134,6 +134,7 @@ func (self *DebugVm) Run(me, caller ClosureRef, code []byte, value, gas, price *
addStepGasUsage
(
GasStep
)
var
newMemSize
*
big
.
Int
=
ethutil
.
Big0
var
additionalGas
*
big
.
Int
=
new
(
big
.
Int
)
// Stack Check, memory resize & gas phase
switch
op
{
// Stack checks only
...
...
@@ -213,22 +214,24 @@ func (self *DebugVm) Run(me, caller ClosureRef, code []byte, value, gas, price *
newMemSize
=
calcMemSize
(
stack
.
Peek
(),
stack
.
data
[
stack
.
Len
()
-
2
])
case
SHA3
:
require
(
2
)
gas
.
Set
(
GasSha
)
newMemSize
=
calcMemSize
(
stack
.
Peek
(),
stack
.
data
[
stack
.
Len
()
-
2
])
additionalGas
.
Set
(
stack
.
data
[
stack
.
Len
()
-
2
])
case
CALLDATACOPY
:
require
(
2
)
newMemSize
=
calcMemSize
(
stack
.
Peek
(),
stack
.
data
[
stack
.
Len
()
-
3
])
additionalGas
.
Set
(
stack
.
data
[
stack
.
Len
()
-
3
])
case
CODECOPY
:
require
(
3
)
newMemSize
=
calcMemSize
(
stack
.
Peek
(),
stack
.
data
[
stack
.
Len
()
-
3
])
additionalGas
.
Set
(
stack
.
data
[
stack
.
Len
()
-
3
])
case
EXTCODECOPY
:
require
(
4
)
newMemSize
=
calcMemSize
(
stack
.
data
[
stack
.
Len
()
-
2
],
stack
.
data
[
stack
.
Len
()
-
4
])
additionalGas
.
Set
(
stack
.
data
[
stack
.
Len
()
-
4
])
case
CALL
,
CALLCODE
:
require
(
7
)
gas
.
Set
(
GasCall
)
...
...
@@ -245,20 +248,23 @@ func (self *DebugVm) Run(me, caller ClosureRef, code []byte, value, gas, price *
newMemSize
=
calcMemSize
(
stack
.
data
[
stack
.
Len
()
-
2
],
stack
.
data
[
stack
.
Len
()
-
3
])
}
if
newMemSize
.
Cmp
(
ethutil
.
Big0
)
>
0
{
newMemSize
.
Add
(
newMemSize
,
u256
(
31
))
newMemSize
.
Div
(
newMemSize
,
u256
(
32
))
newMemSize
.
Mul
(
newMemSize
,
u256
(
32
))
switch
op
{
case
CALLDATACOPY
,
CODECOPY
,
EXTCODECOPY
:
addStepGasUsage
(
new
(
big
.
Int
)
.
Div
(
newMemSize
,
u256
(
32
)))
additionalGas
.
Add
(
additionalGas
,
u256
(
31
))
additionalGas
.
Div
(
additionalGas
,
u256
(
32
))
addStepGasUsage
(
additionalGas
)
case
SHA3
:
g
:=
new
(
big
.
Int
)
.
Div
(
newMemSize
,
u256
(
32
))
g
.
Mul
(
g
,
GasSha3Byte
)
addStepGasUsage
(
g
)
additionalGas
.
Add
(
additionalGas
,
u256
(
31
))
additionalGas
.
Div
(
additionalGas
,
u256
(
32
))
additionalGas
.
Mul
(
additionalGas
,
GasSha3Byte
)
addStepGasUsage
(
additionalGas
)
}
if
newMemSize
.
Cmp
(
ethutil
.
Big0
)
>
0
{
newMemSize
.
Add
(
newMemSize
,
u256
(
31
))
newMemSize
.
Div
(
newMemSize
,
u256
(
32
))
newMemSize
.
Mul
(
newMemSize
,
u256
(
32
))
if
newMemSize
.
Cmp
(
u256
(
int64
(
mem
.
Len
())))
>
0
{
memGasUsage
:=
new
(
big
.
Int
)
.
Sub
(
newMemSize
,
u256
(
int64
(
mem
.
Len
())))
memGasUsage
.
Mul
(
GasMemory
,
memGasUsage
)
...
...
@@ -643,9 +649,7 @@ func (self *DebugVm) Run(me, caller ClosureRef, code []byte, value, gas, price *
case
CODECOPY
,
EXTCODECOPY
:
var
code
[]
byte
if
op
==
EXTCODECOPY
{
addr
:=
stack
.
Pop
()
.
Bytes
()
code
=
statedb
.
GetCode
(
addr
)
code
=
statedb
.
GetCode
(
stack
.
Pop
()
.
Bytes
())
}
else
{
code
=
closure
.
Code
}
...
...
@@ -663,12 +667,11 @@ func (self *DebugVm) Run(me, caller ClosureRef, code []byte, value, gas, price *
}
else
if
cOff
+
l
>
size
{
l
=
uint64
(
math
.
Min
(
float64
(
cOff
+
l
),
float64
(
size
)))
}
codeCopy
:=
code
[
cOff
:
cOff
+
l
]
mem
.
Set
(
mOff
,
l
,
codeCopy
)
self
.
Printf
(
" => [%v, %v, %v] %x"
,
mOff
,
cOff
,
l
,
code
[
cOff
:
cOff
+
l
]
)
self
.
Printf
(
" => [%v, %v, %v] %x"
,
mOff
,
cOff
,
l
,
code
Copy
)
case
GASPRICE
:
stack
.
Push
(
closure
.
Price
)
...
...
@@ -891,7 +894,7 @@ func (self *DebugVm) Run(me, caller ClosureRef, code []byte, value, gas, price *
size
,
offset
:=
stack
.
Popn
()
ret
:=
mem
.
Get
(
offset
.
Int64
(),
size
.
Int64
())
self
.
Printf
(
" =>
(%d) 0x%x"
,
len
(
ret
),
ret
)
.
Endl
()
self
.
Printf
(
" =>
[%v, %v] (%d) 0x%x"
,
offset
,
size
,
len
(
ret
),
ret
)
.
Endl
()
return
closure
.
Return
(
ret
),
nil
case
SUICIDE
:
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment