Commit 38c12844 authored by mdj33's avatar mdj33 Committed by vipwzw

fix ticket bind bug

parent ef941882
...@@ -222,7 +222,7 @@ func (client *Client) flushTicket() error { ...@@ -222,7 +222,7 @@ func (client *Client) flushTicket() error {
client.setTicket(nil, nil) client.setTicket(nil, nil)
return nil return nil
} }
if err != nil { if err != nil && err != ty.ErrNoTicket {
tlog.Error("flushTicket error", "err", err) tlog.Error("flushTicket error", "err", err)
return err return err
} }
......
...@@ -10,6 +10,7 @@ import ( ...@@ -10,6 +10,7 @@ import (
"fmt" "fmt"
"os" "os"
"github.com/33cn/chain33/common"
"github.com/33cn/chain33/rpc/jsonclient" "github.com/33cn/chain33/rpc/jsonclient"
rpctypes "github.com/33cn/chain33/rpc/types" rpctypes "github.com/33cn/chain33/rpc/types"
"github.com/33cn/chain33/types" "github.com/33cn/chain33/types"
...@@ -102,11 +103,17 @@ func CloseTicketCmd() *cobra.Command { ...@@ -102,11 +103,17 @@ func CloseTicketCmd() *cobra.Command {
Short: "Close tickets", Short: "Close tickets",
Run: closeTicket, Run: closeTicket,
} }
addCloseBindAddr(cmd)
return cmd return cmd
} }
func addCloseBindAddr(cmd *cobra.Command) {
cmd.Flags().StringP("miner_addr", "m", "", "miner address (optional)")
}
func closeTicket(cmd *cobra.Command, args []string) { func closeTicket(cmd *cobra.Command, args []string) {
rpcLaddr, _ := cmd.Flags().GetString("rpc_laddr") rpcLaddr, _ := cmd.Flags().GetString("rpc_laddr")
bindAddr, _ := cmd.Flags().GetString("miner_addr")
status, err := getWalletStatus(rpcLaddr) status, err := getWalletStatus(rpcLaddr)
if err != nil { if err != nil {
fmt.Fprintln(os.Stderr, err) fmt.Fprintln(os.Stderr, err)
...@@ -119,13 +126,17 @@ func closeTicket(cmd *cobra.Command, args []string) { ...@@ -119,13 +126,17 @@ func closeTicket(cmd *cobra.Command, args []string) {
return return
} }
tClose := &ty.TicketClose{
MinerAddress: bindAddr,
}
var res types.ReplyHashes var res types.ReplyHashes
rpc, err := jsonclient.NewJSONClient(rpcLaddr) rpc, err := jsonclient.NewJSONClient(rpcLaddr)
if err != nil { if err != nil {
fmt.Fprintln(os.Stderr, err) fmt.Fprintln(os.Stderr, err)
return return
} }
err = rpc.Call("ticket.CloseTickets", nil, &res) err = rpc.Call("ticket.CloseTickets", tClose, &res)
if err != nil { if err != nil {
fmt.Fprintln(os.Stderr, err) fmt.Fprintln(os.Stderr, err)
return return
...@@ -135,7 +146,12 @@ func closeTicket(cmd *cobra.Command, args []string) { ...@@ -135,7 +146,12 @@ func closeTicket(cmd *cobra.Command, args []string) {
return return
} }
data, err := json.MarshalIndent(res, "", " ") var tx txHashes
for _, hash := range res.Hashes {
tx.Hashes = append(tx.Hashes, common.ToHex(hash))
}
data, err := json.MarshalIndent(tx, "", " ")
if err != nil { if err != nil {
fmt.Fprintln(os.Stderr, err) fmt.Fprintln(os.Stderr, err)
return return
......
// Copyright Fuzamei Corp. 2018 All Rights Reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package commands
type txHashes struct {
Hashes []string `json:"hashes"`
}
...@@ -79,6 +79,7 @@ message TicketGenesis { ...@@ -79,6 +79,7 @@ message TicketGenesis {
message TicketClose { message TicketClose {
repeated string ticketId = 1; repeated string ticketId = 1;
string minerAddress = 2;
} }
message TicketList { message TicketList {
......
...@@ -77,8 +77,8 @@ func (g *channelClient) GetTicketCount(ctx context.Context, in *types.ReqNil) (* ...@@ -77,8 +77,8 @@ func (g *channelClient) GetTicketCount(ctx context.Context, in *types.ReqNil) (*
} }
// CloseTickets close ticket // CloseTickets close ticket
func (g *channelClient) CloseTickets(ctx context.Context, in *types.ReqNil) (*types.ReplyHashes, error) { func (g *channelClient) CloseTickets(ctx context.Context, in *ty.TicketClose) (*types.ReplyHashes, error) {
data, err := g.ExecWalletFunc(ty.TicketX, "CloseTickets", &types.ReqNil{}) data, err := g.ExecWalletFunc(ty.TicketX, "CloseTickets", in)
if err != nil { if err != nil {
return nil, err return nil, err
} }
...@@ -107,8 +107,8 @@ func (c *Jrpc) GetTicketCount(in *types.ReqNil, result *int64) error { ...@@ -107,8 +107,8 @@ func (c *Jrpc) GetTicketCount(in *types.ReqNil, result *int64) error {
} }
// CloseTickets close ticket // CloseTickets close ticket
func (c *Jrpc) CloseTickets(in *types.ReqNil, result *interface{}) error { func (c *Jrpc) CloseTickets(in *ty.TicketClose, result *interface{}) error {
resp, err := c.cli.CloseTickets(context.Background(), &types.ReqNil{}) resp, err := c.cli.CloseTickets(context.Background(), in)
if err != nil { if err != nil {
return err return err
} }
......
...@@ -10,9 +10,9 @@ import ( ...@@ -10,9 +10,9 @@ import (
) )
// On_CloseTickets close ticket // On_CloseTickets close ticket
func (policy *ticketPolicy) On_CloseTickets(req *types.ReqNil) (types.Message, error) { func (policy *ticketPolicy) On_CloseTickets(req *ty.TicketClose) (types.Message, error) {
operater := policy.getWalletOperate() operater := policy.getWalletOperate()
reply, err := policy.forceCloseTicket(operater.GetBlockHeight() + 1) reply, err := policy.forceCloseTicket(operater.GetBlockHeight()+1, req.MinerAddress)
if err != nil { if err != nil {
bizlog.Error("onCloseTickets", "forceCloseTicket error", err.Error()) bizlog.Error("onCloseTickets", "forceCloseTicket error", err.Error())
} else { } else {
......
...@@ -298,18 +298,29 @@ func (policy *ticketPolicy) checkNeedFlushTicket(tx *types.Transaction, receipt ...@@ -298,18 +298,29 @@ func (policy *ticketPolicy) checkNeedFlushTicket(tx *types.Transaction, receipt
return policy.needFlushTicket(tx, receipt) return policy.needFlushTicket(tx, receipt)
} }
func (policy *ticketPolicy) forceCloseTicket(height int64) (*types.ReplyHashes, error) { func (policy *ticketPolicy) forceCloseTicket(height int64, minerAddr string) (*types.ReplyHashes, error) {
return policy.forceCloseAllTicket(height) return policy.forceCloseAllTicket(height, minerAddr)
} }
func (policy *ticketPolicy) forceCloseAllTicket(height int64) (*types.ReplyHashes, error) { func (policy *ticketPolicy) forceCloseAllTicket(height int64, minerAddr string) (*types.ReplyHashes, error) {
var tlistMiner []*ty.Ticket
var err error
// get miner addr's tickets if any
if minerAddr != "" {
tlistMiner, err = policy.getForceCloseTickets(minerAddr)
if err != nil {
return nil, err
}
}
keys, err := policy.getWalletOperate().GetAllPrivKeys() keys, err := policy.getWalletOperate().GetAllPrivKeys()
if err != nil { if err != nil {
return nil, err return nil, err
} }
var hashes types.ReplyHashes var hashes types.ReplyHashes
for _, key := range keys { for _, key := range keys {
hash, err := policy.forceCloseTicketsByAddr(height, key) hash, err := policy.forceCloseTicketsByAddr(height, key, tlistMiner)
if err != nil { if err != nil {
bizlog.Error("forceCloseAllTicket", "forceCloseTicketsByAddr error", err) bizlog.Error("forceCloseAllTicket", "forceCloseTicketsByAddr error", err)
continue continue
...@@ -334,8 +345,10 @@ func (policy *ticketPolicy) getTickets(addr string, status int32) ([]*ty.Ticket, ...@@ -334,8 +345,10 @@ func (policy *ticketPolicy) getTickets(addr string, status int32) ([]*ty.Ticket,
return reply.Tickets, nil return reply.Tickets, nil
} }
func (policy *ticketPolicy) forceCloseTicketsByAddr(height int64, priv crypto.PrivKey) ([]byte, error) { func (policy *ticketPolicy) getForceCloseTickets(addr string) ([]*ty.Ticket, error) {
addr := address.PubKeyToAddress(priv.PubKey().Bytes()).String() if addr == "" {
return nil, nil
}
tlist1, err1 := policy.getTickets(addr, 1) tlist1, err1 := policy.getTickets(addr, 1)
if err1 != nil && err1 != types.ErrNotFound { if err1 != nil && err1 != types.ErrNotFound {
return nil, err1 return nil, err1
...@@ -344,7 +357,23 @@ func (policy *ticketPolicy) forceCloseTicketsByAddr(height int64, priv crypto.Pr ...@@ -344,7 +357,23 @@ func (policy *ticketPolicy) forceCloseTicketsByAddr(height int64, priv crypto.Pr
if err2 != nil && err2 != types.ErrNotFound { if err2 != nil && err2 != types.ErrNotFound {
return nil, err1 return nil, err1
} }
tlist := append(tlist1, tlist2...)
return append(tlist1, tlist2...), nil
}
func (policy *ticketPolicy) forceCloseTicketsByAddr(height int64, priv crypto.PrivKey, tListMiner []*ty.Ticket) ([]byte, error) {
addr := address.PubKeyToAddress(priv.PubKey().Bytes()).String()
tlist, err := policy.getForceCloseTickets(addr)
if err != nil {
return nil, err
}
for _, ticket := range tListMiner {
if ticket.ReturnAddress == addr {
tlist = append(tlist, ticket)
}
}
var ids []string var ids []string
var tl []*ty.Ticket var tl []*ty.Ticket
now := types.Now().Unix() now := types.Now().Unix()
......
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