Unverified Commit dd21f079 authored by Felix Lange's avatar Felix Lange Committed by GitHub

core/state: fix staticcheck warnings (#20357)

Also remove dependency on gopkg.in/check.v1 in tests.
parent 36a684ca
...@@ -47,7 +47,9 @@ type Dump struct { ...@@ -47,7 +47,9 @@ type Dump struct {
} }
// iterativeDump is a 'collector'-implementation which dump output line-by-line iteratively // 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 // Collector interface which the state trie calls during iteration
type collector interface { type collector interface {
...@@ -55,15 +57,15 @@ type collector interface { ...@@ -55,15 +57,15 @@ type collector interface {
onAccount(common.Address, DumpAccount) onAccount(common.Address, DumpAccount)
} }
func (self *Dump) onRoot(root common.Hash) { func (d *Dump) onRoot(root common.Hash) {
self.Root = fmt.Sprintf("%x", root) d.Root = fmt.Sprintf("%x", root)
} }
func (self *Dump) onAccount(addr common.Address, account DumpAccount) { func (d *Dump) onAccount(addr common.Address, account DumpAccount) {
self.Accounts[addr] = account d.Accounts[addr] = account
} }
func (self iterativeDump) onAccount(addr common.Address, account DumpAccount) { func (d iterativeDump) onAccount(addr common.Address, account DumpAccount) {
dumpAccount := &DumpAccount{ dumpAccount := &DumpAccount{
Balance: account.Balance, Balance: account.Balance,
Nonce: account.Nonce, Nonce: account.Nonce,
...@@ -77,25 +79,26 @@ func (self iterativeDump) onAccount(addr common.Address, account DumpAccount) { ...@@ -77,25 +79,26 @@ func (self iterativeDump) onAccount(addr common.Address, account DumpAccount) {
if addr != (common.Address{}) { if addr != (common.Address{}) {
dumpAccount.Address = &addr 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 common.Hash `json:"root"`
}{root}) }{root})
} }
func (self *StateDB) dump(c collector, excludeCode, excludeStorage, excludeMissingPreimages bool) { func (s *StateDB) dump(c collector, excludeCode, excludeStorage, excludeMissingPreimages bool) {
emptyAddress := (common.Address{}) emptyAddress := (common.Address{})
missingPreimages := 0 missingPreimages := 0
c.onRoot(self.trie.Hash()) c.onRoot(s.trie.Hash())
it := trie.NewIterator(self.trie.NodeIterator(nil)) it := trie.NewIterator(s.trie.NodeIterator(nil))
for it.Next() { for it.Next() {
var data Account var data Account
if err := rlp.DecodeBytes(it.Value, &data); err != nil { if err := rlp.DecodeBytes(it.Value, &data); err != nil {
panic(err) panic(err)
} }
addr := common.BytesToAddress(self.trie.GetKey(it.Key)) addr := common.BytesToAddress(s.trie.GetKey(it.Key))
obj := newObject(nil, addr, data) obj := newObject(nil, addr, data)
account := DumpAccount{ account := DumpAccount{
Balance: data.Balance.String(), Balance: data.Balance.String(),
...@@ -112,18 +115,18 @@ func (self *StateDB) dump(c collector, excludeCode, excludeStorage, excludeMissi ...@@ -112,18 +115,18 @@ func (self *StateDB) dump(c collector, excludeCode, excludeStorage, excludeMissi
account.SecureKey = it.Key account.SecureKey = it.Key
} }
if !excludeCode { if !excludeCode {
account.Code = common.Bytes2Hex(obj.Code(self.db)) account.Code = common.Bytes2Hex(obj.Code(s.db))
} }
if !excludeStorage { if !excludeStorage {
account.Storage = make(map[common.Hash]string) account.Storage = make(map[common.Hash]string)
storageIt := trie.NewIterator(obj.getTrie(self.db).NodeIterator(nil)) storageIt := trie.NewIterator(obj.getTrie(s.db).NodeIterator(nil))
for storageIt.Next() { for storageIt.Next() {
_, content, _, err := rlp.Split(storageIt.Value) _, content, _, err := rlp.Split(storageIt.Value)
if err != nil { if err != nil {
log.Error("Failed to decode the value returned by iterator", "error", err) log.Error("Failed to decode the value returned by iterator", "error", err)
continue continue
} }
account.Storage[common.BytesToHash(self.trie.GetKey(storageIt.Key))] = common.Bytes2Hex(content) account.Storage[common.BytesToHash(s.trie.GetKey(storageIt.Key))] = common.Bytes2Hex(content)
} }
} }
c.onAccount(addr, account) c.onAccount(addr, account)
...@@ -134,17 +137,17 @@ func (self *StateDB) dump(c collector, excludeCode, excludeStorage, excludeMissi ...@@ -134,17 +137,17 @@ func (self *StateDB) dump(c collector, excludeCode, excludeStorage, excludeMissi
} }
// RawDump returns the entire state an a single large object // RawDump returns the entire state an a single large object
func (self *StateDB) RawDump(excludeCode, excludeStorage, excludeMissingPreimages bool) Dump { func (s *StateDB) RawDump(excludeCode, excludeStorage, excludeMissingPreimages bool) Dump {
dump := &Dump{ dump := &Dump{
Accounts: make(map[common.Address]DumpAccount), Accounts: make(map[common.Address]DumpAccount),
} }
self.dump(dump, excludeCode, excludeStorage, excludeMissingPreimages) s.dump(dump, excludeCode, excludeStorage, excludeMissingPreimages)
return *dump return *dump
} }
// Dump returns a JSON string representing the entire state as a single json-object // Dump returns a JSON string representing the entire state as a single json-object
func (self *StateDB) Dump(excludeCode, excludeStorage, excludeMissingPreimages bool) []byte { func (s *StateDB) Dump(excludeCode, excludeStorage, excludeMissingPreimages bool) []byte {
dump := self.RawDump(excludeCode, excludeStorage, excludeMissingPreimages) dump := s.RawDump(excludeCode, excludeStorage, excludeMissingPreimages)
json, err := json.MarshalIndent(dump, "", " ") json, err := json.MarshalIndent(dump, "", " ")
if err != nil { if err != nil {
fmt.Println("dump err", err) fmt.Println("dump err", err)
...@@ -153,6 +156,6 @@ func (self *StateDB) Dump(excludeCode, excludeStorage, excludeMissingPreimages b ...@@ -153,6 +156,6 @@ func (self *StateDB) Dump(excludeCode, excludeStorage, excludeMissingPreimages b
} }
// IterativeDump dumps out accounts as json-objects, delimited by linebreaks on stdout // IterativeDump dumps out accounts as json-objects, delimited by linebreaks on stdout
func (self *StateDB) IterativeDump(excludeCode, excludeStorage, excludeMissingPreimages bool, output *json.Encoder) { func (s *StateDB) IterativeDump(excludeCode, excludeStorage, excludeMissingPreimages bool, output *json.Encoder) {
self.dump(iterativeDump(*output), excludeCode, excludeStorage, excludeMissingPreimages) s.dump(iterativeDump{output}, excludeCode, excludeStorage, excludeMissingPreimages)
} }
...@@ -127,9 +127,7 @@ type ( ...@@ -127,9 +127,7 @@ type (
hash common.Hash hash common.Hash
} }
touchChange struct { touchChange struct {
account *common.Address account *common.Address
prev bool
prevDirty bool
} }
) )
......
// 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) }
...@@ -25,19 +25,24 @@ import ( ...@@ -25,19 +25,24 @@ import (
"github.com/ethereum/go-ethereum/core/rawdb" "github.com/ethereum/go-ethereum/core/rawdb"
"github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/crypto"
"github.com/ethereum/go-ethereum/ethdb" "github.com/ethereum/go-ethereum/ethdb"
checker "gopkg.in/check.v1"
) )
type StateSuite struct { var toAddr = common.BytesToAddress
type stateTest struct {
db ethdb.Database db ethdb.Database
state *StateDB 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 // generate a few entries
obj1 := s.state.GetOrNewStateObject(toAddr([]byte{0x01})) obj1 := s.state.GetOrNewStateObject(toAddr([]byte{0x01}))
obj1.AddBalance(big.NewInt(22)) obj1.AddBalance(big.NewInt(22))
...@@ -78,16 +83,12 @@ func (s *StateSuite) TestDump(c *checker.C) { ...@@ -78,16 +83,12 @@ func (s *StateSuite) TestDump(c *checker.C) {
} }
}` }`
if got != want { if got != want {
c.Errorf("dump mismatch:\ngot: %s\nwant: %s\n", got, want) t.Errorf("dump mismatch:\ngot: %s\nwant: %s\n", got, want)
} }
} }
func (s *StateSuite) SetUpTest(c *checker.C) { func TestNull(t *testing.T) {
s.db = rawdb.NewMemoryDatabase() s := newStateTest()
s.state, _ = New(common.Hash{}, NewDatabase(s.db))
}
func (s *StateSuite) TestNull(c *checker.C) {
address := common.HexToAddress("0x823140710bf13990e4500136726d8b55") address := common.HexToAddress("0x823140710bf13990e4500136726d8b55")
s.state.CreateAccount(address) s.state.CreateAccount(address)
//value := common.FromHex("0x823140710bf13990e4500136726d8b55") //value := common.FromHex("0x823140710bf13990e4500136726d8b55")
...@@ -97,18 +98,19 @@ func (s *StateSuite) TestNull(c *checker.C) { ...@@ -97,18 +98,19 @@ func (s *StateSuite) TestNull(c *checker.C) {
s.state.Commit(false) s.state.Commit(false)
if value := s.state.GetState(address, common.Hash{}); value != (common.Hash{}) { 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{}) { 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")) stateobjaddr := toAddr([]byte("aa"))
var storageaddr common.Hash var storageaddr common.Hash
data1 := common.BytesToHash([]byte{42}) data1 := common.BytesToHash([]byte{42})
data2 := common.BytesToHash([]byte{43}) data2 := common.BytesToHash([]byte{43})
s := newStateTest()
// snapshot the genesis state // snapshot the genesis state
genesis := s.state.Snapshot() genesis := s.state.Snapshot()
...@@ -121,21 +123,28 @@ func (s *StateSuite) TestSnapshot(c *checker.C) { ...@@ -121,21 +123,28 @@ func (s *StateSuite) TestSnapshot(c *checker.C) {
s.state.SetState(stateobjaddr, storageaddr, data2) s.state.SetState(stateobjaddr, storageaddr, data2)
s.state.RevertToSnapshot(snapshot) s.state.RevertToSnapshot(snapshot)
c.Assert(s.state.GetState(stateobjaddr, storageaddr), checker.DeepEquals, data1) if v := s.state.GetState(stateobjaddr, storageaddr); v != data1 {
c.Assert(s.state.GetCommittedState(stateobjaddr, storageaddr), checker.DeepEquals, common.Hash{}) 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 // revert up to the genesis state and ensure correct content
s.state.RevertToSnapshot(genesis) s.state.RevertToSnapshot(genesis)
c.Assert(s.state.GetState(stateobjaddr, storageaddr), checker.DeepEquals, common.Hash{}) if v := s.state.GetState(stateobjaddr, storageaddr); v != (common.Hash{}) {
c.Assert(s.state.GetCommittedState(stateobjaddr, storageaddr), checker.DeepEquals, 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()) 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) { func TestSnapshot2(t *testing.T) {
state, _ := New(common.Hash{}, NewDatabase(rawdb.NewMemoryDatabase())) state, _ := New(common.Hash{}, NewDatabase(rawdb.NewMemoryDatabase()))
......
This diff is collapsed.
...@@ -29,8 +29,6 @@ import ( ...@@ -29,8 +29,6 @@ import (
"testing" "testing"
"testing/quick" "testing/quick"
"gopkg.in/check.v1"
"github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/core/rawdb" "github.com/ethereum/go-ethereum/core/rawdb"
"github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/core/types"
...@@ -458,7 +456,8 @@ func (test *snapshotTest) checkEqual(state, checkstate *StateDB) error { ...@@ -458,7 +456,8 @@ func (test *snapshotTest) checkEqual(state, checkstate *StateDB) error {
return nil return nil
} }
func (s *StateSuite) TestTouchDelete(c *check.C) { func TestTouchDelete(t *testing.T) {
s := newStateTest()
s.state.GetOrNewStateObject(common.Address{}) s.state.GetOrNewStateObject(common.Address{})
root, _ := s.state.Commit(false) root, _ := s.state.Commit(false)
s.state.Reset(root) s.state.Reset(root)
...@@ -467,11 +466,11 @@ func (s *StateSuite) TestTouchDelete(c *check.C) { ...@@ -467,11 +466,11 @@ func (s *StateSuite) TestTouchDelete(c *check.C) {
s.state.AddBalance(common.Address{}, new(big.Int)) s.state.AddBalance(common.Address{}, new(big.Int))
if len(s.state.journal.dirties) != 1 { 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) s.state.RevertToSnapshot(snapshot)
if len(s.state.journal.dirties) != 0 { if len(s.state.journal.dirties) != 0 {
c.Fatal("expected no dirty state object") t.Fatal("expected no dirty state object")
} }
} }
......
...@@ -59,7 +59,6 @@ require ( ...@@ -59,7 +59,6 @@ require (
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f golang.org/x/sync v0.0.0-20181108010431-42b317875d0f
golang.org/x/sys v0.0.0-20190712062909-fae7ac547cb7 golang.org/x/sys v0.0.0-20190712062909-fae7ac547cb7
golang.org/x/text v0.3.2 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/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce
gopkg.in/olebedev/go-duktape.v3 v3.0.0-20190213234257-ec84240a7772 gopkg.in/olebedev/go-duktape.v3 v3.0.0-20190213234257-ec84240a7772
gopkg.in/sourcemap.v1 v1.0.5 // indirect gopkg.in/sourcemap.v1 v1.0.5 // indirect
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment