Skip to content

Commit aa05efc

Browse files
author
yihuang
authored
Problem: tx format conversions not necessary (#478)
* Problem: tx format conversions not necessary Solution: - embed ethtypes.Transaction into MsgEthereumTx protobuf message as the core component. * restore ValidateBasic * fix json format * fix json * fix json
1 parent 40463e8 commit aa05efc

Some content is hidden

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

49 files changed

+614
-658
lines changed

app/ante/ante_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -315,10 +315,10 @@ func (suite *AnteTestSuite) TestAnteHandler() {
315315

316316
txBuilder := suite.CreateTestTxBuilder(signedTx, privKey, 1, false)
317317

318-
txData, err := evmtypes.UnpackTxData(signedTx.Data)
319-
suite.Require().NoError(err)
318+
txData := signedTx.AsTransaction()
319+
suite.Require().NotNil(txData)
320320

321-
expFee := txData.Fee()
321+
expFee := signedTx.GetFee()
322322
invalidFee := new(big.Int).Add(expFee, big.NewInt(1))
323323
invalidFeeAmount := sdk.Coins{sdk.NewCoin(evmtypes.DefaultEVMDenom, sdkmath.NewIntFromBigInt(invalidFee))}
324324
txBuilder.SetFeeAmount(invalidFeeAmount)

app/ante/eth.go

Lines changed: 20 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -47,16 +47,13 @@ func VerifyEthAccount(
4747
return nil
4848
}
4949

50-
for i, msg := range tx.GetMsgs() {
50+
for _, msg := range tx.GetMsgs() {
5151
msgEthTx, ok := msg.(*evmtypes.MsgEthereumTx)
5252
if !ok {
5353
return errorsmod.Wrapf(errortypes.ErrUnknownRequest, "invalid message type %T, expected %T", msg, (*evmtypes.MsgEthereumTx)(nil))
5454
}
5555

56-
txData, err := evmtypes.UnpackTxData(msgEthTx.Data)
57-
if err != nil {
58-
return errorsmod.Wrapf(err, "failed to unpack tx data any for tx %d", i)
59-
}
56+
ethTx := msgEthTx.AsTransaction()
6057

6158
// sender address should be in the tx cache from the previous AnteHandle call
6259
from := msgEthTx.GetFrom()
@@ -76,8 +73,8 @@ func VerifyEthAccount(
7673
"the sender is not EOA: address %s, codeHash <%s>", fromAddr, acct.CodeHash)
7774
}
7875

79-
balance := evmKeeper.GetBalance(ctx, sdk.AccAddress(fromAddr.Bytes()), evmDenom)
80-
if err := keeper.CheckSenderBalance(sdkmath.NewIntFromBigInt(balance), txData); err != nil {
76+
balance := evmKeeper.GetBalance(ctx, from, evmDenom)
77+
if err := keeper.CheckSenderBalance(sdkmath.NewIntFromBigIntMut(balance), ethTx); err != nil {
8178
return errorsmod.Wrap(err, "failed to check sender balance")
8279
}
8380
}
@@ -119,26 +116,22 @@ func CheckEthGasConsume(
119116
return ctx, errorsmod.Wrapf(errortypes.ErrUnknownRequest, "invalid message type %T, expected %T", msg, (*evmtypes.MsgEthereumTx)(nil))
120117
}
121118

122-
txData, err := evmtypes.UnpackTxData(msgEthTx.Data)
123-
if err != nil {
124-
return ctx, errorsmod.Wrap(err, "failed to unpack tx data")
125-
}
126-
127-
priority := evmtypes.GetTxPriority(txData, baseFee)
119+
priority := evmtypes.GetTxPriority(msgEthTx, baseFee)
128120

129121
if priority < minPriority {
130122
minPriority = priority
131123
}
132124

125+
gasLimit := msgEthTx.GetGas()
133126
if ctx.IsCheckTx() && maxGasWanted != 0 {
134127
// We can't trust the tx gas limit, because we'll refund the unused gas.
135-
if txData.GetGas() > maxGasWanted {
128+
if gasLimit > maxGasWanted {
136129
gasWanted += maxGasWanted
137130
} else {
138-
gasWanted += txData.GetGas()
131+
gasWanted += gasLimit
139132
}
140133
} else {
141-
gasWanted += txData.GetGas()
134+
gasWanted += gasLimit
142135
}
143136

144137
// user balance is already checked during CheckTx so there's no need to
@@ -147,7 +140,7 @@ func CheckEthGasConsume(
147140
continue
148141
}
149142

150-
fees, err := keeper.VerifyFee(txData, evmDenom, baseFee, rules.IsHomestead, rules.IsIstanbul, rules.IsShanghai, ctx.IsCheckTx())
143+
fees, err := keeper.VerifyFee(msgEthTx, evmDenom, baseFee, rules.IsHomestead, rules.IsIstanbul, rules.IsShanghai, ctx.IsCheckTx())
151144
if err != nil {
152145
return ctx, errorsmod.Wrapf(err, "failed to verify the fees")
153146
}
@@ -212,38 +205,32 @@ func CheckEthCanTransfer(
212205
return errorsmod.Wrapf(errortypes.ErrUnknownRequest, "invalid message type %T, expected %T", msg, (*evmtypes.MsgEthereumTx)(nil))
213206
}
214207

215-
coreMsg, err := msgEthTx.AsMessage(baseFee)
216-
if err != nil {
217-
return errorsmod.Wrapf(
218-
err,
219-
"failed to create an ethereum core.Message",
220-
)
221-
}
222-
208+
tx := msgEthTx.AsTransaction()
223209
if rules.IsLondon {
224210
if baseFee == nil {
225211
return errorsmod.Wrap(
226212
evmtypes.ErrInvalidBaseFee,
227213
"base fee is supported but evm block context value is nil",
228214
)
229215
}
230-
if coreMsg.GasFeeCap.Cmp(baseFee) < 0 {
216+
if tx.GasFeeCap().Cmp(baseFee) < 0 {
231217
return errorsmod.Wrapf(
232218
errortypes.ErrInsufficientFee,
233219
"max fee per gas less than block base fee (%s < %s)",
234-
coreMsg.GasFeeCap, baseFee,
220+
tx.GasFeeCap(), baseFee,
235221
)
236222
}
237223
}
238224

225+
from := common.BytesToAddress(msgEthTx.From)
239226
// check that caller has enough balance to cover asset transfer for **topmost** call
240227
// NOTE: here the gas consumed is from the context with the infinite gas meter
241-
if coreMsg.Value.Sign() > 0 && !canTransfer(ctx, evmKeeper, evmParams.EvmDenom, coreMsg.From, coreMsg.Value) {
228+
if tx.Value().Sign() > 0 && !canTransfer(ctx, evmKeeper, evmParams.EvmDenom, from, tx.Value()) {
242229
return errorsmod.Wrapf(
243230
errortypes.ErrInsufficientFunds,
244231
"failed to transfer %s from address %s using the EVM block context transfer function",
245-
coreMsg.Value,
246-
coreMsg.From,
232+
tx.Value(),
233+
from,
247234
)
248235
}
249236
}
@@ -269,10 +256,7 @@ func CheckEthSenderNonce(
269256
return errorsmod.Wrapf(errortypes.ErrUnknownRequest, "invalid message type %T, expected %T", msg, (*evmtypes.MsgEthereumTx)(nil))
270257
}
271258

272-
txData, err := evmtypes.UnpackTxData(msgEthTx.Data)
273-
if err != nil {
274-
return errorsmod.Wrap(err, "failed to unpack tx data")
275-
}
259+
tx := msgEthTx.AsTransaction()
276260

277261
// increase sequence of sender
278262
acc := ak.GetAccount(ctx, msgEthTx.GetFrom())
@@ -286,10 +270,10 @@ func CheckEthSenderNonce(
286270

287271
// we merged the nonce verification to nonce increment, so when tx includes multiple messages
288272
// with same sender, they'll be accepted.
289-
if txData.GetNonce() != nonce {
273+
if tx.Nonce() != nonce {
290274
return errorsmod.Wrapf(
291275
errortypes.ErrInvalidSequence,
292-
"invalid nonce; got %d, expected %d", txData.GetNonce(), nonce,
276+
"invalid nonce; got %d, expected %d", tx.Nonce(), nonce,
293277
)
294278
}
295279

app/ante/eth_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -489,11 +489,11 @@ func (suite *AnteTestSuite) TestEthIncrementSenderSequenceDecorator() {
489489
suite.Require().NoError(err)
490490
msg := tc.tx.(*evmtypes.MsgEthereumTx)
491491

492-
txData, err := evmtypes.UnpackTxData(msg.Data)
493-
suite.Require().NoError(err)
492+
txData := msg.AsTransaction()
493+
suite.Require().NotNil(txData)
494494

495495
nonce := suite.app.EvmKeeper.GetNonce(suite.ctx, addr)
496-
suite.Require().Equal(txData.GetNonce()+1, nonce)
496+
suite.Require().Equal(txData.Nonce()+1, nonce)
497497
} else {
498498
suite.Require().Error(err)
499499
}

app/ante/fees.go

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@ import (
2323
sdk "github.com/cosmos/cosmos-sdk/types"
2424
errortypes "github.com/cosmos/cosmos-sdk/types/errors"
2525

26-
ethtypes "github.com/ethereum/go-ethereum/core/types"
2726
evmtypes "github.com/evmos/ethermint/x/evm/types"
2827
feemarkettypes "github.com/evmos/ethermint/x/feemarket/types"
2928
)
@@ -114,8 +113,6 @@ func CheckEthMinGasPrice(tx sdk.Tx, minGasPrice sdkmath.LegacyDec, baseFee *big.
114113
)
115114
}
116115

117-
feeAmt := ethMsg.GetFee()
118-
119116
// For dynamic transactions, GetFee() uses the GasFeeCap value, which
120117
// is the maximum gas price that the signer can pay. In practice, the
121118
// signer can pay less, if the block's BaseFee is lower. So, in this case,
@@ -124,15 +121,7 @@ func CheckEthMinGasPrice(tx sdk.Tx, minGasPrice sdkmath.LegacyDec, baseFee *big.
124121
// increase the GasTipCap (priority fee) until EffectivePrice > MinGasPrices.
125122
// Transactions with MinGasPrices * gasUsed < tx fees < EffectiveFee are rejected
126123
// by the feemarket AnteHandle
127-
128-
txData, err := evmtypes.UnpackTxData(ethMsg.Data)
129-
if err != nil {
130-
return errorsmod.Wrapf(err, "failed to unpack tx data %s", ethMsg.Hash)
131-
}
132-
133-
if txData.TxType() != ethtypes.LegacyTxType {
134-
feeAmt = ethMsg.GetEffectiveFee(baseFee)
135-
}
124+
feeAmt := ethMsg.GetEffectiveFee(baseFee)
136125

137126
gasLimit := sdkmath.LegacyNewDecFromBigInt(new(big.Int).SetUint64(ethMsg.GetGas()))
138127

app/ante/setup.go

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -107,30 +107,25 @@ func ValidateEthBasic(ctx sdk.Context, tx sdk.Tx, evmParams *evmtypes.Params, ba
107107

108108
txGasLimit += msgEthTx.GetGas()
109109

110-
txData, err := evmtypes.UnpackTxData(msgEthTx.Data)
111-
if err != nil {
112-
return errorsmod.Wrap(err, "failed to unpack MsgEthereumTx Data")
113-
}
114-
110+
tx := msgEthTx.AsTransaction()
115111
// return error if contract creation or call are disabled through governance
116-
if !enableCreate && txData.GetTo() == nil {
112+
if !enableCreate && tx.To() == nil {
117113
return errorsmod.Wrap(evmtypes.ErrCreateDisabled, "failed to create new contract")
118-
} else if !enableCall && txData.GetTo() != nil {
114+
} else if !enableCall && tx.To() != nil {
119115
return errorsmod.Wrap(evmtypes.ErrCallDisabled, "failed to call contract")
120116
}
121117

122-
if baseFee == nil && txData.TxType() == ethtypes.DynamicFeeTxType {
118+
if baseFee == nil && tx.Type() == ethtypes.DynamicFeeTxType {
123119
return errorsmod.Wrap(ethtypes.ErrTxTypeNotSupported, "dynamic fee tx not supported")
124120
}
125121

126-
ethTx := ethtypes.NewTx(txData.AsEthereumData())
127-
if !allowUnprotectedTxs && !ethTx.Protected() {
122+
if !allowUnprotectedTxs && !tx.Protected() {
128123
return errorsmod.Wrapf(
129124
errortypes.ErrNotSupported,
130125
"rejected unprotected Ethereum transaction. Please EIP155 sign your transaction to protect it against replay-attacks")
131126
}
132127

133-
txFee = txFee.Add(sdk.Coin{Denom: evmDenom, Amount: sdkmath.NewIntFromBigInt(txData.Fee())})
128+
txFee = txFee.Add(sdk.Coin{Denom: evmDenom, Amount: sdkmath.NewIntFromBigInt(msgEthTx.GetFee())})
134129
}
135130

136131
if !authInfo.Fee.Amount.Equal(txFee) {

app/ante/sigs_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,10 +32,10 @@ func (suite *AnteTestSuite) TestSignatures() {
3232
// signatures of cosmos tx should be empty
3333
suite.Require().Equal(len(sigs), 0)
3434

35-
txData, err := evmtypes.UnpackTxData(msgEthereumTx.Data)
36-
suite.Require().NoError(err)
35+
txData := msgEthereumTx.AsTransaction()
36+
suite.Require().NotNil(txData)
3737

38-
msgV, msgR, msgS := txData.GetRawSignatureValues()
38+
msgV, msgR, msgS := txData.RawSignatureValues()
3939

4040
ethTx := msgEthereumTx.AsTransaction()
4141
ethV, ethR, ethS := ethTx.RawSignatureValues()

app/ante/utils_test.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -231,10 +231,10 @@ func (suite *AnteTestSuite) CreateTestTxBuilder(
231231
err = builder.SetMsgs(msg)
232232
suite.Require().NoError(err)
233233

234-
txData, err := evmtypes.UnpackTxData(msg.Data)
235-
suite.Require().NoError(err)
234+
txData := msg.AsTransaction()
235+
suite.Require().NotNil(txData)
236236

237-
fees := sdk.NewCoins(sdk.NewCoin(evmtypes.DefaultEVMDenom, sdkmath.NewIntFromBigInt(txData.Fee())))
237+
fees := sdk.NewCoins(sdk.NewCoin(evmtypes.DefaultEVMDenom, sdkmath.NewIntFromBigInt(msg.GetFee())))
238238
builder.SetFeeAmount(fees)
239239
builder.SetGasLimit(msg.GetGas())
240240

@@ -250,7 +250,7 @@ func (suite *AnteTestSuite) CreateTestTxBuilder(
250250
SignMode: defaultSignMode,
251251
Signature: nil,
252252
},
253-
Sequence: txData.GetNonce(),
253+
Sequence: txData.Nonce(),
254254
}
255255

256256
sigsV2 := []signing.SignatureV2{sigV2}
@@ -263,12 +263,12 @@ func (suite *AnteTestSuite) CreateTestTxBuilder(
263263
signerData := authsigning.SignerData{
264264
ChainID: suite.ctx.ChainID(),
265265
AccountNumber: accNum,
266-
Sequence: txData.GetNonce(),
266+
Sequence: txData.Nonce(),
267267
}
268268
sigV2, err = tx.SignWithPrivKey(
269269
suite.ctx,
270270
defaultSignMode, signerData,
271-
txBuilder, priv, suite.clientCtx.TxConfig, txData.GetNonce(),
271+
txBuilder, priv, suite.clientCtx.TxConfig, txData.Nonce(),
272272
)
273273
suite.Require().NoError(err)
274274

app/signer.go

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -28,14 +28,10 @@ func (s EthSignerExtractionAdapter) GetSigners(tx sdk.Tx) ([]mempool.SignerData,
2828
if len(opts) > 0 && opts[0].GetTypeUrl() == "/ethermint.evm.v1.ExtensionOptionsEthereumTx" {
2929
for _, msg := range tx.GetMsgs() {
3030
if ethMsg, ok := msg.(*evmtypes.MsgEthereumTx); ok {
31-
txData, err := evmtypes.UnpackTxData(ethMsg.Data)
32-
if err != nil {
33-
return nil, err
34-
}
3531
return []mempool.SignerData{
3632
mempool.NewSignerData(
37-
sdk.AccAddress(ethMsg.From),
38-
txData.GetNonce(),
33+
ethMsg.GetFrom(),
34+
ethMsg.AsTransaction().Nonce(),
3935
),
4036
}, nil
4137
}

go.mod

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -253,7 +253,8 @@ replace (
253253
// use cosmos keyring
254254
github.com/99designs/keyring => github.com/cosmos/keyring v1.2.0
255255
github.com/cockroachdb/pebble => github.com/cockroachdb/pebble v0.0.0-20230209160836-829675f94811
256-
github.com/ethereum/go-ethereum => github.com/crypto-org-chain/go-ethereum v1.10.20-0.20231207063621-43cf32d91c3e
256+
// release/v1.11.x
257+
github.com/ethereum/go-ethereum => github.com/crypto-org-chain/go-ethereum v1.10.20-0.20240425065928-ebb09502e7a7
257258
// Fix upstream GHSA-h395-qcrw-5vmq vulnerability.
258259
// TODO Remove it: https://github.com/cosmos/cosmos-sdk/issues/10409
259260
github.com/gin-gonic/gin => github.com/gin-gonic/gin v1.7.0

go.sum

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -421,8 +421,8 @@ github.com/crypto-org-chain/cosmos-sdk/x/tx v0.0.0-20240415105151-0108877a3201 h
421421
github.com/crypto-org-chain/cosmos-sdk/x/tx v0.0.0-20240415105151-0108877a3201/go.mod h1:CBCU6fsRVz23QGFIQBb1DNX2DztJCf3jWyEkHY2nJQ0=
422422
github.com/crypto-org-chain/go-block-stm v0.0.0-20240408011717-9f11af197bde h1:sQIHTJfVt5VTrF7po9eZiFkZiPjlHbFvnXtGCOoBjNM=
423423
github.com/crypto-org-chain/go-block-stm v0.0.0-20240408011717-9f11af197bde/go.mod h1:iwQTX9xMX8NV9k3o2BiWXA0SswpsZrDk5q3gA7nWYiE=
424-
github.com/crypto-org-chain/go-ethereum v1.10.20-0.20231207063621-43cf32d91c3e h1:vnyepPQ/m25+19xcTuBUdRxmltZ/EjVWNqEjhg7Ummk=
425-
github.com/crypto-org-chain/go-ethereum v1.10.20-0.20231207063621-43cf32d91c3e/go.mod h1:+a8pUj1tOyJ2RinsNQD4326YS+leSoKGiG/uVVb0x6Y=
424+
github.com/crypto-org-chain/go-ethereum v1.10.20-0.20240425065928-ebb09502e7a7 h1:V43F3JFcqG4MUThf9W/DytnPblpR6CcaLBw2Wx6zTgE=
425+
github.com/crypto-org-chain/go-ethereum v1.10.20-0.20240425065928-ebb09502e7a7/go.mod h1:+a8pUj1tOyJ2RinsNQD4326YS+leSoKGiG/uVVb0x6Y=
426426
github.com/danieljoos/wincred v1.2.0 h1:ozqKHaLK0W/ii4KVbbvluM91W2H3Sh0BncbUNPS7jLE=
427427
github.com/danieljoos/wincred v1.2.0/go.mod h1:FzQLLMKBFdvu+osBrnFODiv32YGwCfx0SkRa/eYHgec=
428428
github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=

0 commit comments

Comments
 (0)