Skip to content

Commit ff37499

Browse files
committed
Problem: diff mempool max-txs trigger apphash mismatch
add test
1 parent 8cd184f commit ff37499

File tree

3 files changed

+131
-5
lines changed

3 files changed

+131
-5
lines changed

evmd/cmd/evmd/cmd/root.go

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -34,11 +34,12 @@ import (
3434
"github.com/cosmos/cosmos-sdk/client/pruning"
3535
"github.com/cosmos/cosmos-sdk/client/rpc"
3636
"github.com/cosmos/cosmos-sdk/client/snapshot"
37+
"github.com/cosmos/cosmos-sdk/server"
3738
sdkserver "github.com/cosmos/cosmos-sdk/server"
3839
servertypes "github.com/cosmos/cosmos-sdk/server/types"
3940
simtestutil "github.com/cosmos/cosmos-sdk/testutil/sims"
4041
sdk "github.com/cosmos/cosmos-sdk/types"
41-
sdkmempool "github.com/cosmos/cosmos-sdk/types/mempool"
42+
"github.com/cosmos/cosmos-sdk/types/mempool"
4243
sdktestutil "github.com/cosmos/cosmos-sdk/types/module/testutil"
4344
"github.com/cosmos/cosmos-sdk/types/tx/signing"
4445
authcmd "github.com/cosmos/cosmos-sdk/x/auth/client/cli"
@@ -315,10 +316,19 @@ func newApp(
315316

316317
// Set up the required mempool and ABCI proposal handlers for Cosmos EVM
317318
baseappOptions = append(baseappOptions, func(app *baseapp.BaseApp) {
318-
mempool := sdkmempool.NoOpMempool{}
319-
app.SetMempool(mempool)
320-
321-
handler := baseapp.NewDefaultProposalHandler(mempool, app)
319+
var mpool mempool.Mempool
320+
if maxTxs := cast.ToInt(appOpts.Get(server.FlagMempoolMaxTxs)); maxTxs >= 0 {
321+
// Setup Mempool and Proposal Handlers
322+
mpool = mempool.NewPriorityMempool(mempool.PriorityNonceMempoolConfig[int64]{
323+
TxPriority: mempool.NewDefaultTxPriority(),
324+
SignerExtractor: evmd.NewEthSignerExtractionAdapter(mempool.NewDefaultSignerExtractionAdapter()),
325+
MaxTx: maxTxs,
326+
})
327+
} else {
328+
mpool = mempool.NoOpMempool{}
329+
}
330+
app.SetMempool(mpool)
331+
handler := baseapp.NewDefaultProposalHandler(mpool, app)
322332
app.SetPrepareProposal(handler.PrepareProposalHandler())
323333
app.SetProcessProposal(handler.ProcessProposalHandler())
324334
})

evmd/signer.go

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package evmd
2+
3+
import (
4+
sdk "github.com/cosmos/cosmos-sdk/types"
5+
mempool "github.com/cosmos/cosmos-sdk/types/mempool"
6+
authante "github.com/cosmos/cosmos-sdk/x/auth/ante"
7+
evmtypes "github.com/cosmos/evm/x/vm/types"
8+
)
9+
10+
var _ mempool.SignerExtractionAdapter = EthSignerExtractionAdapter{}
11+
12+
// EthSignerExtractionAdapter is the default implementation of SignerExtractionAdapter. It extracts the signers
13+
// from a cosmos-sdk tx via GetSignaturesV2.
14+
type EthSignerExtractionAdapter struct {
15+
fallback mempool.SignerExtractionAdapter
16+
}
17+
18+
// NewEthSignerExtractionAdapter constructs a new EthSignerExtractionAdapter instance
19+
func NewEthSignerExtractionAdapter(fallback mempool.SignerExtractionAdapter) EthSignerExtractionAdapter {
20+
return EthSignerExtractionAdapter{fallback}
21+
}
22+
23+
// GetSigners implements the Adapter interface
24+
// NOTE: only the first item is used by the mempool
25+
func (s EthSignerExtractionAdapter) GetSigners(tx sdk.Tx) ([]mempool.SignerData, error) {
26+
if txWithExtensions, ok := tx.(authante.HasExtensionOptionsTx); ok {
27+
opts := txWithExtensions.GetExtensionOptions()
28+
if len(opts) > 0 && opts[0].GetTypeUrl() == "/cosmos.evm.vm.v1.ExtensionOptionsEthereumTx" {
29+
for _, msg := range tx.GetMsgs() {
30+
if ethMsg, ok := msg.(*evmtypes.MsgEthereumTx); ok {
31+
return []mempool.SignerData{
32+
mempool.NewSignerData(
33+
ethMsg.GetFrom(),
34+
ethMsg.AsTransaction().Nonce(),
35+
),
36+
}, nil
37+
}
38+
}
39+
}
40+
}
41+
42+
return s.fallback.GetSigners(tx)
43+
}

evmd/signer_test.go

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
package evmd_test
2+
3+
import (
4+
"math/big"
5+
"testing"
6+
7+
codectypes "github.com/cosmos/cosmos-sdk/codec/types"
8+
sdk "github.com/cosmos/cosmos-sdk/types"
9+
mempool "github.com/cosmos/cosmos-sdk/types/mempool"
10+
"github.com/cosmos/evm/evmd"
11+
"github.com/cosmos/evm/x/vm/types"
12+
"github.com/stretchr/testify/require"
13+
protov2 "google.golang.org/protobuf/proto"
14+
)
15+
16+
type mockFallback struct {
17+
called bool
18+
}
19+
20+
func (m *mockFallback) GetSigners(tx sdk.Tx) ([]mempool.SignerData, error) {
21+
m.called = true
22+
return []mempool.SignerData{mempool.NewSignerData(sdk.AccAddress("fallback"), 1)}, nil
23+
}
24+
25+
type mockHasExtOptions struct {
26+
msg sdk.Msg
27+
}
28+
29+
func (m *mockHasExtOptions) GetMsgs() []sdk.Msg { return []sdk.Msg{m.msg} }
30+
func (m *mockHasExtOptions) GetMsgsV2() ([]protov2.Message, error) {
31+
return []protov2.Message{}, nil
32+
}
33+
func (m *mockHasExtOptions) GetExtensionOptions() []*codectypes.Any {
34+
return []*codectypes.Any{
35+
{
36+
TypeUrl: "/cosmos.evm.vm.v1.ExtensionOptionsEthereumTx",
37+
Value: []byte{},
38+
},
39+
}
40+
}
41+
func (m *mockHasExtOptions) GetNonCriticalExtensionOptions() []*codectypes.Any { return nil }
42+
43+
func TestGetSigners(t *testing.T) {
44+
ethAddr := sdk.AccAddress("ethsigner")
45+
evmTx := &types.EvmTxArgs{
46+
ChainID: big.NewInt(100),
47+
Nonce: 1,
48+
Amount: big.NewInt(10),
49+
GasLimit: 100000,
50+
GasPrice: big.NewInt(150),
51+
GasFeeCap: big.NewInt(200),
52+
}
53+
ethMsg := types.NewTx(evmTx)
54+
ethMsg.From = ethAddr.String()
55+
txWithEth := &mockHasExtOptions{
56+
msg: ethMsg,
57+
}
58+
fallback := &mockFallback{}
59+
adapter := evmd.NewEthSignerExtractionAdapter(fallback)
60+
signers, err := adapter.GetSigners(txWithEth)
61+
require.NoError(t, err)
62+
require.Equal(t, []mempool.SignerData{{Signer: signers[0].Signer, Sequence: signers[0].Sequence}}, signers)
63+
require.False(t, fallback.called)
64+
65+
fallback = &mockFallback{}
66+
txWithEth = &mockHasExtOptions{}
67+
adapter = evmd.NewEthSignerExtractionAdapter(fallback)
68+
signers, err = adapter.GetSigners(txWithEth)
69+
require.NoError(t, err)
70+
fallbackSigners, _ := new(mockFallback).GetSigners(txWithEth)
71+
require.Equal(t, fallbackSigners, signers)
72+
require.True(t, fallback.called)
73+
}

0 commit comments

Comments
 (0)