}
// 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
}
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
}
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)
}
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) {
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
}
}
txsToRemove := map[bc.Hash]*types.Tx{}
- finalizedBlockHeader := c.finalizedBlockHeader
for _, attachNode := range attachNodes {
hash := attachNode.Hash()
b, err := c.store.GetBlock(&hash)
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
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
}
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.
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
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) {
}
// 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
}
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")
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
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
}
}
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
}
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)
}
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)
}