OSDN Git Service

remove finalized block header (#1979)
authorPoseidon <shenao.78@163.com>
Fri, 18 Jun 2021 09:45:44 +0000 (17:45 +0800)
committerGitHub <noreply@github.com>
Fri, 18 Jun 2021 09:45:44 +0000 (17:45 +0800)
database/store.go
database/store_test.go
protocol/auth_verification_test.go
protocol/block.go
protocol/protocol.go
protocol/store.go
protocol/txpool_test.go
test/utxo_view/utxo_view_test.go

index 9b70b29..01524f2 100644 (file)
@@ -196,7 +196,7 @@ func (s *Store) GetStoreStatus() *protocol.BlockStoreState {
 }
 
 // SaveChainStatus save the core's newest status && delete old status
-func (s *Store) SaveChainStatus(blockHeader, finalizedBlockHeader *types.BlockHeader, mainBlockHeaders []*types.BlockHeader, view *state.UtxoViewpoint, contractView *state.ContractViewpoint) error {
+func (s *Store) SaveChainStatus(blockHeader *types.BlockHeader, mainBlockHeaders []*types.BlockHeader, view *state.UtxoViewpoint, contractView *state.ContractViewpoint, finalizedHeight uint64, finalizedHash *bc.Hash) error {
        batch := s.db.NewBatch()
        if err := saveUtxoView(batch, view); err != nil {
                return err
@@ -211,13 +211,12 @@ func (s *Store) SaveChainStatus(blockHeader, finalizedBlockHeader *types.BlockHe
        }
 
        blockHeaderHash := blockHeader.Hash()
-       finalizedHash := finalizedBlockHeader.Hash()
        bytes, err := json.Marshal(
                protocol.BlockStoreState{
                        Height:          blockHeader.Height,
                        Hash:            &blockHeaderHash,
-                       FinalizedHeight: finalizedBlockHeader.Height,
-                       FinalizedHash:   &finalizedHash,
+                       FinalizedHeight: finalizedHeight,
+                       FinalizedHash:   finalizedHash,
                })
        if err != nil {
                return err
index 085bade..7a6a0c1 100644 (file)
@@ -30,11 +30,11 @@ func TestSaveChainStatus(t *testing.T) {
        }
 
        contractView := state.NewContractViewpoint()
-       if err := store.SaveChainStatus(blockHeader, blockHeader, []*types.BlockHeader{blockHeader}, view, contractView); err != nil {
+       if err := store.SaveChainStatus(blockHeader, []*types.BlockHeader{blockHeader}, view, contractView, 0, &bc.Hash{}); err != nil {
                t.Fatal(err)
        }
 
-       expectStatus := &protocol.BlockStoreState{Height: blockHeader.Height, Hash: &blockHash, FinalizedHeight: blockHeader.Height, FinalizedHash: &blockHash}
+       expectStatus := &protocol.BlockStoreState{Height: blockHeader.Height, Hash: &blockHash, FinalizedHeight: 0, FinalizedHash: &bc.Hash{}}
        if !testutil.DeepEqual(store.GetStoreStatus(), expectStatus) {
                t.Errorf("got block status:%v, expect block status:%v", store.GetStoreStatus(), expectStatus)
        }
index 98d7759..f5ed51a 100644 (file)
@@ -108,7 +108,7 @@ func (s *mockStore2) GetMainChainHash(uint64) (*bc.Hash, error)                {
 func (s *mockStore2) GetContract([32]byte) ([]byte, error)                     { return nil, nil }
 func (s *mockStore2) SaveBlock(*types.Block) error                             { return nil }
 func (s *mockStore2) SaveBlockHeader(*types.BlockHeader) error                 { return nil }
-func (s *mockStore2) SaveChainStatus(*types.BlockHeader, *types.BlockHeader, []*types.BlockHeader, *state.UtxoViewpoint, *state.ContractViewpoint) error {
+func (s *mockStore2) SaveChainStatus(*types.BlockHeader, []*types.BlockHeader, *state.UtxoViewpoint, *state.ContractViewpoint, uint64, *bc.Hash) error {
        return nil
 }
 func (s *mockStore2) GetBlockHeader(hash *bc.Hash) (*types.BlockHeader, error) {
index 15fd092..2c42b35 100644 (file)
@@ -118,16 +118,7 @@ func (c *Chain) connectBlock(block *types.Block) (err error) {
                return err
        }
 
-       finalizedBlockHeader := c.finalizedBlockHeader
-       lastJustifiedHeader, err := c.LastJustifiedHeader()
-       if err != nil {
-               return err
-       }
-
-       if block.Height > lastJustifiedHeader.Height {
-               finalizedBlockHeader = &block.BlockHeader
-       }
-       if err := c.setState(&block.BlockHeader, finalizedBlockHeader, []*types.BlockHeader{&block.BlockHeader}, utxoView, contractView); err != nil {
+       if err := c.setState(&block.BlockHeader, []*types.BlockHeader{&block.BlockHeader}, utxoView, contractView); err != nil {
                return err
        }
 
@@ -174,7 +165,6 @@ func (c *Chain) reorganizeChain(blockHeader *types.BlockHeader) error {
        }
 
        txsToRemove := map[bc.Hash]*types.Tx{}
-       finalizedBlockHeader := c.finalizedBlockHeader
        for _, attachNode := range attachNodes {
                hash := attachNode.Hash()
                b, err := c.store.GetBlock(&hash)
@@ -195,15 +185,6 @@ func (c *Chain) reorganizeChain(blockHeader *types.BlockHeader) error {
                        return err
                }
 
-               lastJustifiedHeader, err := c.LastJustifiedHeader()
-               if err != nil {
-                       return err
-               }
-
-               if attachBlock.Height > lastJustifiedHeader.Height {
-                       finalizedBlockHeader = attachNode
-               }
-
                for _, tx := range b.Transactions {
                        if _, ok := txsToRestore[tx.ID]; !ok {
                                txsToRemove[tx.ID] = tx
@@ -215,7 +196,7 @@ func (c *Chain) reorganizeChain(blockHeader *types.BlockHeader) error {
                log.WithFields(log.Fields{"module": logModule, "height": attachNode.Height, "hash": hash.String()}).Debug("attach from mainchain")
        }
 
-       if err := c.setState(blockHeader, finalizedBlockHeader, []*types.BlockHeader{blockHeader}, utxoView, contractView); err != nil {
+       if err := c.setState(blockHeader, []*types.BlockHeader{blockHeader}, utxoView, contractView); err != nil {
                return err
        }
 
index ea43150..36a3ad2 100644 (file)
@@ -32,7 +32,6 @@ type Chain struct {
 
        cond                 sync.Cond
        bestBlockHeader      *types.BlockHeader // the last block on current main chain
-       finalizedBlockHeader *types.BlockHeader
 }
 
 // NewChain returns a new Chain using store as the underlying storage.
@@ -65,11 +64,6 @@ func NewChainWithOrphanManage(store Store, txPool *TxPool, manage *OrphanManage,
                return nil, err
        }
 
-       c.finalizedBlockHeader, err = c.store.GetBlockHeader(storeStatus.FinalizedHash)
-       if err != nil {
-               return nil, err
-       }
-
        casper, err := newCasper(store, storeStatus, c.processRollbackCh)
        if err != nil {
                return nil, err
@@ -105,7 +99,7 @@ func (c *Chain) initChainStatus() error {
 
        contractView := state.NewContractViewpoint()
        genesisBlockHeader := &genesisBlock.BlockHeader
-       return c.store.SaveChainStatus(genesisBlockHeader, genesisBlockHeader, []*types.BlockHeader{genesisBlockHeader}, utxoView, contractView)
+       return c.store.SaveChainStatus(genesisBlockHeader, []*types.BlockHeader{genesisBlockHeader}, utxoView, contractView, 0, &checkpoint.Hash)
 }
 
 func newCasper(store Store, storeStatus *BlockStoreState, rollbackCh chan *rollbackMsg) (*Casper, error) {
@@ -212,8 +206,9 @@ func (c *Chain) SignBlockHeader(blockHeader *types.BlockHeader) {
 }
 
 // This function must be called with mu lock in above level
-func (c *Chain) setState(blockHeader, finalizedBlockHeader *types.BlockHeader, mainBlockHeaders []*types.BlockHeader, view *state.UtxoViewpoint, contractView *state.ContractViewpoint) error {
-       if err := c.store.SaveChainStatus(blockHeader, finalizedBlockHeader, mainBlockHeaders, view, contractView); err != nil {
+func (c *Chain) setState(blockHeader *types.BlockHeader, mainBlockHeaders []*types.BlockHeader, view *state.UtxoViewpoint, contractView *state.ContractViewpoint) error {
+       finalizedHeight, finalizedHash := c.casper.LastFinalized()
+       if err := c.store.SaveChainStatus(blockHeader, mainBlockHeaders, view, contractView, finalizedHeight, &finalizedHash); err != nil {
                return err
        }
 
@@ -221,7 +216,6 @@ func (c *Chain) setState(blockHeader, finalizedBlockHeader *types.BlockHeader, m
        defer c.cond.L.Unlock()
 
        c.bestBlockHeader = blockHeader
-       c.finalizedBlockHeader = finalizedBlockHeader
 
        hash := c.bestBlockHeader.Hash()
        log.WithFields(log.Fields{"module": logModule, "height": c.bestBlockHeader.Height, "hash": hash.String()}).Debug("chain best status has been update")
index 52ad8d7..4b8a5f2 100644 (file)
@@ -26,7 +26,7 @@ type Store interface {
 
        SaveBlock(*types.Block) error
        SaveBlockHeader(*types.BlockHeader) error
-       SaveChainStatus(*types.BlockHeader, *types.BlockHeader, []*types.BlockHeader, *state.UtxoViewpoint, *state.ContractViewpoint) error
+       SaveChainStatus(*types.BlockHeader, []*types.BlockHeader, *state.UtxoViewpoint, *state.ContractViewpoint, uint64, *bc.Hash) error
 }
 
 // BlockStoreState represents the core's db status
index e19ff25..d27c3bc 100644 (file)
@@ -113,7 +113,7 @@ func (s *mockStore) GetMainChainHash(uint64) (*bc.Hash, error)                {
 func (s *mockStore) GetContract(hash [32]byte) ([]byte, error)                { return nil, nil }
 func (s *mockStore) SaveBlock(*types.Block) error                             { return nil }
 func (s *mockStore) SaveBlockHeader(*types.BlockHeader) error                 { return nil }
-func (s *mockStore) SaveChainStatus(*types.BlockHeader, *types.BlockHeader, []*types.BlockHeader, *state.UtxoViewpoint, *state.ContractViewpoint) error {
+func (s *mockStore) SaveChainStatus(*types.BlockHeader, []*types.BlockHeader, *state.UtxoViewpoint, *state.ContractViewpoint, uint64, *bc.Hash) error {
        return nil
 }
 
@@ -612,12 +612,12 @@ func (s *mockStore1) GetTransactionsUtxo(utxoView *state.UtxoViewpoint, tx []*bc
        }
        return nil
 }
-func (s *mockStore1) GetUtxo(*bc.Hash) (*storage.UtxoEntry, error) { return nil, nil }
-func (s *mockStore1) GetMainChainHash(uint64) (*bc.Hash, error)    { return nil, nil }
-func (s *mockStore1) GetContract(hash [32]byte) ([]byte, error)    { return nil, nil }
-func (s *mockStore1) SaveBlock(*types.Block) error                 { return nil }
-func (s *mockStore1) SaveBlockHeader(*types.BlockHeader) error     { return nil }
-func (s *mockStore1) SaveChainStatus(*types.BlockHeader, *types.BlockHeader, []*types.BlockHeader, *state.UtxoViewpoint, *state.ContractViewpoint) error {
+func (s *mockStore1) GetUtxo(*bc.Hash) (*storage.UtxoEntry, error)     { return nil, nil }
+func (s *mockStore1) GetMainChainHash(uint64) (*bc.Hash, error)        { return nil, nil }
+func (s *mockStore1) GetContract(hash [32]byte) ([]byte, error)        { return nil, nil }
+func (s *mockStore1) SaveBlock(*types.Block) error                     { return nil }
+func (s *mockStore1) SaveBlockHeader(*types.BlockHeader) error         { return nil }
+func (s *mockStore1) SaveChainStatus(*types.BlockHeader, []*types.BlockHeader, *state.UtxoViewpoint, *state.ContractViewpoint, uint64, *bc.Hash) error {
        return nil
 }
 
index a16e010..eb8ea62 100644 (file)
@@ -188,7 +188,7 @@ func TestAttachOrDetachBlocks(t *testing.T) {
                        utxoViewpoint.Entries[k] = v
                }
                contractView := state.NewContractViewpoint()
-               if err := store.SaveChainStatus(mockBlockHeader, mockBlockHeader, []*types.BlockHeader{mockBlockHeader}, utxoViewpoint, contractView); err != nil {
+               if err := store.SaveChainStatus(mockBlockHeader, []*types.BlockHeader{mockBlockHeader}, utxoViewpoint, contractView, 0, &bc.Hash{}); err != nil {
                        t.Error(err)
                }
 
@@ -210,7 +210,7 @@ func TestAttachOrDetachBlocks(t *testing.T) {
                                t.Error(err)
                        }
                }
-               if err := store.SaveChainStatus(mockBlockHeader, mockBlockHeader, []*types.BlockHeader{mockBlockHeader}, utxoViewpoint, contractView); err != nil {
+               if err := store.SaveChainStatus(mockBlockHeader, []*types.BlockHeader{mockBlockHeader}, utxoViewpoint, contractView, 0, &bc.Hash{}); err != nil {
                        t.Error(err)
                }