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
4dc7ee90
Commit
4dc7ee90
authored
Jan 02, 2015
by
obscuren
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Closure => Context
parent
e2d1d832
Changes
13
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
13 changed files
with
107 additions
and
119 deletions
+107
-119
main.go
cmd/evm/main.go
+3
-3
vm_env.go
cmd/utils/vm_env.go
+3
-3
chain_manager.go
core/chain_manager.go
+0
-20
execution.go
core/execution.go
+3
-3
state_transition.go
core/state_transition.go
+1
-1
vm_env.go
core/vm_env.go
+3
-3
vm.go
tests/helper/vm.go
+3
-3
context.go
vm/context.go
+17
-17
environment.go
vm/environment.go
+3
-3
virtual_machine.go
vm/virtual_machine.go
+1
-1
vm.go
vm/vm.go
+1
-1
vm_debug.go
vm/vm_debug.go
+66
-58
vm_env.go
xeth/vm_env.go
+3
-3
No files found.
cmd/evm/main.go
View file @
4dc7ee90
...
...
@@ -144,19 +144,19 @@ func (self *VMEnv) vm(addr, data []byte, gas, price, value *big.Int) *core.Execu
return
core
.
NewExecution
(
self
,
addr
,
data
,
gas
,
price
,
value
)
}
func
(
self
*
VMEnv
)
Call
(
caller
vm
.
C
losure
Ref
,
addr
,
data
[]
byte
,
gas
,
price
,
value
*
big
.
Int
)
([]
byte
,
error
)
{
func
(
self
*
VMEnv
)
Call
(
caller
vm
.
C
ontext
Ref
,
addr
,
data
[]
byte
,
gas
,
price
,
value
*
big
.
Int
)
([]
byte
,
error
)
{
exe
:=
self
.
vm
(
addr
,
data
,
gas
,
price
,
value
)
ret
,
err
:=
exe
.
Call
(
addr
,
caller
)
self
.
Gas
=
exe
.
Gas
return
ret
,
err
}
func
(
self
*
VMEnv
)
CallCode
(
caller
vm
.
C
losure
Ref
,
addr
,
data
[]
byte
,
gas
,
price
,
value
*
big
.
Int
)
([]
byte
,
error
)
{
func
(
self
*
VMEnv
)
CallCode
(
caller
vm
.
C
ontext
Ref
,
addr
,
data
[]
byte
,
gas
,
price
,
value
*
big
.
Int
)
([]
byte
,
error
)
{
exe
:=
self
.
vm
(
caller
.
Address
(),
data
,
gas
,
price
,
value
)
return
exe
.
Call
(
addr
,
caller
)
}
func
(
self
*
VMEnv
)
Create
(
caller
vm
.
C
losureRef
,
addr
,
data
[]
byte
,
gas
,
price
,
value
*
big
.
Int
)
([]
byte
,
error
,
vm
.
Closure
Ref
)
{
func
(
self
*
VMEnv
)
Create
(
caller
vm
.
C
ontextRef
,
addr
,
data
[]
byte
,
gas
,
price
,
value
*
big
.
Int
)
([]
byte
,
error
,
vm
.
Context
Ref
)
{
exe
:=
self
.
vm
(
addr
,
data
,
gas
,
price
,
value
)
return
exe
.
Create
(
caller
)
}
cmd/utils/vm_env.go
View file @
4dc7ee90
...
...
@@ -52,19 +52,19 @@ func (self *VMEnv) vm(addr, data []byte, gas, price, value *big.Int) *core.Execu
return
core
.
NewExecution
(
self
,
addr
,
data
,
gas
,
price
,
value
)
}
func
(
self
*
VMEnv
)
Call
(
caller
vm
.
C
losure
Ref
,
addr
,
data
[]
byte
,
gas
,
price
,
value
*
big
.
Int
)
([]
byte
,
error
)
{
func
(
self
*
VMEnv
)
Call
(
caller
vm
.
C
ontext
Ref
,
addr
,
data
[]
byte
,
gas
,
price
,
value
*
big
.
Int
)
([]
byte
,
error
)
{
exe
:=
self
.
vm
(
addr
,
data
,
gas
,
price
,
value
)
ret
,
err
:=
exe
.
Call
(
addr
,
caller
)
self
.
Gas
=
exe
.
Gas
return
ret
,
err
}
func
(
self
*
VMEnv
)
CallCode
(
caller
vm
.
C
losure
Ref
,
addr
,
data
[]
byte
,
gas
,
price
,
value
*
big
.
Int
)
([]
byte
,
error
)
{
func
(
self
*
VMEnv
)
CallCode
(
caller
vm
.
C
ontext
Ref
,
addr
,
data
[]
byte
,
gas
,
price
,
value
*
big
.
Int
)
([]
byte
,
error
)
{
exe
:=
self
.
vm
(
caller
.
Address
(),
data
,
gas
,
price
,
value
)
return
exe
.
Call
(
addr
,
caller
)
}
func
(
self
*
VMEnv
)
Create
(
caller
vm
.
C
losureRef
,
addr
,
data
[]
byte
,
gas
,
price
,
value
*
big
.
Int
)
([]
byte
,
error
,
vm
.
Closure
Ref
)
{
func
(
self
*
VMEnv
)
Create
(
caller
vm
.
C
ontextRef
,
addr
,
data
[]
byte
,
gas
,
price
,
value
*
big
.
Int
)
([]
byte
,
error
,
vm
.
Context
Ref
)
{
exe
:=
self
.
vm
(
addr
,
data
,
gas
,
price
,
value
)
return
exe
.
Create
(
caller
)
}
core/chain_manager.go
View file @
4dc7ee90
...
...
@@ -20,26 +20,6 @@ type StateQuery interface {
GetAccount
(
addr
[]
byte
)
*
state
.
StateObject
}
/*
func AddTestNetFunds(block *types.Block) {
for _, addr := range []string{
"51ba59315b3a95761d0863b05ccc7a7f54703d99",
"e4157b34ea9615cfbde6b4fda419828124b70c78",
"b9c015918bdaba24b4ff057a92a3873d6eb201be",
"6c386a4b26f73c802f34673f7248bb118f97424a",
"cd2a3d9f938e13cd947ec05abc7fe734df8dd826",
"2ef47100e0787b915105fd5e3f4ff6752079d5cb",
"e6716f9544a56c530d868e4bfbacb172315bdead",
"1a26338f0d905e295fccb71fa9ea849ffa12aaf4",
} {
codedAddr := ethutil.Hex2Bytes(addr)
account := block.State().GetAccount(codedAddr)
account.SetBalance(ethutil.Big("1606938044258990275541962092341162602522202993782792835301376")) //ethutil.BigPow(2, 200)
block.State().UpdateStateObject(account)
}
}
*/
func
CalcDifficulty
(
block
,
parent
*
types
.
Block
)
*
big
.
Int
{
diff
:=
new
(
big
.
Int
)
...
...
core/execution.go
View file @
4dc7ee90
...
...
@@ -24,14 +24,14 @@ func (self *Execution) Addr() []byte {
return
self
.
address
}
func
(
self
*
Execution
)
Call
(
codeAddr
[]
byte
,
caller
vm
.
C
losure
Ref
)
([]
byte
,
error
)
{
func
(
self
*
Execution
)
Call
(
codeAddr
[]
byte
,
caller
vm
.
C
ontext
Ref
)
([]
byte
,
error
)
{
// Retrieve the executing code
code
:=
self
.
env
.
State
()
.
GetCode
(
codeAddr
)
return
self
.
exec
(
code
,
codeAddr
,
caller
)
}
func
(
self
*
Execution
)
exec
(
code
,
contextAddr
[]
byte
,
caller
vm
.
C
losure
Ref
)
(
ret
[]
byte
,
err
error
)
{
func
(
self
*
Execution
)
exec
(
code
,
contextAddr
[]
byte
,
caller
vm
.
C
ontext
Ref
)
(
ret
[]
byte
,
err
error
)
{
env
:=
self
.
env
evm
:=
vm
.
New
(
env
,
vm
.
DebugVmTy
)
...
...
@@ -63,7 +63,7 @@ func (self *Execution) exec(code, contextAddr []byte, caller vm.ClosureRef) (ret
return
}
func
(
self
*
Execution
)
Create
(
caller
vm
.
C
losure
Ref
)
(
ret
[]
byte
,
err
error
,
account
*
state
.
StateObject
)
{
func
(
self
*
Execution
)
Create
(
caller
vm
.
C
ontext
Ref
)
(
ret
[]
byte
,
err
error
,
account
*
state
.
StateObject
)
{
ret
,
err
=
self
.
exec
(
self
.
input
,
nil
,
caller
)
account
=
self
.
env
.
State
()
.
GetStateObject
(
self
.
address
)
...
...
core/state_transition.go
View file @
4dc7ee90
...
...
@@ -184,7 +184,7 @@ func (self *StateTransition) TransitionState() (ret []byte, err error) {
}
vmenv
:=
self
.
VmEnv
()
var
ref
vm
.
C
losure
Ref
var
ref
vm
.
C
ontext
Ref
if
MessageCreatesContract
(
msg
)
{
contract
:=
MakeContract
(
msg
,
self
.
state
)
ret
,
err
,
ref
=
vmenv
.
Create
(
sender
,
contract
.
Address
(),
self
.
msg
.
Data
(),
self
.
gas
,
self
.
gasPrice
,
self
.
value
)
...
...
core/vm_env.go
View file @
4dc7ee90
...
...
@@ -46,16 +46,16 @@ func (self *VMEnv) vm(addr, data []byte, gas, price, value *big.Int) *Execution
return
NewExecution
(
self
,
addr
,
data
,
gas
,
price
,
value
)
}
func
(
self
*
VMEnv
)
Call
(
me
vm
.
C
losure
Ref
,
addr
,
data
[]
byte
,
gas
,
price
,
value
*
big
.
Int
)
([]
byte
,
error
)
{
func
(
self
*
VMEnv
)
Call
(
me
vm
.
C
ontext
Ref
,
addr
,
data
[]
byte
,
gas
,
price
,
value
*
big
.
Int
)
([]
byte
,
error
)
{
exe
:=
self
.
vm
(
addr
,
data
,
gas
,
price
,
value
)
return
exe
.
Call
(
addr
,
me
)
}
func
(
self
*
VMEnv
)
CallCode
(
me
vm
.
C
losure
Ref
,
addr
,
data
[]
byte
,
gas
,
price
,
value
*
big
.
Int
)
([]
byte
,
error
)
{
func
(
self
*
VMEnv
)
CallCode
(
me
vm
.
C
ontext
Ref
,
addr
,
data
[]
byte
,
gas
,
price
,
value
*
big
.
Int
)
([]
byte
,
error
)
{
exe
:=
self
.
vm
(
me
.
Address
(),
data
,
gas
,
price
,
value
)
return
exe
.
Call
(
addr
,
me
)
}
func
(
self
*
VMEnv
)
Create
(
me
vm
.
C
losureRef
,
addr
,
data
[]
byte
,
gas
,
price
,
value
*
big
.
Int
)
([]
byte
,
error
,
vm
.
Closure
Ref
)
{
func
(
self
*
VMEnv
)
Create
(
me
vm
.
C
ontextRef
,
addr
,
data
[]
byte
,
gas
,
price
,
value
*
big
.
Int
)
([]
byte
,
error
,
vm
.
Context
Ref
)
{
exe
:=
self
.
vm
(
addr
,
data
,
gas
,
price
,
value
)
return
exe
.
Create
(
me
)
}
tests/helper/vm.go
View file @
4dc7ee90
...
...
@@ -74,19 +74,19 @@ func (self *Env) vm(addr, data []byte, gas, price, value *big.Int) *core.Executi
return
exec
}
func
(
self
*
Env
)
Call
(
caller
vm
.
C
losure
Ref
,
addr
,
data
[]
byte
,
gas
,
price
,
value
*
big
.
Int
)
([]
byte
,
error
)
{
func
(
self
*
Env
)
Call
(
caller
vm
.
C
ontext
Ref
,
addr
,
data
[]
byte
,
gas
,
price
,
value
*
big
.
Int
)
([]
byte
,
error
)
{
exe
:=
self
.
vm
(
addr
,
data
,
gas
,
price
,
value
)
ret
,
err
:=
exe
.
Call
(
addr
,
caller
)
self
.
Gas
=
exe
.
Gas
return
ret
,
err
}
func
(
self
*
Env
)
CallCode
(
caller
vm
.
C
losure
Ref
,
addr
,
data
[]
byte
,
gas
,
price
,
value
*
big
.
Int
)
([]
byte
,
error
)
{
func
(
self
*
Env
)
CallCode
(
caller
vm
.
C
ontext
Ref
,
addr
,
data
[]
byte
,
gas
,
price
,
value
*
big
.
Int
)
([]
byte
,
error
)
{
exe
:=
self
.
vm
(
caller
.
Address
(),
data
,
gas
,
price
,
value
)
return
exe
.
Call
(
addr
,
caller
)
}
func
(
self
*
Env
)
Create
(
caller
vm
.
C
losureRef
,
addr
,
data
[]
byte
,
gas
,
price
,
value
*
big
.
Int
)
([]
byte
,
error
,
vm
.
Closure
Ref
)
{
func
(
self
*
Env
)
Create
(
caller
vm
.
C
ontextRef
,
addr
,
data
[]
byte
,
gas
,
price
,
value
*
big
.
Int
)
([]
byte
,
error
,
vm
.
Context
Ref
)
{
exe
:=
self
.
vm
(
addr
,
data
,
gas
,
price
,
value
)
return
exe
.
Create
(
caller
)
}
...
...
vm/c
losure
.go
→
vm/c
ontext
.go
View file @
4dc7ee90
...
...
@@ -8,15 +8,15 @@ import (
"github.com/ethereum/go-ethereum/state"
)
type
C
losure
Ref
interface
{
type
C
ontext
Ref
interface
{
ReturnGas
(
*
big
.
Int
,
*
big
.
Int
)
Address
()
[]
byte
SetCode
([]
byte
)
}
type
C
losure
struct
{
caller
C
losure
Ref
object
C
losure
Ref
type
C
ontext
struct
{
caller
C
ontext
Ref
object
C
ontext
Ref
Code
[]
byte
message
*
state
.
Message
...
...
@@ -25,9 +25,9 @@ type Closure struct {
Args
[]
byte
}
// Create a new c
losure
for the given data items
func
NewC
losure
(
msg
*
state
.
Message
,
caller
ClosureRef
,
object
ClosureRef
,
code
[]
byte
,
gas
,
price
*
big
.
Int
)
*
Closure
{
c
:=
&
C
losure
{
message
:
msg
,
caller
:
caller
,
object
:
object
,
Code
:
code
,
Args
:
nil
}
// Create a new c
ontext
for the given data items
func
NewC
ontext
(
msg
*
state
.
Message
,
caller
ContextRef
,
object
ContextRef
,
code
[]
byte
,
gas
,
price
*
big
.
Int
)
*
Context
{
c
:=
&
C
ontext
{
message
:
msg
,
caller
:
caller
,
object
:
object
,
Code
:
code
,
Args
:
nil
}
// Gas should be a pointer so it can safely be reduced through the run
// This pointer will be off the state transition
...
...
@@ -40,11 +40,11 @@ func NewClosure(msg *state.Message, caller ClosureRef, object ClosureRef, code [
return
c
}
func
(
c
*
C
losure
)
GetOp
(
x
uint64
)
OpCode
{
func
(
c
*
C
ontext
)
GetOp
(
x
uint64
)
OpCode
{
return
OpCode
(
c
.
GetByte
(
x
))
}
func
(
c
*
C
losure
)
GetByte
(
x
uint64
)
byte
{
func
(
c
*
C
ontext
)
GetByte
(
x
uint64
)
byte
{
if
x
<
uint64
(
len
(
c
.
Code
))
{
return
c
.
Code
[
x
]
}
...
...
@@ -52,18 +52,18 @@ func (c *Closure) GetByte(x uint64) byte {
return
0
}
func
(
c
*
C
losure
)
GetBytes
(
x
,
y
int
)
[]
byte
{
func
(
c
*
C
ontext
)
GetBytes
(
x
,
y
int
)
[]
byte
{
return
c
.
GetRangeValue
(
uint64
(
x
),
uint64
(
y
))
}
func
(
c
*
C
losure
)
GetRangeValue
(
x
,
size
uint64
)
[]
byte
{
func
(
c
*
C
ontext
)
GetRangeValue
(
x
,
size
uint64
)
[]
byte
{
x
=
uint64
(
math
.
Min
(
float64
(
x
),
float64
(
len
(
c
.
Code
))))
y
:=
uint64
(
math
.
Min
(
float64
(
x
+
size
),
float64
(
len
(
c
.
Code
))))
return
ethutil
.
LeftPadBytes
(
c
.
Code
[
x
:
y
],
int
(
size
))
}
func
(
c
*
C
losure
)
Return
(
ret
[]
byte
)
[]
byte
{
func
(
c
*
C
ontext
)
Return
(
ret
[]
byte
)
[]
byte
{
// Return the remaining gas to the caller
c
.
caller
.
ReturnGas
(
c
.
Gas
,
c
.
Price
)
...
...
@@ -73,7 +73,7 @@ func (c *Closure) Return(ret []byte) []byte {
/*
* Gas functions
*/
func
(
c
*
C
losure
)
UseGas
(
gas
*
big
.
Int
)
bool
{
func
(
c
*
C
ontext
)
UseGas
(
gas
*
big
.
Int
)
bool
{
if
c
.
Gas
.
Cmp
(
gas
)
<
0
{
return
false
}
...
...
@@ -86,8 +86,8 @@ func (c *Closure) UseGas(gas *big.Int) bool {
}
// Implement the caller interface
func
(
c
*
C
losure
)
ReturnGas
(
gas
,
price
*
big
.
Int
)
{
// Return the gas to the c
losure
func
(
c
*
C
ontext
)
ReturnGas
(
gas
,
price
*
big
.
Int
)
{
// Return the gas to the c
ontext
c
.
Gas
.
Add
(
c
.
Gas
,
gas
)
c
.
UsedGas
.
Sub
(
c
.
UsedGas
,
gas
)
}
...
...
@@ -95,10 +95,10 @@ func (c *Closure) ReturnGas(gas, price *big.Int) {
/*
* Set / Get
*/
func
(
c
*
C
losure
)
Address
()
[]
byte
{
func
(
c
*
C
ontext
)
Address
()
[]
byte
{
return
c
.
object
.
Address
()
}
func
(
self
*
C
losure
)
SetCode
(
code
[]
byte
)
{
func
(
self
*
C
ontext
)
SetCode
(
code
[]
byte
)
{
self
.
Code
=
code
}
vm/environment.go
View file @
4dc7ee90
...
...
@@ -26,9 +26,9 @@ type Environment interface {
Depth
()
int
SetDepth
(
i
int
)
Call
(
me
C
losure
Ref
,
addr
,
data
[]
byte
,
gas
,
price
,
value
*
big
.
Int
)
([]
byte
,
error
)
CallCode
(
me
C
losure
Ref
,
addr
,
data
[]
byte
,
gas
,
price
,
value
*
big
.
Int
)
([]
byte
,
error
)
Create
(
me
C
losureRef
,
addr
,
data
[]
byte
,
gas
,
price
,
value
*
big
.
Int
)
([]
byte
,
error
,
Closure
Ref
)
Call
(
me
C
ontext
Ref
,
addr
,
data
[]
byte
,
gas
,
price
,
value
*
big
.
Int
)
([]
byte
,
error
)
CallCode
(
me
C
ontext
Ref
,
addr
,
data
[]
byte
,
gas
,
price
,
value
*
big
.
Int
)
([]
byte
,
error
)
Create
(
me
C
ontextRef
,
addr
,
data
[]
byte
,
gas
,
price
,
value
*
big
.
Int
)
([]
byte
,
error
,
Context
Ref
)
}
type
Object
interface
{
...
...
vm/virtual_machine.go
View file @
4dc7ee90
...
...
@@ -4,7 +4,7 @@ import "math/big"
type
VirtualMachine
interface
{
Env
()
Environment
Run
(
me
,
caller
C
losure
Ref
,
code
[]
byte
,
value
,
gas
,
price
*
big
.
Int
,
data
[]
byte
)
([]
byte
,
error
)
Run
(
me
,
caller
C
ontext
Ref
,
code
[]
byte
,
value
,
gas
,
price
*
big
.
Int
,
data
[]
byte
)
([]
byte
,
error
)
Printf
(
string
,
...
interface
{})
VirtualMachine
Endl
()
VirtualMachine
}
vm/vm.go
View file @
4dc7ee90
...
...
@@ -20,7 +20,7 @@ func New(env Environment, typ Type) VirtualMachine {
}
}
func
(
self
*
Vm
)
Run
(
me
,
caller
C
losure
Ref
,
code
[]
byte
,
value
,
gas
,
price
*
big
.
Int
,
data
[]
byte
)
(
ret
[]
byte
,
err
error
)
{
func
(
self
*
Vm
)
Run
(
me
,
caller
C
ontext
Ref
,
code
[]
byte
,
value
,
gas
,
price
*
big
.
Int
,
data
[]
byte
)
(
ret
[]
byte
,
err
error
)
{
panic
(
"not implemented"
)
}
...
...
vm/vm_debug.go
View file @
4dc7ee90
This diff is collapsed.
Click to expand it.
xeth/vm_env.go
View file @
4dc7ee90
...
...
@@ -50,16 +50,16 @@ func (self *VMEnv) vm(addr, data []byte, gas, price, value *big.Int) *core.Execu
return
core
.
NewExecution
(
self
,
addr
,
data
,
gas
,
price
,
value
)
}
func
(
self
*
VMEnv
)
Call
(
me
vm
.
C
losure
Ref
,
addr
,
data
[]
byte
,
gas
,
price
,
value
*
big
.
Int
)
([]
byte
,
error
)
{
func
(
self
*
VMEnv
)
Call
(
me
vm
.
C
ontext
Ref
,
addr
,
data
[]
byte
,
gas
,
price
,
value
*
big
.
Int
)
([]
byte
,
error
)
{
exe
:=
self
.
vm
(
addr
,
data
,
gas
,
price
,
value
)
return
exe
.
Call
(
addr
,
me
)
}
func
(
self
*
VMEnv
)
CallCode
(
me
vm
.
C
losure
Ref
,
addr
,
data
[]
byte
,
gas
,
price
,
value
*
big
.
Int
)
([]
byte
,
error
)
{
func
(
self
*
VMEnv
)
CallCode
(
me
vm
.
C
ontext
Ref
,
addr
,
data
[]
byte
,
gas
,
price
,
value
*
big
.
Int
)
([]
byte
,
error
)
{
exe
:=
self
.
vm
(
me
.
Address
(),
data
,
gas
,
price
,
value
)
return
exe
.
Call
(
addr
,
me
)
}
func
(
self
*
VMEnv
)
Create
(
me
vm
.
C
losureRef
,
addr
,
data
[]
byte
,
gas
,
price
,
value
*
big
.
Int
)
([]
byte
,
error
,
vm
.
Closure
Ref
)
{
func
(
self
*
VMEnv
)
Create
(
me
vm
.
C
ontextRef
,
addr
,
data
[]
byte
,
gas
,
price
,
value
*
big
.
Int
)
([]
byte
,
error
,
vm
.
Context
Ref
)
{
exe
:=
self
.
vm
(
addr
,
data
,
gas
,
price
,
value
)
return
exe
.
Create
(
me
)
}
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