forked from TrueCloudLab/neoneo-go
core: don't reverify mempooled transactions in AddBlock
The end effect is almost as if `VerifyTransactions: false` was set in the config, but without actually compromising the guarantees provided by it. It almost doubles performance for single-mode benchmarks and makes block processing smoother (more smaller blocks are being produced).
This commit is contained in:
parent
187a2d14b1
commit
3a379e4f3e
2 changed files with 43 additions and 0 deletions
|
@ -437,6 +437,12 @@ func (bc *Blockchain) AddBlock(block *block.Block) error {
|
|||
}
|
||||
if bc.config.VerifyTransactions {
|
||||
for _, tx := range block.Transactions {
|
||||
// Transactions are verified before adding them
|
||||
// into the pool, so there is no point in doing
|
||||
// it again even if we're verifying in-block transactions.
|
||||
if bc.memPool.ContainsKey(tx.Hash()) {
|
||||
continue
|
||||
}
|
||||
err := bc.VerifyTx(tx, block)
|
||||
if err != nil {
|
||||
return fmt.Errorf("transaction %s failed to verify: %w", tx.Hash().StringLE(), err)
|
||||
|
|
|
@ -117,6 +117,43 @@ func TestAddBlock(t *testing.T) {
|
|||
assert.Equal(t, lastBlock.Hash(), bc.CurrentHeaderHash())
|
||||
}
|
||||
|
||||
func TestAddBadBlock(t *testing.T) {
|
||||
bc := newTestChain(t)
|
||||
defer bc.Close()
|
||||
// It has ValidUntilBlock == 0, which is wrong
|
||||
tx := transaction.New(netmode.UnitTestNet, []byte{byte(opcode.PUSH1)}, 0)
|
||||
tx.Signers = []transaction.Signer{{
|
||||
Account: testchain.MultisigScriptHash(),
|
||||
Scopes: transaction.FeeOnly,
|
||||
}}
|
||||
require.NoError(t, signTx(bc, tx))
|
||||
b1 := bc.newBlock(tx)
|
||||
|
||||
require.Error(t, bc.AddBlock(b1))
|
||||
bc.config.VerifyTransactions = false
|
||||
require.NoError(t, bc.AddBlock(b1))
|
||||
|
||||
b2 := bc.newBlock()
|
||||
b2.PrevHash = util.Uint256{}
|
||||
|
||||
require.Error(t, bc.AddBlock(b2))
|
||||
bc.config.VerifyBlocks = false
|
||||
require.NoError(t, bc.AddBlock(b2))
|
||||
|
||||
tx = transaction.New(netmode.UnitTestNet, []byte{byte(opcode.PUSH1)}, 0)
|
||||
tx.ValidUntilBlock = 128
|
||||
tx.Signers = []transaction.Signer{{
|
||||
Account: testchain.MultisigScriptHash(),
|
||||
Scopes: transaction.FeeOnly,
|
||||
}}
|
||||
require.NoError(t, signTx(bc, tx))
|
||||
require.NoError(t, bc.PoolTx(tx))
|
||||
bc.config.VerifyTransactions = true
|
||||
bc.config.VerifyBlocks = true
|
||||
b3 := bc.newBlock(tx)
|
||||
require.NoError(t, bc.AddBlock(b3))
|
||||
}
|
||||
|
||||
func TestScriptFromWitness(t *testing.T) {
|
||||
witness := &transaction.Witness{}
|
||||
h := util.Uint160{1, 2, 3}
|
||||
|
|
Loading…
Reference in a new issue