diff --git a/CHANGELOG.md b/CHANGELOG.md index 63bb59d6..522d15cc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -71,6 +71,7 @@ the Tracer type used to collect execution traces from the EVM transaction execut ### Improvements +* (server) [tharsis#343](https://github.com/tharsis/ethermint/pull/343) Define a wrap tendermint logger `Handler` go-ethereum's `root` logger. * (rpc) [tharsis#457](https://github.com/tharsis/ethermint/pull/457) Configure RPC gas cap through app config. * (evm) [tharsis#434](https://github.com/tharsis/ethermint/pull/434) Support different `Tracer` types for the EVM. * (deps) [tharsis#427](https://github.com/tharsis/ethermint/pull/427) Bump ibc-go to [`v1.0.0`](https://github.com/cosmos/ibc-go/releases/tag/v1.0.0) diff --git a/app/ante/ante.go b/app/ante/ante.go index 2ff21d9f..74a43ce7 100644 --- a/app/ante/ante.go +++ b/app/ante/ante.go @@ -1,10 +1,12 @@ package ante import ( + "fmt" "runtime/debug" "github.com/palantir/stacktrace" - log "github.com/xlab/suplog" + + tmlog "github.com/tendermint/tendermint/libs/log" sdk "github.com/cosmos/cosmos-sdk/types" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" @@ -53,7 +55,7 @@ func NewAnteHandler( ) (newCtx sdk.Context, err error) { var anteHandler sdk.AnteHandler - defer Recover(&err) + defer Recover(ctx.Logger(), &err) txWithExtensions, ok := tx.(authante.HasExtensionOptionsTx) if ok { @@ -119,15 +121,21 @@ func NewAnteHandler( } } -func Recover(err *error) { +func Recover(logger tmlog.Logger, err *error) { if r := recover(); r != nil { *err = sdkerrors.Wrapf(sdkerrors.ErrPanic, "%v", r) if e, ok := r.(error); ok { - log.WithError(e).Errorln("ante handler panicked with an error") - log.Debugln(string(debug.Stack())) + logger.Error( + "ante handler panicked", + "error", e, + "stack trace", string(debug.Stack()), + ) } else { - log.Errorln(r) + logger.Error( + "ante handler panicked", + "recover", fmt.Sprintf("%v", r), + ) } } } diff --git a/cmd/ethermintd/root.go b/cmd/ethermintd/root.go index 471965dc..4d87e9de 100644 --- a/cmd/ethermintd/root.go +++ b/cmd/ethermintd/root.go @@ -6,14 +6,11 @@ import ( "os" "path/filepath" - "github.com/cosmos/cosmos-sdk/simapp/params" - "github.com/cosmos/cosmos-sdk/snapshots" - "github.com/spf13/cast" "github.com/spf13/cobra" tmcli "github.com/tendermint/tendermint/libs/cli" - "github.com/tendermint/tendermint/libs/log" + tmlog "github.com/tendermint/tendermint/libs/log" dbm "github.com/tendermint/tm-db" "github.com/cosmos/cosmos-sdk/baseapp" @@ -24,6 +21,8 @@ import ( "github.com/cosmos/cosmos-sdk/client/rpc" sdkserver "github.com/cosmos/cosmos-sdk/server" servertypes "github.com/cosmos/cosmos-sdk/server/types" + "github.com/cosmos/cosmos-sdk/simapp/params" + "github.com/cosmos/cosmos-sdk/snapshots" "github.com/cosmos/cosmos-sdk/store" sdk "github.com/cosmos/cosmos-sdk/types" authcmd "github.com/cosmos/cosmos-sdk/x/auth/client/cli" @@ -183,7 +182,8 @@ type appCreator struct { } // newApp is an appCreator -func (a appCreator) newApp(logger log.Logger, db dbm.DB, traceStore io.Writer, appOpts servertypes.AppOptions) servertypes.Application { +func (a appCreator) newApp(logger tmlog.Logger, db dbm.DB, traceStore io.Writer, appOpts servertypes.AppOptions) servertypes.Application { + var cache sdk.MultiStorePersistentCache if cast.ToBool(appOpts.Get(sdkserver.FlagInterBlockCache)) { @@ -235,7 +235,7 @@ func (a appCreator) newApp(logger log.Logger, db dbm.DB, traceStore io.Writer, a // appExport creates a new simapp (optionally at a given height) // and exports state. func (a appCreator) appExport( - logger log.Logger, db dbm.DB, traceStore io.Writer, height int64, forZeroHeight bool, jailAllowedAddrs []string, + logger tmlog.Logger, db dbm.DB, traceStore io.Writer, height int64, forZeroHeight bool, jailAllowedAddrs []string, appOpts servertypes.AppOptions, ) (servertypes.ExportedApp, error) { diff --git a/ethereum/rpc/apis.go b/ethereum/rpc/apis.go index d9c4fecf..baea369d 100644 --- a/ethereum/rpc/apis.go +++ b/ethereum/rpc/apis.go @@ -5,7 +5,9 @@ package rpc import ( "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/server" + "github.com/ethereum/go-ethereum/rpc" + "github.com/tharsis/ethermint/ethereum/rpc/backend" "github.com/tharsis/ethermint/ethereum/rpc/namespaces/debug" "github.com/tharsis/ethermint/ethereum/rpc/namespaces/eth" diff --git a/go.mod b/go.mod index 32829ce4..e06cd01e 100644 --- a/go.mod +++ b/go.mod @@ -5,12 +5,8 @@ go 1.16 require ( github.com/DataDog/zstd v1.4.8 // indirect github.com/armon/go-metrics v0.3.9 - github.com/aws/aws-sdk-go v1.38.21 // indirect - github.com/bitly/go-simplejson v0.5.0 // indirect github.com/btcsuite/btcd v0.22.0-beta github.com/btcsuite/btcutil v1.0.3-0.20201208143702-a53e38424cce - github.com/bugsnag/bugsnag-go v2.1.0+incompatible // indirect - github.com/bugsnag/panicwrap v1.3.4 // indirect github.com/cespare/cp v1.1.1 // indirect github.com/cosmos/cosmos-sdk v0.43.0 github.com/cosmos/go-bip39 v1.0.0 @@ -19,7 +15,6 @@ require ( github.com/dgraph-io/badger/v2 v2.2007.3 // indirect github.com/dgraph-io/ristretto v0.1.0 // indirect github.com/ethereum/go-ethereum v1.10.3 - github.com/gofrs/uuid v4.0.0+incompatible // indirect github.com/gogo/protobuf v1.3.3 github.com/golang/glog v0.0.0-20210429001901-424d2337a529 // indirect github.com/golang/protobuf v1.5.2 @@ -31,7 +26,6 @@ require ( github.com/grpc-ecosystem/grpc-gateway v1.16.0 github.com/hashicorp/go-immutable-radix v1.3.0 // indirect github.com/improbable-eng/grpc-web v0.14.0 - github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0 // indirect github.com/miguelmota/go-ethereum-hdwallet v0.0.1 github.com/palantir/stacktrace v0.0.0-20161112013806-78658fd2d177 github.com/pkg/errors v0.9.1 @@ -40,6 +34,7 @@ require ( github.com/regen-network/cosmos-proto v0.3.1 github.com/rjeczalik/notify v0.9.2 // indirect github.com/rs/cors v1.8.0 + github.com/rs/zerolog v1.23.0 github.com/spf13/cast v1.4.1 github.com/spf13/cobra v1.2.1 github.com/spf13/viper v1.8.1 @@ -48,7 +43,6 @@ require ( github.com/tendermint/tendermint v0.34.12 github.com/tendermint/tm-db v0.6.4 github.com/tyler-smith/go-bip39 v1.1.0 - github.com/xlab/suplog v1.3.0 go.etcd.io/bbolt v1.3.6 // indirect golang.org/x/crypto v0.0.0-20210813211128-0a44fdfbc16e // indirect golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d // indirect diff --git a/go.sum b/go.sum index b227a12f..c633458a 100644 --- a/go.sum +++ b/go.sum @@ -110,11 +110,8 @@ github.com/armon/go-metrics v0.3.9/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4 github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A= github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU= -github.com/aws/aws-sdk-go v1.25.16/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= github.com/aws/aws-sdk-go v1.25.48/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= -github.com/aws/aws-sdk-go v1.38.21 h1:D08DXWI4QRaawLaW+OtsIEClOI90I6eheJs1GwXTQVI= -github.com/aws/aws-sdk-go v1.38.21/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g= github.com/aws/aws-sdk-go-v2 v1.2.0/go.mod h1:zEQs02YRBw1DjK0PoJv3ygDYOFTre1ejlJWl8FwAuQo= github.com/aws/aws-sdk-go-v2/config v1.1.1/go.mod h1:0XsVy9lBI/BCXm+2Tuvt39YmdHwS5unDQmxZOYe8F5Y= @@ -131,11 +128,8 @@ github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/bgentry/speakeasy v0.1.0 h1:ByYyxL9InA1OWqxJqqp2A5pYHUrCiAL6K3J+LKSsQkY= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= -github.com/bitly/go-simplejson v0.5.0 h1:6IH+V8/tVMab511d5bn4M7EwGXZf9Hj6i2xSwkNEM+Y= -github.com/bitly/go-simplejson v0.5.0/go.mod h1:cXHtHw4XUPsvGaxgjIAn8PhEWG9NfngEKAMDJEczWVA= github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= github.com/bketelsen/crypt v0.0.4/go.mod h1:aI6NrJ0pMGgvZKL1iVgXLnfIFJtfV+bKCoqOes/6LfM= -github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4= github.com/bmizerany/pat v0.0.0-20170815010413-6226ea591a40/go.mod h1:8rLXio+WjiTceGBHIoTvn60HIbs7Hm7bcHjyrSqYB9c= github.com/boltdb/bolt v1.3.1/go.mod h1:clJnj/oiGkjum5o1McbSZDSLxVThjynRyGBgiAx27Ps= github.com/btcsuite/btcd v0.0.0-20171128150713-2e60448ffcc6/go.mod h1:Dmm/EzmjnCiweXmzRIAiUWCInVmPgjkzgv5k4tVyXiQ= @@ -159,11 +153,6 @@ github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku github.com/btcsuite/snappy-go v1.0.0/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= -github.com/bugsnag/bugsnag-go v1.5.3/go.mod h1:2oa8nejYd4cQ/b0hMIopN0lCRxU0bueqREvZLWFrtK8= -github.com/bugsnag/bugsnag-go v2.1.0+incompatible h1:SuqsBHDutts2rZh4swHEWTexxi0F/JZ/6j1rR9BFe7I= -github.com/bugsnag/bugsnag-go v2.1.0+incompatible/go.mod h1:2oa8nejYd4cQ/b0hMIopN0lCRxU0bueqREvZLWFrtK8= -github.com/bugsnag/panicwrap v1.3.4 h1:A6sXFtDGsgU/4BLf5JT0o5uYg3EeKgGx3Sfs+/uk3pU= -github.com/bugsnag/panicwrap v1.3.4/go.mod h1:D/8v3kj0zr8ZAKg1AQ6crr+5VwKN5eIywRkfhyM/+dE= github.com/c-bata/go-prompt v0.2.2/go.mod h1:VzqtzE2ksDBcdln8G7mk2RX9QyGjH+OVqOCSiVIqS34= github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= @@ -357,8 +346,6 @@ github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 h1:ZpnhV/YsD2/4cESfV5+ github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gofrs/uuid v3.3.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= -github.com/gofrs/uuid v4.0.0+incompatible h1:1SD/1F5pU8p29ybwgQSwpQk+mwdRrXCYuPhW6m+TnJw= -github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gogo/gateway v1.1.0 h1:u0SuhL9+Il+UbjM9VIE3ntfRujKbvVpFvNB4HbjeVQ0= github.com/gogo/gateway v1.1.0/go.mod h1:S7rR8FRQyG3QFESeSv4l2WnsyzlCLG0CzBbUUo/mbic= github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= @@ -570,9 +557,7 @@ github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJS github.com/jhump/protoreflect v1.8.2 h1:k2xE7wcUomeqwY0LDCYA16y4WWfyTcMx5mKhk0d4ua0= github.com/jhump/protoreflect v1.8.2/go.mod h1:7GcYQDdMU/O/BBrl/cX6PNHpXh6cenjd8pneu5yW7Tg= github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= -github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= -github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= github.com/jmhodges/levigo v1.0.0 h1:q5EC36kV79HWeTBWsod3mG11EgStG3qArTKcvlksN1U= github.com/jmhodges/levigo v1.0.0/go.mod h1:Q6Qx+uH3RAqyK4rFQroq9RL7mdkABMcfhEI+nNuzMJQ= @@ -598,8 +583,6 @@ github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E github.com/jwilder/encoding v0.0.0-20170811194829-b4e1701a28ef/go.mod h1:Ct9fl0F6iIOGgxJ5npU/IUOhOhqlVrGjyIZc8/MagT0= github.com/karalabe/usb v0.0.0-20190919080040-51dc0efba356 h1:I/yrLt2WilKxlQKCM52clh5rGzTKpVctGT1lH4Dc8Jw= github.com/karalabe/usb v0.0.0-20190919080040-51dc0efba356/go.mod h1:Od972xHfMJowv7NGVDiWVxk2zxnWgjLlJzE+F4F7AGU= -github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0 h1:iQTw/8FWTuc7uiaSepXwyf3o52HaUYcV+Tu66S3F5GA= -github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0/go.mod h1:1NbS8ALrpOvjt0rHPNLyCIeMtbizbir8U//inJ+zuB8= github.com/keybase/go-keychain v0.0.0-20190712205309-48d3d31d256d h1:Z+RDyXzjKE0i2sTjZ/b1uxiGtPhFy34Ou/Tk0qwN0kM= github.com/keybase/go-keychain v0.0.0-20190712205309-48d3d31d256d/go.mod h1:JJNrCn9otv/2QP4D7SMJBgaleKpOf66PnW6F5WGNRIc= github.com/kilic/bls12-381 v0.0.0-20201226121925-69dacb279461/go.mod h1:vDTTHJONJ6G+P2R74EhnyotQDTliQDnFEwhdmfzw1ig= @@ -715,7 +698,6 @@ github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= -github.com/oklog/ulid v1.3.1 h1:EGfNDEx6MqHz8B3uNV6QAib1UR2Lm97sHi3ocA6ESJ4= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= github.com/olekukonko/tablewriter v0.0.1/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= @@ -876,8 +858,6 @@ github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeV github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= -github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE= -github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s= @@ -995,10 +975,6 @@ github.com/wsddn/go-ecdh v0.0.0-20161211032359-48726bab9208/go.mod h1:IotVbo4F+m github.com/xdg/scram v0.0.0-20180814205039-7eeb5667e42c/go.mod h1:lB8K/P019DLNhemzwFU4jHLhdvlE6uDZjXFejJXr49I= github.com/xdg/stringprep v1.0.0/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= -github.com/xlab/closer v0.0.0-20190328110542-03326addb7c2 h1:LPYwXwwHigHHFX3SFa9W9zBIa5reyaLJos2e95eHh68= -github.com/xlab/closer v0.0.0-20190328110542-03326addb7c2/go.mod h1:Y8IYP9aVODN3Vnw1FCqygCG5IWyYBeBlZqQ5aX+fHFw= -github.com/xlab/suplog v1.3.0 h1:bbnKR8R8gSs2Q4Y25u2xH6shNNV/4r+bNspqViJQTLY= -github.com/xlab/suplog v1.3.0/go.mod h1:Fq+wOrO0v1DZhfHxgCFB/MlFMzost3Mf/xLuJlfyUA0= github.com/xlab/treeprint v0.0.0-20180616005107-d6fb6747feb6/go.mod h1:ce1O1j6UtZfjr22oyGxGLbauSBp2YVXpARAosm7dHBg= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= github.com/xtaci/kcp-go v5.4.20+incompatible/go.mod h1:bN6vIwHQbfHaHtFpEssmWsN45a+AZwO7eyRCmEIbtvE= @@ -1157,7 +1133,6 @@ golang.org/x/net v0.0.0-20201010224723-4f7140c49acb/go.mod h1:sp8m0HH+o8qH0wwXwY golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210220033124-5f55cee0dc0d/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= diff --git a/init.sh b/init.sh index 96eb639f..80adcb68 100755 --- a/init.sh +++ b/init.sh @@ -6,8 +6,8 @@ KEYRING="test" KEYALGO="eth_secp256k1" LOGLEVEL="info" # to trace evm -#TRACE="--trace" -TRACE="" +TRACE="--trace" +# TRACE="" # validate dependencies are installed command -v jq > /dev/null 2>&1 || { echo >&2 "jq not installed. More info: https://stedolan.github.io/jq/download/"; exit 1; } diff --git a/log/handler.go b/log/handler.go new file mode 100644 index 00000000..5f10b47f --- /dev/null +++ b/log/handler.go @@ -0,0 +1,88 @@ +package log + +import ( + "github.com/rs/zerolog" + + "github.com/cosmos/cosmos-sdk/server" + + ethlog "github.com/ethereum/go-ethereum/log" + tmlog "github.com/tendermint/tendermint/libs/log" +) + +var _ ethlog.Handler = &Handler{} + +// Logger wraps the zero log Wrapper and extends it to support the ethereum logger interface. +type Handler struct { + *server.ZeroLogWrapper +} + +func NewHandler(logger tmlog.Logger) ethlog.Handler { + zerologger, ok := logger.(*server.ZeroLogWrapper) + if !ok { + // default to Stdout if not an SDK logger wrapper + return ethlog.StdoutHandler + } + + return &Handler{ + ZeroLogWrapper: zerologger, + } +} + +// Log implements the go-ethereum Logger Handler interface +func (h *Handler) Log(r *ethlog.Record) error { + lvl := EthLogLvlToZerolog(r.Lvl) + + h.WithLevel(lvl). + Fields(getLogFields(r.Ctx...)). + Time(r.KeyNames.Time, r.Time). + Msg(r.Msg) + return nil +} + +func EthLogLvlToZerolog(lvl ethlog.Lvl) zerolog.Level { + var level zerolog.Level + + switch lvl { + case ethlog.LvlCrit: + level = zerolog.FatalLevel + case ethlog.LvlDebug: + level = zerolog.DebugLevel + case ethlog.LvlError: + level = zerolog.ErrorLevel + case ethlog.LvlInfo: + level = zerolog.InfoLevel + case ethlog.LvlTrace: + level = zerolog.TraceLevel + case ethlog.LvlWarn: + level = zerolog.WarnLevel + default: + level = zerolog.NoLevel + } + + return level +} + +func getLogFields(keyVals ...interface{}) map[string]interface{} { + if len(keyVals)%2 != 0 { + return nil + } + + fields := make(map[string]interface{}) + for i := 0; i < len(keyVals); i += 2 { + fields[keyVals[i].(string)] = keyVals[i+1] + } + + return fields +} + +// var ethermintLogger *tmlog.Logger = nil + +// func NewHandler(logger tmlog.Logger) ethlog.Handler { + +// ethermintLogger = &logger + +// return ethlog.FuncHandler(func(r *ethlog.Record) error { +// (*ethermintLogger).Debug(fmt.Sprintf("[EVM] %v", r)) +// return nil +// }) +// } diff --git a/log/handler_test.go b/log/handler_test.go new file mode 100644 index 00000000..d10c7191 --- /dev/null +++ b/log/handler_test.go @@ -0,0 +1,62 @@ +package log + +import ( + "bytes" + "testing" + + "github.com/rs/zerolog" + "github.com/stretchr/testify/require" + "github.com/tendermint/tendermint/types/time" + + "github.com/cosmos/cosmos-sdk/server" + + ethlog "github.com/ethereum/go-ethereum/log" +) + +const ( + timeKey = "t" + lvlKey = "lvl" + msgKey = "msg" + ctxKey = "ctx" +) + +func TestLog(t *testing.T) { + out := &bytes.Buffer{} + + logger := &server.ZeroLogWrapper{ + Logger: zerolog.New(out).Level(zerolog.DebugLevel).With().Timestamp().Logger(), + } + + h := NewHandler(logger) + + err := h.Log(ðlog.Record{ + Time: time.Now().UTC(), + Lvl: ethlog.LvlCrit, + Msg: "critical error", + KeyNames: ethlog.RecordKeyNames{ + Time: timeKey, + Msg: msgKey, + Lvl: lvlKey, + Ctx: ctxKey, + }, + }) + + require.NoError(t, err) + require.Contains(t, string(out.Bytes()), "\"message\":\"critical error\"") + require.Contains(t, string(out.Bytes()), "\"level\":\"fatal\"") +} + +func TestOverrideRootLogger(t *testing.T) { + out := &bytes.Buffer{} + + logger := &server.ZeroLogWrapper{ + Logger: zerolog.New(out).Level(zerolog.DebugLevel).With().Timestamp().Logger(), + } + + h := NewHandler(logger) + ethlog.Root().SetHandler(h) + + ethlog.Root().Info("some info") + require.Contains(t, string(out.Bytes()), "\"message\":\"some info\"") + require.Contains(t, string(out.Bytes()), "\"level\":\"info\"") +} diff --git a/server/json_rpc.go b/server/json_rpc.go index 2ae61705..23043fc0 100644 --- a/server/json_rpc.go +++ b/server/json_rpc.go @@ -19,7 +19,7 @@ import ( // StartJSONRPC starts the JSON-RPC server func StartJSONRPC(ctx *server.Context, clientCtx client.Context, tmRPCAddr string, tmEndpoint string, config config.Config) (*http.Server, chan struct{}, error) { - tmWsClient := ConnectTmWS(tmRPCAddr, tmEndpoint) + tmWsClient := ConnectTmWS(tmRPCAddr, tmEndpoint, ctx.Logger) rpcServer := ethrpc.NewServer() @@ -76,7 +76,7 @@ func StartJSONRPC(ctx *server.Context, clientCtx client.Context, tmRPCAddr strin _, port, _ := net.SplitHostPort(config.JSONRPC.Address) // allocate separate WS connection to Tendermint - tmWsClient = ConnectTmWS(tmRPCAddr, tmEndpoint) + tmWsClient = ConnectTmWS(tmRPCAddr, tmEndpoint, ctx.Logger) wsSrv := rpc.NewWebsocketsServer(ctx.Logger, tmWsClient, "localhost:"+port, config.JSONRPC.WsAddress) wsSrv.Start() return httpSrv, httpSrvDone, nil diff --git a/server/start.go b/server/start.go index 2d8faa9e..cbda3654 100644 --- a/server/start.go +++ b/server/start.go @@ -14,6 +14,7 @@ import ( "github.com/cosmos/cosmos-sdk/codec" "github.com/spf13/cobra" + "google.golang.org/grpc" abciserver "github.com/tendermint/tendermint/abci/server" @@ -40,8 +41,8 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" ethlog "github.com/ethereum/go-ethereum/log" - ethdebug "github.com/tharsis/ethermint/ethereum/rpc/namespaces/debug" + "github.com/tharsis/ethermint/log" "github.com/tharsis/ethermint/server/config" srvflags "github.com/tharsis/ethermint/server/flags" ) @@ -368,7 +369,7 @@ func startInProcess(ctx *server.Context, clientCtx client.Context, appCreator ty } } - ethlog.Root().SetHandler(ethlog.StdoutHandler) + ethlog.Root().SetHandler(log.NewHandler(logger)) var ( httpSrv *http.Server diff --git a/server/util.go b/server/util.go index 219b6703..b45456c9 100644 --- a/server/util.go +++ b/server/util.go @@ -7,12 +7,12 @@ import ( "github.com/gorilla/mux" "github.com/improbable-eng/grpc-web/go/grpcweb" "github.com/spf13/cobra" - log "github.com/xlab/suplog" sdkserver "github.com/cosmos/cosmos-sdk/server" "github.com/cosmos/cosmos-sdk/server/types" "github.com/cosmos/cosmos-sdk/version" + tmlog "github.com/tendermint/tendermint/libs/log" rpcclient "github.com/tendermint/tendermint/rpc/jsonrpc/client" "github.com/tharsis/ethermint/app" @@ -44,22 +44,29 @@ func AddCommands(rootCmd *cobra.Command, defaultNodeHome string, appCreator type ) } -func ConnectTmWS(tmRPCAddr, tmEndpoint string) *rpcclient.WSClient { +func ConnectTmWS(tmRPCAddr, tmEndpoint string, logger tmlog.Logger) *rpcclient.WSClient { tmWsClient, err := rpcclient.NewWS(tmRPCAddr, tmEndpoint, rpcclient.MaxReconnectAttempts(256), rpcclient.ReadWait(120*time.Second), rpcclient.WriteWait(120*time.Second), rpcclient.PingPeriod(50*time.Second), rpcclient.OnReconnect(func() { - log.WithField("tendermint_rpc", tmRPCAddr+tmEndpoint). - Debugln("EVM RPC reconnects to Tendermint WS") + logger.Debug("EVM RPC reconnects to Tendermint WS", "address", tmRPCAddr+tmEndpoint) }), ) if err != nil { - log.WithError(err).Fatalln("Tendermint WS client could not be created for ", tmRPCAddr+tmEndpoint) + logger.Error( + "Tendermint WS client could not be created", + "address", tmRPCAddr+tmEndpoint, + "error", err, + ) } else if err := tmWsClient.OnStart(); err != nil { - log.WithError(err).Fatalln("Tendermint WS client could not start for ", tmRPCAddr+tmEndpoint) + logger.Error( + "Tendermint WS client could not start", + "address", tmRPCAddr+tmEndpoint, + "error", err, + ) } return tmWsClient @@ -69,9 +76,11 @@ func MountGRPCWebServices( router *mux.Router, grpcWeb *grpcweb.WrappedGrpcServer, grpcResources []string, + logger tmlog.Logger, ) { for _, res := range grpcResources { - log.Printf("[GRPC Web] HTTP POST mounted on %s", res) + + logger.Info("[GRPC Web] HTTP POST mounted", "resource", res) s := router.Methods("POST").Subrouter() s.HandleFunc(res, func(resp http.ResponseWriter, req *http.Request) { diff --git a/tests/solidity/README.md b/tests/solidity/README.md index 7a0947f7..f16b6e89 100644 --- a/tests/solidity/README.md +++ b/tests/solidity/README.md @@ -56,7 +56,7 @@ The [`init-test-node.sh`](./init-test-node.sh) script sets up ethermint with the Each with roughly 100 ETH available (1e18 photon). -Running `ethermintd list keys` should output: +Running `ethermintd keys list --keyring-backend=test` should output: ```json [ diff --git a/testutil/network/util.go b/testutil/network/util.go index e4fbff66..730180fc 100644 --- a/testutil/network/util.go +++ b/testutil/network/util.go @@ -117,7 +117,7 @@ func startInProcess(cfg Config, val *Validator) error { if val.AppConfig.JSONRPC.Enable { tmEndpoint := "/websocket" tmRPCAddr := val.Ctx.Config.RPC.ListenAddress - tmWsClient := ethsrv.ConnectTmWS(tmRPCAddr, tmEndpoint) + tmWsClient := ethsrv.ConnectTmWS(tmRPCAddr, tmEndpoint, val.Ctx.Logger) val.jsonRPC = jsonrpc.NewServer() @@ -134,7 +134,7 @@ func startInProcess(cfg Config, val *Validator) error { r.HandleFunc("/", val.jsonRPC.ServeHTTP).Methods("POST") if val.grpc != nil { grpcWeb := grpcweb.WrapServer(val.grpc) - ethsrv.MountGRPCWebServices(r, grpcWeb, grpcweb.ListGRPCResources(val.grpc)) + ethsrv.MountGRPCWebServices(r, grpcWeb, grpcweb.ListGRPCResources(val.grpc), val.Ctx.Logger) } handlerWithCors := cors.New(cors.Options{ diff --git a/x/evm/handler.go b/x/evm/handler.go index 21ae7abc..1b2fa03d 100644 --- a/x/evm/handler.go +++ b/x/evm/handler.go @@ -1,9 +1,10 @@ package evm import ( + "fmt" "runtime/debug" - log "github.com/xlab/suplog" + tmlog "github.com/tendermint/tendermint/libs/log" sdk "github.com/cosmos/cosmos-sdk/types" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" @@ -14,7 +15,7 @@ import ( // NewHandler returns a handler for Ethermint type messages. func NewHandler(server types.MsgServer) sdk.Handler { return func(ctx sdk.Context, msg sdk.Msg) (result *sdk.Result, err error) { - defer Recover(&err) + defer Recover(ctx.Logger(), &err) ctx = ctx.WithEventManager(sdk.NewEventManager()) @@ -31,15 +32,21 @@ func NewHandler(server types.MsgServer) sdk.Handler { } } -func Recover(err *error) { +func Recover(logger tmlog.Logger, err *error) { if r := recover(); r != nil { *err = sdkerrors.Wrapf(sdkerrors.ErrPanic, "%v", r) if e, ok := r.(error); ok { - log.WithError(e).Errorln("evm msg handler panicked with an error") - log.Debugln(string(debug.Stack())) + logger.Error( + "message handler panicked", + "error", e, + "stack trace", string(debug.Stack()), + ) } else { - log.Errorln(r) + logger.Error( + "message handler panicked", + "recover", fmt.Sprintf("%v", r), + ) } } } diff --git a/x/evm/types/utils.go b/x/evm/types/utils.go index 5bfca981..44ee600a 100644 --- a/x/evm/types/utils.go +++ b/x/evm/types/utils.go @@ -3,8 +3,6 @@ package types import ( "fmt" - log "github.com/xlab/suplog" - "github.com/gogo/protobuf/proto" sdk "github.com/cosmos/cosmos-sdk/types" @@ -19,7 +17,6 @@ var EmptyCodeHash = crypto.Keccak256(nil) func DecodeTxResponse(in []byte) (*MsgEthereumTxResponse, error) { var txMsgData sdk.TxMsgData if err := proto.Unmarshal(in, &txMsgData); err != nil { - log.WithError(err).Errorln("failed to unmarshal TxMsgData") return nil, err }