forked from TrueCloudLab/neoneo-go
Merge pull request #557 from nspcc-dev/fix-mempool-verify
core: fix and speed up mempool Verify()
This commit is contained in:
commit
5f40b6a93c
2 changed files with 35 additions and 15 deletions
|
@ -287,23 +287,17 @@ func (mp *MemPool) GetVerifiedTransactions() []*transaction.Transaction {
|
||||||
// If yes, the transaction tx is not a valid transaction and the function return false.
|
// If yes, the transaction tx is not a valid transaction and the function return false.
|
||||||
// If no, the transaction tx is a valid transaction and the function return true.
|
// If no, the transaction tx is a valid transaction and the function return true.
|
||||||
func (mp MemPool) Verify(tx *transaction.Transaction) bool {
|
func (mp MemPool) Verify(tx *transaction.Transaction) bool {
|
||||||
count := 0
|
mp.lock.RLock()
|
||||||
inputs := make([]*transaction.Input, 0)
|
defer mp.lock.RUnlock()
|
||||||
for _, item := range mp.GetVerifiedTransactions() {
|
for _, item := range mp.unsortedTxn {
|
||||||
if tx.Hash().Equals(item.Hash()) {
|
for i := range item.txn.Inputs {
|
||||||
for i := range item.Inputs {
|
|
||||||
inputs = append(inputs, &item.Inputs[i])
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for i := 0; i < len(inputs); i++ {
|
|
||||||
for j := 0; j < len(tx.Inputs); j++ {
|
for j := 0; j < len(tx.Inputs); j++ {
|
||||||
if inputs[i].PrevHash.Equals(tx.Inputs[j].PrevHash) {
|
if item.txn.Inputs[i] == tx.Inputs[j] {
|
||||||
count++
|
return false
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return count == 0
|
return true
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,6 +4,7 @@ import (
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/CityOfZion/neo-go/pkg/core/transaction"
|
"github.com/CityOfZion/neo-go/pkg/core/transaction"
|
||||||
|
"github.com/CityOfZion/neo-go/pkg/internal/random"
|
||||||
"github.com/CityOfZion/neo-go/pkg/util"
|
"github.com/CityOfZion/neo-go/pkg/util"
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
|
@ -62,3 +63,28 @@ func TestMemPoolAddRemove(t *testing.T) {
|
||||||
fs.lowPriority = true
|
fs.lowPriority = true
|
||||||
t.Run("high priority", func(t *testing.T) { testMemPoolAddRemoveWithFeer(t, fs) })
|
t.Run("high priority", func(t *testing.T) { testMemPoolAddRemoveWithFeer(t, fs) })
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestMemPoolVerify(t *testing.T) {
|
||||||
|
mp := NewMemPool(10)
|
||||||
|
tx := newMinerTX()
|
||||||
|
inhash1 := random.Uint256()
|
||||||
|
tx.Inputs = append(tx.Inputs, transaction.Input{PrevHash: inhash1, PrevIndex: 0})
|
||||||
|
require.Equal(t, true, mp.Verify(tx))
|
||||||
|
item := NewPoolItem(tx, &FeerStub{})
|
||||||
|
require.Equal(t, true, mp.TryAdd(tx.Hash(), item))
|
||||||
|
|
||||||
|
tx2 := newMinerTX()
|
||||||
|
inhash2 := random.Uint256()
|
||||||
|
tx2.Inputs = append(tx2.Inputs, transaction.Input{PrevHash: inhash2, PrevIndex: 0})
|
||||||
|
require.Equal(t, true, mp.Verify(tx2))
|
||||||
|
item = NewPoolItem(tx2, &FeerStub{})
|
||||||
|
require.Equal(t, true, mp.TryAdd(tx2.Hash(), item))
|
||||||
|
|
||||||
|
tx3 := newMinerTX()
|
||||||
|
// Different index number, but the same PrevHash as in tx1.
|
||||||
|
tx3.Inputs = append(tx3.Inputs, transaction.Input{PrevHash: inhash1, PrevIndex: 1})
|
||||||
|
require.Equal(t, true, mp.Verify(tx3))
|
||||||
|
// The same input as in tx2.
|
||||||
|
tx3.Inputs = append(tx3.Inputs, transaction.Input{PrevHash: inhash2, PrevIndex: 0})
|
||||||
|
require.Equal(t, false, mp.Verify(tx3))
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue