From 013ce93396e4e8d13de8be791067bfccc04b6284 Mon Sep 17 00:00:00 2001 From: Emmanuel T Odeke Date: Sat, 11 Dec 2021 23:20:47 -0800 Subject: [PATCH 1/5] x/evm/keeper: save 24B with Go in-condition variable idiom MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The prior code doubly invoked (*ethereum/go-ethereum/core/types.Transaction).To() which is quite expensive, and firstly copies 20 bytes each time, then that gets rounded up to the proper size class/pointer alignment so on 64-bit machines 20B -> 24B. Isolating a benchmark for this code per issue #826 shows this saves quite a bit of bytes and some nano seconds which all count up towards the transactions per seconds being processed: ```shell $ benchstat before.txt after.txt name old time/op new time/op delta CopyAddr-8 38.4ns ± 3% 19.3ns ± 3% -49.66% (p=0.000 n=10+10) name old alloc/op new alloc/op delta CopyAddr-8 48.0B ± 0% 24.0B ± 0% -50.00% (p=0.000 n=10+10) name old allocs/op new allocs/op delta CopyAddr-8 2.00 ± 0% 1.00 ± 0% -50.00% (p=0.000 n=10+10) ``` Fixes #826 --- x/evm/keeper/benchmark_test.go | 33 +++++++++++++++++++++++++++++++++ x/evm/keeper/msg_server.go | 4 ++-- x/evm/keeper/statedb.go | 5 ++++- 3 files changed, 39 insertions(+), 3 deletions(-) diff --git a/x/evm/keeper/benchmark_test.go b/x/evm/keeper/benchmark_test.go index c312681508..69ad2639b8 100644 --- a/x/evm/keeper/benchmark_test.go +++ b/x/evm/keeper/benchmark_test.go @@ -180,3 +180,36 @@ func BenchmarkDeepContextStack10(b *testing.B) { func BenchmarkDeepContextStack13(b *testing.B) { DoBenchmarkDeepContextStack(b, 13) } + +func before() *big.Int { + b2 := new(big.Int).SetUint64(2) + return new(big.Int).Mul(b2, new(big.Int).SetUint64(34)) +} + +func after() *big.Int { + b2 := new(big.Int).SetUint64(2) + return b2 + return b2.Mul(b2, new(big.Int).SetUint64(34)) +} + +var sink interface{} + +func BenchmarkMulBefore(b *testing.B) { + for i := 0; i < b.N; i++ { + sink = before() + } + if sink == nil { + b.Fatal("Benchmark did not run") + } + sink = (interface{})(nil) +} + +func BenchmarkMulAfter(b *testing.B) { + for i := 0; i < b.N; i++ { + sink = after() + } + if sink == nil { + b.Fatal("Benchmark did not run") + } + sink = (interface{})(nil) +} diff --git a/x/evm/keeper/msg_server.go b/x/evm/keeper/msg_server.go index c12a877c84..df132a4f05 100644 --- a/x/evm/keeper/msg_server.go +++ b/x/evm/keeper/msg_server.go @@ -44,8 +44,8 @@ func (k *Keeper) EthereumTx(goCtx context.Context, msg *types.MsgEthereumTx) (*t attrs = append(attrs, sdk.NewAttribute(types.AttributeKeyTxHash, hash.String())) } - if tx.To() != nil { - attrs = append(attrs, sdk.NewAttribute(types.AttributeKeyRecipient, tx.To().Hex())) + if to := tx.To(); to != nil { + attrs = append(attrs, sdk.NewAttribute(types.AttributeKeyRecipient, to.Hex())) } if response.Failed() { diff --git a/x/evm/keeper/statedb.go b/x/evm/keeper/statedb.go index ac1cef6650..4a912ede9e 100644 --- a/x/evm/keeper/statedb.go +++ b/x/evm/keeper/statedb.go @@ -623,12 +623,15 @@ func (k *Keeper) Empty(addr common.Address) bool { codeHash = common.HexToHash(ethAccount.CodeHash).Bytes() } + if nonce == 0 { + return false + } balance := k.GetBalance(addr) hasZeroBalance := balance.Sign() == 0 hasEmptyCodeHash := bytes.Equal(codeHash, types.EmptyCodeHash) - return hasZeroBalance && nonce == 0 && hasEmptyCodeHash + return hasZeroBalance && hasEmptyCodeHash } // ---------------------------------------------------------------------------- From 2aa34bc4d832368827d0e75cb46485a34e40ce61 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Federico=20Kunze=20K=C3=BCllmer?= Date: Mon, 13 Dec 2021 12:53:14 -0500 Subject: [PATCH 2/5] changelog --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index b39a9c52e3..b7feaf4689 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -37,6 +37,10 @@ Ref: https://keepachangelog.com/en/1.0.0/ ## Unreleased +### Improvements + +* (evm) [tharsis#826](https://github.com/tharsis/ethermint/issues/826) Improve allocation of bytes of `tx.To` address. + ## [v0.9.0] - 2021-12-01 ### State Machine Breaking From 393ed865b4cd01e918f9e65f90dcdce7e19f236a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Federico=20Kunze=20K=C3=BCllmer?= Date: Mon, 13 Dec 2021 13:45:56 -0500 Subject: [PATCH 3/5] lint --- .golangci.yml | 2 +- gometalinter.json | 16 ---------------- 2 files changed, 1 insertion(+), 17 deletions(-) delete mode 100644 gometalinter.json diff --git a/.golangci.yml b/.golangci.yml index 5121886580..e5e9ae6e45 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -28,7 +28,7 @@ linters: - staticcheck - structcheck - stylecheck - - typecheck + # - typecheck #TODO: enable - unconvert - unparam - unused diff --git a/gometalinter.json b/gometalinter.json deleted file mode 100644 index 78a33ed7b4..0000000000 --- a/gometalinter.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "Linters": { - "vet": "go tool vet -composites=false :PATH:LINE:MESSAGE" - }, - "Enable": [ - "golint", - "vet", - "ineffassign", - "unparam", - "unconvert", - "misspell" - ], - "Deadline": "500s", - "Vendor": true, - "Cyclo": 11 -} \ No newline at end of file From e516c3ccb86d996a065509cfb008b6b1d5decf49 Mon Sep 17 00:00:00 2001 From: Emmanuel T Odeke Date: Mon, 13 Dec 2021 11:39:35 -0800 Subject: [PATCH 4/5] Revert stray changes that were used in testing --- x/evm/keeper/benchmark_test.go | 33 --------------------------------- x/evm/keeper/statedb.go | 5 +---- 2 files changed, 1 insertion(+), 37 deletions(-) diff --git a/x/evm/keeper/benchmark_test.go b/x/evm/keeper/benchmark_test.go index 69ad2639b8..c312681508 100644 --- a/x/evm/keeper/benchmark_test.go +++ b/x/evm/keeper/benchmark_test.go @@ -180,36 +180,3 @@ func BenchmarkDeepContextStack10(b *testing.B) { func BenchmarkDeepContextStack13(b *testing.B) { DoBenchmarkDeepContextStack(b, 13) } - -func before() *big.Int { - b2 := new(big.Int).SetUint64(2) - return new(big.Int).Mul(b2, new(big.Int).SetUint64(34)) -} - -func after() *big.Int { - b2 := new(big.Int).SetUint64(2) - return b2 - return b2.Mul(b2, new(big.Int).SetUint64(34)) -} - -var sink interface{} - -func BenchmarkMulBefore(b *testing.B) { - for i := 0; i < b.N; i++ { - sink = before() - } - if sink == nil { - b.Fatal("Benchmark did not run") - } - sink = (interface{})(nil) -} - -func BenchmarkMulAfter(b *testing.B) { - for i := 0; i < b.N; i++ { - sink = after() - } - if sink == nil { - b.Fatal("Benchmark did not run") - } - sink = (interface{})(nil) -} diff --git a/x/evm/keeper/statedb.go b/x/evm/keeper/statedb.go index 4a912ede9e..ac1cef6650 100644 --- a/x/evm/keeper/statedb.go +++ b/x/evm/keeper/statedb.go @@ -623,15 +623,12 @@ func (k *Keeper) Empty(addr common.Address) bool { codeHash = common.HexToHash(ethAccount.CodeHash).Bytes() } - if nonce == 0 { - return false - } balance := k.GetBalance(addr) hasZeroBalance := balance.Sign() == 0 hasEmptyCodeHash := bytes.Equal(codeHash, types.EmptyCodeHash) - return hasZeroBalance && hasEmptyCodeHash + return hasZeroBalance && nonce == 0 && hasEmptyCodeHash } // ---------------------------------------------------------------------------- From 348ad0a1f18766163e02c2b88341ad18c1af97ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Federico=20Kunze=20K=C3=BCllmer?= Date: Mon, 13 Dec 2021 18:33:03 -0500 Subject: [PATCH 5/5] rm log --- server/start.go | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/server/start.go b/server/start.go index 3ae3c61e91..80f7b3bf1f 100644 --- a/server/start.go +++ b/server/start.go @@ -41,8 +41,6 @@ import ( storetypes "github.com/cosmos/cosmos-sdk/store/types" sdk "github.com/cosmos/cosmos-sdk/types" - ethlog "github.com/ethereum/go-ethereum/log" - "github.com/tharsis/ethermint/log" ethdebug "github.com/tharsis/ethermint/rpc/ethereum/namespaces/debug" "github.com/tharsis/ethermint/server/config" srvflags "github.com/tharsis/ethermint/server/flags" @@ -405,12 +403,11 @@ func startInProcess(ctx *server.Context, clientCtx client.Context, appCreator ty } } - ethlog.Root().SetHandler(log.NewHandler(logger)) - var ( httpSrv *http.Server httpSrvDone chan struct{} ) + if config.JSONRPC.Enable { genDoc, err := genDocProvider() if err != nil {