OSDN Git Service

d07fd8eb0485fddac1764ca9e2b3138cdc23fc13
[bytom/vapor.git] / federation / synchron / detach_block_processor.go
1 package synchron
2
3 import (
4         // "github.com/bytom/protocol/bc"
5         btmTypes "github.com/bytom/protocol/bc/types"
6         "github.com/jinzhu/gorm"
7
8         "github.com/vapor/errors"
9         "github.com/vapor/federation/config"
10         "github.com/vapor/federation/database/orm"
11         vaporTypes "github.com/vapor/protocol/bc/types"
12 )
13
14 type detachBlockProcessor struct {
15         cfg   *config.Chain
16         db    *gorm.DB
17         chain *orm.Chain
18         block interface{}
19         // txStatus *bc.TransactionStatus
20 }
21
22 func (p *detachBlockProcessor) getCfg() *config.Chain {
23         return p.cfg
24 }
25
26 func (p *detachBlockProcessor) getBlock() interface{} {
27         return p.block
28 }
29
30 func (p *detachBlockProcessor) processWithdrawalToMainchain(txIndex uint64, tx *btmTypes.Tx) error {
31         return p.db.Delete(&orm.CrossTransaction{ChainID: p.chain.ID, TxHash: tx.ID.String()}).Error
32 }
33
34 func (p *detachBlockProcessor) processDepositFromMainchain(txIndex uint64, tx *btmTypes.Tx) error {
35         ormTx := &orm.CrossTransaction{ChainID: p.chain.ID, TxHash: tx.ID.String()}
36         if err := p.db.Where(tx).First(tx).Error; err != nil {
37                 return errors.Wrap(err, "db query transaction")
38         }
39
40         if err := p.db.Delete(&orm.CrossTransactionInput{}, "MainchainTxID = ?", ormTx.ID).Error; err != nil {
41                 return errors.Wrap(err, "db delete CrossTransactionInput")
42         }
43
44         return p.db.Delete(ormTx).Error
45 }
46
47 func (p *detachBlockProcessor) processIssuing(db *gorm.DB, txs []*btmTypes.Tx) error {
48         return nil
49 }
50
51 func (p *detachBlockProcessor) processChainInfo() error {
52         var oldBlockHashStr string
53
54         switch {
55         case p.cfg.IsMainchain:
56                 p.chain.BlockHash = p.block.(*btmTypes.Block).PreviousBlockHash.String()
57                 p.chain.BlockHeight = p.block.(*btmTypes.Block).Height - 1
58                 oldBlockHash := p.block.(*btmTypes.Block).Hash()
59                 oldBlockHashStr = oldBlockHash.String()
60         default:
61                 p.chain.BlockHash = p.block.(*vaporTypes.Block).PreviousBlockHash.String()
62                 p.chain.BlockHeight = p.block.(*vaporTypes.Block).Height - 1
63                 oldBlockHash := p.block.(*vaporTypes.Block).Hash()
64                 oldBlockHashStr = oldBlockHash.String()
65         }
66
67         db := p.db.Model(p.chain).Where("block_hash = ?", oldBlockHashStr).Updates(p.chain)
68         if err := db.Error; err != nil {
69                 return err
70         }
71
72         if db.RowsAffected != 1 {
73                 return ErrInconsistentDB
74         }
75         return nil
76 }