txCh := make(chan *orm.CrossTransaction)
go synchron.NewMainchainKeeper(db, &cfg.Mainchain, txCh).Run()
go synchron.NewSidechainKeeper(db, &cfg.Sidechain, txCh).Run()
- go federation.NewWarder(db, txCh).Run()
+ go federation.NewWarder(cfg, db, txCh).Run()
// keep the main func running in case of terminating goroutines
var wg sync.WaitGroup
}
type Config struct {
- GinGonic GinGonic `json:"gin-gonic"`
- MySQLConfig MySQLConfig `json:"mysql"`
- Warders []Warder `json:"warders"`
- Mainchain Chain `json:"mainchain"`
- Sidechain Chain `json:"sidechain"`
+ GinGonic GinGonic `json:"gin-gonic"`
+ MySQLConfig MySQLConfig `json:"mysql"`
+ CollectMinutes uint64 `json:"collect_unsubimmited_minutes"`
+ Warders []Warder `json:"warders"`
+ Mainchain Chain `json:"mainchain"`
+ Sidechain Chain `json:"sidechain"`
}
type GinGonic struct {
import (
"database/sql"
+ "time"
"github.com/jinzhu/gorm"
log "github.com/sirupsen/logrus"
"github.com/vapor/errors"
"github.com/vapor/federation/common"
+ "github.com/vapor/federation/config"
"github.com/vapor/federation/database/orm"
vaporTypes "github.com/vapor/protocol/bc/types"
)
type warder struct {
- db *gorm.DB
- txCh chan *orm.CrossTransaction
+ colletInterval time.Duration
+ db *gorm.DB
+ txCh chan *orm.CrossTransaction
}
-func NewWarder(db *gorm.DB, txCh chan *orm.CrossTransaction) *warder {
+func NewWarder(cfg *config.Config, db *gorm.DB, txCh chan *orm.CrossTransaction) *warder {
return &warder{
- txCh: txCh,
+ colletInterval: time.Duration(cfg.CollectMinutes) * time.Minute,
+ db: db,
+ txCh: txCh,
}
}
func (w *warder) Run() {
+ go w.collectUnsubmittedTx()
+
for ormTx := range w.txCh {
if err := w.validateCrossTx(ormTx); err != nil {
log.Warnln("invalid cross-chain tx", ormTx)
}
}
+func (w *warder) collectUnsubmittedTx() {
+
+}
+
func (w *warder) validateCrossTx(tx *orm.CrossTransaction) error {
if tx.Status == common.CrossTxRejectedStatus {
return errors.New("cross-chain tx rejeted")