Skip to content

Commit

Permalink
fix: align signer extraction adapter for mempool remove (#19759)
Browse files Browse the repository at this point in the history
  • Loading branch information
mmsqe committed Mar 18, 2024
1 parent 5a733e8 commit 26c1db6
Show file tree
Hide file tree
Showing 3 changed files with 84 additions and 4 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@ Every module contains its own CHANGELOG.md. Please refer to the module you are i
* (types) [#18768](https://github.com/cosmos/cosmos-sdk/pull/18768) Add MustValAddressFromBech32 function.
* (gRPC) [#19049](https://github.com/cosmos/cosmos-sdk/pull/19049) Add debug log prints for each gRPC request.
* (x/consensus) [#19483](https://github.com/cosmos/cosmos-sdk/pull/19483) Add consensus messages registration to consensus module.
* (types) [#19759](https://github.com/cosmos/cosmos-sdk/pull/19759) Align SignerExtractionAdapter in PriorityNonceMempool Remove.

### Improvements

Expand Down
6 changes: 2 additions & 4 deletions types/mempool/priority_nonce.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,6 @@ import (

"github.com/huandu/skiplist"

"cosmossdk.io/x/auth/signing"

sdk "github.com/cosmos/cosmos-sdk/types"
)

Expand Down Expand Up @@ -433,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
}
Expand All @@ -442,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}
Expand Down
81 changes: 81 additions & 0 deletions types/mempool/priority_nonce_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,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, 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, false, log.NewNopLogger())
Expand Down

0 comments on commit 26c1db6

Please sign in to comment.