diff --git a/Gopkg.lock b/Gopkg.lock index 9c6941f0..8ce87699 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -57,6 +57,14 @@ revision = "8991bc29aa16c548c550c7ff78260e27b9ab7c73" version = "v1.1.1" +[[projects]] + digest = "1:e47d51dab652d26c3fba6f8cba403f922d02757a82abdc77e90df7948daf296e" + name = "github.com/deckarep/golang-set" + packages = ["."] + pruneopts = "T" + revision = "cbaa98ba5575e67703b32b4b19f73c91f3c4159e" + version = "v1.7.1" + [[projects]] branch = "master" digest = "1:67d0b50be0549e610017cb91e0b0b745ec0cad7c613bc8e18ff2d1c1fc8825a7" @@ -66,7 +74,7 @@ revision = "0bce6a6887123b67a60366d2c9fe2dfb74289d2e" [[projects]] - digest = "1:3238a0c355a81640974751f7d3bab21bf91035165f75c2c457959425c0422a4b" + digest = "1:c24d17ef5d37ae7215811cf1cade45822faa232d6bcfbadff30bbeba52225a98" name = "github.com/ethereum/go-ethereum" packages = [ ".", @@ -80,6 +88,7 @@ "common/hexutil", "common/math", "common/mclock", + "common/prque", "consensus", "consensus/ethash", "consensus/misc", @@ -93,7 +102,6 @@ "crypto/bn256/cloudflare", "crypto/bn256/google", "crypto/ecies", - "crypto/randentropy", "crypto/secp256k1", "crypto/sha3", "eth/downloader", @@ -114,8 +122,8 @@ "trie", ] pruneopts = "T" - revision = "dea1ce052a10cd7d401a5c04f83f371a06fe293c" - version = "v1.8.11" + revision = "477eb0933b9529f7deeccc233cc815fe34a8ea56" + version = "v1.8.16" [[projects]] digest = "1:0b9c3ad6c948d57a379da9c4e1cdd989b1c73ddc5ec8673f52a9539ce60a109b" @@ -427,6 +435,7 @@ digest = "1:bfa444982d49ce4ca1360599270a94de12a573ccd3bf04493c79bee09da3170b" name = "golang.org/x/sys" packages = [ + "cpu", "unix", "windows", ] @@ -510,22 +519,6 @@ revision = "168a6198bcb0ef175f7dacec0b8691fc141dc9b8" 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]] branch = "v2" digest = "1:3d3f9391ab615be8655ae0d686a1564f3fec413979bb1aaf018bac1ec1bb1cc7" @@ -548,7 +541,6 @@ "github.com/cosmos/cosmos-sdk/x/params", "github.com/cosmos/cosmos-sdk/x/slashing", "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/hexutil", "github.com/ethereum/go-ethereum/common/math", @@ -569,7 +561,6 @@ "github.com/ethereum/go-ethereum/trie", "github.com/hashicorp/golang-lru", "github.com/pkg/errors", - "github.com/stretchr/testify/assert", "github.com/stretchr/testify/require", "github.com/stretchr/testify/suite", "github.com/tendermint/tendermint/abci/types", diff --git a/Gopkg.toml b/Gopkg.toml index 1bd7ac6c..7883b9c5 100644 --- a/Gopkg.toml +++ b/Gopkg.toml @@ -1,6 +1,6 @@ [[constraint]] name = "github.com/ethereum/go-ethereum" - version = "=1.8.11" + version = "=1.8.16" [[constraint]] name = "github.com/cosmos/cosmos-sdk" diff --git a/Makefile b/Makefile index 239556c4..8c03eadc 100644 --- a/Makefile +++ b/Makefile @@ -16,7 +16,7 @@ PACKAGES=$(shell go list ./... | grep -v '/vendor/') COMMIT_HASH := $(shell git rev-parse --short HEAD) BUILD_FLAGS = -tags netgo -ldflags "-X github.com/cosmos/ethermint/version.GitCommit=${COMMIT_HASH}" DOCKER_TAG = unstable -DOCKER_IMAGE = tendermint/ethermint +DOCKER_IMAGE = cosmos/ethermint ETHERMINT_DAEMON_BINARY = emintd ETHERMINT_CLI_BINARY = emintcli @@ -43,8 +43,9 @@ clean: @rm -rf ./build ./vendor update-tools: - @echo "--> Updating golang dependencies" - go get -u -v $(DEP) $(GOLINT) $(GOMETALINTER) $(UNCONVERT) $(INEFFASSIGN) $(MISSPELL) $(ERRCHECK) $(UNPARAM) $(GOCYCLO) + @echo "--> Updating vendor dependencies" + go get -u -v $(DEP) $(GOLINT) $(GOMETALINTER) $(UNCONVERT) $(INEFFASSIGN) $(MISSPELL) $(ERRCHECK) $(UNPARAM) + ############################ ### Tools / Dependencies ### @@ -62,7 +63,6 @@ INEFFASSIGN = github.com/gordonklaus/ineffassign MISSPELL = github.com/client9/misspell/cmd/misspell ERRCHECK = github.com/kisielk/errcheck UNPARAM = mvdan.cc/unparam -GOCYCLO = github.com/alecthomas/gocyclo DEP_CHECK := $(shell command -v dep 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) ERRCHECK_CHECK := $(shell command -v errcheck 2> /dev/null) UNPARAM_CHECK := $(shell command -v unparam 2> /dev/null) -GOCYCLO_CHECK := $(shell command -v gocyclo 2> /dev/null) tools: ifdef DEP_CHECK @@ -123,12 +122,6 @@ else @echo "--> Installing unparam" go get -v $(UNPARAM) 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: @rm -rf vendor/ @@ -139,26 +132,20 @@ deps: ### Testing / Misc. ### ####################### -TEST_PACKAGES=$(shell go list ./... | grep -v github.com/cosmos/ethermint/cmd/test) - test: test-unit test-unit: - @go test -v $(TEST_PACKAGES) + @go test -v --vet=off $(PACKAGES) test-race: - @go test -v -race $(TEST_PACKAGES) + @go test -v --vet=off -race $(PACKAGES) test-cli: @echo "NO CLI TESTS" test-lint: - @echo "--> Running gometalinter" - @gometalinter.v2 --config=gometalinter.json ./... - @!(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) + @echo "--> Running gometalinter..." + @gometalinter.v2 --config=gometalinter.json --exclude=vendor ./... godocs: @echo "--> Wait a few seconds and visit http://localhost:6060/pkg/github.com/cosmos/ethermint" diff --git a/core/chain.go b/core/chain.go index b7a7ddca..5c3c41b0 100644 --- a/core/chain.go +++ b/core/chain.go @@ -64,8 +64,8 @@ func (cc *ChainContext) Author(_ *ethtypes.Header) (ethcmn.Address, error) { return cc.Coinbase, nil } -// APIs implements Ethereum's core.ChainContext interface. It currently -// performs a no-op. +// APIs implements Ethereum's consensus.Engine interface. It currently performs +// a no-op. // // TODO: Do we need to support such RPC APIs? This will tie into a bigger // discussion on if we want to support web3. @@ -73,13 +73,13 @@ func (cc *ChainContext) APIs(_ ethcons.ChainReader) []ethrpc.API { return nil } -// CalcDifficulty implements Ethereum's core.ChainContext interface. It -// currently performs a no-op. +// CalcDifficulty implements Ethereum's consensus.Engine interface. It currently +// performs a no-op. func (cc *ChainContext) CalcDifficulty(_ ethcons.ChainReader, _ uint64, _ *ethtypes.Header) *big.Int { return nil } -// Finalize implements Ethereum's core.ChainContext interface. It currently +// Finalize implements Ethereum's consensus.Engine interface. It currently // performs a no-op. // // 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 } -// Prepare implements Ethereum's core.ChainContext interface. It currently +// Prepare implements Ethereum's consensus.Engine interface. It currently // performs a no-op. // // 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 } -// Seal implements Ethereum's core.ChainContext interface. It currently +// Seal implements Ethereum's consensus.Engine interface. It currently // performs a no-op. // // 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) { - return nil, nil +func (cc *ChainContext) Seal(_ ethcons.ChainReader, _ *ethtypes.Block, _ chan<- *ethtypes.Block, _ <-chan struct{}) error { + 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. // // 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 } -// VerifyHeaders implements Ethereum's core.ChainContext interface. It +// VerifyHeaders implements Ethereum's consensus.Engine interface. It // currently performs a no-op. // // 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 } -// VerifySeal implements Ethereum's core.ChainContext interface. It currently +// VerifySeal implements Ethereum's consensus.Engine interface. It currently // performs a no-op. // // 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 } -// VerifyUncles implements Ethereum's core.ChainContext interface. It currently +// VerifyUncles implements Ethereum's consensus.Engine interface. It currently // performs a no-op. func (cc *ChainContext) VerifyUncles(_ ethcons.ChainReader, _ *ethtypes.Block) error { 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 +} diff --git a/core/chain_test.go b/core/chain_test.go index d0194352..a1f18036 100644 --- a/core/chain_test.go +++ b/core/chain_test.go @@ -86,9 +86,8 @@ func TestChainContextPrepare(t *testing.T) { func TestChainContextSeal(t *testing.T) { cc := NewChainContext() - block, err := cc.Seal(nil, nil, nil) + err := cc.Seal(nil, nil, nil, nil) require.Nil(t, err) - require.Nil(t, block) } func TestChainContextVerifyHeader(t *testing.T) { diff --git a/gometalinter.json b/gometalinter.json index 124e28c1..78a33ed7 100644 --- a/gometalinter.json +++ b/gometalinter.json @@ -1,8 +1,15 @@ { "Linters": { "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", "Vendor": true, "Cyclo": 11 diff --git a/server/rpc/apis.go b/server/rpc/apis.go index d0f7bb38..3286b5af 100644 --- a/server/rpc/apis.go +++ b/server/rpc/apis.go @@ -9,7 +9,8 @@ import ( "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 { return []rpc.API{ { diff --git a/server/rpc/apis_test.go b/server/rpc/apis_test.go index d0bec724..e0140862 100644 --- a/server/rpc/apis_test.go +++ b/server/rpc/apis_test.go @@ -2,10 +2,13 @@ package rpc import ( "context" + "testing" + "time" + "github.com/cosmos/ethermint/version" + "github.com/ethereum/go-ethereum/rpc" "github.com/stretchr/testify/require" "github.com/stretchr/testify/suite" - "testing" ) type apisTestSuite struct { @@ -56,10 +59,18 @@ func startAPIServer() (context.CancelFunc, int, error) { RPCAddr: "127.0.0.1", RPCPort: randomPort(), } + timeouts := rpc.HTTPTimeouts{ + ReadTimeout: 5 * time.Second, + WriteTimeout: 5 * time.Second, + IdleTimeout: 5 * time.Second, + } + ctx, cancel := context.WithCancel(context.Background()) - _, err := StartHTTPEndpoint(ctx, config, GetRPCAPIs()) + + _, err := StartHTTPEndpoint(ctx, config, GetRPCAPIs(), timeouts) if err != nil { return cancel, 0, err } + return cancel, config.RPCPort, nil } diff --git a/server/rpc/rpc.go b/server/rpc/rpc.go index df621eb6..1b56f63a 100644 --- a/server/rpc/rpc.go +++ b/server/rpc/rpc.go @@ -3,16 +3,19 @@ package rpc import ( "context" "fmt" + "github.com/ethereum/go-ethereum/rpc" ) -// StartHTTPEndpoint starts the Tendermint Web3-compatible RPC layer. Consumes a Context for cancellation, a config -// struct, and a list of rpc.API interfaces that will be automatically wired into a JSON-RPC webserver. -func StartHTTPEndpoint(ctx context.Context, config *Config, apis []rpc.API) (*rpc.Server, error) { +// StartHTTPEndpoint starts the Tendermint Web3-compatible RPC layer. Consumes +// a Context for cancellation, a config struct, and a list of rpc.API interfaces +// 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) for _, api := range apis { uniqModules[api.Namespace] = api.Namespace } + modules := make([]string, len(uniqModules)) i := 0 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) - _, 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() { <-ctx.Done() diff --git a/server/rpc/rpc_test.go b/server/rpc/rpc_test.go index fcf50192..19f47e33 100644 --- a/server/rpc/rpc_test.go +++ b/server/rpc/rpc_test.go @@ -4,13 +4,15 @@ import ( "context" "encoding/json" "fmt" - "github.com/ethereum/go-ethereum/rpc" - "github.com/stretchr/testify/require" "io/ioutil" "math/rand" "net/http" "strings" "testing" + "time" + + "github.com/ethereum/go-ethereum/rpc" + "github.com/stretchr/testify/require" ) type TestService struct{} @@ -24,21 +26,34 @@ func TestStartHTTPEndpointStartStop(t *testing.T) { RPCAddr: "127.0.0.1", RPCPort: randomPort(), } + ctx, cancel := context.WithCancel(context.Background()) - _, err := StartHTTPEndpoint(ctx, config, []rpc.API{ - { - Namespace: "test", - Version: "1.0", - Service: &TestService{}, - Public: true, + + _, err := StartHTTPEndpoint( + ctx, config, []rpc.API{ + { + Namespace: "test", + 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") + res, err := rpcCall(config.RPCPort, "test_foo", []string{"baz"}) require.Nil(t, err, "unexpected error") + resStr := res.(string) require.Equal(t, "baz", resStr) + cancel() + _, err = rpcCall(config.RPCPort, "test_foo", []string{"baz"}) require.NotNil(t, err) } @@ -48,12 +63,17 @@ func rpcCall(port int, method string, params []string) (interface{}, error) { if err != nil { 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)) if err != nil { return nil, err } + data, err := ioutil.ReadAll(res.Body) if err != nil { return nil, err diff --git a/state/trie_test.go b/state/trie_test.go index 84a5c048..51a30787 100644 --- a/state/trie_test.go +++ b/state/trie_test.go @@ -182,7 +182,7 @@ func TestTrieCommit(t *testing.T) { tc.trie.TryUpdate(tc.data.key, tc.data.value) } 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)