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
d30571a7
Commit
d30571a7
authored
Nov 10, 2014
by
obscuren
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Added VM testing tool
parent
cbeebcd4
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
128 additions
and
2 deletions
+128
-2
main.go
cmd/evm/main.go
+109
-0
vm_debug.go
vm/vm_debug.go
+1
-2
vm_test.go
vm/vm_test.go
+18
-0
No files found.
cmd/evm/main.go
0 → 100644
View file @
d30571a7
/*
This file is part of go-ethereum
go-ethereum is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
go-ethereum is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with go-ethereum. If not, see <http://www.gnu.org/licenses/>.
*/
/**
* @authors
* Jeffrey Wilcke <i@jev.io>
* @date 2014
*
*/
package
main
import
(
"flag"
"fmt"
"log"
"math/big"
"os"
"runtime"
"time"
"github.com/ethereum/go-ethereum/ethutil"
"github.com/ethereum/go-ethereum/logger"
"github.com/ethereum/go-ethereum/state"
"github.com/ethereum/go-ethereum/trie"
"github.com/ethereum/go-ethereum/vm"
)
var
(
code
=
flag
.
String
(
"code"
,
""
,
"evm code"
)
loglevel
=
flag
.
Int
(
"log"
,
4
,
"log level"
)
gas
=
flag
.
String
(
"gas"
,
"1000000"
,
"gas amount"
)
price
=
flag
.
String
(
"price"
,
"0"
,
"gas price"
)
dump
=
flag
.
Bool
(
"dump"
,
false
,
"dump state after run"
)
)
func
perr
(
v
...
interface
{})
{
fmt
.
Println
(
v
...
)
//os.Exit(1)
}
func
main
()
{
flag
.
Parse
()
logger
.
AddLogSystem
(
logger
.
NewStdLogSystem
(
os
.
Stdout
,
log
.
LstdFlags
,
logger
.
LogLevel
(
*
loglevel
)))
ethutil
.
ReadConfig
(
".ethtest"
,
"/tmp/evm"
,
""
)
stateObject
:=
state
.
NewStateObject
([]
byte
(
"evmuser"
))
closure
:=
vm
.
NewClosure
(
nil
,
stateObject
,
stateObject
,
ethutil
.
Hex2Bytes
(
*
code
),
ethutil
.
Big
(
*
gas
),
ethutil
.
Big
(
*
price
))
tstart
:=
time
.
Now
()
ret
,
_
,
e
:=
closure
.
Call
(
vm
.
New
(
NewVmEnv
(),
vm
.
DebugVmTy
),
nil
)
logger
.
Flush
()
if
e
!=
nil
{
perr
(
e
)
}
var
mem
runtime
.
MemStats
runtime
.
ReadMemStats
(
&
mem
)
fmt
.
Printf
(
"vm took %v
\n
"
,
time
.
Since
(
tstart
))
fmt
.
Printf
(
`alloc: %d
tot alloc: %d
no. malloc: %d
heap alloc: %d
heap objs: %d
num gc: %d
`
,
mem
.
Alloc
,
mem
.
TotalAlloc
,
mem
.
Mallocs
,
mem
.
HeapAlloc
,
mem
.
HeapObjects
,
mem
.
NumGC
)
fmt
.
Printf
(
"%x
\n
"
,
ret
)
}
type
VmEnv
struct
{
state
*
state
.
State
}
func
NewVmEnv
()
*
VmEnv
{
return
&
VmEnv
{
state
.
New
(
trie
.
New
(
nil
,
""
))}
}
func
(
VmEnv
)
Origin
()
[]
byte
{
return
nil
}
func
(
VmEnv
)
BlockNumber
()
*
big
.
Int
{
return
nil
}
func
(
VmEnv
)
BlockHash
()
[]
byte
{
return
nil
}
func
(
VmEnv
)
PrevHash
()
[]
byte
{
return
nil
}
func
(
VmEnv
)
Coinbase
()
[]
byte
{
return
nil
}
func
(
VmEnv
)
Time
()
int64
{
return
0
}
func
(
VmEnv
)
GasLimit
()
*
big
.
Int
{
return
nil
}
func
(
VmEnv
)
Difficulty
()
*
big
.
Int
{
return
nil
}
func
(
VmEnv
)
Value
()
*
big
.
Int
{
return
nil
}
func
(
self
*
VmEnv
)
State
()
*
state
.
State
{
return
self
.
state
}
func
(
VmEnv
)
AddLog
(
state
.
Log
)
{}
func
(
VmEnv
)
Transfer
(
from
,
to
vm
.
Account
,
amount
*
big
.
Int
)
error
{
return
nil
}
vm/vm_debug.go
View file @
d30571a7
...
@@ -50,8 +50,7 @@ func (self *DebugVm) RunClosure(closure *Closure) (ret []byte, err error) {
...
@@ -50,8 +50,7 @@ func (self *DebugVm) RunClosure(closure *Closure) (ret []byte, err error) {
ret
=
closure
.
Return
(
nil
)
ret
=
closure
.
Return
(
nil
)
err
=
fmt
.
Errorf
(
"%v"
,
r
)
err
=
fmt
.
Errorf
(
"%v"
,
r
)
// No error should be set. Recover is used with require
// Is this too error prone?
}
}
}()
}()
}
}
...
...
vm/vm_test.go
View file @
d30571a7
...
@@ -169,3 +169,21 @@ func TestBuildInRipemd(t *testing.T) {
...
@@ -169,3 +169,21 @@ func TestBuildInRipemd(t *testing.T) {
t
.
Errorf
(
"Expected %x, got %x"
,
exp
,
ret
)
t
.
Errorf
(
"Expected %x, got %x"
,
exp
,
ret
)
}
}
}
}
func
TestOog
(
t
*
testing
.
T
)
{
// This tests takes a long time and will eventually run out of gas
//t.Skip()
logger
.
AddLogSystem
(
logger
.
NewStdLogSystem
(
os
.
Stdout
,
log
.
LstdFlags
,
logger
.
InfoLevel
))
ethutil
.
ReadConfig
(
".ethtest"
,
"/tmp/ethtest"
,
""
)
stateObject
:=
state
.
NewStateObject
([]
byte
{
'j'
,
'e'
,
'f'
,
'f'
})
closure
:=
NewClosure
(
nil
,
stateObject
,
stateObject
,
ethutil
.
Hex2Bytes
(
"60ff60ff600057"
),
big
.
NewInt
(
1000000
),
big
.
NewInt
(
0
))
vm
:=
New
(
TestEnv
{},
DebugVmTy
)
_
,
_
,
e
:=
closure
.
Call
(
vm
,
nil
)
if
e
!=
nil
{
fmt
.
Println
(
e
)
}
}
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