"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 {
assetStore *database.AssetStore
chainID uint64
federationProg []byte
+ vaporNetParams consensus.Params
}
func NewMainchainKeeper(db *gorm.DB, assetStore *database.AssetStore, cfg *config.Config) *mainchainKeeper {
assetStore: assetStore,
federationProg: cfg.FederationProg,
chainID: chain.ID,
+ vaporNetParams: consensus.NetParams[cfg.Network],
}
}
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
}
}
- if sourceTxHash := locateSideChainTx(tx.Outputs[len(tx.Outputs)-1]); sourceTxHash == "" {
- return false
- }
- return true
+ sourceTxHash := locateSideChainTx(tx.Outputs[len(tx.Outputs)-1])
+ return sourceTxHash != ""
}
func locateSideChainTx(output *types.TxOutput) string {
return ""
}
- return string(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 {
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},
}
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
}