Commit 868518ae authored by szh's avatar szh

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

parent c55e58e6
/*
Navicat MySQL Data Transfer
Source Server : localhost_3306
Source Server Version : 50553
Source Server : localhost
Source Server Version : 50726
Source Host : localhost:3306
Source Database : raspberry
Target Server Type : MYSQL
Target Server Version : 50553
Target Server Version : 50726
File Encoding : 65001
Date: 2019-10-12 11:11:49
Date: 2019-11-04 11:26:08
*/
SET FOREIGN_KEY_CHECKS=0;
......@@ -56,5 +56,21 @@ CREATE TABLE `rasp_miner_txs` (
`amount` int(10) DEFAULT '0' COMMENT '矿工挖矿获利',
`time` int(11) DEFAULT '0' COMMENT '挖矿时间',
PRIMARY KEY (`height`),
KEY `miner` (`miner`)
KEY `miner` (`miner`),
KEY `return_addr` (`return_addr`)
) 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 (
ttype "github.com/33cn/plugin/plugin/dapp/ticket/types"
"github.com/jinzhu/gorm"
"github.com/33cn/chain33/common"
"strings"
"chain33-pai/pkg/e"
)
func Setup() {
......@@ -85,6 +87,10 @@ func SyncBlock() {
statMap[vv.Addr].MinedTicketCount += vv.MinedTicketCount
statMap[vv.Addr].MiningTicketCount += vv.MiningTicketCount
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
//处理交易数据
for k,v := range block.Block.Txs {
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 {
logging.Error("dealTx err ",err)
return nil,nil,err
......@@ -183,20 +189,29 @@ func DealBlock(height int64) ( []*models.RaspMinerStat, *models.RaspMinerTxs,er
rt.Amount = rt1.Amount
rt.Hash = rt1.Hash
}
if rs1 != nil && rs1.Addr != "" {
rs := &RMinerStat{}
if _,ok := rsMap[rs1.Addr];!ok {
rs.Addr = rs1.Addr
rs.MinedTicketCount = rs1.MinedTicketCount
rs.MiningTicketCount = rs1.MiningTicketCount
rs.MinedAmount = rs1.MinedAmount
rs.Time = block.Block.BlockTime
rs.Height = block.Block.Height
rsMap[rs1.Addr] = rs
} else {
rsMap[rs1.Addr].MiningTicketCount += rs1.MiningTicketCount
for _,vv := range rss {
if vv != nil && vv.Addr != "" {
rs := &RMinerStat{}
if _,ok := rsMap[vv.Addr];!ok {
rs.Addr = vv.Addr
rs.MinedTicketCount = vv.MinedTicketCount
rs.MiningTicketCount = vv.MiningTicketCount
rs.MinedAmount = vv.MinedAmount
rs.Time = block.Block.BlockTime
rs.Height = block.Block.Height
rsMap[vv.Addr] = rs
} else {
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
}
}
}
}
}
}
......@@ -252,9 +267,9 @@ type RMinerStat struct {
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 rs RMinerStat
rss := make([]*RMinerStat,0)
//只处理ticket合约
if string(tx.Execer) == "ticket" {
var miner ttype.TicketAction
......@@ -264,26 +279,46 @@ func dealTx(tx *types.Transaction) (*RMinerTxs,*RMinerStat,error) {
return nil,nil,err
}
switch miner.Ty {
case ttype.TicketActionMiner:
rt.Amount = miner.GetMiner().Reward
rt.Miner = tx.From()
rt.Hash = common.ToHex(tx.Hash())
rs.MinedAmount = miner.GetMiner().Reward
rs.MinedTicketCount = int64(1)
rs.Addr = tx.From()
rt1,rs1,err := DealMinerAction(tx,&miner)
if err != nil {
return nil,nil,err
}
rt = *rt1
rt.Height = height
rt.Time = blocktime
rss = append(rss,rs1)
case ttype.TicketActionClose:
rs.MiningTicketCount = -int64(len(miner.GetTclose().TicketId))
rs.Addr = tx.From()
rslist ,err := DealCloseAction(&miner)
if err != nil {
return nil,nil,err
}
for _,v:= range rslist {
v.Time = blocktime
v.Height = height
}
rss = append(rss,rslist...)
case ttype.TicketActionOpen:
rs.MiningTicketCount = int64(miner.GetTopen().Count)
rs.Addr = tx.From()
rs1 ,err := DealOpenAction(&miner)
if err != nil {
return nil,nil,err
}
rs1.Height = height
rs1.Time = blocktime
rss = append(rss,rs1)
case ttype.TicketActionGenesis:
rs.MiningTicketCount = int64(miner.GetGenesis().Count)
rs.Addr = tx.From()
rs1 ,err := DealGenesisAction(&miner)
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 {
......@@ -307,6 +342,83 @@ func NewMinerTxs(rt *RMinerTxs) *models.RaspMinerTxs {
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 {
// ForkChainParamV2
if height >= 2270000 {
......
......@@ -31,7 +31,7 @@ func UpdateHeight(height int64) error {
// AddArticle add a single article
func InitHeight() error {
config := RaspConfig{
Height: 0,
Height: -1,
Config: "height",
}
if err := db.Create(&config).Error; err != nil {
......
......@@ -41,6 +41,10 @@ func (p *PaiClient) GetNetInfo() (*types.NodeNetInfo,error) {
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) {
var detail types.BlockDetails
reply,err := paiClient.GetBlocks(context.Background(),req)
......
package e
import "github.com/micro/go-micro/errors"
const (
SUCCESS = 200
ERROR = 500
......@@ -35,3 +37,8 @@ const (
ERROR_UPLOAD_CHECK_IMAGE_FAIL = 30002
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