Commit 868518ae authored by szh's avatar szh

更新授权挖矿 地址统计数据逻辑

parent c55e58e6
/* /*
Navicat MySQL Data Transfer Navicat MySQL Data Transfer
Source Server : localhost_3306 Source Server : localhost
Source Server Version : 50553 Source Server Version : 50726
Source Host : localhost:3306 Source Host : localhost:3306
Source Database : raspberry Source Database : raspberry
Target Server Type : MYSQL Target Server Type : MYSQL
Target Server Version : 50553 Target Server Version : 50726
File Encoding : 65001 File Encoding : 65001
Date: 2019-10-12 11:11:49 Date: 2019-11-04 11:26:08
*/ */
SET FOREIGN_KEY_CHECKS=0; SET FOREIGN_KEY_CHECKS=0;
...@@ -56,5 +56,21 @@ CREATE TABLE `rasp_miner_txs` ( ...@@ -56,5 +56,21 @@ CREATE TABLE `rasp_miner_txs` (
`amount` int(10) DEFAULT '0' COMMENT '矿工挖矿获利', `amount` int(10) DEFAULT '0' COMMENT '矿工挖矿获利',
`time` int(11) DEFAULT '0' COMMENT '挖矿时间', `time` int(11) DEFAULT '0' COMMENT '挖矿时间',
PRIMARY KEY (`height`), PRIMARY KEY (`height`),
KEY `miner` (`miner`) KEY `miner` (`miner`),
KEY `return_addr` (`return_addr`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8; ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- ----------------------------
-- Table structure for rasp_tickets
-- ----------------------------
DROP TABLE IF EXISTS `rasp_tickets`;
CREATE TABLE `rasp_tickets` (
`id` varchar(512) NOT NULL,
`miner` varchar(66) DEFAULT NULL,
`return_address` varchar(66) DEFAULT NULL,
`height` int(11) DEFAULT NULL,
`pubhash` varchar(255) DEFAULT NULL,
`status` tinyint(2) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `status` (`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
...@@ -11,6 +11,8 @@ import ( ...@@ -11,6 +11,8 @@ import (
ttype "github.com/33cn/plugin/plugin/dapp/ticket/types" ttype "github.com/33cn/plugin/plugin/dapp/ticket/types"
"github.com/jinzhu/gorm" "github.com/jinzhu/gorm"
"github.com/33cn/chain33/common" "github.com/33cn/chain33/common"
"strings"
"chain33-pai/pkg/e"
) )
func Setup() { func Setup() {
...@@ -85,6 +87,10 @@ func SyncBlock() { ...@@ -85,6 +87,10 @@ func SyncBlock() {
statMap[vv.Addr].MinedTicketCount += vv.MinedTicketCount statMap[vv.Addr].MinedTicketCount += vv.MinedTicketCount
statMap[vv.Addr].MiningTicketCount += vv.MiningTicketCount statMap[vv.Addr].MiningTicketCount += vv.MiningTicketCount
statMap[vv.Addr].MinedAmount += vv.MinedAmount statMap[vv.Addr].MinedAmount += vv.MinedAmount
if statMap[vv.Addr].Height < vv.Height {
statMap[vv.Addr].Height = vv.Height
statMap[vv.Addr].Time = vv.Time
}
} }
} }
...@@ -173,7 +179,7 @@ func DealBlock(height int64) ( []*models.RaspMinerStat, *models.RaspMinerTxs,er ...@@ -173,7 +179,7 @@ func DealBlock(height int64) ( []*models.RaspMinerStat, *models.RaspMinerTxs,er
//处理交易数据 //处理交易数据
for k,v := range block.Block.Txs { for k,v := range block.Block.Txs {
if block.Receipts[k].Ty == types.ExecOk { if block.Receipts[k].Ty == types.ExecOk {
rt1,rs1,err := dealTx(v) rt1,rss,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,err
...@@ -183,21 +189,30 @@ func DealBlock(height int64) ( []*models.RaspMinerStat, *models.RaspMinerTxs,er ...@@ -183,21 +189,30 @@ func DealBlock(height int64) ( []*models.RaspMinerStat, *models.RaspMinerTxs,er
rt.Amount = rt1.Amount rt.Amount = rt1.Amount
rt.Hash = rt1.Hash rt.Hash = rt1.Hash
} }
if rs1 != nil && rs1.Addr != "" { for _,vv := range rss {
if vv != nil && vv.Addr != "" {
rs := &RMinerStat{} rs := &RMinerStat{}
if _,ok := rsMap[rs1.Addr];!ok { if _,ok := rsMap[vv.Addr];!ok {
rs.Addr = rs1.Addr rs.Addr = vv.Addr
rs.MinedTicketCount = rs1.MinedTicketCount rs.MinedTicketCount = vv.MinedTicketCount
rs.MiningTicketCount = rs1.MiningTicketCount rs.MiningTicketCount = vv.MiningTicketCount
rs.MinedAmount = rs1.MinedAmount rs.MinedAmount = vv.MinedAmount
rs.Time = block.Block.BlockTime rs.Time = block.Block.BlockTime
rs.Height = block.Block.Height rs.Height = block.Block.Height
rsMap[rs1.Addr] = rs rsMap[vv.Addr] = rs
} else { } else {
rsMap[rs1.Addr].MiningTicketCount += rs1.MiningTicketCount rsMap[vv.Addr].MiningTicketCount += vv.MiningTicketCount
rsMap[vv.Addr].MinedAmount += vv.MinedAmount
rsMap[vv.Addr].MinedTicketCount += vv.MinedTicketCount
if rsMap[vv.Addr].Height < vv.Height {
rsMap[vv.Addr].Height = vv.Height
rsMap[vv.Addr].Time = vv.Time
}
} }
} }
} }
}
} }
rt.Height = block.Block.Height rt.Height = block.Block.Height
...@@ -252,9 +267,9 @@ type RMinerStat struct { ...@@ -252,9 +267,9 @@ type RMinerStat struct {
Time int64 `json:"time"` Time int64 `json:"time"`
} }
func dealTx(tx *types.Transaction) (*RMinerTxs,*RMinerStat,error) { func dealTx(tx *types.Transaction,receipt *types.ReceiptData,height,blocktime int64) (*RMinerTxs,[]*RMinerStat,error) {
var rt RMinerTxs var rt RMinerTxs
var rs RMinerStat rss := make([]*RMinerStat,0)
//只处理ticket合约 //只处理ticket合约
if string(tx.Execer) == "ticket" { if string(tx.Execer) == "ticket" {
var miner ttype.TicketAction var miner ttype.TicketAction
...@@ -264,26 +279,46 @@ func dealTx(tx *types.Transaction) (*RMinerTxs,*RMinerStat,error) { ...@@ -264,26 +279,46 @@ func dealTx(tx *types.Transaction) (*RMinerTxs,*RMinerStat,error) {
return nil,nil,err return nil,nil,err
} }
switch miner.Ty { switch miner.Ty {
case ttype.TicketActionMiner: case ttype.TicketActionMiner:
rt.Amount = miner.GetMiner().Reward rt1,rs1,err := DealMinerAction(tx,&miner)
rt.Miner = tx.From() if err != nil {
rt.Hash = common.ToHex(tx.Hash()) return nil,nil,err
rs.MinedAmount = miner.GetMiner().Reward }
rs.MinedTicketCount = int64(1) rt = *rt1
rs.Addr = tx.From() rt.Height = height
rt.Time = blocktime
rss = append(rss,rs1)
case ttype.TicketActionClose: case ttype.TicketActionClose:
rs.MiningTicketCount = -int64(len(miner.GetTclose().TicketId)) rslist ,err := DealCloseAction(&miner)
rs.Addr = tx.From() if err != nil {
return nil,nil,err
}
for _,v:= range rslist {
v.Time = blocktime
v.Height = height
}
rss = append(rss,rslist...)
case ttype.TicketActionOpen: case ttype.TicketActionOpen:
rs.MiningTicketCount = int64(miner.GetTopen().Count) rs1 ,err := DealOpenAction(&miner)
rs.Addr = tx.From() if err != nil {
return nil,nil,err
}
rs1.Height = height
rs1.Time = blocktime
rss = append(rss,rs1)
case ttype.TicketActionGenesis: case ttype.TicketActionGenesis:
rs.MiningTicketCount = int64(miner.GetGenesis().Count) rs1 ,err := DealGenesisAction(&miner)
rs.Addr = tx.From() if err != nil {
return nil,nil,err
}
rs1.Time = blocktime
rs1.Height = height
rss = append(rss,rs1)
} }
} }
return &rt,&rs,nil return &rt,rss,nil
} }
func NewMinerStat(rs *RMinerStat) *models.RaspMinerStat { func NewMinerStat(rs *RMinerStat) *models.RaspMinerStat {
...@@ -307,6 +342,83 @@ func NewMinerTxs(rt *RMinerTxs) *models.RaspMinerTxs { ...@@ -307,6 +342,83 @@ func NewMinerTxs(rt *RMinerTxs) *models.RaspMinerTxs {
return &r return &r
} }
func DealMinerAction(tx *types.Transaction,miner *ttype.TicketAction)(*RMinerTxs,*RMinerStat,error) {
var rs RMinerStat
var rt RMinerTxs
ticketparams := strings.Split(miner.GetMiner().TicketId,":")
if len(ticketparams) < 3 {
return nil,nil,e.ErrWrongTicketId
}
realaddress ,err := GetRealAddress(ticketparams[1])
if err != nil {
return nil,nil,err
}
rt.Amount = miner.GetMiner().Reward
rt.Miner = tx.From()
rt.ReturnAddr = realaddress
rt.Hash = common.ToHex(tx.Hash())
rs.MinedAmount = miner.GetMiner().Reward
rs.MinedTicketCount = int64(1)
rs.Addr = realaddress
return &rt,&rs,nil
}
func DealOpenAction(open *ttype.TicketAction)(*RMinerStat,error) {
var rs RMinerStat
rs.Addr = open.GetTopen().ReturnAddress
rs.MiningTicketCount = int64(open.GetTopen().Count)
return &rs,nil
}
func DealGenesisAction(genesis *ttype.TicketAction)(*RMinerStat,error) {
var rs RMinerStat
rs.Addr = genesis.GetGenesis().ReturnAddress
rs.MiningTicketCount = int64(genesis.GetGenesis().Count)
return &rs,nil
}
func DealCloseAction(close *ttype.TicketAction)([]*RMinerStat,error) {
rslist := make([]*RMinerStat,0)
for _,v := range close.GetTclose().TicketId {
var rs RMinerStat
ticketparams := strings.Split(v,":")
if len(ticketparams) < 3 {
return nil,e.ErrWrongTicketId
}
realaddress ,err := GetRealAddress(ticketparams[1])
if err != nil {
return nil,err
}
rs.Addr = realaddress
rs.MiningTicketCount = int64(-1)
rslist = append(rslist,&rs)
}
return rslist,nil
}
func GetRealAddress(hash string) (string,error) {
client := &chain33.PaiClient{}
hashb ,err := common.FromHex(hash)
if err != nil {
return "",err
}
res,err := client.QueryTransaction(hashb)
if err != nil {
return "",err
}
var payload ttype.TicketAction
err = types.Decode(res.Tx.Payload,&payload)
if err != nil {
return "",err
}
switch payload.Ty {
case ttype.TicketActionOpen:
return payload.GetTopen().ReturnAddress,nil
}
return "",types.ErrActionNotSupport
}
func bityuanMiner(height int64) int64 { func bityuanMiner(height int64) int64 {
// ForkChainParamV2 // ForkChainParamV2
if height >= 2270000 { if height >= 2270000 {
......
...@@ -31,7 +31,7 @@ func UpdateHeight(height int64) error { ...@@ -31,7 +31,7 @@ func UpdateHeight(height int64) error {
// AddArticle add a single article // AddArticle add a single article
func InitHeight() error { func InitHeight() error {
config := RaspConfig{ config := RaspConfig{
Height: 0, Height: -1,
Config: "height", Config: "height",
} }
if err := db.Create(&config).Error; err != nil { if err := db.Create(&config).Error; err != nil {
......
...@@ -41,6 +41,10 @@ func (p *PaiClient) GetNetInfo() (*types.NodeNetInfo,error) { ...@@ -41,6 +41,10 @@ func (p *PaiClient) GetNetInfo() (*types.NodeNetInfo,error) {
return paiClient.NetInfo(context.Background(),&types.ReqNil{}) return paiClient.NetInfo(context.Background(),&types.ReqNil{})
} }
func (p *PaiClient) QueryTransaction(hash []byte) (*types.TransactionDetail, error) {
return paiClient.QueryTransaction(context.Background(),&types.ReqHash{Hash:hash})
}
func (p *PaiClient) GetBlocks(req *types.ReqBlocks) (*types.BlockDetails,error) { func (p *PaiClient) GetBlocks(req *types.ReqBlocks) (*types.BlockDetails,error) {
var detail types.BlockDetails var detail types.BlockDetails
reply,err := paiClient.GetBlocks(context.Background(),req) reply,err := paiClient.GetBlocks(context.Background(),req)
......
package e package e
import "github.com/micro/go-micro/errors"
const ( const (
SUCCESS = 200 SUCCESS = 200
ERROR = 500 ERROR = 500
...@@ -35,3 +37,8 @@ const ( ...@@ -35,3 +37,8 @@ const (
ERROR_UPLOAD_CHECK_IMAGE_FAIL = 30002 ERROR_UPLOAD_CHECK_IMAGE_FAIL = 30002
ERROR_UPLOAD_CHECK_IMAGE_FORMAT = 30003 ERROR_UPLOAD_CHECK_IMAGE_FORMAT = 30003
) )
const (
ErrWrongTicketId = errors.New("ErrWrongTicketId")
)
\ No newline at end of file
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