From 54581269b81a9778ac266349b64785258ea6a98f Mon Sep 17 00:00:00 2001 From: yihuang Date: Mon, 26 Jul 2021 16:40:59 +0800 Subject: [PATCH] evm: change log tx index to index in block (#354) Closes #334 --- CHANGELOG.md | 2 ++ x/evm/keeper/keeper.go | 19 ++++++++++++++++++ x/evm/keeper/statedb.go | 5 +++-- x/evm/keeper/statedb_test.go | 38 +++++++++++++++++++++++++++++------- x/evm/types/key.go | 2 ++ x/evm/types/logs.go | 1 + 6 files changed, 58 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d924ba13..a7ae2374 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -47,6 +47,8 @@ Ref: https://keepachangelog.com/en/1.0.0/ * (evm) [tharsis#276](https://github.com/tharsis/ethermint/pull/276) Vm errors don't result in cosmos tx failure, just different tx state and events. * (evm) [tharsis#342](https://github.com/tharsis/ethermint/issues/342) Don't clear balance when resetting the account. +* (evm) [tharsis#334](https://github.com/tharsis/ethermint/pull/334) Log index changed to the index in block rather than + tx. ### API Breaking diff --git a/x/evm/keeper/keeper.go b/x/evm/keeper/keeper.go index 60702dc1..5098098a 100644 --- a/x/evm/keeper/keeper.go +++ b/x/evm/keeper/keeper.go @@ -247,6 +247,25 @@ func (k Keeper) DeleteTxLogs(ctx sdk.Context, txHash common.Hash) { store.Delete(txHash.Bytes()) } +// GetLogSizeTransient returns EVM log index on the current block. +func (k Keeper) GetLogSizeTransient() uint64 { + store := k.ctx.TransientStore(k.transientKey) + bz := store.Get(types.KeyPrefixTransientLogSize) + if len(bz) == 0 { + return 0 + } + + return sdk.BigEndianToUint64(bz) +} + +// IncreaseLogSizeTransient fetches the current EVM log index from the transient store, increases its +// value by one and then sets the new index back to the transient store. +func (k Keeper) IncreaseLogSizeTransient() { + logSize := k.GetLogSizeTransient() + store := k.ctx.TransientStore(k.transientKey) + store.Set(types.KeyPrefixTransientLogSize, sdk.Uint64ToBigEndian(logSize+1)) +} + // ---------------------------------------------------------------------------- // Storage // ---------------------------------------------------------------------------- diff --git a/x/evm/keeper/statedb.go b/x/evm/keeper/statedb.go index 0d909b8e..8059504e 100644 --- a/x/evm/keeper/statedb.go +++ b/x/evm/keeper/statedb.go @@ -590,9 +590,10 @@ func (k *Keeper) AddLog(log *ethtypes.Log) { log.TxIndex = uint(k.GetTxIndexTransient()) log.TxHash = k.GetTxHashTransient() - logs := k.GetTxLogs(log.TxHash) + log.Index = uint(k.GetLogSizeTransient()) + k.IncreaseLogSizeTransient() - log.Index = uint(len(logs)) + logs := k.GetTxLogs(log.TxHash) logs = append(logs, log) k.SetLogs(log.TxHash, logs) diff --git a/x/evm/keeper/statedb_test.go b/x/evm/keeper/statedb_test.go index 859172a9..b5b31e26 100644 --- a/x/evm/keeper/statedb_test.go +++ b/x/evm/keeper/statedb_test.go @@ -485,6 +485,13 @@ func (suite *KeeperTestSuite) TestAddLog() { msg, _ = tx.GetMsgs()[0].(*evmtypes.MsgEthereumTx) txHash := msg.AsTransaction().Hash() + msg2 := types.NewTx(big.NewInt(1), 1, &suite.address, big.NewInt(1), 100000, big.NewInt(1), []byte("test"), nil) + msg2.From = addr.Hex() + + tx2 := suite.CreateTestTx(msg2, privKey) + msg2, _ = tx2.GetMsgs()[0].(*evmtypes.MsgEthereumTx) + txHash2 := msg2.AsTransaction().Hash() + testCases := []struct { name string hash common.Hash @@ -503,21 +510,38 @@ func (suite *KeeperTestSuite) TestAddLog() { }, func() {}, }, + { + "log index keep increasing in new tx", + txHash2, + ðtypes.Log{ + Address: addr, + }, + ðtypes.Log{ + Address: addr, + TxHash: txHash2, + TxIndex: 1, + Index: 1, + }, + func() { + suite.app.EvmKeeper.SetTxHashTransient(txHash) + suite.app.EvmKeeper.AddLog(ðtypes.Log{ + Address: addr, + }) + suite.app.EvmKeeper.IncreaseTxIndexTransient() + }, + }, } for _, tc := range testCases { suite.Run(tc.name, func() { + suite.SetupTest() tc.malleate() - prev := suite.app.EvmKeeper.GetTxLogs(tc.hash) suite.app.EvmKeeper.SetTxHashTransient(tc.hash) suite.app.EvmKeeper.AddLog(tc.log) - post := suite.app.EvmKeeper.GetTxLogs(tc.hash) - - suite.Require().NotZero(len(post), tc.hash.Hex()) - suite.Require().Equal(len(prev)+1, len(post)) - suite.Require().NotNil(post[len(post)-1]) - suite.Require().Equal(tc.log, post[len(post)-1]) + logs := suite.app.EvmKeeper.GetTxLogs(tc.hash) + suite.Require().Equal(1, len(logs)) + suite.Require().Equal(tc.expLog, logs[0]) }) } } diff --git a/x/evm/types/key.go b/x/evm/types/key.go index a0f52a89..b42e6fef 100644 --- a/x/evm/types/key.go +++ b/x/evm/types/key.go @@ -43,6 +43,7 @@ const ( prefixTransientAccessListAddress prefixTransientAccessListSlot prefixTransientTxHash + prefixTransientLogSize ) // KVStore key prefixes @@ -65,6 +66,7 @@ var ( KeyPrefixTransientAccessListAddress = []byte{prefixTransientAccessListAddress} KeyPrefixTransientAccessListSlot = []byte{prefixTransientAccessListSlot} KeyPrefixTransientTxHash = []byte{prefixTransientTxHash} + KeyPrefixTransientLogSize = []byte{prefixTransientLogSize} ) // BloomKey defines the store key for a block Bloom diff --git a/x/evm/types/logs.go b/x/evm/types/logs.go index 44c7f418..4048ae85 100644 --- a/x/evm/types/logs.go +++ b/x/evm/types/logs.go @@ -120,6 +120,7 @@ func NewLogFromEth(log *ethtypes.Log) *Log { BlockNumber: log.BlockNumber, TxHash: log.TxHash.String(), TxIndex: uint64(log.TxIndex), + Index: uint64(log.Index), BlockHash: log.BlockHash.String(), Removed: log.Removed, }