Commit 88942a63 authored by mdj33's avatar mdj33 Committed by vipwzw

add node group apply and coin frozen process

parent 645fdab2
...@@ -212,3 +212,7 @@ superManager=[ ...@@ -212,3 +212,7 @@ superManager=[
"12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv", "12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv",
"1Q8hGLfoGe63efeWa8fJ4Pnukhkngt6poK" "1Q8hGLfoGe63efeWa8fJ4Pnukhkngt6poK"
] ]
[exec.sub.paracross]
nodeGroupFrozenCoins=0
...@@ -33,6 +33,7 @@ func ParcCmd() *cobra.Command { ...@@ -33,6 +33,7 @@ func ParcCmd() *cobra.Command {
CreateRawWithdrawCmd(), CreateRawWithdrawCmd(),
CreateRawTransferToExecCmd(), CreateRawTransferToExecCmd(),
CreateRawNodeManageCmd(), CreateRawNodeManageCmd(),
CreateNodeGroupApplyCmd(),
GetParaInfoCmd(), GetParaInfoCmd(),
GetParaListCmd(), GetParaListCmd(),
GetNodeGroupCmd(), GetNodeGroupCmd(),
...@@ -248,22 +249,27 @@ func CreateRawNodeManageCmd() *cobra.Command { ...@@ -248,22 +249,27 @@ func CreateRawNodeManageCmd() *cobra.Command {
} }
func addNodeManageFlags(cmd *cobra.Command) { func addNodeManageFlags(cmd *cobra.Command) {
cmd.Flags().StringP("operation", "o", "", "operation:join,quit,vote,takeover") cmd.Flags().StringP("operation", "o", "", "operation:join,quit,vote")
cmd.MarkFlagRequired("operation") cmd.MarkFlagRequired("operation")
cmd.Flags().StringP("addr", "a", "", "operating target addr") cmd.Flags().StringP("addr", "a", "", "operating target addr")
cmd.MarkFlagRequired("addrs")
cmd.Flags().StringP("value", "v", "", "vote value: yes,no") cmd.Flags().StringP("value", "v", "", "vote value: yes,no")
cmd.Flags().Int64P("coins_frozen", "c", 0, "join to frozen coins amount, not less config")
} }
func createNodeTx(cmd *cobra.Command, args []string) { func createNodeTx(cmd *cobra.Command, args []string) {
op, _ := cmd.Flags().GetString("operation") op, _ := cmd.Flags().GetString("operation")
opAddr, _ := cmd.Flags().GetString("addr") opAddr, _ := cmd.Flags().GetString("addr")
val, _ := cmd.Flags().GetString("value") val, _ := cmd.Flags().GetString("value")
if op != "vote" && op != "quit" && op != "join" && op != "takeover" { coins, _ := cmd.Flags().GetInt64("coins_frozen")
fmt.Println("operation should be one of join,quit,vote,takeover")
if op != "vote" && op != "quit" && op != "join" {
fmt.Println("operation should be one of join,quit,vote")
return return
} }
if (op == "vote" || op == "join" || op == "quit") && opAddr == "" { if opAddr == "" {
fmt.Println("addr parameter should not be null") fmt.Println("addr parameter should not be null")
return return
} }
...@@ -272,7 +278,7 @@ func createNodeTx(cmd *cobra.Command, args []string) { ...@@ -272,7 +278,7 @@ func createNodeTx(cmd *cobra.Command, args []string) {
return return
} }
payload := &pt.ParaNodeAddrConfig{Op: op, Value: val, Addr: opAddr} payload := &pt.ParaNodeAddrConfig{Op: op, Value: val, Addr: opAddr, CoinsFrozen: coins}
params := &rpctypes.CreateTxIn{ params := &rpctypes.CreateTxIn{
Execer: types.ExecName(pt.ParaX), Execer: types.ExecName(pt.ParaX),
ActionName: "NodeConfig", ActionName: "NodeConfig",
...@@ -285,6 +291,54 @@ func createNodeTx(cmd *cobra.Command, args []string) { ...@@ -285,6 +291,54 @@ func createNodeTx(cmd *cobra.Command, args []string) {
} }
// CreateNodeGroupApplyCmd get node group addr
func CreateNodeGroupApplyCmd() *cobra.Command {
cmd := &cobra.Command{
Use: "nodegroup",
Short: "apply for para chain's super node group",
Run: nodeGroupApply,
}
addNodeGroupApplyCmdFlags(cmd)
return cmd
}
func addNodeGroupApplyCmdFlags(cmd *cobra.Command) {
cmd.Flags().Uint32P("operation", "o", 0, "operation:1:apply,2:approve,3:quit")
cmd.MarkFlagRequired("operation")
cmd.Flags().StringP("addrs", "a", "", "addrs apply for super node,split by ',' ")
cmd.MarkFlagRequired("addrs")
cmd.Flags().Int64P("coins_frozen", "c", 0, "coins amount to frozen, not less config")
}
func nodeGroupApply(cmd *cobra.Command, args []string) {
op, _ := cmd.Flags().GetUint32("operation")
addrs, _ := cmd.Flags().GetString("addrs")
coins, _ := cmd.Flags().GetInt64("coins_frozen")
if op == 0 || op > 3 {
fmt.Println("operation should be one of 1:apply,2:approve,3:quit")
return
}
if addrs == "" {
fmt.Println("addrs should not be nil")
return
}
payload := &pt.ParaNodeGroupApply{Op: op, Addrs: addrs, CoinsFrozen: coins}
params := &rpctypes.CreateTxIn{
Execer: types.ExecName(pt.ParaX),
ActionName: "NodeGroupApply",
Payload: types.MustPBToJSON(payload),
}
rpcLaddr, _ := cmd.Flags().GetString("rpc_laddr")
ctx := jsonclient.NewRPCCtx(rpcLaddr, "Chain33.CreateTransaction", params, nil)
ctx.RunWithoutMarshal()
}
// IsSyncCmd query parachain is sync // IsSyncCmd query parachain is sync
func IsSyncCmd() *cobra.Command { func IsSyncCmd() *cobra.Command {
cmd := &cobra.Command{ cmd := &cobra.Command{
...@@ -315,6 +369,7 @@ func GetHeightCmd() *cobra.Command { ...@@ -315,6 +369,7 @@ func GetHeightCmd() *cobra.Command {
func addTitleFlags(cmd *cobra.Command) { func addTitleFlags(cmd *cobra.Command) {
cmd.Flags().StringP("title", "t", "", "parallel chain's title, default null in para chain") cmd.Flags().StringP("title", "t", "", "parallel chain's title, default null in para chain")
cmd.MarkFlagRequired("title")
} }
func consusHeight(cmd *cobra.Command, args []string) { func consusHeight(cmd *cobra.Command, args []string) {
...@@ -484,8 +539,8 @@ func nodeList(cmd *cobra.Command, args []string) { ...@@ -484,8 +539,8 @@ func nodeList(cmd *cobra.Command, args []string) {
// GetNodeGroupCmd get node group addr // GetNodeGroupCmd get node group addr
func GetNodeGroupCmd() *cobra.Command { func GetNodeGroupCmd() *cobra.Command {
cmd := &cobra.Command{ cmd := &cobra.Command{
Use: "node_group", Use: "nodegroup_list",
Short: "Get super node group by title", Short: "Get super node group list by title or status",
Run: nodeGroup, Run: nodeGroup,
} }
addNodeGroupCmdFlags(cmd) addNodeGroupCmdFlags(cmd)
...@@ -495,13 +550,22 @@ func GetNodeGroupCmd() *cobra.Command { ...@@ -495,13 +550,22 @@ func GetNodeGroupCmd() *cobra.Command {
func addNodeGroupCmdFlags(cmd *cobra.Command) { func addNodeGroupCmdFlags(cmd *cobra.Command) {
cmd.Flags().StringP("title", "t", "", "parallel chain's title") cmd.Flags().StringP("title", "t", "", "parallel chain's title")
cmd.MarkFlagRequired("title") cmd.MarkFlagRequired("title")
cmd.Flags().Int32P("status", "s", 0, "status:1:apply,2:approve,3:quit")
cmd.MarkFlagRequired("status")
} }
func nodeGroup(cmd *cobra.Command, args []string) { func nodeGroup(cmd *cobra.Command, args []string) {
rpcLaddr, _ := cmd.Flags().GetString("rpc_laddr") rpcLaddr, _ := cmd.Flags().GetString("rpc_laddr")
title, _ := cmd.Flags().GetString("title") title, _ := cmd.Flags().GetString("title")
status, _ := cmd.Flags().GetInt32("status")
params := pt.ReqParacrossNodeInfo{
Title: title,
Status: status,
}
var res types.ReplyConfig var res types.ReplyConfig
ctx := jsonclient.NewRPCCtx(rpcLaddr, "paracross.GetNodeGroup", types.ReqString{Data: title}, &res) ctx := jsonclient.NewRPCCtx(rpcLaddr, "paracross.GetNodeGroup", params, &res)
ctx.Run() ctx.Run()
} }
...@@ -92,3 +92,8 @@ func (e *Paracross) Exec_NodeConfig(payload *pt.ParaNodeAddrConfig, tx *types.Tr ...@@ -92,3 +92,8 @@ func (e *Paracross) Exec_NodeConfig(payload *pt.ParaNodeAddrConfig, tx *types.Tr
a := newAction(e, tx) a := newAction(e, tx)
return a.NodeConfig(payload) return a.NodeConfig(payload)
} }
func (e *Paracross) Exec_NodeGroupConfig(payload *pt.ParaNodeGroupApply, tx *types.Transaction, index int) (*types.Receipt, error) {
a := newAction(e, tx)
return a.NodeGroupConfig(payload)
}
...@@ -16,6 +16,7 @@ var ( ...@@ -16,6 +16,7 @@ var (
managerConfigNodes string //manager 合约配置的nodes managerConfigNodes string //manager 合约配置的nodes
paraConfigNodes string //平行链自组织配置的nodes,最初是从manager同步过来 paraConfigNodes string //平行链自组织配置的nodes,最初是从manager同步过来
paraConfigNodeAddr string //平行链配置节点账户 paraConfigNodeAddr string //平行链配置节点账户
paraNodeGroupApplyAddrs string
localTx string localTx string
localTitle string localTitle string
localTitleHeight string localTitleHeight string
...@@ -30,6 +31,7 @@ func setPrefix() { ...@@ -30,6 +31,7 @@ func setPrefix() {
managerConfigNodes = "paracross-nodes-" managerConfigNodes = "paracross-nodes-"
paraConfigNodes = "mavl-paracross-nodes-title-" paraConfigNodes = "mavl-paracross-nodes-title-"
paraConfigNodeAddr = "mavl-paracross-nodes-titleAddr-" paraConfigNodeAddr = "mavl-paracross-nodes-titleAddr-"
paraNodeGroupApplyAddrs = "mavl-paracross-nodegroup-apply-title-"
localTx = "LODB-paracross-titleHeightAddr-" localTx = "LODB-paracross-titleHeightAddr-"
localTitle = "LODB-paracross-title-" localTitle = "LODB-paracross-title-"
localTitleHeight = "LODB-paracross-titleHeight-" localTitleHeight = "LODB-paracross-titleHeight-"
...@@ -65,6 +67,10 @@ func calcParaNodeAddrKey(title string, addr string) []byte { ...@@ -65,6 +67,10 @@ func calcParaNodeAddrKey(title string, addr string) []byte {
return []byte(fmt.Sprintf(paraConfigNodeAddr+"%s-%s", title, addr)) return []byte(fmt.Sprintf(paraConfigNodeAddr+"%s-%s", title, addr))
} }
func calcParaNodeGroupApplyKey(title string) []byte {
return []byte(fmt.Sprintf(paraNodeGroupApplyAddrs+"%s", title))
}
func calcLocalTxKey(title string, height int64, addr string) []byte { func calcLocalTxKey(title string, height int64, addr string) []byte {
return []byte(fmt.Sprintf(localTx+"%s-%012-%s", title, height, addr)) return []byte(fmt.Sprintf(localTx+"%s-%012-%s", title, height, addr))
} }
......
...@@ -300,7 +300,8 @@ func (c *Paracross) allow(tx *types.Transaction, index int) error { ...@@ -300,7 +300,8 @@ func (c *Paracross) allow(tx *types.Transaction, index int) error {
return nil return nil
} }
if types.IsDappFork(c.GetHeight(), pt.ParaX, pt.ForkCommitTx) { if types.IsDappFork(c.GetHeight(), pt.ParaX, pt.ForkCommitTx) {
if payload.Ty == pt.ParacrossActionCommit || payload.Ty == pt.ParacrossActionNodeConfig { if payload.Ty == pt.ParacrossActionCommit || payload.Ty == pt.ParacrossActionNodeConfig ||
payload.Ty == pt.ParacrossActionNodeGroupApply {
return nil return nil
} }
} }
......
...@@ -36,11 +36,11 @@ func (p *Paracross) Query_GetTitleByHash(in *pt.ReqParacrossTitleHash) (types.Me ...@@ -36,11 +36,11 @@ func (p *Paracross) Query_GetTitleByHash(in *pt.ReqParacrossTitleHash) (types.Me
} }
//Query_GetNodeGroup get node group addrs //Query_GetNodeGroup get node group addrs
func (p *Paracross) Query_GetNodeGroup(in *types.ReqString) (types.Message, error) { func (p *Paracross) Query_GetNodeGroup(in *pt.ReqParacrossNodeInfo) (types.Message, error) {
if in == nil { if in == nil {
return nil, types.ErrInvalidParam return nil, types.ErrInvalidParam
} }
key := calcParaNodeGroupKey(in.GetData()) key := calcParaNodeGroupKey(in.GetTitle())
ret, _, err := getNodes(p.GetStateDB(), key) ret, _, err := getNodes(p.GetStateDB(), key)
if err != nil { if err != nil {
return nil, errors.Cause(err) return nil, errors.Cause(err)
......
...@@ -39,6 +39,7 @@ message ParaNodeAddrConfig{ ...@@ -39,6 +39,7 @@ message ParaNodeAddrConfig{
string op = 2; string op = 2;
string addr = 3; string addr = 3;
string value = 4; string value = 4;
int64 coinsFrozen = 5;
} }
...@@ -51,7 +52,8 @@ message ParaNodeAddrStatus{ ...@@ -51,7 +52,8 @@ message ParaNodeAddrStatus{
int32 status = 1; int32 status = 1;
string title = 2; string title = 2;
string applyAddr = 3; string applyAddr = 3;
ParaNodeVoteDetail votes = 4; int64 coinsFrozen = 4;
ParaNodeVoteDetail votes = 5;
} }
...@@ -79,6 +81,15 @@ message ReceiptParaNodeVoteDone { ...@@ -79,6 +81,15 @@ message ReceiptParaNodeVoteDone {
} }
message ParaNodeGroupApply{
string title = 1;
uint32 op = 2;
string addrs = 3;
int64 coinsFrozen = 4;
}
// node query // node query
message ReqParacrossNodeInfo { message ReqParacrossNodeInfo {
string title = 1; string title = 1;
...@@ -137,6 +148,8 @@ message ParacrossAction { ...@@ -137,6 +148,8 @@ message ParacrossAction {
AssetsWithdraw withdraw = 7; AssetsWithdraw withdraw = 7;
AssetsTransferToExec transferToExec = 8; AssetsTransferToExec transferToExec = 8;
ParaNodeAddrConfig nodeConfig = 9; ParaNodeAddrConfig nodeConfig = 9;
ParaNodeGroupApply nodeGroupConfig= 10;
} }
int32 ty = 2; int32 ty = 2;
......
...@@ -169,7 +169,7 @@ func (c *Jrpc) GetBlock2MainInfo(req *types.ReqBlocks, result *interface{}) erro ...@@ -169,7 +169,7 @@ func (c *Jrpc) GetBlock2MainInfo(req *types.ReqBlocks, result *interface{}) erro
} }
// GetNodeGroup get super node group // GetNodeGroup get super node group
func (c *channelClient) GetNodeGroup(ctx context.Context, req *types.ReqString) (*types.ReplyConfig, error) { func (c *channelClient) GetNodeGroup(ctx context.Context, req *pt.ReqParacrossNodeInfo) (*types.ReplyConfig, error) {
r := *req r := *req
data, err := c.Query(pt.GetExecName(), "GetNodeGroup", &r) data, err := c.Query(pt.GetExecName(), "GetNodeGroup", &r)
if err != nil { if err != nil {
...@@ -182,7 +182,7 @@ func (c *channelClient) GetNodeGroup(ctx context.Context, req *types.ReqString) ...@@ -182,7 +182,7 @@ func (c *channelClient) GetNodeGroup(ctx context.Context, req *types.ReqString)
} }
// GetNodeGroup get super node group // GetNodeGroup get super node group
func (c *Jrpc) GetNodeGroup(req *types.ReqString, result *interface{}) error { func (c *Jrpc) GetNodeGroup(req *pt.ReqParacrossNodeInfo, result *interface{}) error {
data, err := c.cli.GetNodeGroup(context.Background(), req) data, err := c.cli.GetNodeGroup(context.Background(), req)
*result = data *result = data
return err return err
......
...@@ -43,4 +43,10 @@ var ( ...@@ -43,4 +43,10 @@ var (
ErrParaNodeGroupLastAddr = errors.New("ErrParaNodeGroupLastAddr") ErrParaNodeGroupLastAddr = errors.New("ErrParaNodeGroupLastAddr")
//ErrParaNodeVoteSelf vote self not allow //ErrParaNodeVoteSelf vote self not allow
ErrParaNodeVoteSelf = errors.New("ErrParaNodeVoteSelf") ErrParaNodeVoteSelf = errors.New("ErrParaNodeVoteSelf")
//ErrParaNodeGroupLessFrozenCoins node group coins in tx less than conf's minimum coins
ErrParaNodeGroupFrozenCoinsNotEnough = errors.New("ErrParaNodeGroupFrozenCoinsNotEnough")
//ErrParaNodeGroupStatusWrong node group process wrong status
ErrParaNodeGroupStatusWrong = errors.New("ErrParaNodeGroupStatusWrong")
//ErrParaNodeGroupAddrNotMatch
ErrParaNodeGroupAddrNotMatch = errors.New("ErrParaNodeGroupAddrNotMatch")
) )
...@@ -39,6 +39,9 @@ const ( ...@@ -39,6 +39,9 @@ const (
TyLogParaNodeConfig = 657 TyLogParaNodeConfig = 657
TyLogParaNodeVoteDone = 658 TyLogParaNodeVoteDone = 658
TyLogParaNodeGroupUpdate = 659 TyLogParaNodeGroupUpdate = 659
TyLogParaNodeGroupApply = 660
TyLogParaNodeGroupApprove = 661
TyLogParaNodeGroupQuit = 662
) )
type paracrossCommitTx struct { type paracrossCommitTx struct {
...@@ -72,6 +75,8 @@ const ( ...@@ -72,6 +75,8 @@ const (
ParacrossActionAssetWithdraw ParacrossActionAssetWithdraw
//ParacrossActionNodeConfig para super node config //ParacrossActionNodeConfig para super node config
ParacrossActionNodeConfig ParacrossActionNodeConfig
//ParacrossActionNodeGroupApply
ParacrossActionNodeGroupApply
) )
// status // status
...@@ -87,7 +92,6 @@ const ( ...@@ -87,7 +92,6 @@ const (
ParaNodeJoin = "join" ParaNodeJoin = "join"
ParaNodeQuit = "quit" ParaNodeQuit = "quit"
ParaNodeVote = "vote" ParaNodeVote = "vote"
ParaNodeTakeover = "takeover"
ParaNodeVoteYes = "yes" ParaNodeVoteYes = "yes"
ParaNodeVoteNo = "no" ParaNodeVoteNo = "no"
...@@ -104,6 +108,12 @@ const ( ...@@ -104,6 +108,12 @@ const (
ParacrossNodeQuited ParacrossNodeQuited
) )
const (
ParacrossNodeGroupApply = iota + 1
ParacrossNodeGroupApprove
ParacrossNodeGroupQuit
)
var ( var (
// ParacrossActionCommitStr Commit string // ParacrossActionCommitStr Commit string
ParacrossActionCommitStr = string("Commit") ParacrossActionCommitStr = string("Commit")
...@@ -176,6 +186,22 @@ func CreateRawNodeConfigTx(config *ParaNodeAddrConfig) (*types.Transaction, erro ...@@ -176,6 +186,22 @@ func CreateRawNodeConfigTx(config *ParaNodeAddrConfig) (*types.Transaction, erro
return tx, nil return tx, nil
} }
func CreateRawNodeGroupApplyTx(apply *ParaNodeGroupApply) (*types.Transaction, error) {
apply.Title = types.GetTitle()
action := &ParacrossAction{
Ty: ParacrossActionNodeGroupApply,
Value: &ParacrossAction_NodeGroupConfig{apply},
}
tx := &types.Transaction{
Payload: types.Encode(action),
}
return tx, nil
}
// CreateRawAssetTransferTx create asset transfer tx // CreateRawAssetTransferTx create asset transfer tx
func CreateRawAssetTransferTx(param *types.CreateTx) (*types.Transaction, error) { func CreateRawAssetTransferTx(param *types.CreateTx) (*types.Transaction, error) {
// 跨链交易需要在主链和平行链上执行, 所以应该可以在主链和平行链上构建 // 跨链交易需要在主链和平行链上执行, 所以应该可以在主链和平行链上构建
......
...@@ -122,6 +122,17 @@ func (p ParacrossType) CreateTx(action string, message json.RawMessage) (*types. ...@@ -122,6 +122,17 @@ func (p ParacrossType) CreateTx(action string, message json.RawMessage) (*types.
return nil, types.ErrInvalidParam return nil, types.ErrInvalidParam
} }
return CreateRawNodeConfigTx(&param) return CreateRawNodeConfigTx(&param)
} else if action == "NodeGroupApply" {
if !types.IsPara() {
return nil, types.ErrNotSupport
}
var param ParaNodeGroupApply
err := json.Unmarshal(message, &param)
if err != nil {
glog.Error("CreateTx.NodeGroupApply", "Error", err)
return nil, types.ErrInvalidParam
}
return CreateRawNodeGroupApplyTx(&param)
} }
return nil, types.ErrNotSupport return nil, types.ErrNotSupport
......
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