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
dd21f079
Unverified
Commit
dd21f079
authored
Nov 22, 2019
by
Felix Lange
Committed by
GitHub
Nov 22, 2019
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
core/state: fix staticcheck warnings (#20357)
Also remove dependency on gopkg.in/check.v1 in tests.
parent
36a684ca
Changes
7
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
211 additions
and
228 deletions
+211
-228
dump.go
core/state/dump.go
+25
-22
journal.go
core/state/journal.go
+1
-3
main_test.go
core/state/main_test.go
+0
-25
state_test.go
core/state/state_test.go
+31
-22
statedb.go
core/state/statedb.go
+150
-150
statedb_test.go
core/state/statedb_test.go
+4
-5
go.mod
go.mod
+0
-1
No files found.
core/state/dump.go
View file @
dd21f079
...
...
@@ -47,7 +47,9 @@ type Dump struct {
}
// iterativeDump is a 'collector'-implementation which dump output line-by-line iteratively
type
iterativeDump
json
.
Encoder
type
iterativeDump
struct
{
*
json
.
Encoder
}
// Collector interface which the state trie calls during iteration
type
collector
interface
{
...
...
@@ -55,15 +57,15 @@ type collector interface {
onAccount
(
common
.
Address
,
DumpAccount
)
}
func
(
self
*
Dump
)
onRoot
(
root
common
.
Hash
)
{
self
.
Root
=
fmt
.
Sprintf
(
"%x"
,
root
)
func
(
d
*
Dump
)
onRoot
(
root
common
.
Hash
)
{
d
.
Root
=
fmt
.
Sprintf
(
"%x"
,
root
)
}
func
(
self
*
Dump
)
onAccount
(
addr
common
.
Address
,
account
DumpAccount
)
{
self
.
Accounts
[
addr
]
=
account
func
(
d
*
Dump
)
onAccount
(
addr
common
.
Address
,
account
DumpAccount
)
{
d
.
Accounts
[
addr
]
=
account
}
func
(
self
iterativeDump
)
onAccount
(
addr
common
.
Address
,
account
DumpAccount
)
{
func
(
d
iterativeDump
)
onAccount
(
addr
common
.
Address
,
account
DumpAccount
)
{
dumpAccount
:=
&
DumpAccount
{
Balance
:
account
.
Balance
,
Nonce
:
account
.
Nonce
,
...
...
@@ -77,25 +79,26 @@ func (self iterativeDump) onAccount(addr common.Address, account DumpAccount) {
if
addr
!=
(
common
.
Address
{})
{
dumpAccount
.
Address
=
&
addr
}
(
*
json
.
Encoder
)(
&
self
)
.
Encode
(
dumpAccount
)
d
.
Encode
(
dumpAccount
)
}
func
(
self
iterativeDump
)
onRoot
(
root
common
.
Hash
)
{
(
*
json
.
Encoder
)(
&
self
)
.
Encode
(
struct
{
func
(
d
iterativeDump
)
onRoot
(
root
common
.
Hash
)
{
d
.
Encode
(
struct
{
Root
common
.
Hash
`json:"root"`
}{
root
})
}
func
(
s
elf
*
StateDB
)
dump
(
c
collector
,
excludeCode
,
excludeStorage
,
excludeMissingPreimages
bool
)
{
func
(
s
*
StateDB
)
dump
(
c
collector
,
excludeCode
,
excludeStorage
,
excludeMissingPreimages
bool
)
{
emptyAddress
:=
(
common
.
Address
{})
missingPreimages
:=
0
c
.
onRoot
(
s
elf
.
trie
.
Hash
())
it
:=
trie
.
NewIterator
(
s
elf
.
trie
.
NodeIterator
(
nil
))
c
.
onRoot
(
s
.
trie
.
Hash
())
it
:=
trie
.
NewIterator
(
s
.
trie
.
NodeIterator
(
nil
))
for
it
.
Next
()
{
var
data
Account
if
err
:=
rlp
.
DecodeBytes
(
it
.
Value
,
&
data
);
err
!=
nil
{
panic
(
err
)
}
addr
:=
common
.
BytesToAddress
(
s
elf
.
trie
.
GetKey
(
it
.
Key
))
addr
:=
common
.
BytesToAddress
(
s
.
trie
.
GetKey
(
it
.
Key
))
obj
:=
newObject
(
nil
,
addr
,
data
)
account
:=
DumpAccount
{
Balance
:
data
.
Balance
.
String
(),
...
...
@@ -112,18 +115,18 @@ func (self *StateDB) dump(c collector, excludeCode, excludeStorage, excludeMissi
account
.
SecureKey
=
it
.
Key
}
if
!
excludeCode
{
account
.
Code
=
common
.
Bytes2Hex
(
obj
.
Code
(
s
elf
.
db
))
account
.
Code
=
common
.
Bytes2Hex
(
obj
.
Code
(
s
.
db
))
}
if
!
excludeStorage
{
account
.
Storage
=
make
(
map
[
common
.
Hash
]
string
)
storageIt
:=
trie
.
NewIterator
(
obj
.
getTrie
(
s
elf
.
db
)
.
NodeIterator
(
nil
))
storageIt
:=
trie
.
NewIterator
(
obj
.
getTrie
(
s
.
db
)
.
NodeIterator
(
nil
))
for
storageIt
.
Next
()
{
_
,
content
,
_
,
err
:=
rlp
.
Split
(
storageIt
.
Value
)
if
err
!=
nil
{
log
.
Error
(
"Failed to decode the value returned by iterator"
,
"error"
,
err
)
continue
}
account
.
Storage
[
common
.
BytesToHash
(
s
elf
.
trie
.
GetKey
(
storageIt
.
Key
))]
=
common
.
Bytes2Hex
(
content
)
account
.
Storage
[
common
.
BytesToHash
(
s
.
trie
.
GetKey
(
storageIt
.
Key
))]
=
common
.
Bytes2Hex
(
content
)
}
}
c
.
onAccount
(
addr
,
account
)
...
...
@@ -134,17 +137,17 @@ func (self *StateDB) dump(c collector, excludeCode, excludeStorage, excludeMissi
}
// RawDump returns the entire state an a single large object
func
(
s
elf
*
StateDB
)
RawDump
(
excludeCode
,
excludeStorage
,
excludeMissingPreimages
bool
)
Dump
{
func
(
s
*
StateDB
)
RawDump
(
excludeCode
,
excludeStorage
,
excludeMissingPreimages
bool
)
Dump
{
dump
:=
&
Dump
{
Accounts
:
make
(
map
[
common
.
Address
]
DumpAccount
),
}
s
elf
.
dump
(
dump
,
excludeCode
,
excludeStorage
,
excludeMissingPreimages
)
s
.
dump
(
dump
,
excludeCode
,
excludeStorage
,
excludeMissingPreimages
)
return
*
dump
}
// Dump returns a JSON string representing the entire state as a single json-object
func
(
s
elf
*
StateDB
)
Dump
(
excludeCode
,
excludeStorage
,
excludeMissingPreimages
bool
)
[]
byte
{
dump
:=
s
elf
.
RawDump
(
excludeCode
,
excludeStorage
,
excludeMissingPreimages
)
func
(
s
*
StateDB
)
Dump
(
excludeCode
,
excludeStorage
,
excludeMissingPreimages
bool
)
[]
byte
{
dump
:=
s
.
RawDump
(
excludeCode
,
excludeStorage
,
excludeMissingPreimages
)
json
,
err
:=
json
.
MarshalIndent
(
dump
,
""
,
" "
)
if
err
!=
nil
{
fmt
.
Println
(
"dump err"
,
err
)
...
...
@@ -153,6 +156,6 @@ func (self *StateDB) Dump(excludeCode, excludeStorage, excludeMissingPreimages b
}
// IterativeDump dumps out accounts as json-objects, delimited by linebreaks on stdout
func
(
s
elf
*
StateDB
)
IterativeDump
(
excludeCode
,
excludeStorage
,
excludeMissingPreimages
bool
,
output
*
json
.
Encoder
)
{
s
elf
.
dump
(
iterativeDump
(
*
output
)
,
excludeCode
,
excludeStorage
,
excludeMissingPreimages
)
func
(
s
*
StateDB
)
IterativeDump
(
excludeCode
,
excludeStorage
,
excludeMissingPreimages
bool
,
output
*
json
.
Encoder
)
{
s
.
dump
(
iterativeDump
{
output
}
,
excludeCode
,
excludeStorage
,
excludeMissingPreimages
)
}
core/state/journal.go
View file @
dd21f079
...
...
@@ -127,9 +127,7 @@ type (
hash
common
.
Hash
}
touchChange
struct
{
account
*
common
.
Address
prev
bool
prevDirty
bool
account
*
common
.
Address
}
)
...
...
core/state/main_test.go
deleted
100644 → 0
View file @
36a684ca
// Copyright 2014 The go-ethereum Authors
// This file is part of the go-ethereum library.
//
// The go-ethereum library is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// The go-ethereum library 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 Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
package
state
import
(
"testing"
checker
"gopkg.in/check.v1"
)
func
Test
(
t
*
testing
.
T
)
{
checker
.
TestingT
(
t
)
}
core/state/state_test.go
View file @
dd21f079
...
...
@@ -25,19 +25,24 @@ import (
"github.com/ethereum/go-ethereum/core/rawdb"
"github.com/ethereum/go-ethereum/crypto"
"github.com/ethereum/go-ethereum/ethdb"
checker
"gopkg.in/check.v1"
)
type
StateSuite
struct
{
var
toAddr
=
common
.
BytesToAddress
type
stateTest
struct
{
db
ethdb
.
Database
state
*
StateDB
}
var
_
=
checker
.
Suite
(
&
StateSuite
{})
func
newStateTest
()
*
stateTest
{
db
:=
rawdb
.
NewMemoryDatabase
()
sdb
,
_
:=
New
(
common
.
Hash
{},
NewDatabase
(
db
))
return
&
stateTest
{
db
:
db
,
state
:
sdb
}
}
var
toAddr
=
common
.
BytesToAddress
func
TestDump
(
t
*
testing
.
T
)
{
s
:=
newStateTest
()
func
(
s
*
StateSuite
)
TestDump
(
c
*
checker
.
C
)
{
// generate a few entries
obj1
:=
s
.
state
.
GetOrNewStateObject
(
toAddr
([]
byte
{
0x01
}))
obj1
.
AddBalance
(
big
.
NewInt
(
22
))
...
...
@@ -78,16 +83,12 @@ func (s *StateSuite) TestDump(c *checker.C) {
}
}`
if
got
!=
want
{
c
.
Errorf
(
"dump mismatch:
\n
got: %s
\n
want: %s
\n
"
,
got
,
want
)
t
.
Errorf
(
"dump mismatch:
\n
got: %s
\n
want: %s
\n
"
,
got
,
want
)
}
}
func
(
s
*
StateSuite
)
SetUpTest
(
c
*
checker
.
C
)
{
s
.
db
=
rawdb
.
NewMemoryDatabase
()
s
.
state
,
_
=
New
(
common
.
Hash
{},
NewDatabase
(
s
.
db
))
}
func
(
s
*
StateSuite
)
TestNull
(
c
*
checker
.
C
)
{
func
TestNull
(
t
*
testing
.
T
)
{
s
:=
newStateTest
()
address
:=
common
.
HexToAddress
(
"0x823140710bf13990e4500136726d8b55"
)
s
.
state
.
CreateAccount
(
address
)
//value := common.FromHex("0x823140710bf13990e4500136726d8b55")
...
...
@@ -97,18 +98,19 @@ func (s *StateSuite) TestNull(c *checker.C) {
s
.
state
.
Commit
(
false
)
if
value
:=
s
.
state
.
GetState
(
address
,
common
.
Hash
{});
value
!=
(
common
.
Hash
{})
{
c
.
Errorf
(
"expected empty current value, got %x"
,
value
)
t
.
Errorf
(
"expected empty current value, got %x"
,
value
)
}
if
value
:=
s
.
state
.
GetCommittedState
(
address
,
common
.
Hash
{});
value
!=
(
common
.
Hash
{})
{
c
.
Errorf
(
"expected empty committed value, got %x"
,
value
)
t
.
Errorf
(
"expected empty committed value, got %x"
,
value
)
}
}
func
(
s
*
StateSuite
)
TestSnapshot
(
c
*
checker
.
C
)
{
func
TestSnapshot
(
t
*
testing
.
T
)
{
stateobjaddr
:=
toAddr
([]
byte
(
"aa"
))
var
storageaddr
common
.
Hash
data1
:=
common
.
BytesToHash
([]
byte
{
42
})
data2
:=
common
.
BytesToHash
([]
byte
{
43
})
s
:=
newStateTest
()
// snapshot the genesis state
genesis
:=
s
.
state
.
Snapshot
()
...
...
@@ -121,21 +123,28 @@ func (s *StateSuite) TestSnapshot(c *checker.C) {
s
.
state
.
SetState
(
stateobjaddr
,
storageaddr
,
data2
)
s
.
state
.
RevertToSnapshot
(
snapshot
)
c
.
Assert
(
s
.
state
.
GetState
(
stateobjaddr
,
storageaddr
),
checker
.
DeepEquals
,
data1
)
c
.
Assert
(
s
.
state
.
GetCommittedState
(
stateobjaddr
,
storageaddr
),
checker
.
DeepEquals
,
common
.
Hash
{})
if
v
:=
s
.
state
.
GetState
(
stateobjaddr
,
storageaddr
);
v
!=
data1
{
t
.
Errorf
(
"wrong storage value %v, want %v"
,
v
,
data1
)
}
if
v
:=
s
.
state
.
GetCommittedState
(
stateobjaddr
,
storageaddr
);
v
!=
(
common
.
Hash
{})
{
t
.
Errorf
(
"wrong committed storage value %v, want %v"
,
v
,
common
.
Hash
{})
}
// revert up to the genesis state and ensure correct content
s
.
state
.
RevertToSnapshot
(
genesis
)
c
.
Assert
(
s
.
state
.
GetState
(
stateobjaddr
,
storageaddr
),
checker
.
DeepEquals
,
common
.
Hash
{})
c
.
Assert
(
s
.
state
.
GetCommittedState
(
stateobjaddr
,
storageaddr
),
checker
.
DeepEquals
,
common
.
Hash
{})
if
v
:=
s
.
state
.
GetState
(
stateobjaddr
,
storageaddr
);
v
!=
(
common
.
Hash
{})
{
t
.
Errorf
(
"wrong storage value %v, want %v"
,
v
,
common
.
Hash
{})
}
if
v
:=
s
.
state
.
GetCommittedState
(
stateobjaddr
,
storageaddr
);
v
!=
(
common
.
Hash
{})
{
t
.
Errorf
(
"wrong committed storage value %v, want %v"
,
v
,
common
.
Hash
{})
}
}
func
(
s
*
StateSuite
)
TestSnapshotEmpty
(
c
*
checker
.
C
)
{
func
TestSnapshotEmpty
(
t
*
testing
.
T
)
{
s
:=
newStateTest
()
s
.
state
.
RevertToSnapshot
(
s
.
state
.
Snapshot
())
}
// use testing instead of checker because checker does not support
// printing/logging in tests (-check.vv does not work)
func
TestSnapshot2
(
t
*
testing
.
T
)
{
state
,
_
:=
New
(
common
.
Hash
{},
NewDatabase
(
rawdb
.
NewMemoryDatabase
()))
...
...
core/state/statedb.go
View file @
dd21f079
...
...
@@ -124,115 +124,115 @@ func New(root common.Hash, db Database) (*StateDB, error) {
}
// setError remembers the first non-nil error it is called with.
func
(
s
elf
*
StateDB
)
setError
(
err
error
)
{
if
s
elf
.
dbErr
==
nil
{
s
elf
.
dbErr
=
err
func
(
s
*
StateDB
)
setError
(
err
error
)
{
if
s
.
dbErr
==
nil
{
s
.
dbErr
=
err
}
}
func
(
s
elf
*
StateDB
)
Error
()
error
{
return
s
elf
.
dbErr
func
(
s
*
StateDB
)
Error
()
error
{
return
s
.
dbErr
}
// Reset clears out all ephemeral state objects from the state db, but keeps
// the underlying state trie to avoid reloading data for the next operations.
func
(
s
elf
*
StateDB
)
Reset
(
root
common
.
Hash
)
error
{
tr
,
err
:=
s
elf
.
db
.
OpenTrie
(
root
)
func
(
s
*
StateDB
)
Reset
(
root
common
.
Hash
)
error
{
tr
,
err
:=
s
.
db
.
OpenTrie
(
root
)
if
err
!=
nil
{
return
err
}
s
elf
.
trie
=
tr
s
elf
.
stateObjects
=
make
(
map
[
common
.
Address
]
*
stateObject
)
s
elf
.
stateObjectsPending
=
make
(
map
[
common
.
Address
]
struct
{})
s
elf
.
stateObjectsDirty
=
make
(
map
[
common
.
Address
]
struct
{})
s
elf
.
thash
=
common
.
Hash
{}
s
elf
.
bhash
=
common
.
Hash
{}
s
elf
.
txIndex
=
0
s
elf
.
logs
=
make
(
map
[
common
.
Hash
][]
*
types
.
Log
)
s
elf
.
logSize
=
0
s
elf
.
preimages
=
make
(
map
[
common
.
Hash
][]
byte
)
s
elf
.
clearJournalAndRefund
()
s
.
trie
=
tr
s
.
stateObjects
=
make
(
map
[
common
.
Address
]
*
stateObject
)
s
.
stateObjectsPending
=
make
(
map
[
common
.
Address
]
struct
{})
s
.
stateObjectsDirty
=
make
(
map
[
common
.
Address
]
struct
{})
s
.
thash
=
common
.
Hash
{}
s
.
bhash
=
common
.
Hash
{}
s
.
txIndex
=
0
s
.
logs
=
make
(
map
[
common
.
Hash
][]
*
types
.
Log
)
s
.
logSize
=
0
s
.
preimages
=
make
(
map
[
common
.
Hash
][]
byte
)
s
.
clearJournalAndRefund
()
return
nil
}
func
(
s
elf
*
StateDB
)
AddLog
(
log
*
types
.
Log
)
{
s
elf
.
journal
.
append
(
addLogChange
{
txhash
:
self
.
thash
})
func
(
s
*
StateDB
)
AddLog
(
log
*
types
.
Log
)
{
s
.
journal
.
append
(
addLogChange
{
txhash
:
s
.
thash
})
log
.
TxHash
=
s
elf
.
thash
log
.
BlockHash
=
s
elf
.
bhash
log
.
TxIndex
=
uint
(
s
elf
.
txIndex
)
log
.
Index
=
s
elf
.
logSize
s
elf
.
logs
[
self
.
thash
]
=
append
(
self
.
logs
[
self
.
thash
],
log
)
s
elf
.
logSize
++
log
.
TxHash
=
s
.
thash
log
.
BlockHash
=
s
.
bhash
log
.
TxIndex
=
uint
(
s
.
txIndex
)
log
.
Index
=
s
.
logSize
s
.
logs
[
s
.
thash
]
=
append
(
s
.
logs
[
s
.
thash
],
log
)
s
.
logSize
++
}
func
(
s
elf
*
StateDB
)
GetLogs
(
hash
common
.
Hash
)
[]
*
types
.
Log
{
return
s
elf
.
logs
[
hash
]
func
(
s
*
StateDB
)
GetLogs
(
hash
common
.
Hash
)
[]
*
types
.
Log
{
return
s
.
logs
[
hash
]
}
func
(
s
elf
*
StateDB
)
Logs
()
[]
*
types
.
Log
{
func
(
s
*
StateDB
)
Logs
()
[]
*
types
.
Log
{
var
logs
[]
*
types
.
Log
for
_
,
lgs
:=
range
s
elf
.
logs
{
for
_
,
lgs
:=
range
s
.
logs
{
logs
=
append
(
logs
,
lgs
...
)
}
return
logs
}
// AddPreimage records a SHA3 preimage seen by the VM.
func
(
s
elf
*
StateDB
)
AddPreimage
(
hash
common
.
Hash
,
preimage
[]
byte
)
{
if
_
,
ok
:=
s
elf
.
preimages
[
hash
];
!
ok
{
s
elf
.
journal
.
append
(
addPreimageChange
{
hash
:
hash
})
func
(
s
*
StateDB
)
AddPreimage
(
hash
common
.
Hash
,
preimage
[]
byte
)
{
if
_
,
ok
:=
s
.
preimages
[
hash
];
!
ok
{
s
.
journal
.
append
(
addPreimageChange
{
hash
:
hash
})
pi
:=
make
([]
byte
,
len
(
preimage
))
copy
(
pi
,
preimage
)
s
elf
.
preimages
[
hash
]
=
pi
s
.
preimages
[
hash
]
=
pi
}
}
// Preimages returns a list of SHA3 preimages that have been submitted.
func
(
s
elf
*
StateDB
)
Preimages
()
map
[
common
.
Hash
][]
byte
{
return
s
elf
.
preimages
func
(
s
*
StateDB
)
Preimages
()
map
[
common
.
Hash
][]
byte
{
return
s
.
preimages
}
// AddRefund adds gas to the refund counter
func
(
s
elf
*
StateDB
)
AddRefund
(
gas
uint64
)
{
s
elf
.
journal
.
append
(
refundChange
{
prev
:
self
.
refund
})
s
elf
.
refund
+=
gas
func
(
s
*
StateDB
)
AddRefund
(
gas
uint64
)
{
s
.
journal
.
append
(
refundChange
{
prev
:
s
.
refund
})
s
.
refund
+=
gas
}
// SubRefund removes gas from the refund counter.
// This method will panic if the refund counter goes below zero
func
(
s
elf
*
StateDB
)
SubRefund
(
gas
uint64
)
{
s
elf
.
journal
.
append
(
refundChange
{
prev
:
self
.
refund
})
if
gas
>
s
elf
.
refund
{
func
(
s
*
StateDB
)
SubRefund
(
gas
uint64
)
{
s
.
journal
.
append
(
refundChange
{
prev
:
s
.
refund
})
if
gas
>
s
.
refund
{
panic
(
"Refund counter below zero"
)
}
s
elf
.
refund
-=
gas
s
.
refund
-=
gas
}
// Exist reports whether the given account address exists in the state.
// Notably this also returns true for suicided accounts.
func
(
s
elf
*
StateDB
)
Exist
(
addr
common
.
Address
)
bool
{
return
s
elf
.
getStateObject
(
addr
)
!=
nil
func
(
s
*
StateDB
)
Exist
(
addr
common
.
Address
)
bool
{
return
s
.
getStateObject
(
addr
)
!=
nil
}
// Empty returns whether the state object is either non-existent
// or empty according to the EIP161 specification (balance = nonce = code = 0)
func
(
s
elf
*
StateDB
)
Empty
(
addr
common
.
Address
)
bool
{
so
:=
s
elf
.
getStateObject
(
addr
)
func
(
s
*
StateDB
)
Empty
(
addr
common
.
Address
)
bool
{
so
:=
s
.
getStateObject
(
addr
)
return
so
==
nil
||
so
.
empty
()
}
// Retrieve the balance from the given address or 0 if object not found
func
(
s
elf
*
StateDB
)
GetBalance
(
addr
common
.
Address
)
*
big
.
Int
{
stateObject
:=
s
elf
.
getStateObject
(
addr
)
func
(
s
*
StateDB
)
GetBalance
(
addr
common
.
Address
)
*
big
.
Int
{
stateObject
:=
s
.
getStateObject
(
addr
)
if
stateObject
!=
nil
{
return
stateObject
.
Balance
()
}
return
common
.
Big0
}
func
(
s
elf
*
StateDB
)
GetNonce
(
addr
common
.
Address
)
uint64
{
stateObject
:=
s
elf
.
getStateObject
(
addr
)
func
(
s
*
StateDB
)
GetNonce
(
addr
common
.
Address
)
uint64
{
stateObject
:=
s
.
getStateObject
(
addr
)
if
stateObject
!=
nil
{
return
stateObject
.
Nonce
()
}
...
...
@@ -241,40 +241,40 @@ func (self *StateDB) GetNonce(addr common.Address) uint64 {
}
// TxIndex returns the current transaction index set by Prepare.
func
(
s
elf
*
StateDB
)
TxIndex
()
int
{
return
s
elf
.
txIndex
func
(
s
*
StateDB
)
TxIndex
()
int
{
return
s
.
txIndex
}
// BlockHash returns the current block hash set by Prepare.
func
(
s
elf
*
StateDB
)
BlockHash
()
common
.
Hash
{
return
s
elf
.
bhash
func
(
s
*
StateDB
)
BlockHash
()
common
.
Hash
{
return
s
.
bhash
}
func
(
s
elf
*
StateDB
)
GetCode
(
addr
common
.
Address
)
[]
byte
{
stateObject
:=
s
elf
.
getStateObject
(
addr
)
func
(
s
*
StateDB
)
GetCode
(
addr
common
.
Address
)
[]
byte
{
stateObject
:=
s
.
getStateObject
(
addr
)
if
stateObject
!=
nil
{
return
stateObject
.
Code
(
s
elf
.
db
)
return
stateObject
.
Code
(
s
.
db
)
}
return
nil
}
func
(
s
elf
*
StateDB
)
GetCodeSize
(
addr
common
.
Address
)
int
{
stateObject
:=
s
elf
.
getStateObject
(
addr
)
func
(
s
*
StateDB
)
GetCodeSize
(
addr
common
.
Address
)
int
{
stateObject
:=
s
.
getStateObject
(
addr
)
if
stateObject
==
nil
{
return
0
}
if
stateObject
.
code
!=
nil
{
return
len
(
stateObject
.
code
)
}
size
,
err
:=
s
elf
.
db
.
ContractCodeSize
(
stateObject
.
addrHash
,
common
.
BytesToHash
(
stateObject
.
CodeHash
()))
size
,
err
:=
s
.
db
.
ContractCodeSize
(
stateObject
.
addrHash
,
common
.
BytesToHash
(
stateObject
.
CodeHash
()))
if
err
!=
nil
{
s
elf
.
setError
(
err
)
s
.
setError
(
err
)
}
return
size
}
func
(
s
elf
*
StateDB
)
GetCodeHash
(
addr
common
.
Address
)
common
.
Hash
{
stateObject
:=
s
elf
.
getStateObject
(
addr
)
func
(
s
*
StateDB
)
GetCodeHash
(
addr
common
.
Address
)
common
.
Hash
{
stateObject
:=
s
.
getStateObject
(
addr
)
if
stateObject
==
nil
{
return
common
.
Hash
{}
}
...
...
@@ -282,25 +282,25 @@ func (self *StateDB) GetCodeHash(addr common.Address) common.Hash {
}
// GetState retrieves a value from the given account's storage trie.
func
(
s
elf
*
StateDB
)
GetState
(
addr
common
.
Address
,
hash
common
.
Hash
)
common
.
Hash
{
stateObject
:=
s
elf
.
getStateObject
(
addr
)
func
(
s
*
StateDB
)
GetState
(
addr
common
.
Address
,
hash
common
.
Hash
)
common
.
Hash
{
stateObject
:=
s
.
getStateObject
(
addr
)
if
stateObject
!=
nil
{
return
stateObject
.
GetState
(
s
elf
.
db
,
hash
)
return
stateObject
.
GetState
(
s
.
db
,
hash
)
}
return
common
.
Hash
{}
}
// GetProof returns the MerkleProof for a given Account
func
(
s
elf
*
StateDB
)
GetProof
(
a
common
.
Address
)
([][]
byte
,
error
)
{
func
(
s
*
StateDB
)
GetProof
(
a
common
.
Address
)
([][]
byte
,
error
)
{
var
proof
proofList
err
:=
s
elf
.
trie
.
Prove
(
crypto
.
Keccak256
(
a
.
Bytes
()),
0
,
&
proof
)
err
:=
s
.
trie
.
Prove
(
crypto
.
Keccak256
(
a
.
Bytes
()),
0
,
&
proof
)
return
[][]
byte
(
proof
),
err
}
// GetProof returns the StorageProof for given key
func
(
s
elf
*
StateDB
)
GetStorageProof
(
a
common
.
Address
,
key
common
.
Hash
)
([][]
byte
,
error
)
{
func
(
s
*
StateDB
)
GetStorageProof
(
a
common
.
Address
,
key
common
.
Hash
)
([][]
byte
,
error
)
{
var
proof
proofList
trie
:=
s
elf
.
StorageTrie
(
a
)
trie
:=
s
.
StorageTrie
(
a
)
if
trie
==
nil
{
return
proof
,
errors
.
New
(
"storage trie for requested address does not exist"
)
}
...
...
@@ -309,32 +309,32 @@ func (self *StateDB) GetStorageProof(a common.Address, key common.Hash) ([][]byt
}
// GetCommittedState retrieves a value from the given account's committed storage trie.
func
(
s
elf
*
StateDB
)
GetCommittedState
(
addr
common
.
Address
,
hash
common
.
Hash
)
common
.
Hash
{
stateObject
:=
s
elf
.
getStateObject
(
addr
)
func
(
s
*
StateDB
)
GetCommittedState
(
addr
common
.
Address
,
hash
common
.
Hash
)
common
.
Hash
{
stateObject
:=
s
.
getStateObject
(
addr
)
if
stateObject
!=
nil
{
return
stateObject
.
GetCommittedState
(
s
elf
.
db
,
hash
)
return
stateObject
.
GetCommittedState
(
s
.
db
,
hash
)
}
return
common
.
Hash
{}
}
// Database retrieves the low level database supporting the lower level trie ops.
func
(
s
elf
*
StateDB
)
Database
()
Database
{
return
s
elf
.
db
func
(
s
*
StateDB
)
Database
()
Database
{
return
s
.
db
}
// StorageTrie returns the storage trie of an account.
// The return value is a copy and is nil for non-existent accounts.
func
(
s
elf
*
StateDB
)
StorageTrie
(
addr
common
.
Address
)
Trie
{
stateObject
:=
s
elf
.
getStateObject
(
addr
)
func
(
s
*
StateDB
)
StorageTrie
(
addr
common
.
Address
)
Trie
{
stateObject
:=
s
.
getStateObject
(
addr
)
if
stateObject
==
nil
{
return
nil
}
cpy
:=
stateObject
.
deepCopy
(
s
elf
)
return
cpy
.
updateTrie
(
s
elf
.
db
)
cpy
:=
stateObject
.
deepCopy
(
s
)
return
cpy
.
updateTrie
(
s
.
db
)
}
func
(
s
elf
*
StateDB
)
HasSuicided
(
addr
common
.
Address
)
bool
{
stateObject
:=
s
elf
.
getStateObject
(
addr
)
func
(
s
*
StateDB
)
HasSuicided
(
addr
common
.
Address
)
bool
{
stateObject
:=
s
.
getStateObject
(
addr
)
if
stateObject
!=
nil
{
return
stateObject
.
suicided
}
...
...
@@ -346,53 +346,53 @@ func (self *StateDB) HasSuicided(addr common.Address) bool {
*/
// AddBalance adds amount to the account associated with addr.
func
(
s
elf
*
StateDB
)
AddBalance
(
addr
common
.
Address
,
amount
*
big
.
Int
)
{
stateObject
:=
s
elf
.
GetOrNewStateObject
(
addr
)
func
(
s
*
StateDB
)
AddBalance
(
addr
common
.
Address
,
amount
*
big
.
Int
)
{
stateObject
:=
s
.
GetOrNewStateObject
(
addr
)
if
stateObject
!=
nil
{
stateObject
.
AddBalance
(
amount
)
}
}
// SubBalance subtracts amount from the account associated with addr.
func
(
s
elf
*
StateDB
)
SubBalance
(
addr
common
.
Address
,
amount
*
big
.
Int
)
{
stateObject
:=
s
elf
.
GetOrNewStateObject
(
addr
)
func
(
s
*
StateDB
)
SubBalance
(
addr
common
.
Address
,
amount
*
big
.
Int
)
{
stateObject
:=
s
.
GetOrNewStateObject
(
addr
)
if
stateObject
!=
nil
{
stateObject
.
SubBalance
(
amount
)
}
}
func
(
s
elf
*
StateDB
)
SetBalance
(
addr
common
.
Address
,
amount
*
big
.
Int
)
{
stateObject
:=
s
elf
.
GetOrNewStateObject
(
addr
)
func
(
s
*
StateDB
)
SetBalance
(
addr
common
.
Address
,
amount
*
big
.
Int
)
{
stateObject
:=
s
.
GetOrNewStateObject
(
addr
)
if
stateObject
!=
nil
{
stateObject
.
SetBalance
(
amount
)
}
}
func
(
s
elf
*
StateDB
)
SetNonce
(
addr
common
.
Address
,
nonce
uint64
)
{
stateObject
:=
s
elf
.
GetOrNewStateObject
(
addr
)
func
(
s
*
StateDB
)
SetNonce
(
addr
common
.
Address
,
nonce
uint64
)
{
stateObject
:=
s
.
GetOrNewStateObject
(
addr
)
if
stateObject
!=
nil
{
stateObject
.
SetNonce
(
nonce
)
}
}
func
(
s
elf
*
StateDB
)
SetCode
(
addr
common
.
Address
,
code
[]
byte
)
{
stateObject
:=
s
elf
.
GetOrNewStateObject
(
addr
)
func
(
s
*
StateDB
)
SetCode
(
addr
common
.
Address
,
code
[]
byte
)
{
stateObject
:=
s
.
GetOrNewStateObject
(
addr
)
if
stateObject
!=
nil
{
stateObject
.
SetCode
(
crypto
.
Keccak256Hash
(
code
),
code
)
}
}
func
(
s
elf
*
StateDB
)
SetState
(
addr
common
.
Address
,
key
,
value
common
.
Hash
)
{
stateObject
:=
s
elf
.
GetOrNewStateObject
(
addr
)
func
(
s
*
StateDB
)
SetState
(
addr
common
.
Address
,
key
,
value
common
.
Hash
)
{
stateObject
:=
s
.
GetOrNewStateObject
(
addr
)
if
stateObject
!=
nil
{
stateObject
.
SetState
(
s
elf
.
db
,
key
,
value
)
stateObject
.
SetState
(
s
.
db
,
key
,
value
)
}
}
// SetStorage replaces the entire storage for the specified account with given
// storage. This function should only be used for debugging.
func
(
s
elf
*
StateDB
)
SetStorage
(
addr
common
.
Address
,
storage
map
[
common
.
Hash
]
common
.
Hash
)
{
stateObject
:=
s
elf
.
GetOrNewStateObject
(
addr
)
func
(
s
*
StateDB
)
SetStorage
(
addr
common
.
Address
,
storage
map
[
common
.
Hash
]
common
.
Hash
)
{
stateObject
:=
s
.
GetOrNewStateObject
(
addr
)
if
stateObject
!=
nil
{
stateObject
.
SetStorage
(
storage
)
}
...
...
@@ -403,12 +403,12 @@ func (self *StateDB) SetStorage(addr common.Address, storage map[common.Hash]com
//
// The account's state object is still available until the state is committed,
// getStateObject will return a non-nil account after Suicide.
func
(
s
elf
*
StateDB
)
Suicide
(
addr
common
.
Address
)
bool
{
stateObject
:=
s
elf
.
getStateObject
(
addr
)
func
(
s
*
StateDB
)
Suicide
(
addr
common
.
Address
)
bool
{
stateObject
:=
s
.
getStateObject
(
addr
)
if
stateObject
==
nil
{
return
false
}
s
elf
.
journal
.
append
(
suicideChange
{
s
.
journal
.
append
(
suicideChange
{
account
:
&
addr
,
prev
:
stateObject
.
suicided
,
prevbalance
:
new
(
big
.
Int
)
.
Set
(
stateObject
.
Balance
()),
...
...
@@ -462,7 +462,7 @@ func (s *StateDB) getStateObject(addr common.Address) *stateObject {
// getDeletedStateObject is similar to getStateObject, but instead of returning
// nil for a deleted state object, it returns the actual object with the deleted
// flag set. This is needed by the state journal to revert to the correct s
elf
-
// flag set. This is needed by the state journal to revert to the correct s-
// destructed object instead of wiping all knowledge about the state object.
func
(
s
*
StateDB
)
getDeletedStateObject
(
addr
common
.
Address
)
*
stateObject
{
// Prefer live objects if any is available
...
...
@@ -490,32 +490,32 @@ func (s *StateDB) getDeletedStateObject(addr common.Address) *stateObject {
return
obj
}
func
(
s
elf
*
StateDB
)
setStateObject
(
object
*
stateObject
)
{
s
elf
.
stateObjects
[
object
.
Address
()]
=
object
func
(
s
*
StateDB
)
setStateObject
(
object
*
stateObject
)
{
s
.
stateObjects
[
object
.
Address
()]
=
object
}
// Retrieve a state object or create a new state object if nil.
func
(
s
elf
*
StateDB
)
GetOrNewStateObject
(
addr
common
.
Address
)
*
stateObject
{
stateObject
:=
s
elf
.
getStateObject
(
addr
)
func
(
s
*
StateDB
)
GetOrNewStateObject
(
addr
common
.
Address
)
*
stateObject
{
stateObject
:=
s
.
getStateObject
(
addr
)
if
stateObject
==
nil
{
stateObject
,
_
=
s
elf
.
createObject
(
addr
)
stateObject
,
_
=
s
.
createObject
(
addr
)
}
return
stateObject
}
// createObject creates a new state object. If there is an existing account with
// the given address, it is overwritten and returned as the second return value.
func
(
s
elf
*
StateDB
)
createObject
(
addr
common
.
Address
)
(
newobj
,
prev
*
stateObject
)
{
prev
=
s
elf
.
getDeletedStateObject
(
addr
)
// Note, prev might have been deleted, we need that!
func
(
s
*
StateDB
)
createObject
(
addr
common
.
Address
)
(
newobj
,
prev
*
stateObject
)
{
prev
=
s
.
getDeletedStateObject
(
addr
)
// Note, prev might have been deleted, we need that!
newobj
=
newObject
(
s
elf
,
addr
,
Account
{})
newobj
=
newObject
(
s
,
addr
,
Account
{})
newobj
.
setNonce
(
0
)
// sets the object to dirty
if
prev
==
nil
{
s
elf
.
journal
.
append
(
createObjectChange
{
account
:
&
addr
})
s
.
journal
.
append
(
createObjectChange
{
account
:
&
addr
})
}
else
{
s
elf
.
journal
.
append
(
resetObjectChange
{
prev
:
prev
})
s
.
journal
.
append
(
resetObjectChange
{
prev
:
prev
})
}
s
elf
.
setStateObject
(
newobj
)
s
.
setStateObject
(
newobj
)
return
newobj
,
prev
}
...
...
@@ -529,8 +529,8 @@ func (self *StateDB) createObject(addr common.Address) (newobj, prev *stateObjec
// 2. tx_create(sha(account ++ nonce)) (note that this gets the address of 1)
//
// Carrying over the balance ensures that Ether doesn't disappear.
func
(
s
elf
*
StateDB
)
CreateAccount
(
addr
common
.
Address
)
{
newObj
,
prev
:=
s
elf
.
createObject
(
addr
)
func
(
s
*
StateDB
)
CreateAccount
(
addr
common
.
Address
)
{
newObj
,
prev
:=
s
.
createObject
(
addr
)
if
prev
!=
nil
{
newObj
.
setBalance
(
prev
.
data
.
Balance
)
}
...
...
@@ -567,27 +567,27 @@ func (db *StateDB) ForEachStorage(addr common.Address, cb func(key, value common
// Copy creates a deep, independent copy of the state.
// Snapshots of the copied state cannot be applied to the copy.
func
(
s
elf
*
StateDB
)
Copy
()
*
StateDB
{
func
(
s
*
StateDB
)
Copy
()
*
StateDB
{
// Copy all the basic fields, initialize the memory ones
state
:=
&
StateDB
{
db
:
s
elf
.
db
,
trie
:
s
elf
.
db
.
CopyTrie
(
self
.
trie
),
stateObjects
:
make
(
map
[
common
.
Address
]
*
stateObject
,
len
(
s
elf
.
journal
.
dirties
)),
stateObjectsPending
:
make
(
map
[
common
.
Address
]
struct
{},
len
(
s
elf
.
stateObjectsPending
)),
stateObjectsDirty
:
make
(
map
[
common
.
Address
]
struct
{},
len
(
s
elf
.
journal
.
dirties
)),
refund
:
s
elf
.
refund
,
logs
:
make
(
map
[
common
.
Hash
][]
*
types
.
Log
,
len
(
s
elf
.
logs
)),
logSize
:
s
elf
.
logSize
,
preimages
:
make
(
map
[
common
.
Hash
][]
byte
,
len
(
s
elf
.
preimages
)),
db
:
s
.
db
,
trie
:
s
.
db
.
CopyTrie
(
s
.
trie
),
stateObjects
:
make
(
map
[
common
.
Address
]
*
stateObject
,
len
(
s
.
journal
.
dirties
)),
stateObjectsPending
:
make
(
map
[
common
.
Address
]
struct
{},
len
(
s
.
stateObjectsPending
)),
stateObjectsDirty
:
make
(
map
[
common
.
Address
]
struct
{},
len
(
s
.
journal
.
dirties
)),
refund
:
s
.
refund
,
logs
:
make
(
map
[
common
.
Hash
][]
*
types
.
Log
,
len
(
s
.
logs
)),
logSize
:
s
.
logSize
,
preimages
:
make
(
map
[
common
.
Hash
][]
byte
,
len
(
s
.
preimages
)),
journal
:
newJournal
(),
}
// Copy the dirty states, logs, and preimages
for
addr
:=
range
s
elf
.
journal
.
dirties
{
for
addr
:=
range
s
.
journal
.
dirties
{
// As documented [here](https://github.com/ethereum/go-ethereum/pull/16485#issuecomment-380438527),
// and in the Finalise-method, there is a case where an object is in the journal but not
// in the stateObjects: OOG after touch on ripeMD prior to Byzantium. Thus, we need to check for
// nil
if
object
,
exist
:=
s
elf
.
stateObjects
[
addr
];
exist
{
if
object
,
exist
:=
s
.
stateObjects
[
addr
];
exist
{
// Even though the original object is dirty, we are not copying the journal,
// so we need to make sure that anyside effect the journal would have caused
// during a commit (or similar op) is already applied to the copy.
...
...
@@ -600,19 +600,19 @@ func (self *StateDB) Copy() *StateDB {
// Above, we don't copy the actual journal. This means that if the copy is copied, the
// loop above will be a no-op, since the copy's journal is empty.
// Thus, here we iterate over stateObjects, to enable copies of copies
for
addr
:=
range
s
elf
.
stateObjectsPending
{
for
addr
:=
range
s
.
stateObjectsPending
{
if
_
,
exist
:=
state
.
stateObjects
[
addr
];
!
exist
{
state
.
stateObjects
[
addr
]
=
s
elf
.
stateObjects
[
addr
]
.
deepCopy
(
state
)
state
.
stateObjects
[
addr
]
=
s
.
stateObjects
[
addr
]
.
deepCopy
(
state
)
}
state
.
stateObjectsPending
[
addr
]
=
struct
{}{}
}
for
addr
:=
range
s
elf
.
stateObjectsDirty
{
for
addr
:=
range
s
.
stateObjectsDirty
{
if
_
,
exist
:=
state
.
stateObjects
[
addr
];
!
exist
{
state
.
stateObjects
[
addr
]
=
s
elf
.
stateObjects
[
addr
]
.
deepCopy
(
state
)
state
.
stateObjects
[
addr
]
=
s
.
stateObjects
[
addr
]
.
deepCopy
(
state
)
}
state
.
stateObjectsDirty
[
addr
]
=
struct
{}{}
}
for
hash
,
logs
:=
range
s
elf
.
logs
{
for
hash
,
logs
:=
range
s
.
logs
{
cpy
:=
make
([]
*
types
.
Log
,
len
(
logs
))
for
i
,
l
:=
range
logs
{
cpy
[
i
]
=
new
(
types
.
Log
)
...
...
@@ -620,42 +620,42 @@ func (self *StateDB) Copy() *StateDB {
}
state
.
logs
[
hash
]
=
cpy
}
for
hash
,
preimage
:=
range
s
elf
.
preimages
{
for
hash
,
preimage
:=
range
s
.
preimages
{
state
.
preimages
[
hash
]
=
preimage
}
return
state
}
// Snapshot returns an identifier for the current revision of the state.
func
(
s
elf
*
StateDB
)
Snapshot
()
int
{
id
:=
s
elf
.
nextRevisionId
s
elf
.
nextRevisionId
++
s
elf
.
validRevisions
=
append
(
self
.
validRevisions
,
revision
{
id
,
self
.
journal
.
length
()})
func
(
s
*
StateDB
)
Snapshot
()
int
{
id
:=
s
.
nextRevisionId
s
.
nextRevisionId
++
s
.
validRevisions
=
append
(
s
.
validRevisions
,
revision
{
id
,
s
.
journal
.
length
()})
return
id
}
// RevertToSnapshot reverts all state changes made since the given revision.
func
(
s
elf
*
StateDB
)
RevertToSnapshot
(
revid
int
)
{
func
(
s
*
StateDB
)
RevertToSnapshot
(
revid
int
)
{
// Find the snapshot in the stack of valid snapshots.
idx
:=
sort
.
Search
(
len
(
s
elf
.
validRevisions
),
func
(
i
int
)
bool
{
return
s
elf
.
validRevisions
[
i
]
.
id
>=
revid
idx
:=
sort
.
Search
(
len
(
s
.
validRevisions
),
func
(
i
int
)
bool
{
return
s
.
validRevisions
[
i
]
.
id
>=
revid
})
if
idx
==
len
(
s
elf
.
validRevisions
)
||
self
.
validRevisions
[
idx
]
.
id
!=
revid
{
if
idx
==
len
(
s
.
validRevisions
)
||
s
.
validRevisions
[
idx
]
.
id
!=
revid
{
panic
(
fmt
.
Errorf
(
"revision id %v cannot be reverted"
,
revid
))
}
snapshot
:=
s
elf
.
validRevisions
[
idx
]
.
journalIndex
snapshot
:=
s
.
validRevisions
[
idx
]
.
journalIndex
// Replay the journal to undo changes and remove invalidated snapshots
s
elf
.
journal
.
revert
(
self
,
snapshot
)
s
elf
.
validRevisions
=
self
.
validRevisions
[
:
idx
]
s
.
journal
.
revert
(
s
,
snapshot
)
s
.
validRevisions
=
s
.
validRevisions
[
:
idx
]
}
// GetRefund returns the current value of the refund counter.
func
(
s
elf
*
StateDB
)
GetRefund
()
uint64
{
return
s
elf
.
refund
func
(
s
*
StateDB
)
GetRefund
()
uint64
{
return
s
.
refund
}
// Finalise finalises the state by removing the s
elf
destructed objects and clears
// Finalise finalises the state by removing the s destructed objects and clears
// the journal as well as the refunds. Finalise, however, will not push any updates
// into the tries just yet. Only IntermediateRoot or Commit will do that.
func
(
s
*
StateDB
)
Finalise
(
deleteEmptyObjects
bool
)
{
...
...
@@ -710,10 +710,10 @@ func (s *StateDB) IntermediateRoot(deleteEmptyObjects bool) common.Hash {
// Prepare sets the current transaction hash and index and block hash which is
// used when the EVM emits new state logs.
func
(
s
elf
*
StateDB
)
Prepare
(
thash
,
bhash
common
.
Hash
,
ti
int
)
{
s
elf
.
thash
=
thash
s
elf
.
bhash
=
bhash
s
elf
.
txIndex
=
ti
func
(
s
*
StateDB
)
Prepare
(
thash
,
bhash
common
.
Hash
,
ti
int
)
{
s
.
thash
=
thash
s
.
bhash
=
bhash
s
.
txIndex
=
ti
}
func
(
s
*
StateDB
)
clearJournalAndRefund
()
{
...
...
core/state/statedb_test.go
View file @
dd21f079
...
...
@@ -29,8 +29,6 @@ import (
"testing"
"testing/quick"
"gopkg.in/check.v1"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/core/rawdb"
"github.com/ethereum/go-ethereum/core/types"
...
...
@@ -458,7 +456,8 @@ func (test *snapshotTest) checkEqual(state, checkstate *StateDB) error {
return
nil
}
func
(
s
*
StateSuite
)
TestTouchDelete
(
c
*
check
.
C
)
{
func
TestTouchDelete
(
t
*
testing
.
T
)
{
s
:=
newStateTest
()
s
.
state
.
GetOrNewStateObject
(
common
.
Address
{})
root
,
_
:=
s
.
state
.
Commit
(
false
)
s
.
state
.
Reset
(
root
)
...
...
@@ -467,11 +466,11 @@ func (s *StateSuite) TestTouchDelete(c *check.C) {
s
.
state
.
AddBalance
(
common
.
Address
{},
new
(
big
.
Int
))
if
len
(
s
.
state
.
journal
.
dirties
)
!=
1
{
c
.
Fatal
(
"expected one dirty state object"
)
t
.
Fatal
(
"expected one dirty state object"
)
}
s
.
state
.
RevertToSnapshot
(
snapshot
)
if
len
(
s
.
state
.
journal
.
dirties
)
!=
0
{
c
.
Fatal
(
"expected no dirty state object"
)
t
.
Fatal
(
"expected no dirty state object"
)
}
}
...
...
go.mod
View file @
dd21f079
...
...
@@ -59,7 +59,6 @@ require (
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f
golang.org/x/sys v0.0.0-20190712062909-fae7ac547cb7
golang.org/x/text v0.3.2
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127
gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce
gopkg.in/olebedev/go-duktape.v3 v3.0.0-20190213234257-ec84240a7772
gopkg.in/sourcemap.v1 v1.0.5 // indirect
...
...
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