OSDN Git Service

fix mainchain keeper (#398)
[bytom/vapor.git] / toolbar / federation / synchron / mainchain_keeper.go
index af90a7d..8bb13d0 100644 (file)
@@ -17,11 +17,11 @@ import (
        "github.com/vapor/consensus"
        "github.com/vapor/errors"
        "github.com/vapor/protocol/bc"
-       "github.com/vapor/toolbar/common/service"
        "github.com/vapor/toolbar/federation/common"
        "github.com/vapor/toolbar/federation/config"
        "github.com/vapor/toolbar/federation/database"
        "github.com/vapor/toolbar/federation/database/orm"
+       "github.com/vapor/toolbar/federation/service"
 )
 
 type mainchainKeeper struct {
@@ -31,6 +31,7 @@ type mainchainKeeper struct {
        assetStore     *database.AssetStore
        chainID        uint64
        federationProg []byte
+       vaporNetParams consensus.Params
 }
 
 func NewMainchainKeeper(db *gorm.DB, assetStore *database.AssetStore, cfg *config.Config) *mainchainKeeper {
@@ -46,6 +47,7 @@ func NewMainchainKeeper(db *gorm.DB, assetStore *database.AssetStore, cfg *confi
                assetStore:     assetStore,
                federationProg: cfg.FederationProg,
                chainID:        chain.ID,
+               vaporNetParams: consensus.NetParams[cfg.Network],
        }
 }
 
@@ -68,8 +70,8 @@ func (m *mainchainKeeper) Run() {
 
 func (m *mainchainKeeper) createCrossChainReqs(db *gorm.DB, crossTransactionID uint64, tx *types.Tx, statusFail bool) error {
        prog := tx.Inputs[0].ControlProgram()
-       fromAddress := common.ProgToAddress(prog, &consensus.BytomMainNetParams)
-       toAddress := common.ProgToAddress(prog, &consensus.MainNetParams)
+       fromAddress := common.ProgToAddress(prog, consensus.BytomMainNetParams(&m.vaporNetParams))
+       toAddress := common.ProgToAddress(prog, &m.vaporNetParams)
        for i, rawOutput := range tx.Outputs {
                if !bytes.Equal(rawOutput.OutputCommitment.ControlProgram, m.federationProg) {
                        continue
@@ -123,10 +125,8 @@ func (m *mainchainKeeper) isWithdrawalTx(tx *types.Tx) bool {
                }
        }
 
-       if sourceTxHash := locateSideChainTx(tx.Outputs[len(tx.Outputs)-1]); sourceTxHash == "" {
-               return false
-       }
-       return false
+       sourceTxHash := locateSideChainTx(tx.Outputs[len(tx.Outputs)-1])
+       return sourceTxHash != ""
 }
 
 func locateSideChainTx(output *types.TxOutput) string {
@@ -139,7 +139,15 @@ func locateSideChainTx(output *types.TxOutput) string {
                return ""
        }
 
-       return hex.EncodeToString(insts[1].Data)
+       if insts[0].Op != vm.OP_FAIL {
+               return ""
+       }
+
+       sourceTxHash := string(insts[1].Data)
+       if _, err = hex.DecodeString(sourceTxHash); err == nil && len(sourceTxHash) == 64 {
+               return sourceTxHash
+       }
+       return ""
 }
 
 func (m *mainchainKeeper) processBlock(db *gorm.DB, block *types.Block, txStatus *bc.TransactionStatus) error {
@@ -251,10 +259,11 @@ func (m *mainchainKeeper) processWithdrawalTx(db *gorm.DB, block *types.Block, t
        blockHash := block.Hash()
        tx := block.Transactions[txIndex]
 
-       stmt := db.Model(&orm.CrossTransaction{}).Where(&orm.CrossTransaction{
+       crossTx := &orm.CrossTransaction{
                SourceTxHash: locateSideChainTx(tx.Outputs[len(tx.Outputs)-1]),
                Status:       common.CrossTxPendingStatus,
-       }).UpdateColumn(&orm.CrossTransaction{
+       }
+       stmt := db.Model(&orm.CrossTransaction{}).Where(crossTx).UpdateColumn(&orm.CrossTransaction{
                DestBlockHeight:    sql.NullInt64{int64(block.Height), true},
                DestBlockTimestamp: sql.NullInt64{int64(block.Timestamp), true},
                DestBlockHash:      sql.NullString{blockHash.String(), true},
@@ -267,7 +276,7 @@ func (m *mainchainKeeper) processWithdrawalTx(db *gorm.DB, block *types.Block, t
        }
 
        if stmt.RowsAffected != 1 {
-               return ErrInconsistentDB
+               log.WithFields(log.Fields{"sourceTxHash": crossTx.SourceTxHash, "destTxHash": tx.ID.String()}).Error("fail to update withdrawal transaction")
        }
        return nil
 }