Upgrade geth and cleanup

This commit is contained in:
Aleksandr Bezobchuk 2018-09-28 17:40:58 -04:00
parent 6e1a73bcad
commit 85ca203972
11 changed files with 114 additions and 80 deletions

35
Gopkg.lock generated
View File

@ -57,6 +57,14 @@
revision = "8991bc29aa16c548c550c7ff78260e27b9ab7c73" revision = "8991bc29aa16c548c550c7ff78260e27b9ab7c73"
version = "v1.1.1" version = "v1.1.1"
[[projects]]
digest = "1:e47d51dab652d26c3fba6f8cba403f922d02757a82abdc77e90df7948daf296e"
name = "github.com/deckarep/golang-set"
packages = ["."]
pruneopts = "T"
revision = "cbaa98ba5575e67703b32b4b19f73c91f3c4159e"
version = "v1.7.1"
[[projects]] [[projects]]
branch = "master" branch = "master"
digest = "1:67d0b50be0549e610017cb91e0b0b745ec0cad7c613bc8e18ff2d1c1fc8825a7" digest = "1:67d0b50be0549e610017cb91e0b0b745ec0cad7c613bc8e18ff2d1c1fc8825a7"
@ -66,7 +74,7 @@
revision = "0bce6a6887123b67a60366d2c9fe2dfb74289d2e" revision = "0bce6a6887123b67a60366d2c9fe2dfb74289d2e"
[[projects]] [[projects]]
digest = "1:3238a0c355a81640974751f7d3bab21bf91035165f75c2c457959425c0422a4b" digest = "1:c24d17ef5d37ae7215811cf1cade45822faa232d6bcfbadff30bbeba52225a98"
name = "github.com/ethereum/go-ethereum" name = "github.com/ethereum/go-ethereum"
packages = [ packages = [
".", ".",
@ -80,6 +88,7 @@
"common/hexutil", "common/hexutil",
"common/math", "common/math",
"common/mclock", "common/mclock",
"common/prque",
"consensus", "consensus",
"consensus/ethash", "consensus/ethash",
"consensus/misc", "consensus/misc",
@ -93,7 +102,6 @@
"crypto/bn256/cloudflare", "crypto/bn256/cloudflare",
"crypto/bn256/google", "crypto/bn256/google",
"crypto/ecies", "crypto/ecies",
"crypto/randentropy",
"crypto/secp256k1", "crypto/secp256k1",
"crypto/sha3", "crypto/sha3",
"eth/downloader", "eth/downloader",
@ -114,8 +122,8 @@
"trie", "trie",
] ]
pruneopts = "T" pruneopts = "T"
revision = "dea1ce052a10cd7d401a5c04f83f371a06fe293c" revision = "477eb0933b9529f7deeccc233cc815fe34a8ea56"
version = "v1.8.11" version = "v1.8.16"
[[projects]] [[projects]]
digest = "1:0b9c3ad6c948d57a379da9c4e1cdd989b1c73ddc5ec8673f52a9539ce60a109b" digest = "1:0b9c3ad6c948d57a379da9c4e1cdd989b1c73ddc5ec8673f52a9539ce60a109b"
@ -427,6 +435,7 @@
digest = "1:bfa444982d49ce4ca1360599270a94de12a573ccd3bf04493c79bee09da3170b" digest = "1:bfa444982d49ce4ca1360599270a94de12a573ccd3bf04493c79bee09da3170b"
name = "golang.org/x/sys" name = "golang.org/x/sys"
packages = [ packages = [
"cpu",
"unix", "unix",
"windows", "windows",
] ]
@ -510,22 +519,6 @@
revision = "168a6198bcb0ef175f7dacec0b8691fc141dc9b8" revision = "168a6198bcb0ef175f7dacec0b8691fc141dc9b8"
version = "v1.13.0" version = "v1.13.0"
[[projects]]
digest = "1:3ccd10c863188cfe0d936fcfe6a055c95362e43af8e7039e33baade846928e74"
name = "gopkg.in/fatih/set.v0"
packages = ["."]
pruneopts = "T"
revision = "57907de300222151a123d29255ed17f5ed43fad3"
version = "v0.1.0"
[[projects]]
branch = "v2"
digest = "1:dae137be246befa42ce4b48c0feff2c5796b8a5027139a283f31a21173744410"
name = "gopkg.in/karalabe/cookiejar.v2"
packages = ["collections/prque"]
pruneopts = "T"
revision = "8dcd6a7f4951f6ff3ee9cbb919a06d8925822e57"
[[projects]] [[projects]]
branch = "v2" branch = "v2"
digest = "1:3d3f9391ab615be8655ae0d686a1564f3fec413979bb1aaf018bac1ec1bb1cc7" digest = "1:3d3f9391ab615be8655ae0d686a1564f3fec413979bb1aaf018bac1ec1bb1cc7"
@ -548,7 +541,6 @@
"github.com/cosmos/cosmos-sdk/x/params", "github.com/cosmos/cosmos-sdk/x/params",
"github.com/cosmos/cosmos-sdk/x/slashing", "github.com/cosmos/cosmos-sdk/x/slashing",
"github.com/cosmos/cosmos-sdk/x/stake", "github.com/cosmos/cosmos-sdk/x/stake",
"github.com/cosmos/cosmos-sdk/x/stake/types",
"github.com/ethereum/go-ethereum/common", "github.com/ethereum/go-ethereum/common",
"github.com/ethereum/go-ethereum/common/hexutil", "github.com/ethereum/go-ethereum/common/hexutil",
"github.com/ethereum/go-ethereum/common/math", "github.com/ethereum/go-ethereum/common/math",
@ -569,7 +561,6 @@
"github.com/ethereum/go-ethereum/trie", "github.com/ethereum/go-ethereum/trie",
"github.com/hashicorp/golang-lru", "github.com/hashicorp/golang-lru",
"github.com/pkg/errors", "github.com/pkg/errors",
"github.com/stretchr/testify/assert",
"github.com/stretchr/testify/require", "github.com/stretchr/testify/require",
"github.com/stretchr/testify/suite", "github.com/stretchr/testify/suite",
"github.com/tendermint/tendermint/abci/types", "github.com/tendermint/tendermint/abci/types",

View File

@ -1,6 +1,6 @@
[[constraint]] [[constraint]]
name = "github.com/ethereum/go-ethereum" name = "github.com/ethereum/go-ethereum"
version = "=1.8.11" version = "=1.8.16"
[[constraint]] [[constraint]]
name = "github.com/cosmos/cosmos-sdk" name = "github.com/cosmos/cosmos-sdk"

View File

@ -16,7 +16,7 @@ PACKAGES=$(shell go list ./... | grep -v '/vendor/')
COMMIT_HASH := $(shell git rev-parse --short HEAD) COMMIT_HASH := $(shell git rev-parse --short HEAD)
BUILD_FLAGS = -tags netgo -ldflags "-X github.com/cosmos/ethermint/version.GitCommit=${COMMIT_HASH}" BUILD_FLAGS = -tags netgo -ldflags "-X github.com/cosmos/ethermint/version.GitCommit=${COMMIT_HASH}"
DOCKER_TAG = unstable DOCKER_TAG = unstable
DOCKER_IMAGE = tendermint/ethermint DOCKER_IMAGE = cosmos/ethermint
ETHERMINT_DAEMON_BINARY = emintd ETHERMINT_DAEMON_BINARY = emintd
ETHERMINT_CLI_BINARY = emintcli ETHERMINT_CLI_BINARY = emintcli
@ -43,8 +43,9 @@ clean:
@rm -rf ./build ./vendor @rm -rf ./build ./vendor
update-tools: update-tools:
@echo "--> Updating golang dependencies" @echo "--> Updating vendor dependencies"
go get -u -v $(DEP) $(GOLINT) $(GOMETALINTER) $(UNCONVERT) $(INEFFASSIGN) $(MISSPELL) $(ERRCHECK) $(UNPARAM) $(GOCYCLO) go get -u -v $(DEP) $(GOLINT) $(GOMETALINTER) $(UNCONVERT) $(INEFFASSIGN) $(MISSPELL) $(ERRCHECK) $(UNPARAM)
############################ ############################
### Tools / Dependencies ### ### Tools / Dependencies ###
@ -62,7 +63,6 @@ INEFFASSIGN = github.com/gordonklaus/ineffassign
MISSPELL = github.com/client9/misspell/cmd/misspell MISSPELL = github.com/client9/misspell/cmd/misspell
ERRCHECK = github.com/kisielk/errcheck ERRCHECK = github.com/kisielk/errcheck
UNPARAM = mvdan.cc/unparam UNPARAM = mvdan.cc/unparam
GOCYCLO = github.com/alecthomas/gocyclo
DEP_CHECK := $(shell command -v dep 2> /dev/null) DEP_CHECK := $(shell command -v dep 2> /dev/null)
GOLINT_CHECK := $(shell command -v golint 2> /dev/null) GOLINT_CHECK := $(shell command -v golint 2> /dev/null)
@ -72,7 +72,6 @@ INEFFASSIGN_CHECK := $(shell command -v ineffassign 2> /dev/null)
MISSPELL_CHECK := $(shell command -v misspell 2> /dev/null) MISSPELL_CHECK := $(shell command -v misspell 2> /dev/null)
ERRCHECK_CHECK := $(shell command -v errcheck 2> /dev/null) ERRCHECK_CHECK := $(shell command -v errcheck 2> /dev/null)
UNPARAM_CHECK := $(shell command -v unparam 2> /dev/null) UNPARAM_CHECK := $(shell command -v unparam 2> /dev/null)
GOCYCLO_CHECK := $(shell command -v gocyclo 2> /dev/null)
tools: tools:
ifdef DEP_CHECK ifdef DEP_CHECK
@ -123,12 +122,6 @@ else
@echo "--> Installing unparam" @echo "--> Installing unparam"
go get -v $(UNPARAM) go get -v $(UNPARAM)
endif endif
ifdef GOCYCLO_CHECK
@echo "goyclo is already installed. Run 'make update-tools' to update."
else
@echo "--> Installing goyclo"
go get -v $(GOCYCLO)
endif
deps: deps:
@rm -rf vendor/ @rm -rf vendor/
@ -139,26 +132,20 @@ deps:
### Testing / Misc. ### ### Testing / Misc. ###
####################### #######################
TEST_PACKAGES=$(shell go list ./... | grep -v github.com/cosmos/ethermint/cmd/test)
test: test-unit test: test-unit
test-unit: test-unit:
@go test -v $(TEST_PACKAGES) @go test -v --vet=off $(PACKAGES)
test-race: test-race:
@go test -v -race $(TEST_PACKAGES) @go test -v --vet=off -race $(PACKAGES)
test-cli: test-cli:
@echo "NO CLI TESTS" @echo "NO CLI TESTS"
test-lint: test-lint:
@echo "--> Running gometalinter" @echo "--> Running gometalinter..."
@gometalinter.v2 --config=gometalinter.json ./... @gometalinter.v2 --config=gometalinter.json --exclude=vendor ./...
@!(gometalinter.v2 --disable-all --enable='errcheck' --vendor ./... | grep -v "client/")
@find . -name '*.go' -type f -not -path "./vendor*" -not -path "*.git*" | xargs gofmt -d -s
@dep status >/dev/null 2>&1
@!(grep -n branch Gopkg.toml)
godocs: godocs:
@echo "--> Wait a few seconds and visit http://localhost:6060/pkg/github.com/cosmos/ethermint" @echo "--> Wait a few seconds and visit http://localhost:6060/pkg/github.com/cosmos/ethermint"

View File

@ -64,8 +64,8 @@ func (cc *ChainContext) Author(_ *ethtypes.Header) (ethcmn.Address, error) {
return cc.Coinbase, nil return cc.Coinbase, nil
} }
// APIs implements Ethereum's core.ChainContext interface. It currently // APIs implements Ethereum's consensus.Engine interface. It currently performs
// performs a no-op. // a no-op.
// //
// TODO: Do we need to support such RPC APIs? This will tie into a bigger // TODO: Do we need to support such RPC APIs? This will tie into a bigger
// discussion on if we want to support web3. // discussion on if we want to support web3.
@ -73,13 +73,13 @@ func (cc *ChainContext) APIs(_ ethcons.ChainReader) []ethrpc.API {
return nil return nil
} }
// CalcDifficulty implements Ethereum's core.ChainContext interface. It // CalcDifficulty implements Ethereum's consensus.Engine interface. It currently
// currently performs a no-op. // performs a no-op.
func (cc *ChainContext) CalcDifficulty(_ ethcons.ChainReader, _ uint64, _ *ethtypes.Header) *big.Int { func (cc *ChainContext) CalcDifficulty(_ ethcons.ChainReader, _ uint64, _ *ethtypes.Header) *big.Int {
return nil return nil
} }
// Finalize implements Ethereum's core.ChainContext interface. It currently // Finalize implements Ethereum's consensus.Engine interface. It currently
// performs a no-op. // performs a no-op.
// //
// TODO: Figure out if this needs to be hooked up to any part of the ABCI? // TODO: Figure out if this needs to be hooked up to any part of the ABCI?
@ -90,7 +90,7 @@ func (cc *ChainContext) Finalize(
return nil, nil return nil, nil
} }
// Prepare implements Ethereum's core.ChainContext interface. It currently // Prepare implements Ethereum's consensus.Engine interface. It currently
// performs a no-op. // performs a no-op.
// //
// TODO: Figure out if this needs to be hooked up to any part of the ABCI? // TODO: Figure out if this needs to be hooked up to any part of the ABCI?
@ -98,15 +98,21 @@ func (cc *ChainContext) Prepare(_ ethcons.ChainReader, _ *ethtypes.Header) error
return nil return nil
} }
// Seal implements Ethereum's core.ChainContext interface. It currently // Seal implements Ethereum's consensus.Engine interface. It currently
// performs a no-op. // performs a no-op.
// //
// TODO: Figure out if this needs to be hooked up to any part of the ABCI? // TODO: Figure out if this needs to be hooked up to any part of the ABCI?
func (cc *ChainContext) Seal(_ ethcons.ChainReader, _ *ethtypes.Block, _ <-chan struct{}) (*ethtypes.Block, error) { func (cc *ChainContext) Seal(_ ethcons.ChainReader, _ *ethtypes.Block, _ chan<- *ethtypes.Block, _ <-chan struct{}) error {
return nil, nil return nil
} }
// VerifyHeader implements Ethereum's core.ChainContext interface. It currently // SealHash implements Ethereum's consensus.Engine interface. It returns the
// hash of a block prior to it being sealed.
func (cc *ChainContext) SealHash(header *ethtypes.Header) ethcmn.Hash {
return ethcmn.Hash{}
}
// VerifyHeader implements Ethereum's consensus.Engine interface. It currently
// performs a no-op. // performs a no-op.
// //
// TODO: Figure out if this needs to be hooked up to any part of the Cosmos SDK // TODO: Figure out if this needs to be hooked up to any part of the Cosmos SDK
@ -115,7 +121,7 @@ func (cc *ChainContext) VerifyHeader(_ ethcons.ChainReader, _ *ethtypes.Header,
return nil return nil
} }
// VerifyHeaders implements Ethereum's core.ChainContext interface. It // VerifyHeaders implements Ethereum's consensus.Engine interface. It
// currently performs a no-op. // currently performs a no-op.
// //
// TODO: Figure out if this needs to be hooked up to any part of the Cosmos SDK // TODO: Figure out if this needs to be hooked up to any part of the Cosmos SDK
@ -124,7 +130,7 @@ func (cc *ChainContext) VerifyHeaders(_ ethcons.ChainReader, _ []*ethtypes.Heade
return nil, nil return nil, nil
} }
// VerifySeal implements Ethereum's core.ChainContext interface. It currently // VerifySeal implements Ethereum's consensus.Engine interface. It currently
// performs a no-op. // performs a no-op.
// //
// TODO: Figure out if this needs to be hooked up to any part of the Cosmos SDK // TODO: Figure out if this needs to be hooked up to any part of the Cosmos SDK
@ -133,8 +139,15 @@ func (cc *ChainContext) VerifySeal(_ ethcons.ChainReader, _ *ethtypes.Header) er
return nil return nil
} }
// VerifyUncles implements Ethereum's core.ChainContext interface. It currently // VerifyUncles implements Ethereum's consensus.Engine interface. It currently
// performs a no-op. // performs a no-op.
func (cc *ChainContext) VerifyUncles(_ ethcons.ChainReader, _ *ethtypes.Block) error { func (cc *ChainContext) VerifyUncles(_ ethcons.ChainReader, _ *ethtypes.Block) error {
return nil return nil
} }
// Close implements Ethereum's consensus.Engine interface. It terminates any
// background threads maintained by the consensus engine. It currently performs
// a no-op.
func (cc *ChainContext) Close() error {
return nil
}

View File

@ -86,9 +86,8 @@ func TestChainContextPrepare(t *testing.T) {
func TestChainContextSeal(t *testing.T) { func TestChainContextSeal(t *testing.T) {
cc := NewChainContext() cc := NewChainContext()
block, err := cc.Seal(nil, nil, nil) err := cc.Seal(nil, nil, nil, nil)
require.Nil(t, err) require.Nil(t, err)
require.Nil(t, block)
} }
func TestChainContextVerifyHeader(t *testing.T) { func TestChainContextVerifyHeader(t *testing.T) {

View File

@ -1,8 +1,15 @@
{ {
"Linters": { "Linters": {
"vet": "go tool vet -composites=false :PATH:LINE:MESSAGE" "vet": "go tool vet -composites=false :PATH:LINE:MESSAGE"
}, },
"Enable": ["golint", "vet", "ineffassign", "unparam", "unconvert", "misspell", "gocyclo"], "Enable": [
"golint",
"vet",
"ineffassign",
"unparam",
"unconvert",
"misspell"
],
"Deadline": "500s", "Deadline": "500s",
"Vendor": true, "Vendor": true,
"Cyclo": 11 "Cyclo": 11

View File

@ -9,7 +9,8 @@ import (
"github.com/ethereum/go-ethereum/rpc" "github.com/ethereum/go-ethereum/rpc"
) )
// returns the master list of public APIs for use with StartHTTPEndpoint // GetRPCAPIs returns the master list of public APIs for use with
// StartHTTPEndpoint.
func GetRPCAPIs() []rpc.API { func GetRPCAPIs() []rpc.API {
return []rpc.API{ return []rpc.API{
{ {

View File

@ -2,10 +2,13 @@ package rpc
import ( import (
"context" "context"
"testing"
"time"
"github.com/cosmos/ethermint/version" "github.com/cosmos/ethermint/version"
"github.com/ethereum/go-ethereum/rpc"
"github.com/stretchr/testify/require" "github.com/stretchr/testify/require"
"github.com/stretchr/testify/suite" "github.com/stretchr/testify/suite"
"testing"
) )
type apisTestSuite struct { type apisTestSuite struct {
@ -56,10 +59,18 @@ func startAPIServer() (context.CancelFunc, int, error) {
RPCAddr: "127.0.0.1", RPCAddr: "127.0.0.1",
RPCPort: randomPort(), RPCPort: randomPort(),
} }
timeouts := rpc.HTTPTimeouts{
ReadTimeout: 5 * time.Second,
WriteTimeout: 5 * time.Second,
IdleTimeout: 5 * time.Second,
}
ctx, cancel := context.WithCancel(context.Background()) ctx, cancel := context.WithCancel(context.Background())
_, err := StartHTTPEndpoint(ctx, config, GetRPCAPIs())
_, err := StartHTTPEndpoint(ctx, config, GetRPCAPIs(), timeouts)
if err != nil { if err != nil {
return cancel, 0, err return cancel, 0, err
} }
return cancel, config.RPCPort, nil return cancel, config.RPCPort, nil
} }

View File

@ -3,16 +3,19 @@ package rpc
import ( import (
"context" "context"
"fmt" "fmt"
"github.com/ethereum/go-ethereum/rpc" "github.com/ethereum/go-ethereum/rpc"
) )
// StartHTTPEndpoint starts the Tendermint Web3-compatible RPC layer. Consumes a Context for cancellation, a config // StartHTTPEndpoint starts the Tendermint Web3-compatible RPC layer. Consumes
// struct, and a list of rpc.API interfaces that will be automatically wired into a JSON-RPC webserver. // a Context for cancellation, a config struct, and a list of rpc.API interfaces
func StartHTTPEndpoint(ctx context.Context, config *Config, apis []rpc.API) (*rpc.Server, error) { // that will be automatically wired into a JSON-RPC webserver.
func StartHTTPEndpoint(ctx context.Context, config *Config, apis []rpc.API, timeouts rpc.HTTPTimeouts) (*rpc.Server, error) {
uniqModules := make(map[string]string) uniqModules := make(map[string]string)
for _, api := range apis { for _, api := range apis {
uniqModules[api.Namespace] = api.Namespace uniqModules[api.Namespace] = api.Namespace
} }
modules := make([]string, len(uniqModules)) modules := make([]string, len(uniqModules))
i := 0 i := 0
for k := range uniqModules { for k := range uniqModules {
@ -21,7 +24,9 @@ func StartHTTPEndpoint(ctx context.Context, config *Config, apis []rpc.API) (*rp
} }
endpoint := fmt.Sprintf("%s:%d", config.RPCAddr, config.RPCPort) endpoint := fmt.Sprintf("%s:%d", config.RPCAddr, config.RPCPort)
_, server, err := rpc.StartHTTPEndpoint(endpoint, apis, modules, config.RPCCORSDomains, config.RPCVHosts) _, server, err := rpc.StartHTTPEndpoint(
endpoint, apis, modules, config.RPCCORSDomains, config.RPCVHosts, timeouts,
)
go func() { go func() {
<-ctx.Done() <-ctx.Done()

View File

@ -4,13 +4,15 @@ import (
"context" "context"
"encoding/json" "encoding/json"
"fmt" "fmt"
"github.com/ethereum/go-ethereum/rpc"
"github.com/stretchr/testify/require"
"io/ioutil" "io/ioutil"
"math/rand" "math/rand"
"net/http" "net/http"
"strings" "strings"
"testing" "testing"
"time"
"github.com/ethereum/go-ethereum/rpc"
"github.com/stretchr/testify/require"
) )
type TestService struct{} type TestService struct{}
@ -24,21 +26,34 @@ func TestStartHTTPEndpointStartStop(t *testing.T) {
RPCAddr: "127.0.0.1", RPCAddr: "127.0.0.1",
RPCPort: randomPort(), RPCPort: randomPort(),
} }
ctx, cancel := context.WithCancel(context.Background()) ctx, cancel := context.WithCancel(context.Background())
_, err := StartHTTPEndpoint(ctx, config, []rpc.API{
{ _, err := StartHTTPEndpoint(
Namespace: "test", ctx, config, []rpc.API{
Version: "1.0", {
Service: &TestService{}, Namespace: "test",
Public: true, Version: "1.0",
Service: &TestService{},
Public: true,
},
}, },
}) rpc.HTTPTimeouts{
ReadTimeout: 5 * time.Second,
WriteTimeout: 5 * time.Second,
IdleTimeout: 5 * time.Second,
},
)
require.Nil(t, err, "unexpected error") require.Nil(t, err, "unexpected error")
res, err := rpcCall(config.RPCPort, "test_foo", []string{"baz"}) res, err := rpcCall(config.RPCPort, "test_foo", []string{"baz"})
require.Nil(t, err, "unexpected error") require.Nil(t, err, "unexpected error")
resStr := res.(string) resStr := res.(string)
require.Equal(t, "baz", resStr) require.Equal(t, "baz", resStr)
cancel() cancel()
_, err = rpcCall(config.RPCPort, "test_foo", []string{"baz"}) _, err = rpcCall(config.RPCPort, "test_foo", []string{"baz"})
require.NotNil(t, err) require.NotNil(t, err)
} }
@ -48,12 +63,17 @@ func rpcCall(port int, method string, params []string) (interface{}, error) {
if err != nil { if err != nil {
return nil, err return nil, err
} }
fullBody := fmt.Sprintf(`{ "id": 1, "jsonrpc": "2.0", "method": "%s", "params": %s }`,
method, string(parsedParams)) fullBody := fmt.Sprintf(
`{ "id": 1, "jsonrpc": "2.0", "method": "%s", "params": %s }`,
method, string(parsedParams),
)
res, err := http.Post(fmt.Sprintf("http://127.0.0.1:%d", port), "application/json", strings.NewReader(fullBody)) res, err := http.Post(fmt.Sprintf("http://127.0.0.1:%d", port), "application/json", strings.NewReader(fullBody))
if err != nil { if err != nil {
return nil, err return nil, err
} }
data, err := ioutil.ReadAll(res.Body) data, err := ioutil.ReadAll(res.Body)
if err != nil { if err != nil {
return nil, err return nil, err

View File

@ -182,7 +182,7 @@ func TestTrieCommit(t *testing.T) {
tc.trie.TryUpdate(tc.data.key, tc.data.value) tc.trie.TryUpdate(tc.data.key, tc.data.value)
} }
if tc.code != nil { if tc.code != nil {
tc.trie.ethTrieDB.Insert(tc.code.hash, tc.code.blob) tc.trie.ethTrieDB.InsertBlob(tc.code.hash, tc.code.blob)
} }
root, err := tc.trie.Commit(nil) root, err := tc.trie.Commit(nil)