Commit a1b68868 authored by szh's avatar szh

add rspopen

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