diff --git a/blockchain/blockchain.go b/blockchain/blockchain.go index 686641ccaf..9957f871b8 100644 --- a/blockchain/blockchain.go +++ b/blockchain/blockchain.go @@ -45,7 +45,7 @@ type Reader interface { EventFilter(from *felt.Felt, keys [][]felt.Felt) (EventFilterer, error) - Pending() (Pending, error) + Pending() (*Pending, error) Network() *utils.Network } @@ -269,7 +269,7 @@ func (b *Blockchain) TransactionByHash(hash *felt.Felt) (core.Transaction, error // not found in the canonical blocks, try pending if errors.Is(err, db.ErrKeyNotFound) { - var pending Pending + var pending *Pending pending, err = pendingBlock(txn) if err != nil { return err @@ -302,7 +302,7 @@ func (b *Blockchain) Receipt(hash *felt.Felt) (*core.TransactionReceipt, *felt.F // not found in the canonical blocks, try pending if errors.Is(err, db.ErrKeyNotFound) { - var pending Pending + var pending *Pending pending, err = pendingBlock(txn) if err != nil { if !errors.Is(err, ErrPendingBlockNotFound) { @@ -1009,12 +1009,10 @@ func (b *Blockchain) StorePending(pending *Pending) error { }) } -// Todo: -// 2. Consider returning reference to Pending instead of Pending -func pendingBlock(txn db.Transaction) (Pending, error) { +func pendingBlock(txn db.Transaction) (*Pending, error) { pending := cachedPending.Load() if pending == nil { - return Pending{}, ErrPendingBlockNotFound + return nil, ErrPendingBlockNotFound } expectedParentHash := &felt.Zero @@ -1022,19 +1020,19 @@ func pendingBlock(txn db.Transaction) (Pending, error) { expectedParentHash = head.Hash } if pending.Block.ParentHash.Equal(expectedParentHash) { - return *pending, nil + return pending, nil } // Since the pending block in the cache is outdated remove it cachedPending.Store(nil) - return Pending{}, ErrPendingBlockNotFound + return nil, ErrPendingBlockNotFound } // Pending returns the pending block from the database -func (b *Blockchain) Pending() (Pending, error) { +func (b *Blockchain) Pending() (*Pending, error) { b.listener.OnRead("Pending") - var pending Pending + var pending *Pending return pending, b.database.View(func(txn db.Transaction) error { var err error pending, err = pendingBlock(txn) @@ -1055,9 +1053,5 @@ func (b *Blockchain) PendingState() (core.StateReader, StateCloser, error) { return nil, nil, utils.RunAndWrapOnError(txn.Discard, err) } - return NewPendingState( - pending.StateUpdate.StateDiff, - pending.NewClasses, - core.NewState(txn), - ), txn.Discard, nil + return NewPendingState(pending.StateUpdate.StateDiff, pending.NewClasses, core.NewState(txn)), txn.Discard, nil } diff --git a/blockchain/blockchain_test.go b/blockchain/blockchain_test.go index cf5ce5c220..a368071366 100644 --- a/blockchain/blockchain_test.go +++ b/blockchain/blockchain_test.go @@ -706,11 +706,11 @@ func TestPending(t *testing.T) { }) t.Run("store genesis as pending", func(t *testing.T) { - pendingGenesis := blockchain.Pending{ + pendingGenesis := &blockchain.Pending{ Block: b, StateUpdate: su, } - require.NoError(t, chain.StorePending(&pendingGenesis)) + require.NoError(t, chain.StorePending(pendingGenesis)) gotPending, pErr := chain.Pending() require.NoError(t, pErr) @@ -739,11 +739,11 @@ func TestPending(t *testing.T) { su, err = gw.StateUpdate(context.Background(), 1) require.NoError(t, err) - expectedPending := blockchain.Pending{ + expectedPending := &blockchain.Pending{ Block: b, StateUpdate: su, } - require.NoError(t, chain.StorePending(&expectedPending)) + require.NoError(t, chain.StorePending(expectedPending)) gotPending, pErr := chain.Pending() require.NoError(t, pErr) diff --git a/mocks/mock_blockchain.go b/mocks/mock_blockchain.go index b42b38232f..d1e04cf1d3 100644 --- a/mocks/mock_blockchain.go +++ b/mocks/mock_blockchain.go @@ -239,10 +239,10 @@ func (mr *MockReaderMockRecorder) Network() *gomock.Call { } // Pending mocks base method. -func (m *MockReader) Pending() (blockchain.Pending, error) { +func (m *MockReader) Pending() (*blockchain.Pending, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Pending") - ret0, _ := ret[0].(blockchain.Pending) + ret0, _ := ret[0].(*blockchain.Pending) ret1, _ := ret[1].(error) return ret0, ret1 } diff --git a/rpc/block_test.go b/rpc/block_test.go index 99af2bf3d9..ad91475d4f 100644 --- a/rpc/block_test.go +++ b/rpc/block_test.go @@ -215,7 +215,7 @@ func TestBlockTransactionCount(t *testing.T) { t.Run("blockID - pending", func(t *testing.T) { latestBlock.Hash = nil latestBlock.GlobalStateRoot = nil - mockReader.EXPECT().Pending().Return(blockchain.Pending{ + mockReader.EXPECT().Pending().Return(&blockchain.Pending{ Block: latestBlock, }, nil) @@ -333,7 +333,7 @@ func TestBlockWithTxHashes(t *testing.T) { t.Run("blockID - pending", func(t *testing.T) { latestBlock.Hash = nil latestBlock.GlobalStateRoot = nil - mockReader.EXPECT().Pending().Return(blockchain.Pending{ + mockReader.EXPECT().Pending().Return(&blockchain.Pending{ Block: latestBlock, }, nil) mockReader.EXPECT().L1Head().Return(nil, db.ErrKeyNotFound) @@ -470,7 +470,7 @@ func TestBlockWithTxs(t *testing.T) { t.Run("blockID - pending", func(t *testing.T) { latestBlock.Hash = nil latestBlock.GlobalStateRoot = nil - mockReader.EXPECT().Pending().Return(blockchain.Pending{ + mockReader.EXPECT().Pending().Return(&blockchain.Pending{ Block: latestBlock, }, nil).Times(2) mockReader.EXPECT().L1Head().Return(nil, db.ErrKeyNotFound).Times(2) diff --git a/rpc/helpers.go b/rpc/helpers.go index 1dc3a5cbfb..0d154b3e95 100644 --- a/rpc/helpers.go +++ b/rpc/helpers.go @@ -38,9 +38,11 @@ func (h *Handler) blockByID(id *BlockID) (*core.Block, *jsonrpc.Error) { case id.Hash != nil: block, err = h.bcReader.BlockByHash(id.Hash) case id.Pending: - var pending blockchain.Pending + var pending *blockchain.Pending pending, err = h.bcReader.Pending() - block = pending.Block + if err == nil { + block = pending.Block + } default: block, err = h.bcReader.BlockByNumber(id.Number) } @@ -66,9 +68,9 @@ func (h *Handler) blockHeaderByID(id *BlockID) (*core.Header, *jsonrpc.Error) { case id.Hash != nil: header, err = h.bcReader.BlockHeaderByHash(id.Hash) case id.Pending: - var pending blockchain.Pending + var pending *blockchain.Pending pending, err = h.bcReader.Pending() - if pending.Block != nil { + if err == nil { header = pending.Block.Header } default: diff --git a/rpc/state_update.go b/rpc/state_update.go index d9b2fb3199..25a4677889 100644 --- a/rpc/state_update.go +++ b/rpc/state_update.go @@ -75,7 +75,7 @@ func (h *Handler) StateUpdate(id BlockID) (*StateUpdate, *jsonrpc.Error) { update, err = h.bcReader.StateUpdateByNumber(height) } } else if id.Pending { - var pending blockchain.Pending + var pending *blockchain.Pending pending, err = h.bcReader.Pending() if err == nil { update = pending.StateUpdate diff --git a/rpc/state_update_test.go b/rpc/state_update_test.go index 94ca90e84d..718a424c16 100644 --- a/rpc/state_update_test.go +++ b/rpc/state_update_test.go @@ -139,7 +139,7 @@ func TestStateUpdate(t *testing.T) { t.Run("pending", func(t *testing.T) { update21656.BlockHash = nil update21656.NewRoot = nil - mockReader.EXPECT().Pending().Return(blockchain.Pending{ + mockReader.EXPECT().Pending().Return(&blockchain.Pending{ StateUpdate: update21656, }, nil) diff --git a/rpc/transaction_test.go b/rpc/transaction_test.go index 8de3400ee9..227de333d5 100644 --- a/rpc/transaction_test.go +++ b/rpc/transaction_test.go @@ -470,7 +470,7 @@ func TestTransactionByBlockIdAndIndex(t *testing.T) { latestBlock.Hash = nil latestBlock.GlobalStateRoot = nil - mockReader.EXPECT().Pending().Return(blockchain.Pending{ + mockReader.EXPECT().Pending().Return(&blockchain.Pending{ Block: latestBlock, }, nil) mockReader.EXPECT().TransactionByHash(latestBlock.Transactions[index].Hash()).DoAndReturn(