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
8baa0f84
Commit
8baa0f84
authored
Jul 03, 2014
by
obscuren
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Fixed reverting error
parent
5d671392
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
29 additions
and
38 deletions
+29
-38
state.go
ethchain/state.go
+5
-3
state_object.go
ethchain/state_object.go
+2
-3
state_transition.go
ethchain/state_transition.go
+16
-25
vm.go
ethchain/vm.go
+6
-7
No files found.
ethchain/state.go
View file @
8baa0f84
...
@@ -157,9 +157,11 @@ func (self *State) Copy() *State {
...
@@ -157,9 +157,11 @@ func (self *State) Copy() *State {
}
}
func
(
self
*
State
)
Set
(
state
*
State
)
{
func
(
self
*
State
)
Set
(
state
*
State
)
{
//s.trie = snapshot.trie
if
state
==
nil
{
//s.stateObjects = snapshot.stateObjects
panic
(
"Tried setting 'state' to nil through 'Set'"
)
self
=
state
}
*
self
=
*
state
}
}
func
(
s
*
State
)
Put
(
key
,
object
[]
byte
)
{
func
(
s
*
State
)
Put
(
key
,
object
[]
byte
)
{
...
...
ethchain/state_object.go
View file @
8baa0f84
...
@@ -191,13 +191,12 @@ func (self *StateObject) Copy() *StateObject {
...
@@ -191,13 +191,12 @@ func (self *StateObject) Copy() *StateObject {
}
}
stateObject
.
script
=
ethutil
.
CopyBytes
(
self
.
script
)
stateObject
.
script
=
ethutil
.
CopyBytes
(
self
.
script
)
stateObject
.
initScript
=
ethutil
.
CopyBytes
(
self
.
initScript
)
stateObject
.
initScript
=
ethutil
.
CopyBytes
(
self
.
initScript
)
//stateObject.gasPool.Set(self.gasPool)
return
s
elf
return
s
tateObject
}
}
func
(
self
*
StateObject
)
Set
(
stateObject
*
StateObject
)
{
func
(
self
*
StateObject
)
Set
(
stateObject
*
StateObject
)
{
self
=
stateObject
*
self
=
*
stateObject
}
}
//
//
...
...
ethchain/state_transition.go
View file @
8baa0f84
...
@@ -192,6 +192,8 @@ func (self *StateTransition) TransitionState() (err error) {
...
@@ -192,6 +192,8 @@ func (self *StateTransition) TransitionState() (err error) {
return
return
}
}
//snapshot := self.state.Copy()
// Process the init code and create 'valid' contract
// Process the init code and create 'valid' contract
if
IsContractAddr
(
self
.
receiver
)
{
if
IsContractAddr
(
self
.
receiver
)
{
// Evaluate the initialization script
// Evaluate the initialization script
...
@@ -199,22 +201,25 @@ func (self *StateTransition) TransitionState() (err error) {
...
@@ -199,22 +201,25 @@ func (self *StateTransition) TransitionState() (err error) {
// script section for the state object.
// script section for the state object.
self
.
data
=
nil
self
.
data
=
nil
code
,
err
,
deepErr
:=
self
.
Eval
(
receiver
.
Init
(),
receiver
)
statelogger
.
Debugln
(
"~> init"
)
if
err
!=
nil
||
deepErr
{
code
,
err
:=
self
.
Eval
(
receiver
.
Init
(),
receiver
)
if
err
!=
nil
{
//self.state.Set(snapshot)
self
.
state
.
ResetStateObject
(
receiver
)
self
.
state
.
ResetStateObject
(
receiver
)
return
fmt
.
Errorf
(
"Error during init
script run %v (deepErr = %v)"
,
err
,
deepE
rr
)
return
fmt
.
Errorf
(
"Error during init
execution %v"
,
e
rr
)
}
}
receiver
.
script
=
code
receiver
.
script
=
code
}
else
{
}
else
{
if
len
(
receiver
.
Script
())
>
0
{
if
len
(
receiver
.
Script
())
>
0
{
var
deepErr
bool
statelogger
.
Debugln
(
"~> code"
)
_
,
err
,
deepErr
=
self
.
Eval
(
receiver
.
Script
(),
receiver
)
_
,
err
=
self
.
Eval
(
receiver
.
Script
(),
receiver
)
if
err
!=
nil
{
if
err
!=
nil
{
//self.state.Set(snapshot)
self
.
state
.
ResetStateObject
(
receiver
)
self
.
state
.
ResetStateObject
(
receiver
)
return
fmt
.
Errorf
(
"Error during code execution %v
(deepErr = %v)"
,
err
,
deepE
rr
)
return
fmt
.
Errorf
(
"Error during code execution %v
"
,
e
rr
)
}
}
}
}
}
}
...
@@ -235,7 +240,7 @@ func (self *StateTransition) transferValue(sender, receiver *StateObject) error
...
@@ -235,7 +240,7 @@ func (self *StateTransition) transferValue(sender, receiver *StateObject) error
return
nil
return
nil
}
}
func
(
self
*
StateTransition
)
Eval
(
script
[]
byte
,
context
*
StateObject
)
(
ret
[]
byte
,
err
error
,
deepErr
bool
)
{
func
(
self
*
StateTransition
)
Eval
(
script
[]
byte
,
context
*
StateObject
)
(
ret
[]
byte
,
err
error
)
{
var
(
var
(
block
=
self
.
block
block
=
self
.
block
initiator
=
self
.
Sender
()
initiator
=
self
.
Sender
()
...
@@ -255,14 +260,13 @@ func (self *StateTransition) Eval(script []byte, context *StateObject) (ret []by
...
@@ -255,14 +260,13 @@ func (self *StateTransition) Eval(script []byte, context *StateObject) (ret []by
})
})
vm
.
Verbose
=
true
vm
.
Verbose
=
true
ret
,
err
,
deepErr
=
Call
(
vm
,
closure
,
self
.
data
)
ret
,
err
=
Call
(
vm
,
closure
,
self
.
data
)
return
return
}
}
func
Call
(
vm
*
Vm
,
closure
*
Closure
,
data
[]
byte
)
(
ret
[]
byte
,
err
error
,
deepErr
bool
)
{
func
Call
(
vm
*
Vm
,
closure
*
Closure
,
data
[]
byte
)
(
ret
[]
byte
,
err
error
)
{
ret
,
_
,
err
=
closure
.
Call
(
vm
,
data
)
ret
,
_
,
err
=
closure
.
Call
(
vm
,
data
)
deepErr
=
vm
.
err
!=
nil
if
ethutil
.
Config
.
Paranoia
{
if
ethutil
.
Config
.
Paranoia
{
var
(
var
(
...
@@ -274,21 +278,8 @@ func Call(vm *Vm, closure *Closure, data []byte) (ret []byte, err error, deepErr
...
@@ -274,21 +278,8 @@ func Call(vm *Vm, closure *Closure, data []byte) (ret []byte, err error, deepErr
if
!
valid
{
if
!
valid
{
// TODO FIXME ASAP
// TODO FIXME ASAP
context
.
state
.
trie
=
t2
context
.
state
.
trie
=
t2
/*
statelogger.Debugf("(o): %x\n", trie.Root)
statelogger
.
Debugln
(
"Warn: PARANOIA: Different state object roots during copy"
)
trie.NewIterator().Each(func(key string, v *ethutil.Value) {
v.Decode()
statelogger.Debugf("%x : %x\n", key, v.Str())
})
statelogger.Debugf("(c): %x\n", trie2.Root)
trie2.NewIterator().Each(func(key string, v *ethutil.Value) {
v.Decode()
statelogger.Debugf("%x : %x\n", key, v.Str())
})
*/
//return nil, fmt.Errorf("PARANOIA: Different state object roots during copy"), false
}
}
}
}
...
...
ethchain/vm.go
View file @
8baa0f84
...
@@ -82,7 +82,7 @@ func (self *Vm) Printf(format string, v ...interface{}) *Vm {
...
@@ -82,7 +82,7 @@ func (self *Vm) Printf(format string, v ...interface{}) *Vm {
func
(
self
*
Vm
)
Endl
()
*
Vm
{
func
(
self
*
Vm
)
Endl
()
*
Vm
{
if
self
.
Verbose
{
if
self
.
Verbose
{
vmlogger
.
Info
ln
(
self
.
logStr
)
vmlogger
.
Debug
ln
(
self
.
logStr
)
self
.
logStr
=
""
self
.
logStr
=
""
}
}
...
@@ -652,7 +652,7 @@ func (vm *Vm) RunClosure(closure *Closure) (ret []byte, err error) {
...
@@ -652,7 +652,7 @@ func (vm *Vm) RunClosure(closure *Closure) (ret []byte, err error) {
c
:=
NewClosure
(
closure
,
contract
,
contract
.
initScript
,
vm
.
state
,
gas
,
closure
.
Price
)
c
:=
NewClosure
(
closure
,
contract
,
contract
.
initScript
,
vm
.
state
,
gas
,
closure
.
Price
)
// Call the closure and set the return value as
// Call the closure and set the return value as
// main script.
// main script.
contract
.
script
,
err
,
_
=
Call
(
vm
,
c
,
nil
)
contract
.
script
,
err
=
Call
(
vm
,
c
,
nil
)
}
else
{
}
else
{
err
=
fmt
.
Errorf
(
"Insufficient funds to transfer value. Req %v, has %v"
,
value
,
closure
.
object
.
Amount
)
err
=
fmt
.
Errorf
(
"Insufficient funds to transfer value. Req %v, has %v"
,
value
,
closure
.
object
.
Amount
)
}
}
...
@@ -690,25 +690,24 @@ func (vm *Vm) RunClosure(closure *Closure) (ret []byte, err error) {
...
@@ -690,25 +690,24 @@ func (vm *Vm) RunClosure(closure *Closure) (ret []byte, err error) {
stack
.
Push
(
ethutil
.
BigFalse
)
stack
.
Push
(
ethutil
.
BigFalse
)
}
else
{
}
else
{
snapshot
:=
vm
.
state
.
Copy
()
//
snapshot := vm.state.Copy()
stateObject
:=
vm
.
state
.
GetOrNewStateObject
(
addr
.
Bytes
())
stateObject
:=
vm
.
state
.
GetOrNewStateObject
(
addr
.
Bytes
())
closure
.
object
.
SubAmount
(
value
)
closure
.
object
.
SubAmount
(
value
)
// Add the value to the state object
stateObject
.
AddAmount
(
value
)
stateObject
.
AddAmount
(
value
)
// Create a new callable closure
// Create a new callable closure
closure
:=
NewClosure
(
closure
,
stateObject
,
stateObject
.
script
,
vm
.
state
,
gas
,
closure
.
Price
)
closure
:=
NewClosure
(
closure
,
stateObject
,
stateObject
.
script
,
vm
.
state
,
gas
,
closure
.
Price
)
// Executer the closure and get the return value (if any)
// Executer the closure and get the return value (if any)
ret
,
err
,
_
:=
Call
(
vm
,
closure
,
args
)
ret
,
err
:=
Call
(
vm
,
closure
,
args
)
if
err
!=
nil
{
if
err
!=
nil
{
stack
.
Push
(
ethutil
.
BigFalse
)
stack
.
Push
(
ethutil
.
BigFalse
)
vmlogger
.
Debugf
(
"Closure execution failed. %v
\n
"
,
err
)
vmlogger
.
Debugf
(
"Closure execution failed. %v
\n
"
,
err
)
vm
.
err
=
err
//vm.state.Set(snapshot)
vm
.
state
.
Set
(
snapsho
t
)
vm
.
state
.
ResetStateObject
(
stateObjec
t
)
}
else
{
}
else
{
stack
.
Push
(
ethutil
.
BigTrue
)
stack
.
Push
(
ethutil
.
BigTrue
)
...
...
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