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
9007f2bb
Commit
9007f2bb
authored
Mar 09, 2015
by
obscuren
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
reworked stack
parent
0795fd27
Changes
6
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
352 additions
and
442 deletions
+352
-442
gh_test.go
tests/vm/gh_test.go
+0
-6
debugger.go
vm/debugger.go
+0
-9
gas.go
vm/gas.go
+86
-0
memory.go
vm/memory.go
+72
-0
stack.go
vm/stack.go
+28
-142
vm.go
vm/vm.go
+166
-285
No files found.
tests/vm/gh_test.go
View file @
9007f2bb
...
...
@@ -11,7 +11,6 @@ import (
"github.com/ethereum/go-ethereum/logger"
"github.com/ethereum/go-ethereum/state"
"github.com/ethereum/go-ethereum/tests/helper"
"github.com/ethereum/go-ethereum/vm"
)
type
Account
struct
{
...
...
@@ -81,11 +80,6 @@ func RunVmTest(p string, t *testing.T) {
helper
.
CreateFileTests
(
t
,
p
,
&
tests
)
for
name
,
test
:=
range
tests
{
vm
.
Debug
=
true
helper
.
Logger
.
SetLogLevel
(
4
)
if
name
!=
"addmod0"
{
continue
}
db
,
_
:=
ethdb
.
NewMemDatabase
()
statedb
:=
state
.
New
(
nil
,
db
)
for
addr
,
account
:=
range
test
.
Pre
{
...
...
vm/debugger.go
View file @
9007f2bb
package
vm
import
"github.com/ethereum/go-ethereum/state"
type
Debugger
interface
{
BreakHook
(
step
int
,
op
OpCode
,
mem
*
Memory
,
stack
*
Stack
,
object
*
state
.
StateObject
)
bool
StepHook
(
step
int
,
op
OpCode
,
mem
*
Memory
,
stack
*
Stack
,
object
*
state
.
StateObject
)
bool
BreakPoints
()
[]
int64
SetCode
(
byteCode
[]
byte
)
}
vm/gas.go
0 → 100644
View file @
9007f2bb
package
vm
import
"math/big"
type
req
struct
{
stack
int
gas
*
big
.
Int
}
var
_baseCheck
=
map
[
OpCode
]
req
{
// Req stack Gas price
ADD
:
{
2
,
GasFastestStep
},
LT
:
{
2
,
GasFastestStep
},
GT
:
{
2
,
GasFastestStep
},
SLT
:
{
2
,
GasFastestStep
},
SGT
:
{
2
,
GasFastestStep
},
EQ
:
{
2
,
GasFastestStep
},
ISZERO
:
{
1
,
GasFastestStep
},
SUB
:
{
2
,
GasFastestStep
},
AND
:
{
2
,
GasFastestStep
},
OR
:
{
2
,
GasFastestStep
},
XOR
:
{
2
,
GasFastestStep
},
NOT
:
{
1
,
GasFastestStep
},
BYTE
:
{
2
,
GasFastestStep
},
CALLDATALOAD
:
{
1
,
GasFastestStep
},
CALLDATACOPY
:
{
3
,
GasFastestStep
},
MLOAD
:
{
1
,
GasFastestStep
},
MSTORE
:
{
2
,
GasFastestStep
},
MSTORE8
:
{
2
,
GasFastestStep
},
CODECOPY
:
{
3
,
GasFastestStep
},
MUL
:
{
2
,
GasFastStep
},
DIV
:
{
2
,
GasFastStep
},
SDIV
:
{
2
,
GasFastStep
},
MOD
:
{
2
,
GasFastStep
},
SMOD
:
{
2
,
GasFastStep
},
SIGNEXTEND
:
{
2
,
GasFastStep
},
ADDMOD
:
{
3
,
GasMidStep
},
MULMOD
:
{
3
,
GasMidStep
},
JUMP
:
{
1
,
GasMidStep
},
JUMPI
:
{
2
,
GasSlowStep
},
EXP
:
{
2
,
GasSlowStep
},
ADDRESS
:
{
0
,
GasQuickStep
},
ORIGIN
:
{
0
,
GasQuickStep
},
CALLER
:
{
0
,
GasQuickStep
},
CALLVALUE
:
{
0
,
GasQuickStep
},
CODESIZE
:
{
0
,
GasQuickStep
},
GASPRICE
:
{
0
,
GasQuickStep
},
COINBASE
:
{
0
,
GasQuickStep
},
TIMESTAMP
:
{
0
,
GasQuickStep
},
NUMBER
:
{
0
,
GasQuickStep
},
CALLDATASIZE
:
{
0
,
GasQuickStep
},
DIFFICULTY
:
{
0
,
GasQuickStep
},
GASLIMIT
:
{
0
,
GasQuickStep
},
POP
:
{
0
,
GasQuickStep
},
PC
:
{
0
,
GasQuickStep
},
MSIZE
:
{
0
,
GasQuickStep
},
GAS
:
{
0
,
GasQuickStep
},
BLOCKHASH
:
{
1
,
GasExtStep
},
BALANCE
:
{
0
,
GasExtStep
},
EXTCODESIZE
:
{
1
,
GasExtStep
},
EXTCODECOPY
:
{
4
,
GasExtStep
},
SLOAD
:
{
1
,
GasStorageGet
},
SSTORE
:
{
2
,
Zero
},
SHA3
:
{
1
,
GasSha3Base
},
CREATE
:
{
3
,
GasCreate
},
CALL
:
{
7
,
GasCall
},
CALLCODE
:
{
7
,
GasCall
},
JUMPDEST
:
{
0
,
GasJumpDest
},
SUICIDE
:
{
1
,
Zero
},
RETURN
:
{
2
,
Zero
},
}
func
baseCheck
(
op
OpCode
,
stack
*
stack
,
gas
*
big
.
Int
)
{
if
r
,
ok
:=
_baseCheck
[
op
];
ok
{
stack
.
require
(
r
.
stack
)
gas
.
Add
(
gas
,
r
.
gas
)
}
}
func
toWordSize
(
size
*
big
.
Int
)
*
big
.
Int
{
tmp
:=
new
(
big
.
Int
)
tmp
.
Add
(
size
,
u256
(
31
))
tmp
.
Div
(
tmp
,
u256
(
32
))
return
tmp
}
vm/memory.go
0 → 100644
View file @
9007f2bb
package
vm
import
"fmt"
type
Memory
struct
{
store
[]
byte
}
func
NewMemory
()
*
Memory
{
return
&
Memory
{
nil
}
}
func
(
m
*
Memory
)
Set
(
offset
,
size
uint64
,
value
[]
byte
)
{
if
len
(
value
)
>
0
{
totSize
:=
offset
+
size
lenSize
:=
uint64
(
len
(
m
.
store
)
-
1
)
if
totSize
>
lenSize
{
// Calculate the diff between the sizes
diff
:=
totSize
-
lenSize
if
diff
>
0
{
// Create a new empty slice and append it
newSlice
:=
make
([]
byte
,
diff
-
1
)
// Resize slice
m
.
store
=
append
(
m
.
store
,
newSlice
...
)
}
}
copy
(
m
.
store
[
offset
:
offset
+
size
],
value
)
}
}
func
(
m
*
Memory
)
Resize
(
size
uint64
)
{
if
uint64
(
m
.
Len
())
<
size
{
m
.
store
=
append
(
m
.
store
,
make
([]
byte
,
size
-
uint64
(
m
.
Len
()))
...
)
}
}
func
(
self
*
Memory
)
Get
(
offset
,
size
int64
)
(
cpy
[]
byte
)
{
if
size
==
0
{
return
nil
}
if
len
(
self
.
store
)
>
int
(
offset
)
{
cpy
=
make
([]
byte
,
size
)
copy
(
cpy
,
self
.
store
[
offset
:
offset
+
size
])
return
}
return
}
func
(
m
*
Memory
)
Len
()
int
{
return
len
(
m
.
store
)
}
func
(
m
*
Memory
)
Data
()
[]
byte
{
return
m
.
store
}
func
(
m
*
Memory
)
Print
()
{
fmt
.
Printf
(
"### mem %d bytes ###
\n
"
,
len
(
m
.
store
))
if
len
(
m
.
store
)
>
0
{
addr
:=
0
for
i
:=
0
;
i
+
32
<=
len
(
m
.
store
);
i
+=
32
{
fmt
.
Printf
(
"%03d: % x
\n
"
,
addr
,
m
.
store
[
i
:
i
+
32
])
addr
++
}
}
else
{
fmt
.
Println
(
"-- empty --"
)
}
fmt
.
Println
(
"####################"
)
}
vm/stack.go
View file @
9007f2bb
...
...
@@ -5,98 +5,53 @@ import (
"math/big"
)
type
OpType
int
const
(
tNorm
=
iota
tData
tExtro
tCrypto
)
type
TxCallback
func
(
opType
OpType
)
bool
// Simple push/pop stack mechanism
type
Stack
struct
{
data
[]
*
big
.
Int
}
func
NewStack
()
*
Stack
{
return
&
Stack
{}
}
func
(
st
*
Stack
)
Data
()
[]
*
big
.
Int
{
return
st
.
data
}
func
(
st
*
Stack
)
Len
()
int
{
return
len
(
st
.
data
)
}
func
(
st
*
Stack
)
Pop
()
*
big
.
Int
{
str
:=
st
.
data
[
len
(
st
.
data
)
-
1
]
copy
(
st
.
data
[
:
len
(
st
.
data
)
-
1
],
st
.
data
[
:
len
(
st
.
data
)
-
1
])
st
.
data
=
st
.
data
[
:
len
(
st
.
data
)
-
1
]
return
str
func
newStack
()
*
stack
{
return
&
stack
{}
}
func
(
st
*
Stack
)
Popn
()
(
*
big
.
Int
,
*
big
.
Int
)
{
ints
:=
st
.
data
[
len
(
st
.
data
)
-
2
:
]
copy
(
st
.
data
[
:
len
(
st
.
data
)
-
2
],
st
.
data
[
:
len
(
st
.
data
)
-
2
])
st
.
data
=
st
.
data
[
:
len
(
st
.
data
)
-
2
]
return
ints
[
0
],
ints
[
1
]
type
stack
struct
{
data
[]
*
big
.
Int
ptr
int
}
func
(
st
*
Stack
)
Peek
()
*
big
.
Int
{
str
:=
st
.
data
[
len
(
st
.
data
)
-
1
]
return
str
func
(
st
*
stack
)
push
(
d
*
big
.
Int
)
{
if
len
(
st
.
data
)
>
st
.
ptr
{
st
.
data
[
st
.
ptr
]
=
d
}
else
{
st
.
data
=
append
(
st
.
data
,
d
)
}
st
.
ptr
++
}
func
(
st
*
Stack
)
Peekn
()
(
*
big
.
Int
,
*
big
.
Int
)
{
ints
:=
st
.
data
[
len
(
st
.
data
)
-
2
:
]
return
ints
[
0
],
ints
[
1
]
func
(
st
*
stack
)
pop
()
(
ret
*
big
.
Int
)
{
st
.
ptr
--
ret
=
st
.
data
[
st
.
ptr
]
return
}
func
(
st
*
Stack
)
Swapn
(
n
int
)
(
*
big
.
Int
,
*
big
.
Int
)
{
st
.
data
[
len
(
st
.
data
)
-
n
],
st
.
data
[
len
(
st
.
data
)
-
1
]
=
st
.
data
[
len
(
st
.
data
)
-
1
],
st
.
data
[
len
(
st
.
data
)
-
n
]
return
st
.
data
[
len
(
st
.
data
)
-
n
],
st
.
data
[
len
(
st
.
data
)
-
1
]
func
(
st
*
stack
)
len
()
int
{
return
st
.
ptr
}
func
(
st
*
Stack
)
Dupn
(
n
int
)
*
big
.
Int
{
st
.
Push
(
st
.
data
[
len
(
st
.
data
)
-
n
])
return
st
.
Peek
()
func
(
st
*
stack
)
swap
(
n
int
)
{
st
.
data
[
st
.
len
()
-
n
],
st
.
data
[
st
.
len
()
-
1
]
=
st
.
data
[
st
.
len
()
-
1
],
st
.
data
[
st
.
len
()
-
n
]
}
func
(
st
*
Stack
)
Push
(
d
*
big
.
I
nt
)
{
st
.
data
=
append
(
st
.
data
,
new
(
big
.
Int
)
.
Set
(
d
)
)
func
(
st
*
stack
)
dup
(
n
i
nt
)
{
st
.
push
(
st
.
data
[
st
.
len
()
-
n
]
)
}
func
(
st
*
Stack
)
Get
(
amount
*
big
.
Int
)
[]
*
big
.
Int
{
// offset + size <= len(data)
length
:=
big
.
NewInt
(
int64
(
len
(
st
.
data
)))
if
amount
.
Cmp
(
length
)
<=
0
{
start
:=
new
(
big
.
Int
)
.
Sub
(
length
,
amount
)
return
st
.
data
[
start
.
Int64
()
:
length
.
Int64
()]
}
return
nil
func
(
st
*
stack
)
peek
()
*
big
.
Int
{
return
st
.
data
[
st
.
len
()
-
1
]
}
func
(
st
*
S
tack
)
require
(
n
int
)
{
if
st
.
L
en
()
<
n
{
panic
(
fmt
.
Sprintf
(
"stack underflow (%d <=> %d)"
,
st
.
Len
(
),
n
))
func
(
st
*
s
tack
)
require
(
n
int
)
{
if
st
.
l
en
()
<
n
{
panic
(
fmt
.
Sprintf
(
"stack underflow (%d <=> %d)"
,
len
(
st
.
data
),
n
))
}
}
func
(
st
*
S
tack
)
Print
()
{
func
(
st
*
s
tack
)
Print
()
{
fmt
.
Println
(
"### stack ###"
)
if
len
(
st
.
data
)
>
0
{
for
i
,
val
:=
range
st
.
data
{
...
...
@@ -107,72 +62,3 @@ func (st *Stack) Print() {
}
fmt
.
Println
(
"#############"
)
}
type
Memory
struct
{
store
[]
byte
}
func
NewMemory
()
*
Memory
{
return
&
Memory
{
nil
}
}
func
(
m
*
Memory
)
Set
(
offset
,
size
uint64
,
value
[]
byte
)
{
if
len
(
value
)
>
0
{
totSize
:=
offset
+
size
lenSize
:=
uint64
(
len
(
m
.
store
)
-
1
)
if
totSize
>
lenSize
{
// Calculate the diff between the sizes
diff
:=
totSize
-
lenSize
if
diff
>
0
{
// Create a new empty slice and append it
newSlice
:=
make
([]
byte
,
diff
-
1
)
// Resize slice
m
.
store
=
append
(
m
.
store
,
newSlice
...
)
}
}
copy
(
m
.
store
[
offset
:
offset
+
size
],
value
)
}
}
func
(
m
*
Memory
)
Resize
(
size
uint64
)
{
if
uint64
(
m
.
Len
())
<
size
{
m
.
store
=
append
(
m
.
store
,
make
([]
byte
,
size
-
uint64
(
m
.
Len
()))
...
)
}
}
func
(
self
*
Memory
)
Get
(
offset
,
size
int64
)
(
cpy
[]
byte
)
{
if
size
==
0
{
return
nil
}
if
len
(
self
.
store
)
>
int
(
offset
)
{
cpy
=
make
([]
byte
,
size
)
copy
(
cpy
,
self
.
store
[
offset
:
offset
+
size
])
return
}
return
}
func
(
m
*
Memory
)
Len
()
int
{
return
len
(
m
.
store
)
}
func
(
m
*
Memory
)
Data
()
[]
byte
{
return
m
.
store
}
func
(
m
*
Memory
)
Print
()
{
fmt
.
Printf
(
"### mem %d bytes ###
\n
"
,
len
(
m
.
store
))
if
len
(
m
.
store
)
>
0
{
addr
:=
0
for
i
:=
0
;
i
+
32
<=
len
(
m
.
store
);
i
+=
32
{
fmt
.
Printf
(
"%03d: % x
\n
"
,
addr
,
m
.
store
[
i
:
i
+
32
])
addr
++
}
}
else
{
fmt
.
Println
(
"-- empty --"
)
}
fmt
.
Println
(
"####################"
)
}
vm/vm.go
View file @
9007f2bb
This diff is collapsed.
Click to expand it.
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