From ac9551040289fe9acb11d3a1560fb7f9b307e75e Mon Sep 17 00:00:00 2001 From: Evgeniy Stratonikov Date: Wed, 10 Mar 2021 12:29:56 +0300 Subject: [PATCH] core: do not return block if only header is present --- pkg/core/blockchain.go | 3 +++ pkg/core/blockchain_test.go | 32 ++++++++++++++++++++++++++++++-- 2 files changed, 33 insertions(+), 2 deletions(-) diff --git a/pkg/core/blockchain.go b/pkg/core/blockchain.go index c8a6bc3b4..5af463146 100644 --- a/pkg/core/blockchain.go +++ b/pkg/core/blockchain.go @@ -1122,6 +1122,9 @@ func (bc *Blockchain) GetBlock(hash util.Uint256) (*block.Block, error) { if err != nil { return nil, err } + if !block.MerkleRoot.Equals(util.Uint256{}) && len(block.Transactions) == 0 { + return nil, errors.New("only header is found") + } for _, tx := range block.Transactions { stx, _, err := bc.dao.GetTransaction(tx.Hash()) if err != nil { diff --git a/pkg/core/blockchain_test.go b/pkg/core/blockchain_test.go index 635f23510..05e2a27a3 100644 --- a/pkg/core/blockchain_test.go +++ b/pkg/core/blockchain_test.go @@ -230,6 +230,33 @@ func TestGetBlock(t *testing.T) { } assert.NoError(t, bc.persist()) } + + t.Run("store only header", func(t *testing.T) { + t.Run("non-empty block", func(t *testing.T) { + tx, err := testchain.NewTransferFromOwner(bc, bc.contracts.NEO.Hash, + random.Uint160(), 1, 1, 1000) + b := bc.newBlock(tx) + require.NoError(t, bc.AddHeaders(&b.Header)) + + _, err = bc.GetBlock(b.Hash()) + require.Error(t, err) + + _, err = bc.GetHeader(b.Hash()) + require.NoError(t, err) + + require.NoError(t, bc.AddBlock(b)) + + _, err = bc.GetBlock(b.Hash()) + require.NoError(t, err) + }) + t.Run("empty block", func(t *testing.T) { + b := bc.newBlock() + require.NoError(t, bc.AddHeaders(&b.Header)) + + _, err = bc.GetBlock(b.Hash()) + require.NoError(t, err) + }) + }) } func (bc *Blockchain) newTestTx(h util.Uint160, script []byte) *transaction.Transaction { @@ -1558,9 +1585,10 @@ func TestRemoveUntraceable(t *testing.T) { require.Error(t, err) _, err = bc.GetAppExecResults(tx1.Hash(), trigger.Application) require.Error(t, err) - b, err := bc.GetBlock(b1.Hash()) + _, err = bc.GetBlock(b1.Hash()) + require.Error(t, err) + _, err = bc.GetHeader(b1.Hash()) require.NoError(t, err) - require.Len(t, b.Transactions, 0) } func TestInvalidNotification(t *testing.T) {