Official Go implementation of the Bytom protocol
Revision | 2eccb08bff712f0e765e41c06c04200348f7ecdf (tree) |
---|---|
Zeit | 2021-06-18 19:00:50 |
Autor | Paladz <yzhu101@uott...> |
Commiter | GitHub |
Merge branch 'btm2.0' into remove_pop_int64
@@ -196,7 +196,7 @@ func (s *Store) GetStoreStatus() *protocol.BlockStoreState { | ||
196 | 196 | } |
197 | 197 | |
198 | 198 | // SaveChainStatus save the core's newest status && delete old status |
199 | -func (s *Store) SaveChainStatus(blockHeader, finalizedBlockHeader *types.BlockHeader, mainBlockHeaders []*types.BlockHeader, view *state.UtxoViewpoint, contractView *state.ContractViewpoint) error { | |
199 | +func (s *Store) SaveChainStatus(blockHeader *types.BlockHeader, mainBlockHeaders []*types.BlockHeader, view *state.UtxoViewpoint, contractView *state.ContractViewpoint, finalizedHeight uint64, finalizedHash *bc.Hash) error { | |
200 | 200 | batch := s.db.NewBatch() |
201 | 201 | if err := saveUtxoView(batch, view); err != nil { |
202 | 202 | return err |
@@ -211,13 +211,12 @@ func (s *Store) SaveChainStatus(blockHeader, finalizedBlockHeader *types.BlockHe | ||
211 | 211 | } |
212 | 212 | |
213 | 213 | blockHeaderHash := blockHeader.Hash() |
214 | - finalizedHash := finalizedBlockHeader.Hash() | |
215 | 214 | bytes, err := json.Marshal( |
216 | 215 | protocol.BlockStoreState{ |
217 | 216 | Height: blockHeader.Height, |
218 | 217 | Hash: &blockHeaderHash, |
219 | - FinalizedHeight: finalizedBlockHeader.Height, | |
220 | - FinalizedHash: &finalizedHash, | |
218 | + FinalizedHeight: finalizedHeight, | |
219 | + FinalizedHash: finalizedHash, | |
221 | 220 | }) |
222 | 221 | if err != nil { |
223 | 222 | return err |
@@ -30,11 +30,11 @@ func TestSaveChainStatus(t *testing.T) { | ||
30 | 30 | } |
31 | 31 | |
32 | 32 | contractView := state.NewContractViewpoint() |
33 | - if err := store.SaveChainStatus(blockHeader, blockHeader, []*types.BlockHeader{blockHeader}, view, contractView); err != nil { | |
33 | + if err := store.SaveChainStatus(blockHeader, []*types.BlockHeader{blockHeader}, view, contractView, 0, &bc.Hash{}); err != nil { | |
34 | 34 | t.Fatal(err) |
35 | 35 | } |
36 | 36 | |
37 | - expectStatus := &protocol.BlockStoreState{Height: blockHeader.Height, Hash: &blockHash, FinalizedHeight: blockHeader.Height, FinalizedHash: &blockHash} | |
37 | + expectStatus := &protocol.BlockStoreState{Height: blockHeader.Height, Hash: &blockHash, FinalizedHeight: 0, FinalizedHash: &bc.Hash{}} | |
38 | 38 | if !testutil.DeepEqual(store.GetStoreStatus(), expectStatus) { |
39 | 39 | t.Errorf("got block status:%v, expect block status:%v", store.GetStoreStatus(), expectStatus) |
40 | 40 | } |
@@ -108,7 +108,7 @@ func (s *mockStore2) GetMainChainHash(uint64) (*bc.Hash, error) { | ||
108 | 108 | func (s *mockStore2) GetContract([32]byte) ([]byte, error) { return nil, nil } |
109 | 109 | func (s *mockStore2) SaveBlock(*types.Block) error { return nil } |
110 | 110 | func (s *mockStore2) SaveBlockHeader(*types.BlockHeader) error { return nil } |
111 | -func (s *mockStore2) SaveChainStatus(*types.BlockHeader, *types.BlockHeader, []*types.BlockHeader, *state.UtxoViewpoint, *state.ContractViewpoint) error { | |
111 | +func (s *mockStore2) SaveChainStatus(*types.BlockHeader, []*types.BlockHeader, *state.UtxoViewpoint, *state.ContractViewpoint, uint64, *bc.Hash) error { | |
112 | 112 | return nil |
113 | 113 | } |
114 | 114 | func (s *mockStore2) GetBlockHeader(hash *bc.Hash) (*types.BlockHeader, error) { |
@@ -118,16 +118,7 @@ func (c *Chain) connectBlock(block *types.Block) (err error) { | ||
118 | 118 | return err |
119 | 119 | } |
120 | 120 | |
121 | - finalizedBlockHeader := c.finalizedBlockHeader | |
122 | - lastJustifiedHeader, err := c.LastJustifiedHeader() | |
123 | - if err != nil { | |
124 | - return err | |
125 | - } | |
126 | - | |
127 | - if block.Height > lastJustifiedHeader.Height { | |
128 | - finalizedBlockHeader = &block.BlockHeader | |
129 | - } | |
130 | - if err := c.setState(&block.BlockHeader, finalizedBlockHeader, []*types.BlockHeader{&block.BlockHeader}, utxoView, contractView); err != nil { | |
121 | + if err := c.setState(&block.BlockHeader, []*types.BlockHeader{&block.BlockHeader}, utxoView, contractView); err != nil { | |
131 | 122 | return err |
132 | 123 | } |
133 | 124 |
@@ -174,7 +165,6 @@ func (c *Chain) reorganizeChain(blockHeader *types.BlockHeader) error { | ||
174 | 165 | } |
175 | 166 | |
176 | 167 | txsToRemove := map[bc.Hash]*types.Tx{} |
177 | - finalizedBlockHeader := c.finalizedBlockHeader | |
178 | 168 | for _, attachNode := range attachNodes { |
179 | 169 | hash := attachNode.Hash() |
180 | 170 | b, err := c.store.GetBlock(&hash) |
@@ -195,15 +185,6 @@ func (c *Chain) reorganizeChain(blockHeader *types.BlockHeader) error { | ||
195 | 185 | return err |
196 | 186 | } |
197 | 187 | |
198 | - lastJustifiedHeader, err := c.LastJustifiedHeader() | |
199 | - if err != nil { | |
200 | - return err | |
201 | - } | |
202 | - | |
203 | - if attachBlock.Height > lastJustifiedHeader.Height { | |
204 | - finalizedBlockHeader = attachNode | |
205 | - } | |
206 | - | |
207 | 188 | for _, tx := range b.Transactions { |
208 | 189 | if _, ok := txsToRestore[tx.ID]; !ok { |
209 | 190 | txsToRemove[tx.ID] = tx |
@@ -215,7 +196,7 @@ func (c *Chain) reorganizeChain(blockHeader *types.BlockHeader) error { | ||
215 | 196 | log.WithFields(log.Fields{"module": logModule, "height": attachNode.Height, "hash": hash.String()}).Debug("attach from mainchain") |
216 | 197 | } |
217 | 198 | |
218 | - if err := c.setState(blockHeader, finalizedBlockHeader, []*types.BlockHeader{blockHeader}, utxoView, contractView); err != nil { | |
199 | + if err := c.setState(blockHeader, []*types.BlockHeader{blockHeader}, utxoView, contractView); err != nil { | |
219 | 200 | return err |
220 | 201 | } |
221 | 202 |
@@ -367,8 +348,6 @@ func (c *Chain) processBlock(block *types.Block) (bool, error) { | ||
367 | 348 | bestBlock := c.saveSubBlock(block) |
368 | 349 | bestBlockHeader := &bestBlock.BlockHeader |
369 | 350 | |
370 | - c.cond.L.Lock() | |
371 | - defer c.cond.L.Unlock() | |
372 | 351 | if bestBlockHeader.PreviousBlockHash == c.bestBlockHeader.Hash() { |
373 | 352 | log.WithFields(log.Fields{"module": logModule}).Debug("append block to the end of mainchain") |
374 | 353 | return false, c.connectBlock(bestBlock) |
@@ -32,7 +32,6 @@ type Chain struct { | ||
32 | 32 | |
33 | 33 | cond sync.Cond |
34 | 34 | bestBlockHeader *types.BlockHeader // the last block on current main chain |
35 | - finalizedBlockHeader *types.BlockHeader | |
36 | 35 | } |
37 | 36 | |
38 | 37 | // NewChain returns a new Chain using store as the underlying storage. |
@@ -65,11 +64,6 @@ func NewChainWithOrphanManage(store Store, txPool *TxPool, manage *OrphanManage, | ||
65 | 64 | return nil, err |
66 | 65 | } |
67 | 66 | |
68 | - c.finalizedBlockHeader, err = c.store.GetBlockHeader(storeStatus.FinalizedHash) | |
69 | - if err != nil { | |
70 | - return nil, err | |
71 | - } | |
72 | - | |
73 | 67 | casper, err := newCasper(store, storeStatus, c.processRollbackCh) |
74 | 68 | if err != nil { |
75 | 69 | return nil, err |
@@ -105,7 +99,7 @@ func (c *Chain) initChainStatus() error { | ||
105 | 99 | |
106 | 100 | contractView := state.NewContractViewpoint() |
107 | 101 | genesisBlockHeader := &genesisBlock.BlockHeader |
108 | - return c.store.SaveChainStatus(genesisBlockHeader, genesisBlockHeader, []*types.BlockHeader{genesisBlockHeader}, utxoView, contractView) | |
102 | + return c.store.SaveChainStatus(genesisBlockHeader, []*types.BlockHeader{genesisBlockHeader}, utxoView, contractView, 0, &checkpoint.Hash) | |
109 | 103 | } |
110 | 104 | |
111 | 105 | func newCasper(store Store, storeStatus *BlockStoreState, rollbackCh chan *rollbackMsg) (*Casper, error) { |
@@ -212,8 +206,9 @@ func (c *Chain) SignBlockHeader(blockHeader *types.BlockHeader) { | ||
212 | 206 | } |
213 | 207 | |
214 | 208 | // This function must be called with mu lock in above level |
215 | -func (c *Chain) setState(blockHeader, finalizedBlockHeader *types.BlockHeader, mainBlockHeaders []*types.BlockHeader, view *state.UtxoViewpoint, contractView *state.ContractViewpoint) error { | |
216 | - if err := c.store.SaveChainStatus(blockHeader, finalizedBlockHeader, mainBlockHeaders, view, contractView); err != nil { | |
209 | +func (c *Chain) setState(blockHeader *types.BlockHeader, mainBlockHeaders []*types.BlockHeader, view *state.UtxoViewpoint, contractView *state.ContractViewpoint) error { | |
210 | + finalizedHeight, finalizedHash := c.casper.LastFinalized() | |
211 | + if err := c.store.SaveChainStatus(blockHeader, mainBlockHeaders, view, contractView, finalizedHeight, &finalizedHash); err != nil { | |
217 | 212 | return err |
218 | 213 | } |
219 | 214 |
@@ -221,7 +216,6 @@ func (c *Chain) setState(blockHeader, finalizedBlockHeader *types.BlockHeader, m | ||
221 | 216 | defer c.cond.L.Unlock() |
222 | 217 | |
223 | 218 | c.bestBlockHeader = blockHeader |
224 | - c.finalizedBlockHeader = finalizedBlockHeader | |
225 | 219 | |
226 | 220 | hash := c.bestBlockHeader.Hash() |
227 | 221 | log.WithFields(log.Fields{"module": logModule, "height": c.bestBlockHeader.Height, "hash": hash.String()}).Debug("chain best status has been update") |
@@ -26,7 +26,7 @@ type Store interface { | ||
26 | 26 | |
27 | 27 | SaveBlock(*types.Block) error |
28 | 28 | SaveBlockHeader(*types.BlockHeader) error |
29 | - SaveChainStatus(*types.BlockHeader, *types.BlockHeader, []*types.BlockHeader, *state.UtxoViewpoint, *state.ContractViewpoint) error | |
29 | + SaveChainStatus(*types.BlockHeader, []*types.BlockHeader, *state.UtxoViewpoint, *state.ContractViewpoint, uint64, *bc.Hash) error | |
30 | 30 | } |
31 | 31 | |
32 | 32 | // BlockStoreState represents the core's db status |
@@ -113,7 +113,7 @@ func (s *mockStore) GetMainChainHash(uint64) (*bc.Hash, error) { | ||
113 | 113 | func (s *mockStore) GetContract(hash [32]byte) ([]byte, error) { return nil, nil } |
114 | 114 | func (s *mockStore) SaveBlock(*types.Block) error { return nil } |
115 | 115 | func (s *mockStore) SaveBlockHeader(*types.BlockHeader) error { return nil } |
116 | -func (s *mockStore) SaveChainStatus(*types.BlockHeader, *types.BlockHeader, []*types.BlockHeader, *state.UtxoViewpoint, *state.ContractViewpoint) error { | |
116 | +func (s *mockStore) SaveChainStatus(*types.BlockHeader, []*types.BlockHeader, *state.UtxoViewpoint, *state.ContractViewpoint, uint64, *bc.Hash) error { | |
117 | 117 | return nil |
118 | 118 | } |
119 | 119 |
@@ -612,12 +612,12 @@ func (s *mockStore1) GetTransactionsUtxo(utxoView *state.UtxoViewpoint, tx []*bc | ||
612 | 612 | } |
613 | 613 | return nil |
614 | 614 | } |
615 | -func (s *mockStore1) GetUtxo(*bc.Hash) (*storage.UtxoEntry, error) { return nil, nil } | |
616 | -func (s *mockStore1) GetMainChainHash(uint64) (*bc.Hash, error) { return nil, nil } | |
617 | -func (s *mockStore1) GetContract(hash [32]byte) ([]byte, error) { return nil, nil } | |
618 | -func (s *mockStore1) SaveBlock(*types.Block) error { return nil } | |
619 | -func (s *mockStore1) SaveBlockHeader(*types.BlockHeader) error { return nil } | |
620 | -func (s *mockStore1) SaveChainStatus(*types.BlockHeader, *types.BlockHeader, []*types.BlockHeader, *state.UtxoViewpoint, *state.ContractViewpoint) error { | |
615 | +func (s *mockStore1) GetUtxo(*bc.Hash) (*storage.UtxoEntry, error) { return nil, nil } | |
616 | +func (s *mockStore1) GetMainChainHash(uint64) (*bc.Hash, error) { return nil, nil } | |
617 | +func (s *mockStore1) GetContract(hash [32]byte) ([]byte, error) { return nil, nil } | |
618 | +func (s *mockStore1) SaveBlock(*types.Block) error { return nil } | |
619 | +func (s *mockStore1) SaveBlockHeader(*types.BlockHeader) error { return nil } | |
620 | +func (s *mockStore1) SaveChainStatus(*types.BlockHeader, []*types.BlockHeader, *state.UtxoViewpoint, *state.ContractViewpoint, uint64, *bc.Hash) error { | |
621 | 621 | return nil |
622 | 622 | } |
623 | 623 |
@@ -188,7 +188,7 @@ func TestAttachOrDetachBlocks(t *testing.T) { | ||
188 | 188 | utxoViewpoint.Entries[k] = v |
189 | 189 | } |
190 | 190 | contractView := state.NewContractViewpoint() |
191 | - if err := store.SaveChainStatus(mockBlockHeader, mockBlockHeader, []*types.BlockHeader{mockBlockHeader}, utxoViewpoint, contractView); err != nil { | |
191 | + if err := store.SaveChainStatus(mockBlockHeader, []*types.BlockHeader{mockBlockHeader}, utxoViewpoint, contractView, 0, &bc.Hash{}); err != nil { | |
192 | 192 | t.Error(err) |
193 | 193 | } |
194 | 194 |
@@ -210,7 +210,7 @@ func TestAttachOrDetachBlocks(t *testing.T) { | ||
210 | 210 | t.Error(err) |
211 | 211 | } |
212 | 212 | } |
213 | - if err := store.SaveChainStatus(mockBlockHeader, mockBlockHeader, []*types.BlockHeader{mockBlockHeader}, utxoViewpoint, contractView); err != nil { | |
213 | + if err := store.SaveChainStatus(mockBlockHeader, []*types.BlockHeader{mockBlockHeader}, utxoViewpoint, contractView, 0, &bc.Hash{}); err != nil { | |
214 | 214 | t.Error(err) |
215 | 215 | } |
216 | 216 |