fix: align signer extraction adapter for mempool remove (backport #19759) (#19773)

Co-authored-by: mmsqe <mavis@crypto.com>
Co-authored-by: marbar3778 <marbar3778@yahoo.com>
This commit is contained in:
mergify[bot] 2024-03-18 12:16:07 +00:00 committed by GitHub
parent 6977c223b2
commit 9a59234c42
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 87 additions and 3 deletions

View File

@ -42,6 +42,10 @@ Ref: https://keepachangelog.com/en/1.0.0/
* (crypto) [#19691](https://github.com/cosmos/cosmos-sdk/pull/19745) Fix tx sign doesn't throw an error when incorrect Ledger is used.
### Features
* (types) [#19759](https://github.com/cosmos/cosmos-sdk/pull/19759) Align SignerExtractionAdapter in PriorityNonceMempool Remove.
## [v0.50.5](https://github.com/cosmos/cosmos-sdk/releases/tag/v0.50.5) - 2024-03-12
### Features

View File

@ -9,7 +9,6 @@ import (
"github.com/huandu/skiplist"
sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/cosmos/cosmos-sdk/x/auth/signing"
)
var (
@ -432,7 +431,7 @@ func (mp *PriorityNonceMempool[C]) CountTx() int {
func (mp *PriorityNonceMempool[C]) Remove(tx sdk.Tx) error {
mp.mtx.Lock()
defer mp.mtx.Unlock()
sigs, err := tx.(signing.SigVerifiableTx).GetSignaturesV2()
sigs, err := mp.cfg.SignerExtractor.GetSigners(tx)
if err != nil {
return err
}
@ -441,7 +440,7 @@ func (mp *PriorityNonceMempool[C]) Remove(tx sdk.Tx) error {
}
sig := sigs[0]
sender := sdk.AccAddress(sig.PubKey.Address()).String()
sender := sig.Signer.String()
nonce := sig.Sequence
scoreKey := txMeta[C]{nonce: nonce, sender: sender}

View File

@ -60,6 +60,87 @@ func TestOutOfOrder(t *testing.T) {
require.Error(t, validateOrder(rmtxs))
}
type signerExtractionAdapter struct {
UseOld bool
}
func (a signerExtractionAdapter) GetSigners(tx sdk.Tx) ([]mempool.SignerData, error) {
if !a.UseOld {
return mempool.NewDefaultSignerExtractionAdapter().GetSigners(tx)
}
sigs, err := tx.(signing.SigVerifiableTx).GetSignaturesV2()
if err != nil {
return nil, err
}
signerData := make([]mempool.SignerData, len(sigs))
for _, sig := range sigs {
signerData = append(signerData, mempool.SignerData{
Signer: sig.PubKey.Address().Bytes(),
Sequence: sig.Sequence,
})
}
return signerData, nil
}
func (s *MempoolTestSuite) TestPriorityNonceTxOrderWithAdapter() {
t := s.T()
ctx := sdk.NewContext(nil, cmtproto.Header{}, false, log.NewNopLogger())
accounts := simtypes.RandomAccounts(rand.New(rand.NewSource(0)), 5)
sa := accounts[0].Address
sb := accounts[1].Address
tests := []struct {
txs []txSpec
order []int
fail bool
}{
{
txs: []txSpec{
{p: 21, n: 4, a: sa},
{p: 8, n: 3, a: sa},
{p: 6, n: 2, a: sa},
{p: 15, n: 1, a: sb},
{p: 20, n: 1, a: sa},
},
order: []int{4, 3, 2, 1, 0},
},
}
for i, tt := range tests {
t.Run(fmt.Sprintf("case %d", i), func(t *testing.T) {
adapter := signerExtractionAdapter{}
pool := mempool.NewPriorityMempool(mempool.PriorityNonceMempoolConfig[int64]{
TxPriority: mempool.NewDefaultTxPriority(),
SignerExtractor: adapter,
})
// create test txs and insert into mempool
for i, ts := range tt.txs {
tx := testTx{id: i, priority: int64(ts.p), nonce: uint64(ts.n), address: ts.a}
c := ctx.WithPriority(tx.priority)
err := pool.Insert(c, tx)
require.NoError(t, err)
}
orderedTxs := fetchTxs(pool.Select(ctx, nil), 1000)
var txOrder []int
for _, tx := range orderedTxs {
txOrder = append(txOrder, tx.(testTx).id)
}
require.Equal(t, tt.order, txOrder)
require.NoError(t, validateOrder(orderedTxs))
adapter.UseOld = true
for _, tx := range orderedTxs {
require.NoError(t, pool.Remove(tx))
}
require.NoError(t, mempool.IsEmpty[int64](pool))
})
}
}
func (s *MempoolTestSuite) TestPriorityNonceTxOrder() {
t := s.T()
ctx := sdk.NewContext(nil, cmtproto.Header{}, false, log.NewNopLogger())