Commit a1b68868 authored by szh's avatar szh

add rspopen

parent 483c72b0
......@@ -68,6 +68,7 @@ func SyncBlock() {
txsMap := make(map[int64]*models.RaspMinerTxs,0)
//statList := make([]*models.RaspMinerStat,0)
txsList := make([]*models.RaspMinerTxs,0)
openlist := make([]*models.RaspOpen,0)
checkList := make(map[int64]int64,0)
var wg sync.WaitGroup
var mutx sync.Mutex
......@@ -76,12 +77,13 @@ func SyncBlock() {
wg.Add(1)
go func(height int64) {
//defer wg.Done()
stat,txs,err := DealBlock(height)
stat,txs,open,err := DealBlock(height)
if err != nil {
logging.Error("DealBlock err",err)
panic(err)
}
mutx.Lock()
openlist = append(openlist,open...)
for _, vv:= range stat {
if _,ok := statMap[vv.Addr];!ok {
statMap[vv.Addr] = vv
......@@ -136,7 +138,7 @@ func SyncBlock() {
}
panic("exception txs not eq expect")
}
err := models.UpdateBlocks(txsMap,statMap,processHeight+maxDownload-1)
err := models.UpdateBlocks(txsMap,statMap,openlist,processHeight+maxDownload-1)
if err != nil {
panic(err)
}
......@@ -169,25 +171,29 @@ func (prev *prevHeight) SetMainHeight() error {
}
func DealBlock(height int64) ( []*models.RaspMinerStat, *models.RaspMinerTxs,error) {
func DealBlock(height int64) ( []*models.RaspMinerStat, *models.RaspMinerTxs,[]*models.RaspOpen,error) {
logging.Info("dealheightstart",height)
t1 := time.Now().Unix()
blocks ,err := client.GetBlocks(&types.ReqBlocks{Start:height,End:height,IsDetail:true})
t2 := time.Now().Unix()
if err != nil {
logging.Error("GetBlocks err",err)
return nil,nil,err
return nil,nil,nil,err
}
block := blocks.GetItems()[0]
rsMap := make(map[string]*RMinerStat,0)
openList := make([]*models.RaspOpen,0)
rt := &RMinerTxs{}
//处理交易数据
for k,v := range block.Block.Txs {
if block.Receipts[k].Ty == types.ExecOk && string(v.Execer) == "ticket"{
rt1,rss,err := dealTx(v,block.Receipts[k],block.Block.Height,block.Block.BlockTime)
rt1,rss,open,err := dealTx(v,block.Receipts[k],block.Block.Height,block.Block.BlockTime)
if err != nil {
logging.Error("dealTx err ",err)
return nil,nil,err
return nil,nil,nil,err
}
if open != nil && open.Hash != "" {
openList = append(openList,open)
}
if rt1 != nil && rt1.Miner != ""{
rt.Miner = rt1.Miner
......@@ -234,7 +240,7 @@ func DealBlock(height int64) ( []*models.RaspMinerStat, *models.RaspMinerTxs,er
logging.Info("dealheightend",height,"getblock cost ",t2-t1," dealtx cost ",t3-t2)
//logging.Info("txs",*raspTxs)
return raspStatList,raspTxs,nil
return raspStatList,raspTxs,openList,nil
}
type RMinerTxs struct {
......@@ -259,23 +265,24 @@ type RMinerStat struct {
Time int64 `json:"time"`
}
func dealTx(tx *types.Transaction,receipt *types.ReceiptData,height,blocktime int64) (*RMinerTxs,[]*RMinerStat,error) {
func dealTx(tx *types.Transaction,receipt *types.ReceiptData,height,blocktime int64) (*RMinerTxs,[]*RMinerStat,*models.RaspOpen,error) {
var rt RMinerTxs
rss := make([]*RMinerStat,0)
open := &models.RaspOpen{}
//只处理ticket合约
if string(tx.Execer) == "ticket" {
var miner ttype.TicketAction
err := types.Decode(tx.Payload,&miner)
if err != nil {
logging.Error("decode ticket err ",err)
return nil,nil,err
return nil,nil,nil,err
}
switch miner.Ty {
case ttype.TicketActionMiner:
rt1,rs1,err := DealMinerAction(tx,&miner)
if err != nil {
return nil,nil,err
return nil,nil,nil,err
}
rt = *rt1
rt.Height = height
......@@ -284,7 +291,7 @@ func dealTx(tx *types.Transaction,receipt *types.ReceiptData,height,blocktime in
case ttype.TicketActionClose:
rslist ,err := DealCloseAction(&miner)
if err != nil {
return nil,nil,err
return nil,nil,nil,err
}
for _,v:= range rslist {
v.Time = blocktime
......@@ -294,15 +301,18 @@ func dealTx(tx *types.Transaction,receipt *types.ReceiptData,height,blocktime in
case ttype.TicketActionOpen:
rs1 ,err := DealOpenAction(&miner)
if err != nil {
return nil,nil,err
return nil,nil,nil,err
}
rs1.Height = height
rs1.Time = blocktime
open.Hash = common.ToHex(tx.Hash())
open.Miner = miner.GetTopen().MinerAddress
open.ReturnAddr = miner.GetTopen().ReturnAddress
rss = append(rss,rs1)
case ttype.TicketActionGenesis:
rs1 ,err := DealGenesisAction(&miner)
if err != nil {
return nil,nil,err
return nil,nil,nil,err
}
rs1.Time = blocktime
rs1.Height = height
......@@ -310,7 +320,7 @@ func dealTx(tx *types.Transaction,receipt *types.ReceiptData,height,blocktime in
}
}
return &rt,rss,nil
return &rt,rss,open,nil
}
func NewMinerStat(rs *RMinerStat) *models.RaspMinerStat {
......
......@@ -7,6 +7,7 @@ type RaspOpen struct {
ReturnAddr string `json:"return_addr"`
}
// GetHeight get lastheight in chain33
func GetReturnAddr(hash string) (string, error) {
var open RaspOpen
......
......@@ -53,7 +53,7 @@ func UpdateBlock(rt *RaspMinerTxs,rs *RaspMinerStat) error {
return tx.Commit().Error
}
func UpdateBlocks(rt map[int64]*RaspMinerTxs,rs map[string]*RaspMinerStat,height int64) error {
func UpdateBlocks(rt map[int64]*RaspMinerTxs,rs map[string]*RaspMinerStat,openlist []*RaspOpen,height int64) error {
tx := db.Begin()
defer func() {
if r := recover(); r != nil {
......@@ -70,6 +70,13 @@ func UpdateBlocks(rt map[int64]*RaspMinerTxs,rs map[string]*RaspMinerStat,height
return err
}
}
for _,v := range openlist {
var open RaspOpen
if err := tx.Where(&RaspOpen{Hash:v.Hash}).Assign(v).FirstOrCreate(&open).Error;err != nil {
tx.Rollback()
return err
}
}
for _,v:= range rs {
var prev RaspMinerStat
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment