Skip to content

Commit 8e9320e

Browse files
author
yihuang
authored
Problem: sender address verification is not decoupled from execution (#358)
* Problem: sender address verification is not decoupled from execution WIP: #355 Solution: - to decouple sender address verification from execution, we must first enforce user setting the From field in the msg * changelog * fix GetSenderLegacy * cleanup * fix unit tests * reduce overhead of debug log * lazy init the btree in cache store because many stores are never touched * fix mutation
1 parent 9c9f9e6 commit 8e9320e

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

43 files changed

+390
-307
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ Ref: https://keepachangelog.com/en/1.0.0/
5252
- (eip712) [#1746](https://github.com/evmos/ethermint/pull/1746) Add EIP712 support for multiple messages and schemas
5353
- (feemarket) [#1790](https://github.com/evmos/ethermint/pull/1790) Raise error when get invalid consensus params
5454
- (deps) [#1782](https://github.com/evmos/ethermint/pull/1782) Bump Cosmos-SDK to v0.47.3 and ibc-go to v7.1.0.
55+
- (ante) [#358](https://github.com/crypto-org-chain/ethermint/pull/358) enforce user setting the From address in MsgEthereumTx
5556

5657
### Bug Fixes
5758

app/ante/ante_test.go

Lines changed: 34 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ func (suite AnteTestSuite) TestAnteHandler() {
9595
nil,
9696
nil,
9797
)
98-
signedContractTx.From = addr.Hex()
98+
signedContractTx.From = addr.Bytes()
9999

100100
tx := suite.CreateTestTx(signedContractTx, privKey, 1, false)
101101
return tx
@@ -116,7 +116,7 @@ func (suite AnteTestSuite) TestAnteHandler() {
116116
nil,
117117
nil,
118118
)
119-
signedContractTx.From = addr.Hex()
119+
signedContractTx.From = addr.Bytes()
120120

121121
tx := suite.CreateTestTx(signedContractTx, privKey, 1, false)
122122
return tx
@@ -137,7 +137,7 @@ func (suite AnteTestSuite) TestAnteHandler() {
137137
nil,
138138
nil,
139139
)
140-
signedContractTx.From = addr.Hex()
140+
signedContractTx.From = addr.Bytes()
141141

142142
tx := suite.CreateTestTx(signedContractTx, privKey, 1, false)
143143
return tx
@@ -159,7 +159,7 @@ func (suite AnteTestSuite) TestAnteHandler() {
159159
nil,
160160
nil,
161161
)
162-
signedTx.From = addr.Hex()
162+
signedTx.From = addr.Bytes()
163163

164164
tx := suite.CreateTestTx(signedTx, privKey, 1, false)
165165
return tx
@@ -181,7 +181,7 @@ func (suite AnteTestSuite) TestAnteHandler() {
181181
nil,
182182
nil,
183183
)
184-
signedTx.From = addr.Hex()
184+
signedTx.From = addr.Bytes()
185185

186186
tx := suite.CreateTestTx(signedTx, privKey, 1, false)
187187
return tx
@@ -203,7 +203,7 @@ func (suite AnteTestSuite) TestAnteHandler() {
203203
nil,
204204
nil,
205205
)
206-
signedTx.From = addr.Hex()
206+
signedTx.From = addr.Bytes()
207207

208208
tx := suite.CreateTestTx(signedTx, privKey, 1, false)
209209
return tx
@@ -224,7 +224,7 @@ func (suite AnteTestSuite) TestAnteHandler() {
224224
nil,
225225
nil,
226226
)
227-
signedTx.From = addr.Hex()
227+
signedTx.From = addr.Bytes()
228228

229229
tx := suite.CreateTestTx(signedTx, privKey, 1, false)
230230
return tx
@@ -234,7 +234,7 @@ func (suite AnteTestSuite) TestAnteHandler() {
234234
"fail - CheckTx (cosmos tx is not valid)",
235235
func() sdk.Tx {
236236
signedTx := evmtypes.NewTx(suite.app.EvmKeeper.ChainID(), 1, &to, big.NewInt(10), 100000, big.NewInt(1), nil, nil, nil, nil)
237-
signedTx.From = addr.Hex()
237+
signedTx.From = addr.Bytes()
238238

239239
txBuilder := suite.CreateTestTxBuilder(signedTx, privKey, 1, false)
240240
// bigger than MaxGasWanted
@@ -246,7 +246,7 @@ func (suite AnteTestSuite) TestAnteHandler() {
246246
"fail - CheckTx (memo too long)",
247247
func() sdk.Tx {
248248
signedTx := evmtypes.NewTx(suite.app.EvmKeeper.ChainID(), 1, &to, big.NewInt(10), 100000, big.NewInt(1), nil, nil, nil, nil)
249-
signedTx.From = addr.Hex()
249+
signedTx.From = addr.Bytes()
250250

251251
txBuilder := suite.CreateTestTxBuilder(signedTx, privKey, 1, false)
252252
txBuilder.SetMemo(strings.Repeat("*", 257))
@@ -257,7 +257,7 @@ func (suite AnteTestSuite) TestAnteHandler() {
257257
"fail - CheckTx (ExtensionOptionsEthereumTx not set)",
258258
func() sdk.Tx {
259259
signedTx := evmtypes.NewTx(suite.app.EvmKeeper.ChainID(), 1, &to, big.NewInt(10), 100000, big.NewInt(1), nil, nil, nil, nil)
260-
signedTx.From = addr.Hex()
260+
signedTx.From = addr.Bytes()
261261

262262
txBuilder := suite.CreateTestTxBuilder(signedTx, privKey, 1, false, true)
263263
return txBuilder.GetTx()
@@ -271,7 +271,7 @@ func (suite AnteTestSuite) TestAnteHandler() {
271271
nonce, err := suite.app.AccountKeeper.GetSequence(suite.ctx, acc.GetAddress())
272272
suite.Require().NoError(err)
273273
signedTx := evmtypes.NewTx(suite.app.EvmKeeper.ChainID(), nonce, &to, big.NewInt(10), 100000, big.NewInt(1), nil, nil, nil, nil)
274-
signedTx.From = addr.Hex()
274+
signedTx.From = addr.Bytes()
275275

276276
tx := suite.CreateTestTx(signedTx, privKey, 1, true)
277277
return tx
@@ -283,7 +283,7 @@ func (suite AnteTestSuite) TestAnteHandler() {
283283
nonce, err := suite.app.AccountKeeper.GetSequence(suite.ctx, acc.GetAddress())
284284
suite.Require().NoError(err)
285285
signedTx := evmtypes.NewTx(suite.app.EvmKeeper.ChainID(), nonce, &to, big.NewInt(10), 100000, big.NewInt(1), nil, nil, nil, nil)
286-
signedTx.From = addr.Hex()
286+
signedTx.From = addr.Bytes()
287287

288288
txBuilder := suite.CreateTestTxBuilder(signedTx, privKey, 1, false)
289289
txBuilder.SetMemo("memo for cosmos tx not allowed")
@@ -296,7 +296,7 @@ func (suite AnteTestSuite) TestAnteHandler() {
296296
nonce, err := suite.app.AccountKeeper.GetSequence(suite.ctx, acc.GetAddress())
297297
suite.Require().NoError(err)
298298
signedTx := evmtypes.NewTx(suite.app.EvmKeeper.ChainID(), nonce, &to, big.NewInt(10), 100000, big.NewInt(1), nil, nil, nil, nil)
299-
signedTx.From = addr.Hex()
299+
signedTx.From = addr.Bytes()
300300

301301
txBuilder := suite.CreateTestTxBuilder(signedTx, privKey, 1, false)
302302
txBuilder.SetTimeoutHeight(10)
@@ -309,7 +309,7 @@ func (suite AnteTestSuite) TestAnteHandler() {
309309
nonce, err := suite.app.AccountKeeper.GetSequence(suite.ctx, acc.GetAddress())
310310
suite.Require().NoError(err)
311311
signedTx := evmtypes.NewTx(suite.app.EvmKeeper.ChainID(), nonce, &to, big.NewInt(10), 100000, big.NewInt(1), nil, nil, nil, nil)
312-
signedTx.From = addr.Hex()
312+
signedTx.From = addr.Bytes()
313313

314314
txBuilder := suite.CreateTestTxBuilder(signedTx, privKey, 1, false)
315315

@@ -329,7 +329,7 @@ func (suite AnteTestSuite) TestAnteHandler() {
329329
nonce, err := suite.app.AccountKeeper.GetSequence(suite.ctx, acc.GetAddress())
330330
suite.Require().NoError(err)
331331
signedTx := evmtypes.NewTx(suite.app.EvmKeeper.ChainID(), nonce, &to, big.NewInt(10), 100000, big.NewInt(1), nil, nil, nil, nil)
332-
signedTx.From = addr.Hex()
332+
signedTx.From = addr.Bytes()
333333

334334
txBuilder := suite.CreateTestTxBuilder(signedTx, privKey, 1, false)
335335

@@ -589,10 +589,12 @@ func (suite AnteTestSuite) TestAnteHandler() {
589589
nil,
590590
nil,
591591
)
592-
msg.From = addr.Hex()
592+
msg.From = addr.Bytes()
593593
tx := suite.CreateTestTx(msg, privKey, 1, false)
594594
msg = tx.GetMsgs()[0].(*evmtypes.MsgEthereumTx)
595-
msg.From = addr.Hex()
595+
msg.From = addr.Bytes()
596+
// arbitrary modify
597+
msg.From[0] = msg.From[0] + 1
596598
return tx
597599
}, true, false, false,
598600
},
@@ -906,7 +908,7 @@ func (suite AnteTestSuite) TestAnteHandler() {
906908
nil,
907909
nil,
908910
)
909-
ethTx.From = addr.Hex()
911+
ethTx.From = addr.Bytes()
910912

911913
msg := authz.NewMsgExec(
912914
sdk.AccAddress(privKey.PubKey().Address()),
@@ -976,7 +978,7 @@ func (suite AnteTestSuite) TestAnteHandlerWithDynamicTxFee() {
976978
nil,
977979
&types.AccessList{},
978980
)
979-
signedContractTx.From = addr.Hex()
981+
signedContractTx.From = addr.Bytes()
980982

981983
tx := suite.CreateTestTx(signedContractTx, privKey, 1, false)
982984
return tx
@@ -998,7 +1000,7 @@ func (suite AnteTestSuite) TestAnteHandlerWithDynamicTxFee() {
9981000
nil,
9991001
&types.AccessList{},
10001002
)
1001-
signedContractTx.From = addr.Hex()
1003+
signedContractTx.From = addr.Bytes()
10021004

10031005
tx := suite.CreateTestTx(signedContractTx, privKey, 1, false)
10041006
return tx
@@ -1020,7 +1022,7 @@ func (suite AnteTestSuite) TestAnteHandlerWithDynamicTxFee() {
10201022
nil,
10211023
&types.AccessList{},
10221024
)
1023-
signedContractTx.From = addr.Hex()
1025+
signedContractTx.From = addr.Bytes()
10241026

10251027
tx := suite.CreateTestTx(signedContractTx, privKey, 1, false)
10261028
return tx
@@ -1043,7 +1045,7 @@ func (suite AnteTestSuite) TestAnteHandlerWithDynamicTxFee() {
10431045
nil,
10441046
&types.AccessList{},
10451047
)
1046-
signedTx.From = addr.Hex()
1048+
signedTx.From = addr.Bytes()
10471049

10481050
tx := suite.CreateTestTx(signedTx, privKey, 1, false)
10491051
return tx
@@ -1066,7 +1068,7 @@ func (suite AnteTestSuite) TestAnteHandlerWithDynamicTxFee() {
10661068
nil,
10671069
&types.AccessList{},
10681070
)
1069-
signedTx.From = addr.Hex()
1071+
signedTx.From = addr.Bytes()
10701072

10711073
tx := suite.CreateTestTx(signedTx, privKey, 1, false)
10721074
return tx
@@ -1089,7 +1091,7 @@ func (suite AnteTestSuite) TestAnteHandlerWithDynamicTxFee() {
10891091
nil,
10901092
&types.AccessList{},
10911093
)
1092-
signedTx.From = addr.Hex()
1094+
signedTx.From = addr.Bytes()
10931095

10941096
tx := suite.CreateTestTx(signedTx, privKey, 1, false)
10951097
return tx
@@ -1112,7 +1114,7 @@ func (suite AnteTestSuite) TestAnteHandlerWithDynamicTxFee() {
11121114
nil,
11131115
&types.AccessList{},
11141116
)
1115-
signedTx.From = addr.Hex()
1117+
signedTx.From = addr.Bytes()
11161118

11171119
tx := suite.CreateTestTx(signedTx, privKey, 1, false)
11181120
return tx
@@ -1135,7 +1137,7 @@ func (suite AnteTestSuite) TestAnteHandlerWithDynamicTxFee() {
11351137
nil,
11361138
&types.AccessList{},
11371139
)
1138-
signedTx.From = addr.Hex()
1140+
signedTx.From = addr.Bytes()
11391141

11401142
txBuilder := suite.CreateTestTxBuilder(signedTx, privKey, 1, false)
11411143
// bigger than MaxGasWanted
@@ -1160,7 +1162,7 @@ func (suite AnteTestSuite) TestAnteHandlerWithDynamicTxFee() {
11601162
nil,
11611163
&types.AccessList{},
11621164
)
1163-
signedTx.From = addr.Hex()
1165+
signedTx.From = addr.Bytes()
11641166

11651167
txBuilder := suite.CreateTestTxBuilder(signedTx, privKey, 1, false)
11661168
txBuilder.SetMemo(strings.Repeat("*", 257))
@@ -1183,7 +1185,7 @@ func (suite AnteTestSuite) TestAnteHandlerWithDynamicTxFee() {
11831185
nil,
11841186
&types.AccessList{},
11851187
)
1186-
signedContractTx.From = addr.Hex()
1188+
signedContractTx.From = addr.Bytes()
11871189

11881190
tx := suite.CreateTestTx(signedContractTx, privKey, 1, false)
11891191
return tx
@@ -1242,7 +1244,7 @@ func (suite AnteTestSuite) TestAnteHandlerWithParams() {
12421244
nil,
12431245
&types.AccessList{},
12441246
)
1245-
signedContractTx.From = addr.Hex()
1247+
signedContractTx.From = addr.Bytes()
12461248

12471249
tx := suite.CreateTestTx(signedContractTx, privKey, 1, false)
12481250
return tx
@@ -1264,7 +1266,7 @@ func (suite AnteTestSuite) TestAnteHandlerWithParams() {
12641266
nil,
12651267
&types.AccessList{},
12661268
)
1267-
signedContractTx.From = addr.Hex()
1269+
signedContractTx.From = addr.Bytes()
12681270

12691271
tx := suite.CreateTestTx(signedContractTx, privKey, 1, false)
12701272
return tx
@@ -1287,7 +1289,7 @@ func (suite AnteTestSuite) TestAnteHandlerWithParams() {
12871289
nil,
12881290
&types.AccessList{},
12891291
)
1290-
signedTx.From = addr.Hex()
1292+
signedTx.From = addr.Bytes()
12911293

12921294
tx := suite.CreateTestTx(signedTx, privKey, 1, false)
12931295
return tx
@@ -1310,7 +1312,7 @@ func (suite AnteTestSuite) TestAnteHandlerWithParams() {
13101312
nil,
13111313
&types.AccessList{},
13121314
)
1313-
signedTx.From = addr.Hex()
1315+
signedTx.From = addr.Bytes()
13141316

13151317
tx := suite.CreateTestTx(signedTx, privKey, 1, false)
13161318
return tx

app/ante/authz_test.go

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -226,6 +226,8 @@ func (suite *AnteTestSuite) TestRejectDeliverMsgsInAuthz() {
226226
_, testAddresses, err := generatePrivKeyAddressPairs(10)
227227
suite.Require().NoError(err)
228228

229+
fromAddr := []byte{0, 0}
230+
229231
testcases := []struct {
230232
name string
231233
msgs []sdk.Msg
@@ -237,7 +239,7 @@ func (suite *AnteTestSuite) TestRejectDeliverMsgsInAuthz() {
237239
msgs: []sdk.Msg{
238240
newGenericMsgGrant(
239241
testAddresses,
240-
sdk.MsgTypeURL(&evmtypes.MsgEthereumTx{}),
242+
sdk.MsgTypeURL(&evmtypes.MsgEthereumTx{From: fromAddr}),
241243
),
242244
},
243245
expectedCode: sdkerrors.ErrUnauthorized.ABCICode(),
@@ -257,7 +259,7 @@ func (suite *AnteTestSuite) TestRejectDeliverMsgsInAuthz() {
257259
msgs: []sdk.Msg{
258260
newGenericMsgGrant(
259261
testAddresses,
260-
sdk.MsgTypeURL(&evmtypes.MsgEthereumTx{}),
262+
sdk.MsgTypeURL(&evmtypes.MsgEthereumTx{From: fromAddr}),
261263
),
262264
},
263265
expectedCode: sdkerrors.ErrUnauthorized.ABCICode(),
@@ -270,7 +272,7 @@ func (suite *AnteTestSuite) TestRejectDeliverMsgsInAuthz() {
270272
testAddresses[1],
271273
[]sdk.Msg{
272274
createMsgSend(testAddresses),
273-
&evmtypes.MsgEthereumTx{},
275+
&evmtypes.MsgEthereumTx{From: fromAddr},
274276
},
275277
),
276278
},
@@ -283,7 +285,7 @@ func (suite *AnteTestSuite) TestRejectDeliverMsgsInAuthz() {
283285
testAddresses[1],
284286
2,
285287
[]sdk.Msg{
286-
&evmtypes.MsgEthereumTx{},
288+
&evmtypes.MsgEthereumTx{From: fromAddr},
287289
},
288290
),
289291
},

app/ante/eth.go

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@ import (
3030
evmtypes "github.com/evmos/ethermint/x/evm/types"
3131

3232
"github.com/ethereum/go-ethereum/common"
33-
ethtypes "github.com/ethereum/go-ethereum/core/types"
3433
"github.com/ethereum/go-ethereum/params"
3534
)
3635

@@ -195,7 +194,7 @@ func (egcd EthGasConsumeDecorator) AnteHandle(ctx sdk.Context, tx sdk.Tx, simula
195194
return ctx, errorsmod.Wrapf(err, "failed to verify the fees")
196195
}
197196

198-
err = egcd.evmKeeper.DeductTxCostsFromUserBalance(ctx, fees, common.HexToAddress(msgEthTx.From))
197+
err = egcd.evmKeeper.DeductTxCostsFromUserBalance(ctx, fees, common.BytesToAddress(msgEthTx.From))
199198
if err != nil {
200199
return ctx, errorsmod.Wrapf(err, "failed to deduct transaction costs from user balance")
201200
}
@@ -263,14 +262,13 @@ func NewCanTransferDecorator(evmKeeper EVMKeeper, baseFee *big.Int, evmParams *e
263262
// AnteHandle creates an EVM from the message and calls the BlockContext CanTransfer function to
264263
// see if the address can execute the transaction.
265264
func (ctd CanTransferDecorator) AnteHandle(ctx sdk.Context, tx sdk.Tx, simulate bool, next sdk.AnteHandler) (sdk.Context, error) {
266-
signer := ethtypes.MakeSigner(ctd.ethCfg, big.NewInt(ctx.BlockHeight()))
267265
for _, msg := range tx.GetMsgs() {
268266
msgEthTx, ok := msg.(*evmtypes.MsgEthereumTx)
269267
if !ok {
270268
return ctx, errorsmod.Wrapf(errortypes.ErrUnknownRequest, "invalid message type %T, expected %T", msg, (*evmtypes.MsgEthereumTx)(nil))
271269
}
272270

273-
coreMsg, err := msgEthTx.AsMessage(signer, ctd.baseFee)
271+
coreMsg, err := msgEthTx.AsMessage(ctd.baseFee)
274272
if err != nil {
275273
return ctx, errorsmod.Wrapf(
276274
err,

0 commit comments

Comments
 (0)