OSDN Git Service

Dpos process block (#69)
[bytom/vapor.git] / database / store.go
index c037b32..d218f0b 100644 (file)
@@ -136,7 +136,7 @@ func (s *Store) GetStoreStatus() *protocol.BlockStoreState {
 func (s *Store) GetVoteResult(seq uint64) (*state.VoteResult, error) {
        data := s.db.Get(calcVoteResultKey(seq))
        if data == nil {
-               return nil, errors.New("can't find the vote result by given sequence")
+               return nil, protocol.ErrNotFoundVoteResult
        }
 
        vr := &state.VoteResult{}
@@ -224,13 +224,22 @@ func (s *Store) SaveBlock(block *types.Block, ts *bc.TransactionStatus) error {
 }
 
 // SaveChainStatus save the core's newest status && delete old status
-func (s *Store) SaveChainStatus(node *state.BlockNode, view *state.UtxoViewpoint) error {
+func (s *Store) SaveChainStatus(node, irreversibleNode *state.BlockNode, view *state.UtxoViewpoint, voteMap map[uint64]*state.VoteResult) error {
        batch := s.db.NewBatch()
        if err := saveUtxoView(batch, view); err != nil {
                return err
        }
 
-       bytes, err := json.Marshal(protocol.BlockStoreState{Height: node.Height, Hash: &node.Hash})
+       if err := saveVoteResult(batch, voteMap); err != nil {
+               return err
+       }
+
+       bytes, err := json.Marshal(protocol.BlockStoreState{
+               Height:             node.Height,
+               Hash:               &node.Hash,
+               IrreversibleHeight: irreversibleNode.Height,
+               IrreversibleHash:   &irreversibleNode.Hash,
+       })
        if err != nil {
                return err
        }
@@ -240,13 +249,15 @@ func (s *Store) SaveChainStatus(node *state.BlockNode, view *state.UtxoViewpoint
        return nil
 }
 
-// SaveVoteResult update the voting results generated by each irreversible block
-func (s *Store) SaveVoteResult(vr *state.VoteResult) error {
-       bytes, err := json.Marshal(vr)
-       if err != nil {
-               return err
-       }
+// saveVoteResult update the voting results generated by each irreversible block
+func saveVoteResult(batch dbm.Batch, voteMap map[uint64]*state.VoteResult) error {
+       for _, vote := range voteMap {
+               bytes, err := json.Marshal(vote)
+               if err != nil {
+                       return err
+               }
 
-       s.db.Set(calcVoteResultKey(vr.Seq), bytes)
+               batch.Set(calcVoteResultKey(vote.Seq), bytes)
+       }
        return nil
 }