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
e620bde4
Commit
e620bde4
authored
Mar 16, 2015
by
obscuren
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
conversion state
parent
76f215b0
Changes
6
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
40 additions
and
36 deletions
+40
-36
types.go
common/types.go
+5
-3
dump.go
state/dump.go
+2
-1
managed_state_test.go
state/managed_state_test.go
+6
-6
state_object.go
state/state_object.go
+11
-13
state_test.go
state/state_test.go
+7
-6
statedb.go
state/statedb.go
+9
-7
No files found.
common/types.go
View file @
e620bde4
package
common
import
"fmt"
type
Hash
[
32
]
byte
var
(
...
...
@@ -31,7 +33,7 @@ func (h Hash) Str() string {
// Sets the hash to the value of b. If b is larger than len(h) it will panic
func
(
h
*
Hash
)
SetBytes
(
b
[]
byte
)
{
if
len
(
b
)
>
len
(
h
)
{
panic
(
"unable to set bytes. too big"
)
panic
(
fmt
.
Sprintf
(
"unable to set bytes. too big = %d"
,
len
(
b
))
)
}
// reverse loop
...
...
@@ -60,11 +62,11 @@ func (a Address) Str() string {
// Sets the address to the value of b. If b is larger than len(a) it will panic
func
(
a
*
Address
)
SetBytes
(
b
[]
byte
)
{
if
len
(
b
)
>
len
(
a
)
{
panic
(
"unable to set bytes. too big"
)
panic
(
fmt
.
Sprintf
(
"unable to set bytes. too big = %d"
,
len
(
b
))
)
}
// reverse loop
for
i
:=
len
(
b
);
i
>=
0
;
i
--
{
for
i
:=
len
(
b
)
-
1
;
i
>=
0
;
i
--
{
a
[
i
]
=
b
[
i
]
}
}
...
...
state/dump.go
View file @
e620bde4
...
...
@@ -28,7 +28,8 @@ func (self *StateDB) RawDump() World {
it
:=
self
.
trie
.
Iterator
()
for
it
.
Next
()
{
stateObject
:=
NewStateObjectFromBytes
(
it
.
Key
,
it
.
Value
,
self
.
db
)
fmt
.
Printf
(
"%x
\n
"
,
it
.
Key
,
len
(
it
.
Key
))
stateObject
:=
NewStateObjectFromBytes
(
common
.
BytesToAddress
(
it
.
Key
),
it
.
Value
,
self
.
db
)
account
:=
Account
{
Balance
:
stateObject
.
balance
.
String
(),
Nonce
:
stateObject
.
nonce
,
Root
:
common
.
Bytes2Hex
(
stateObject
.
Root
()),
CodeHash
:
common
.
Bytes2Hex
(
stateObject
.
codeHash
)}
account
.
Storage
=
make
(
map
[
string
]
string
)
...
...
state/managed_state_test.go
View file @
e620bde4
...
...
@@ -6,15 +6,15 @@ import (
"github.com/ethereum/go-ethereum/common"
)
var
addr
=
common
.
Address
([]
byte
(
"test"
))
var
addr
=
common
.
BytesTo
Address
([]
byte
(
"test"
))
func
create
()
(
*
ManagedState
,
*
account
)
{
ms
:=
ManageState
(
&
StateDB
{
stateObjects
:
make
(
map
[
string
]
*
StateObject
)})
so
:=
&
StateObject
{
address
:
addr
,
nonce
:
100
}
ms
.
StateDB
.
stateObjects
[
string
(
addr
)]
=
so
ms
.
accounts
[
string
(
addr
)]
=
newAccount
(
so
)
ms
.
StateDB
.
stateObjects
[
addr
.
Str
(
)]
=
so
ms
.
accounts
[
addr
.
Str
(
)]
=
newAccount
(
so
)
return
ms
,
ms
.
accounts
[
string
(
addr
)]
return
ms
,
ms
.
accounts
[
addr
.
Str
(
)]
}
func
TestNewNonce
(
t
*
testing
.
T
)
{
...
...
@@ -73,7 +73,7 @@ func TestRemoteNonceChange(t *testing.T) {
account
.
nonces
=
append
(
account
.
nonces
,
nn
...
)
nonce
:=
ms
.
NewNonce
(
addr
)
ms
.
StateDB
.
stateObjects
[
string
(
addr
)]
.
nonce
=
200
ms
.
StateDB
.
stateObjects
[
addr
.
Str
(
)]
.
nonce
=
200
nonce
=
ms
.
NewNonce
(
addr
)
if
nonce
!=
200
{
t
.
Error
(
"expected nonce after remote update to be"
,
201
,
"got"
,
nonce
)
...
...
@@ -81,7 +81,7 @@ func TestRemoteNonceChange(t *testing.T) {
ms
.
NewNonce
(
addr
)
ms
.
NewNonce
(
addr
)
ms
.
NewNonce
(
addr
)
ms
.
StateDB
.
stateObjects
[
string
(
addr
)]
.
nonce
=
200
ms
.
StateDB
.
stateObjects
[
addr
.
Str
(
)]
.
nonce
=
200
nonce
=
ms
.
NewNonce
(
addr
)
if
nonce
!=
204
{
t
.
Error
(
"expected nonce after remote update to be"
,
201
,
"got"
,
nonce
)
...
...
state/state_object.go
View file @
e620bde4
...
...
@@ -109,7 +109,7 @@ func NewStateObjectFromBytes(address common.Address, data []byte, db common.Data
object
.
nonce
=
extobject
.
Nonce
object
.
balance
=
extobject
.
Balance
object
.
codeHash
=
extobject
.
CodeHash
object
.
State
=
New
(
extobject
.
Root
,
db
)
object
.
State
=
New
(
extobject
.
Root
[
:
]
,
db
)
object
.
storage
=
make
(
map
[
string
]
*
common
.
Value
)
object
.
gasPool
=
new
(
big
.
Int
)
object
.
prepaid
=
new
(
big
.
Int
)
...
...
@@ -124,8 +124,8 @@ func (self *StateObject) MarkForDeletion() {
statelogger
.
Debugf
(
"%x: #%d %v X
\n
"
,
self
.
Address
(),
self
.
nonce
,
self
.
balance
)
}
func
(
c
*
StateObject
)
getAddr
(
addr
[]
byte
)
*
common
.
Value
{
return
common
.
NewValueFromBytes
([]
byte
(
c
.
State
.
trie
.
Get
(
addr
)))
func
(
c
*
StateObject
)
getAddr
(
addr
common
.
Hash
)
*
common
.
Value
{
return
common
.
NewValueFromBytes
([]
byte
(
c
.
State
.
trie
.
Get
(
addr
[
:
]
)))
}
func
(
c
*
StateObject
)
setAddr
(
addr
[]
byte
,
value
interface
{})
{
...
...
@@ -133,34 +133,32 @@ func (c *StateObject) setAddr(addr []byte, value interface{}) {
}
func
(
self
*
StateObject
)
GetStorage
(
key
*
big
.
Int
)
*
common
.
Value
{
return
self
.
GetState
(
key
.
Bytes
(
))
return
self
.
GetState
(
common
.
BytesToHash
(
key
.
Bytes
()
))
}
func
(
self
*
StateObject
)
SetStorage
(
key
*
big
.
Int
,
value
*
common
.
Value
)
{
self
.
SetState
(
key
.
Bytes
(
),
value
)
self
.
SetState
(
common
.
BytesToHash
(
key
.
Bytes
()
),
value
)
}
func
(
self
*
StateObject
)
Storage
()
Storage
{
return
self
.
storage
}
func
(
self
*
StateObject
)
GetState
(
k
[]
byte
)
*
common
.
Value
{
key
:=
common
.
LeftPadBytes
(
k
,
32
)
value
:=
self
.
storage
[
string
(
key
)]
func
(
self
*
StateObject
)
GetState
(
key
common
.
Hash
)
*
common
.
Value
{
strkey
:=
key
.
Str
()
value
:=
self
.
storage
[
strkey
]
if
value
==
nil
{
value
=
self
.
getAddr
(
key
)
if
!
value
.
IsNil
()
{
self
.
storage
[
str
ing
(
key
)
]
=
value
self
.
storage
[
str
key
]
=
value
}
}
return
value
}
func
(
self
*
StateObject
)
SetState
(
k
[]
byte
,
value
*
common
.
Value
)
{
key
:=
common
.
LeftPadBytes
(
k
,
32
)
self
.
storage
[
string
(
key
)]
=
value
.
Copy
()
func
(
self
*
StateObject
)
SetState
(
k
common
.
Hash
,
value
*
common
.
Value
)
{
self
.
storage
[
k
.
Str
()]
=
value
.
Copy
()
self
.
dirty
=
true
}
...
...
state/state_test.go
View file @
e620bde4
...
...
@@ -5,8 +5,8 @@ import (
checker
"gopkg.in/check.v1"
"github.com/ethereum/go-ethereum/ethdb"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/ethdb"
)
type
StateSuite
struct
{
...
...
@@ -15,15 +15,16 @@ type StateSuite struct {
var
_
=
checker
.
Suite
(
&
StateSuite
{})
// var ZeroHash256 = make([]byte, 32)
var
toAddr
=
common
.
BytesToAddress
func
(
s
*
StateSuite
)
TestDump
(
c
*
checker
.
C
)
{
return
// generate a few entries
obj1
:=
s
.
state
.
GetOrNewStateObject
(
[]
byte
{
0x01
}
)
obj1
:=
s
.
state
.
GetOrNewStateObject
(
toAddr
([]
byte
{
0x01
})
)
obj1
.
AddBalance
(
big
.
NewInt
(
22
))
obj2
:=
s
.
state
.
GetOrNewStateObject
(
[]
byte
{
0x01
,
0x02
}
)
obj2
:=
s
.
state
.
GetOrNewStateObject
(
toAddr
([]
byte
{
0x01
,
0x02
})
)
obj2
.
SetCode
([]
byte
{
3
,
3
,
3
,
3
,
3
,
3
,
3
})
obj3
:=
s
.
state
.
GetOrNewStateObject
(
[]
byte
{
0x02
}
)
obj3
:=
s
.
state
.
GetOrNewStateObject
(
toAddr
([]
byte
{
0x02
})
)
obj3
.
SetBalance
(
big
.
NewInt
(
44
))
// write some of them to the trie
...
...
@@ -62,7 +63,7 @@ func (s *StateSuite) SetUpTest(c *checker.C) {
}
func
(
s
*
StateSuite
)
TestSnapshot
(
c
*
checker
.
C
)
{
stateobjaddr
:=
[]
byte
(
"aa"
)
stateobjaddr
:=
toAddr
([]
byte
(
"aa"
)
)
storageaddr
:=
common
.
Big
(
"0"
)
data1
:=
common
.
NewValue
(
42
)
data2
:=
common
.
NewValue
(
43
)
...
...
state/statedb.go
View file @
e620bde4
...
...
@@ -88,7 +88,7 @@ func (self *StateDB) GetCode(addr common.Address) []byte {
return
nil
}
func
(
self
*
StateDB
)
GetState
(
a
common
.
Adress
,
b
common
.
Hash
)
[]
byte
{
func
(
self
*
StateDB
)
GetState
(
a
common
.
Ad
d
ress
,
b
common
.
Hash
)
[]
byte
{
stateObject
:=
self
.
GetStateObject
(
a
)
if
stateObject
!=
nil
{
return
stateObject
.
GetState
(
b
)
.
Bytes
()
...
...
@@ -150,14 +150,16 @@ func (self *StateDB) UpdateStateObject(stateObject *StateObject) {
self
.
db
.
Put
(
stateObject
.
CodeHash
(),
stateObject
.
code
)
}
self
.
trie
.
Update
(
stateObject
.
Address
(),
stateObject
.
RlpEncode
())
addr
:=
stateObject
.
Address
()
self
.
trie
.
Update
(
addr
[
:
],
stateObject
.
RlpEncode
())
}
// Delete the given state object and delete it from the state trie
func
(
self
*
StateDB
)
DeleteStateObject
(
stateObject
*
StateObject
)
{
self
.
trie
.
Delete
(
stateObject
.
Address
())
addr
:=
stateObject
.
Address
()
self
.
trie
.
Delete
(
addr
[
:
])
delete
(
self
.
stateObjects
,
stateObject
.
Address
()
.
Str
())
delete
(
self
.
stateObjects
,
addr
.
Str
())
}
// Retrieve a state object given my the address. Nil if not found
...
...
@@ -169,7 +171,7 @@ func (self *StateDB) GetStateObject(addr common.Address) *StateObject {
return
stateObject
}
data
:=
self
.
trie
.
Get
(
addr
)
data
:=
self
.
trie
.
Get
(
addr
[
:
]
)
if
len
(
data
)
==
0
{
return
nil
}
...
...
@@ -201,13 +203,13 @@ func (self *StateDB) NewStateObject(addr common.Address) *StateObject {
statelogger
.
Debugf
(
"(+) %x
\n
"
,
addr
)
stateObject
:=
NewStateObject
(
addr
,
self
.
db
)
self
.
stateObjects
[
string
(
addr
)]
=
stateObject
self
.
stateObjects
[
addr
.
Str
(
)]
=
stateObject
return
stateObject
}
// Deprecated
func
(
self
*
StateDB
)
GetAccount
(
addr
[]
byte
)
*
StateObject
{
func
(
self
*
StateDB
)
GetAccount
(
addr
common
.
Address
)
*
StateObject
{
return
self
.
GetOrNewStateObject
(
addr
)
}
...
...
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