Commit 70d84651 authored by mdj33's avatar mdj33 Committed by vipwzw

update para title status cmd

parent c715a827
...@@ -248,35 +248,31 @@ func CreateRawNodeManageCmd() *cobra.Command { ...@@ -248,35 +248,31 @@ func CreateRawNodeManageCmd() *cobra.Command {
} }
func addNodeManageFlags(cmd *cobra.Command) { func addNodeManageFlags(cmd *cobra.Command) {
cmd.Flags().StringP("operation", "o", "", "add,delete,vote,takeover operation") cmd.Flags().StringP("operation", "o", "", "operation:join,quit,vote,takeover")
cmd.MarkFlagRequired("operation") cmd.MarkFlagRequired("operation")
cmd.Flags().StringP("addr", "a", "", "operating addr object") cmd.Flags().StringP("addr", "a", "", "operating target addr")
cmd.Flags().StringP("value", "v", "pass", "vote value: pass,no") cmd.Flags().StringP("value", "v", "", "vote value: yes,no")
} }
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 != "delete" && op != "add" && op != "takeover" { if op != "vote" && op != "quit" && op != "join" && op != "takeover" {
fmt.Println(os.Stderr, "operation should be one of add, delete,vote,takeover") fmt.Println("operation should be one of join,quit,vote,takeover")
return
} }
if (op == "vote" || op == "add" || op == "delete") && opAddr == "" { if (op == "vote" || op == "join" || op == "quit") && opAddr == "" {
fmt.Println(os.Stderr, "addr parameter should not be null") fmt.Println("addr parameter should not be null")
return return
} }
if op == "vote" && (val != "pass" && val != "no") { if op == "vote" && (val != "yes" && val != "no") {
fmt.Println(os.Stderr, "vote operation value parameter require pass or no value") fmt.Println("vote operation value parameter require yes or no value")
return return
} }
payload := &pt.ParaNodeAddrConfig{Op: op, Value: val, Addr: opAddr} payload := &pt.ParaNodeAddrConfig{Op: op, Value: val, Addr: opAddr}
//modify := &pt.ParacrossAction{
// Ty: pt.ParacrossActionNodeConfig,
// Value: &pt.ParacrossAction_NodeConfig{NodeConfig: v},
//}
params := &rpcTypes.CreateTxIn{ params := &rpcTypes.CreateTxIn{
Execer: types.ExecName(pt.ParaX), Execer: types.ExecName(pt.ParaX),
ActionName: "NodeConfig", ActionName: "NodeConfig",
...@@ -393,7 +389,7 @@ func paraInfo(cmd *cobra.Command, args []string) { ...@@ -393,7 +389,7 @@ func paraInfo(cmd *cobra.Command, args []string) {
Title: title, Title: title,
Height: height, Height: height,
} }
var res pt.ReceiptParacrossDone var res pt.RespParacrossDone
ctx := jsonclient.NewRPCCtx(rpcLaddr, "paracross.GetTitleHeight", params, &res) ctx := jsonclient.NewRPCCtx(rpcLaddr, "paracross.GetTitleHeight", params, &res)
ctx.Run() ctx.Run()
} }
...@@ -466,7 +462,7 @@ func addNodeListCmdFlags(cmd *cobra.Command) { ...@@ -466,7 +462,7 @@ func addNodeListCmdFlags(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:0:add,1:added,2:quit,3:quited,4:refused") cmd.Flags().Int32P("status", "s", 0, "status:1:adding,2:added,3:quiting,4:quited")
cmd.MarkFlagRequired("status") cmd.MarkFlagRequired("status")
} }
...@@ -485,7 +481,7 @@ func nodeList(cmd *cobra.Command, args []string) { ...@@ -485,7 +481,7 @@ func nodeList(cmd *cobra.Command, args []string) {
ctx.Run() ctx.Run()
} }
// GetNodeListCmd get node list by status // GetNodeGroupCmd get node group addr
func GetNodeGroupCmd() *cobra.Command { func GetNodeGroupCmd() *cobra.Command {
cmd := &cobra.Command{ cmd := &cobra.Command{
Use: "node_group", Use: "node_group",
......
...@@ -298,7 +298,12 @@ func (a *action) Commit(commit *pt.ParacrossCommitAction) (*types.Receipt, error ...@@ -298,7 +298,12 @@ func (a *action) Commit(commit *pt.ParacrossCommitAction) (*types.Receipt, error
} }
receipt = makeCommitReceipt(a.fromaddr, commit, nil, stat) receipt = makeCommitReceipt(a.fromaddr, commit, nil, stat)
} else { } else {
copyStat := *stat var copyStat pt.ParacrossHeightStatus
err = deepCopy(&copyStat, stat)
if err != nil {
clog.Error("paracross.Commit deep copy fail", "copy", copyStat, "stat", stat)
return nil, err
}
// 如有分叉, 同一个节点可能再次提交commit交易 // 如有分叉, 同一个节点可能再次提交commit交易
found, index := hasCommited(stat.Details.Addrs, a.fromaddr) found, index := hasCommited(stat.Details.Addrs, a.fromaddr)
if found { if found {
......
...@@ -49,6 +49,7 @@ func (e *Paracross) ExecDelLocal_Commit(payload *pt.ParacrossCommitAction, tx *t ...@@ -49,6 +49,7 @@ func (e *Paracross) ExecDelLocal_Commit(payload *pt.ParacrossCommitAction, tx *t
return &set, nil return &set, nil
} }
// ExecDelLocal_NodeConfig node config tx delete process
func (e *Paracross) ExecDelLocal_NodeConfig(payload *pt.ParaNodeAddrConfig, tx *types.Transaction, receiptData *types.ReceiptData, index int) (*types.LocalDBSet, error) { func (e *Paracross) ExecDelLocal_NodeConfig(payload *pt.ParaNodeAddrConfig, tx *types.Transaction, receiptData *types.ReceiptData, index int) (*types.LocalDBSet, error) {
var set types.LocalDBSet var set types.LocalDBSet
for _, log := range receiptData.Logs { for _, log := range receiptData.Logs {
......
...@@ -51,6 +51,7 @@ func (e *Paracross) ExecLocal_Commit(payload *pt.ParacrossCommitAction, tx *type ...@@ -51,6 +51,7 @@ func (e *Paracross) ExecLocal_Commit(payload *pt.ParacrossCommitAction, tx *type
return &set, nil return &set, nil
} }
//ExecLocal_NodeConfig node config add process
func (e *Paracross) ExecLocal_NodeConfig(payload *pt.ParaNodeAddrConfig, tx *types.Transaction, receiptData *types.ReceiptData, index int) (*types.LocalDBSet, error) { func (e *Paracross) ExecLocal_NodeConfig(payload *pt.ParaNodeAddrConfig, tx *types.Transaction, receiptData *types.ReceiptData, index int) (*types.LocalDBSet, error) {
var set types.LocalDBSet var set types.LocalDBSet
for _, log := range receiptData.Logs { for _, log := range receiptData.Logs {
......
...@@ -17,11 +17,10 @@ var ( ...@@ -17,11 +17,10 @@ var (
managerConfigNodes string //manager 合约配置的nodes managerConfigNodes string //manager 合约配置的nodes
paraConfigNodes string //平行链自组织配置的nodes,最初是从manager同步过来 paraConfigNodes string //平行链自组织配置的nodes,最初是从manager同步过来
paraConfigNodeAddr string //平行链配置节点账户 paraConfigNodeAddr string //平行链配置节点账户
localTx string localTx string
localTitle string localTitle string
localTitleHeight string localTitleHeight string
localAssetKey string localAssetKey string
localNodeTitle string
localNodeTitleStatus string localNodeTitleStatus string
localNodeTitleDone string localNodeTitleDone string
) )
......
...@@ -8,6 +8,9 @@ import ( ...@@ -8,6 +8,9 @@ import (
"encoding/hex" "encoding/hex"
"fmt" "fmt"
"math/big"
"strconv"
dbm "github.com/33cn/chain33/common/db" dbm "github.com/33cn/chain33/common/db"
"github.com/33cn/chain33/types" "github.com/33cn/chain33/types"
pt "github.com/33cn/plugin/plugin/dapp/paracross/types" pt "github.com/33cn/plugin/plugin/dapp/paracross/types"
...@@ -40,6 +43,7 @@ func (p *Paracross) Query_GetTitleByHash(in *pt.ReqParacrossTitleHash) (types.Me ...@@ -40,6 +43,7 @@ func (p *Paracross) Query_GetTitleByHash(in *pt.ReqParacrossTitleHash) (types.Me
} }
//Query_GetNodeGroup get node group addrs
func (p *Paracross) Query_GetNodeGroup(in *types.ReqString) (types.Message, error) { func (p *Paracross) Query_GetNodeGroup(in *types.ReqString) (types.Message, error) {
if in == nil { if in == nil {
return nil, types.ErrInvalidParam return nil, types.ErrInvalidParam
...@@ -59,6 +63,7 @@ func (p *Paracross) Query_GetNodeGroup(in *types.ReqString) (types.Message, erro ...@@ -59,6 +63,7 @@ func (p *Paracross) Query_GetNodeGroup(in *types.ReqString) (types.Message, erro
return &reply, nil return &reply, nil
} }
//Query_GetNodeAddrInfo get specific node addr info
func (p *Paracross) Query_GetNodeAddrInfo(in *pt.ReqParacrossNodeInfo) (types.Message, error) { func (p *Paracross) Query_GetNodeAddrInfo(in *pt.ReqParacrossNodeInfo) (types.Message, error) {
if in == nil || in.Title == "" || in.Addr == "" { if in == nil || in.Title == "" || in.Addr == "" {
return nil, types.ErrInvalidParam return nil, types.ErrInvalidParam
...@@ -71,6 +76,7 @@ func (p *Paracross) Query_GetNodeAddrInfo(in *pt.ReqParacrossNodeInfo) (types.Me ...@@ -71,6 +76,7 @@ func (p *Paracross) Query_GetNodeAddrInfo(in *pt.ReqParacrossNodeInfo) (types.Me
return stat, nil return stat, nil
} }
//Query_ListNodeStatusInfo list node info by status
func (p *Paracross) Query_ListNodeStatusInfo(in *pt.ReqParacrossNodeInfo) (types.Message, error) { func (p *Paracross) Query_ListNodeStatusInfo(in *pt.ReqParacrossNodeInfo) (types.Message, error) {
if in == nil || in.Title == "" { if in == nil || in.Title == "" {
return nil, types.ErrInvalidParam return nil, types.ErrInvalidParam
...@@ -165,7 +171,18 @@ func listLocalTitles(db dbm.KVDB) (types.Message, error) { ...@@ -165,7 +171,18 @@ func listLocalTitles(db dbm.KVDB) (types.Message, error) {
if err != nil { if err != nil {
panic(err) panic(err)
} }
resp.Titles = append(resp.Titles, &st) rst := &pt.RespParacrossDone{
TotalNodes: st.TotalNodes,
TotalCommit: st.TotalCommit,
MostSameCommit: st.MostSameCommit,
Title: st.Title,
Height: st.Height,
StateHash: hex.EncodeToString(st.StateHash),
TxCounts: st.TxCounts,
TxResult: strconv.FormatUint(big.NewInt(0).SetBytes(st.TxResult).Uint64(), 2),
}
resp.Titles = append(resp.Titles, rst)
} }
return &resp, nil return &resp, nil
} }
...@@ -180,7 +197,7 @@ func listLocalNodeStatus(db dbm.KVDB, title string, status int32) (types.Message ...@@ -180,7 +197,7 @@ func listLocalNodeStatus(db dbm.KVDB, title string, status int32) (types.Message
var resp pt.RespParacrossNodeAddrs var resp pt.RespParacrossNodeAddrs
for _, r := range res { for _, r := range res {
var st pt.ReceiptParaNodeVoteDone var st pt.ParaNodeAddrStatus
err = types.Decode(r, &st) err = types.Decode(r, &st)
if err != nil { if err != nil {
panic(err) panic(err)
...@@ -197,12 +214,22 @@ func loadLocalTitle(db dbm.KV, title string, height int64) (types.Message, error ...@@ -197,12 +214,22 @@ func loadLocalTitle(db dbm.KV, title string, height int64) (types.Message, error
if err != nil { if err != nil {
return nil, err return nil, err
} }
var resp pt.ReceiptParacrossDone var st pt.ReceiptParacrossDone
err = types.Decode(res, &resp) err = types.Decode(res, &st)
if err != nil { if err != nil {
panic(err) panic(err)
} }
return &resp, nil
return &pt.RespParacrossDone{
TotalNodes: st.TotalNodes,
TotalCommit: st.TotalCommit,
MostSameCommit: st.MostSameCommit,
Title: st.Title,
Height: st.Height,
StateHash: hex.EncodeToString(st.StateHash),
TxCounts: st.TxCounts,
TxResult: strconv.FormatUint(big.NewInt(0).SetBytes(st.TxResult).Uint64(), 2),
}, nil
} }
func (p *Paracross) paracrossGetTitleHeight(title string, height int64) (types.Message, error) { func (p *Paracross) paracrossGetTitleHeight(title string, height int64) (types.Message, error) {
......
...@@ -5,12 +5,23 @@ ...@@ -5,12 +5,23 @@
package executor package executor
import ( import (
"bytes"
"encoding/gob"
dbm "github.com/33cn/chain33/common/db" dbm "github.com/33cn/chain33/common/db"
"github.com/33cn/chain33/types" "github.com/33cn/chain33/types"
pt "github.com/33cn/plugin/plugin/dapp/paracross/types" pt "github.com/33cn/plugin/plugin/dapp/paracross/types"
"github.com/pkg/errors" "github.com/pkg/errors"
) )
func deepCopy(dst, src interface{}) error {
var buf bytes.Buffer
if err := gob.NewEncoder(&buf).Encode(src); err != nil {
return err
}
return gob.NewDecoder(bytes.NewBuffer(buf.Bytes())).Decode(dst)
}
func getNodeAddr(db dbm.KV, key []byte) (*pt.ParaNodeAddrStatus, error) { func getNodeAddr(db dbm.KV, key []byte) (*pt.ParaNodeAddrStatus, error) {
val, err := db.Get(key) val, err := db.Get(key)
if err != nil { if err != nil {
...@@ -23,20 +34,18 @@ func getNodeAddr(db dbm.KV, key []byte) (*pt.ParaNodeAddrStatus, error) { ...@@ -23,20 +34,18 @@ func getNodeAddr(db dbm.KV, key []byte) (*pt.ParaNodeAddrStatus, error) {
} }
func saveNodeAddr(db dbm.KV, key []byte, status types.Message) error { func saveNodeAddr(db dbm.KV, key []byte, status types.Message) error {
// use as a types.Message
val := types.Encode(status) val := types.Encode(status)
return db.Set(key, val) return db.Set(key, val)
} }
func makeVoteDoneReceipt(config *pt.ParaNodeAddrConfig, totalCount, commitCount, most int, ok bool, status int32) *types.Receipt { func makeVoteDoneReceipt(config *pt.ParaNodeAddrConfig, totalCount, commitCount, most int, pass string, status int32) *types.Receipt {
log := &pt.ReceiptParaNodeVoteDone{ log := &pt.ReceiptParaNodeVoteDone{
Title: config.Title, Title: config.Title,
TargetAddr: config.Addr, TargetAddr: config.Addr,
TotalNodes: int32(totalCount), TotalNodes: int32(totalCount),
TotalVote: int32(commitCount), TotalVote: int32(commitCount),
MostVote: int32(most), MostVote: int32(most),
VoteRst: ok, VoteRst: pass,
DoneStatus: status, DoneStatus: status,
} }
...@@ -116,7 +125,12 @@ func (a *action) nodeAdd(config *pt.ParaNodeAddrConfig) (*types.Receipt, error) ...@@ -116,7 +125,12 @@ func (a *action) nodeAdd(config *pt.ParaNodeAddrConfig) (*types.Receipt, error)
return makeNodeConfigReceipt(a.fromaddr, config, nil, stat), nil return makeNodeConfigReceipt(a.fromaddr, config, nil, stat), nil
} }
copyStatus := *stat var copyStat pt.ParaNodeAddrStatus
err = deepCopy(&copyStat, stat)
if err != nil {
clog.Error("nodeaccount.nodeAdd deep copy fail", "copy", copyStat, "stat", stat)
return nil, err
}
if stat.Status != pt.ParacrossNodeQuited { if stat.Status != pt.ParacrossNodeQuited {
clog.Error("nodeaccount.nodeAdd key exist", "key", string(key), "status", stat) clog.Error("nodeaccount.nodeAdd key exist", "key", string(key), "status", stat)
return nil, pt.ErrParaNodeAddrExisted return nil, pt.ErrParaNodeAddrExisted
...@@ -124,7 +138,7 @@ func (a *action) nodeAdd(config *pt.ParaNodeAddrConfig) (*types.Receipt, error) ...@@ -124,7 +138,7 @@ func (a *action) nodeAdd(config *pt.ParaNodeAddrConfig) (*types.Receipt, error)
stat.Status = pt.ParacrossNodeAdding stat.Status = pt.ParacrossNodeAdding
stat.Votes = &pt.ParaNodeVoteDetail{} stat.Votes = &pt.ParaNodeVoteDetail{}
saveNodeAddr(a.db, key, stat) saveNodeAddr(a.db, key, stat)
return makeNodeConfigReceipt(a.fromaddr, config, &copyStatus, stat), nil return makeNodeConfigReceipt(a.fromaddr, config, &copyStat, stat), nil
} }
...@@ -150,9 +164,14 @@ func (a *action) nodeDelete(config *pt.ParaNodeAddrConfig) (*types.Receipt, erro ...@@ -150,9 +164,14 @@ func (a *action) nodeDelete(config *pt.ParaNodeAddrConfig) (*types.Receipt, erro
//refused or quiting //refused or quiting
if stat.Status != pt.ParacrossNodeAdded { if stat.Status != pt.ParacrossNodeAdded {
clog.Error("nodeaccount.nodeDelete wrong status", "key", string(key), "status", stat) clog.Error("nodeaccount.nodeDelete wrong status", "key", string(key), "status", stat)
return nil, errors.Wrapf(pt.ErrParaNodeGroupRefuseByVote, "nodeAddr refused by vote:%s", a.fromaddr) return nil, errors.Wrapf(pt.ErrParaUnSupportNodeOper, "nodeAddr %s not be added status:%d", a.fromaddr, stat.Status)
}
var copyStat pt.ParaNodeAddrStatus
err = deepCopy(&copyStat, stat)
if err != nil {
clog.Error("nodeaccount.nodeDelete deep copy fail", "copy", copyStat, "stat", stat)
return nil, err
} }
copyStat := *stat
stat.Status = pt.ParacrossNodeQuiting stat.Status = pt.ParacrossNodeQuiting
stat.Votes = &pt.ParaNodeVoteDetail{} stat.Votes = &pt.ParaNodeVoteDetail{}
saveNodeAddr(a.db, key, stat) saveNodeAddr(a.db, key, stat)
...@@ -160,19 +179,19 @@ func (a *action) nodeDelete(config *pt.ParaNodeAddrConfig) (*types.Receipt, erro ...@@ -160,19 +179,19 @@ func (a *action) nodeDelete(config *pt.ParaNodeAddrConfig) (*types.Receipt, erro
} }
func getMostVote(stat *pt.ParaNodeAddrStatus) (int, bool) { func getMostVote(stat *pt.ParaNodeAddrStatus) (int, string) {
var ok, nok int var ok, nok int
for _, v := range stat.GetVotes().Votes { for _, v := range stat.GetVotes().Votes {
if v == pt.ParaNodeVotePass { if v == pt.ParaNodeVoteYes {
ok++ ok++
} else { } else {
nok++ nok++
} }
} }
if ok > nok { if ok > nok {
return ok, true return ok, pt.ParaNodeVoteYes
} }
return nok, false return nok, pt.ParaNodeVoteNo
} }
...@@ -211,7 +230,13 @@ func (a *action) nodeVote(config *pt.ParaNodeAddrConfig) (*types.Receipt, error) ...@@ -211,7 +230,13 @@ func (a *action) nodeVote(config *pt.ParaNodeAddrConfig) (*types.Receipt, error)
return nil, err return nil, err
} }
copyStat := *stat var copyStat pt.ParaNodeAddrStatus
err = deepCopy(&copyStat, stat)
if err != nil {
clog.Error("nodeaccount.nodevOTE deep copy fail", "copy", copyStat, "stat", stat)
return nil, err
}
if stat.Votes == nil { if stat.Votes == nil {
stat.Votes = &pt.ParaNodeVoteDetail{} stat.Votes = &pt.ParaNodeVoteDetail{}
} }
...@@ -222,17 +247,24 @@ func (a *action) nodeVote(config *pt.ParaNodeAddrConfig) (*types.Receipt, error) ...@@ -222,17 +247,24 @@ func (a *action) nodeVote(config *pt.ParaNodeAddrConfig) (*types.Receipt, error)
stat.Votes.Addrs = append(stat.Votes.Addrs, a.fromaddr) stat.Votes.Addrs = append(stat.Votes.Addrs, a.fromaddr)
stat.Votes.Votes = append(stat.Votes.Votes, config.Value) stat.Votes.Votes = append(stat.Votes.Votes, config.Value)
} }
receipt := makeNodeConfigReceipt(config.Addr, config, &copyStat, stat) receipt := makeNodeConfigReceipt(a.fromaddr, config, &copyStat, stat)
most, ok := getMostVote(stat) most, vote := getMostVote(stat)
if !isCommitDone(stat, nodes, most) { if !isCommitDone(stat, nodes, most) {
saveNodeAddr(a.db, key, stat) saveNodeAddr(a.db, key, stat)
return receipt, nil return receipt, nil
} }
clog.Info("paracross.nodeVote commit ----pass", "most", most, "pass", ok) clog.Info("paracross.nodeVote ----pass", "most", most, "pass", vote)
var receiptGroup *types.Receipt var receiptGroup *types.Receipt
if !ok { if vote == pt.ParaNodeVoteNo {
stat.Status = pt.ParacrossNodeRefused // 对已经在group里面的node,直接投票remove,对正在申请中的adding or quiting状态保持不变,对quited的保持不变
if stat.Status == pt.ParacrossNodeAdded {
receiptGroup, err = unpdateNodeGroup(a.db, config.Title, config.Addr, false)
if err != nil {
return nil, err
}
stat.Status = pt.ParacrossNodeQuited
}
} else { } else {
if stat.Status == pt.ParacrossNodeAdding { if stat.Status == pt.ParacrossNodeAdding {
receiptGroup, err = unpdateNodeGroup(a.db, config.Title, config.Addr, true) receiptGroup, err = unpdateNodeGroup(a.db, config.Title, config.Addr, true)
...@@ -248,14 +280,13 @@ func (a *action) nodeVote(config *pt.ParaNodeAddrConfig) (*types.Receipt, error) ...@@ -248,14 +280,13 @@ func (a *action) nodeVote(config *pt.ParaNodeAddrConfig) (*types.Receipt, error)
stat.Status = pt.ParacrossNodeQuited stat.Status = pt.ParacrossNodeQuited
} }
} }
saveNodeAddr(a.db, key, stat) saveNodeAddr(a.db, key, stat)
receipt = makeNodeConfigReceipt(config.Addr, config, &copyStat, stat) receipt = makeNodeConfigReceipt(a.fromaddr, config, &copyStat, stat)
if receiptGroup != nil { if receiptGroup != nil {
receipt.KV = append(receipt.KV, receiptGroup.KV...) receipt.KV = append(receipt.KV, receiptGroup.KV...)
receipt.Logs = append(receipt.Logs, receiptGroup.Logs...) receipt.Logs = append(receipt.Logs, receiptGroup.Logs...)
} }
receiptDone := makeVoteDoneReceipt(config, len(nodes), len(stat.Votes.Addrs), most, ok, stat.Status) receiptDone := makeVoteDoneReceipt(config, len(nodes), len(stat.Votes.Addrs), most, vote, stat.Status)
receipt.KV = append(receipt.KV, receiptDone.KV...) receipt.KV = append(receipt.KV, receiptDone.KV...)
receipt.Logs = append(receipt.Logs, receiptDone.Logs...) receipt.Logs = append(receipt.Logs, receiptDone.Logs...)
return receipt, nil return receipt, nil
...@@ -295,7 +326,7 @@ func unpdateNodeGroup(db dbm.KV, title, addr string, add bool) (*types.Receipt, ...@@ -295,7 +326,7 @@ func unpdateNodeGroup(db dbm.KV, title, addr string, add bool) (*types.Receipt,
item.Addr = addr item.Addr = addr
item.GetArr().Value = make([]string, 0) item.GetArr().Value = make([]string, 0)
for _, value := range copyItem.GetArr().Value { for _, value := range copyItem.GetArr().Value {
clog.Info("unpdateNodeGroup", "key delete", key, "current", value) clog.Info("unpdateNodeGroup", "key delete", string(key), "current", value)
if value != addr { if value != addr {
item.GetArr().Value = append(item.GetArr().Value, value) item.GetArr().Value = append(item.GetArr().Value, value)
} }
...@@ -357,13 +388,13 @@ func (a *action) NodeConfig(config *pt.ParaNodeAddrConfig) (*types.Receipt, erro ...@@ -357,13 +388,13 @@ func (a *action) NodeConfig(config *pt.ParaNodeAddrConfig) (*types.Receipt, erro
return nil, pt.ErrInvalidTitle return nil, pt.ErrInvalidTitle
} }
if config.Op == pt.ParaNodeAdd { if config.Op == pt.ParaNodeJoin {
if config.Addr != a.fromaddr { if config.Addr != a.fromaddr {
return nil, types.ErrFromAddr return nil, types.ErrFromAddr
} }
return a.nodeAdd(config) return a.nodeAdd(config)
} else if config.Op == pt.ParaNodeDelete { } else if config.Op == pt.ParaNodeQuit {
if config.Addr != a.fromaddr { if config.Addr != a.fromaddr {
return nil, types.ErrFromAddr return nil, types.ErrFromAddr
} }
......
# paracross 执行器 授权账户管理 # paracross 执行器 授权账户管理
## 场景
## 执行逻辑
1. 平行链申请开链之前申请几个授权账户,没有授权账户无法做跨链交易,目前没有押金机制 1. 平行链申请开链之前申请几个授权账户,没有授权账户无法做跨链交易,目前没有押金机制
1. 主链超级用户会分别向主链和平行链的manager合约发送账户添加tx,作为平行链的初始授权账户 1. 主链超级用户会分别向主链和平行链的manager合约发送账户添加tx,作为平行链的初始授权账户
1. 平行链开链后在做跨链tx之前需要任何一个初始授权账户在平行链上发送takeover tx把初始授权账户接管到平行链, 1. 平行链开链后在做跨链tx之前需要任何一个初始授权账户在平行链上发送takeover tx把初始授权账户接管到平行链,
...@@ -13,5 +10,24 @@ ...@@ -13,5 +10,24 @@
1. 当前授权账户有投票删除某一个授权账户的权利,2/3数同意的规则 1. 当前授权账户有投票删除某一个授权账户的权利,2/3数同意的规则
1. 特殊或异常场景: 1. 特殊或异常场景:
1. 新申请节点还没投票就退出,不允许,必须都投完票之后再申请 1. 新申请节点还没投票就退出,不允许,必须都投完票之后再申请
1. 申请节点退出后重新申请,允许重新加入,但需要重新投票 1. 申请节点退出后重新申请,允许重新加入,但需要重新投票
1. 新申请节点投票超过2/3否决,后来又投票超过2/3同意,可以加入或退出
## 四个状态
+-----------------------------------
| |
adding --+ added --+ quiting --+ quited
| |
-----------------------+
adding: 新授权账户申请状态,若投票超过2/3否决停留在此状态,后续可以继续投赞成票
added: 授权账户被当前授权账户组超过2/3票通过状态
quiting: 当前授权账户申请退出账户组状态,投票超过2/3否决停留在此状态,后续可以继续投赞成票
quited: 授权账户quiting被账户组除自己外账户投票超过2/3通过状态,或added的账户被账户组除自己外投票超过2/3否决除名状态
## 测试场景:
1. 新节点发tx申请加入,超2/3同意,新节点加入成功处于added状态
1. 已加入节点申请退出,超2/3同意,已加入节点退出管理组处于quited状态
1. 新节点重新申请加入,超2/3否决,新节点仍停留在adding状态,后来投票节点又2/3同意,新节点加入
1. 投票节点一起投某一个账户组里面的账户否决票,超2/3数后,此账户退出账户组,又超过2/3同意后,仍处于退出状态(需自己申请加入)
1. 账户组里面账户申请退出,当是最后一个时候退出失败
\ No newline at end of file
...@@ -43,7 +43,7 @@ message ParaNodeAddrConfig{ ...@@ -43,7 +43,7 @@ message ParaNodeAddrConfig{
} }
message ParaNodeVoteDetail{ message ParaNodeVoteDetail{
repeated string addrs = 1; repeated string addrs = 1;
repeated string votes = 2; repeated string votes = 2;
} }
...@@ -74,7 +74,7 @@ message ReceiptParaNodeVoteDone { ...@@ -74,7 +74,7 @@ message ReceiptParaNodeVoteDone {
int32 totalNodes = 3; int32 totalNodes = 3;
int32 totalVote = 4; int32 totalVote = 4;
int32 mostVote = 5; int32 mostVote = 5;
bool voteRst = 6; string voteRst = 6;
int32 doneStatus = 7; int32 doneStatus = 7;
} }
...@@ -87,7 +87,7 @@ message ReqParacrossNodeInfo { ...@@ -87,7 +87,7 @@ message ReqParacrossNodeInfo {
} }
message RespParacrossNodeAddrs { message RespParacrossNodeAddrs {
repeated ReceiptParaNodeVoteDone addrs = 1; repeated ParaNodeAddrStatus addrs = 1;
} }
message ParaBlock2MainMap { message ParaBlock2MainMap {
...@@ -181,8 +181,19 @@ message ReqParacrossTitleHeight { ...@@ -181,8 +181,19 @@ message ReqParacrossTitleHeight {
int64 height = 2; int64 height = 2;
} }
message RespParacrossDone {
int32 totalNodes = 1;
int32 totalCommit = 2;
int32 mostSameCommit = 3;
string title = 4;
int64 height = 5;
string stateHash = 6;
uint32 txCounts = 7;
string txResult = 8;
}
message RespParacrossTitles { message RespParacrossTitles {
repeated ReceiptParacrossDone titles = 1; repeated RespParacrossDone titles = 1;
} }
message ReqParacrossTitleHash { message ReqParacrossTitleHash {
...@@ -213,7 +224,7 @@ message ParacrossAsset { ...@@ -213,7 +224,7 @@ message ParacrossAsset {
service paracross { service paracross {
rpc GetTitle(ReqString) returns (ParacrossConsensusStatus) {} rpc GetTitle(ReqString) returns (ParacrossConsensusStatus) {}
rpc ListTitles(ReqNil) returns (RespParacrossTitles) {} rpc ListTitles(ReqNil) returns (RespParacrossTitles) {}
rpc GetTitleHeight(ReqParacrossTitleHeight) returns (ReceiptParacrossDone) {} rpc GetTitleHeight(ReqParacrossTitleHeight) returns (RespParacrossDone) {}
rpc GetAssetTxResult(ReqHash) returns (ParacrossAsset) {} rpc GetAssetTxResult(ReqHash) returns (ParacrossAsset) {}
rpc IsSync(ReqNil) returns (IsCaughtUp) {} rpc IsSync(ReqNil) returns (IsCaughtUp) {}
} }
\ No newline at end of file
...@@ -72,12 +72,12 @@ func (c *Jrpc) ListTitles(req *types.ReqNil, result *interface{}) error { ...@@ -72,12 +72,12 @@ func (c *Jrpc) ListTitles(req *types.ReqNil, result *interface{}) error {
return err return err
} }
func (c *channelClient) GetTitleHeight(ctx context.Context, req *pt.ReqParacrossTitleHeight) (*pt.ReceiptParacrossDone, error) { func (c *channelClient) GetTitleHeight(ctx context.Context, req *pt.ReqParacrossTitleHeight) (*pt.RespParacrossDone, error) {
data, err := c.Query(pt.GetExecName(), "GetTitleHeight", req) data, err := c.Query(pt.GetExecName(), "GetTitleHeight", req)
if err != nil { if err != nil {
return nil, err return nil, err
} }
if resp, ok := data.(*pt.ReceiptParacrossDone); ok { if resp, ok := data.(*pt.RespParacrossDone); ok {
return resp, nil return resp, nil
} }
return nil, types.ErrDecode return nil, types.ErrDecode
...@@ -168,8 +168,10 @@ func (c *Jrpc) GetBlock2MainInfo(req *types.ReqBlocks, result *interface{}) erro ...@@ -168,8 +168,10 @@ func (c *Jrpc) GetBlock2MainInfo(req *types.ReqBlocks, result *interface{}) erro
return err return err
} }
// 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 *types.ReqString) (*types.ReplyConfig, error) {
data, err := c.Query(pt.GetExecName(), "GetNodeGroup", req) r := *req
data, err := c.Query(pt.GetExecName(), "GetNodeGroup", &r)
if err != nil { if err != nil {
return nil, err return nil, err
} }
...@@ -179,15 +181,17 @@ func (c *channelClient) GetNodeGroup(ctx context.Context, req *types.ReqString) ...@@ -179,15 +181,17 @@ func (c *channelClient) GetNodeGroup(ctx context.Context, req *types.ReqString)
return nil, types.ErrDecode return nil, types.ErrDecode
} }
// ListTitles get paracross consensus titles list // GetNodeGroup get super node group
func (c *Jrpc) GetNodeGroup(req *types.ReqString, result *interface{}) error { func (c *Jrpc) GetNodeGroup(req *types.ReqString, 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
} }
// GetNodeStatus get super node status
func (c *channelClient) GetNodeStatus(ctx context.Context, req *pt.ReqParacrossNodeInfo) (*pt.ParaNodeAddrStatus, error) { func (c *channelClient) GetNodeStatus(ctx context.Context, req *pt.ReqParacrossNodeInfo) (*pt.ParaNodeAddrStatus, error) {
data, err := c.Query(pt.GetExecName(), "GetNodeAddrInfo", req) r := *req
data, err := c.Query(pt.GetExecName(), "GetNodeAddrInfo", &r)
if err != nil { if err != nil {
return nil, err return nil, err
} }
...@@ -197,15 +201,17 @@ func (c *channelClient) GetNodeStatus(ctx context.Context, req *pt.ReqParacrossN ...@@ -197,15 +201,17 @@ func (c *channelClient) GetNodeStatus(ctx context.Context, req *pt.ReqParacrossN
return nil, types.ErrDecode return nil, types.ErrDecode
} }
// ListTitles get paracross consensus titles list // GetNodeStatus get super node status
func (c *Jrpc) GetNodeStatus(req *pt.ReqParacrossNodeInfo, result *interface{}) error { func (c *Jrpc) GetNodeStatus(req *pt.ReqParacrossNodeInfo, result *interface{}) error {
data, err := c.cli.GetNodeStatus(context.Background(), req) data, err := c.cli.GetNodeStatus(context.Background(), req)
*result = data *result = data
return err return err
} }
//ListNodeStatus list super node by status
func (c *channelClient) ListNodeStatus(ctx context.Context, req *pt.ReqParacrossNodeInfo) (*pt.RespParacrossNodeAddrs, error) { func (c *channelClient) ListNodeStatus(ctx context.Context, req *pt.ReqParacrossNodeInfo) (*pt.RespParacrossNodeAddrs, error) {
data, err := c.Query(pt.GetExecName(), "ListNodeStatusInfo", req) r := *req
data, err := c.Query(pt.GetExecName(), "ListNodeStatusInfo", &r)
if err != nil { if err != nil {
return nil, err return nil, err
} }
...@@ -215,7 +221,7 @@ func (c *channelClient) ListNodeStatus(ctx context.Context, req *pt.ReqParacross ...@@ -215,7 +221,7 @@ func (c *channelClient) ListNodeStatus(ctx context.Context, req *pt.ReqParacross
return nil, types.ErrDecode return nil, types.ErrDecode
} }
// ListTitles get paracross consensus titles list //ListNodeStatus list super node by status
func (c *Jrpc) ListNodeStatus(req *pt.ReqParacrossNodeInfo, result *interface{}) error { func (c *Jrpc) ListNodeStatus(req *pt.ReqParacrossNodeInfo, result *interface{}) error {
data, err := c.cli.ListNodeStatus(context.Background(), req) data, err := c.cli.ListNodeStatus(context.Background(), req)
*result = data *result = data
......
...@@ -28,13 +28,19 @@ var ( ...@@ -28,13 +28,19 @@ var (
// ErrParaCurHashNotMatch para curr main hash not match with pre, main node may switched // ErrParaCurHashNotMatch para curr main hash not match with pre, main node may switched
ErrParaCurHashNotMatch = errors.New("ErrParaCurHashNotMatch") ErrParaCurHashNotMatch = errors.New("ErrParaCurHashNotMatch")
// ErrParaUnSupportNodeOper unsupport node operation // ErrParaUnSupportNodeOper unsupport node operation
ErrParaUnSupportNodeOper = errors.New("ErrParaUnSupportNodeOper") ErrParaUnSupportNodeOper = errors.New("ErrParaUnSupportNodeOper")
ErrParaNodeAddrExisted = errors.New("ErrParaNodeAddrExisted") //ErrParaNodeAddrExisted node addr exist in group
ErrParaNodeAddrNotExisted = errors.New("ErrParaNodeAddrNotExisted") ErrParaNodeAddrExisted = errors.New("ErrParaNodeAddrExisted")
ErrParaManageNodesNotSet = errors.New("ErrParaManageNodesNotSet") //ErrParaNodeAddrNotExisted node addr not exist in group
ErrParaNodeGroupNotSet = errors.New("ErrParaManageNodesNotSet") ErrParaNodeAddrNotExisted = errors.New("ErrParaNodeAddrNotExisted")
ErrParaNodeGroupExisted = errors.New("ErrParaNodesExisted") //ErrParaManageNodesNotSet config manage node not set
ErrParaNodeGroupLastAddr = errors.New("ErrParaNodeGroupLastAddr") ErrParaManageNodesNotSet = errors.New("ErrParaManageNodesNotSet")
ErrParaNodeGroupRefuseByVote = errors.New("ErrParaNodeGroupRefuseByVote") //ErrParaNodeGroupNotSet para config node group not set by take over
ErrParaNodeVoteSelf = errors.New("ErrParaNodeVoteSelf") ErrParaNodeGroupNotSet = errors.New("ErrParaManageNodesNotSet")
//ErrParaNodeGroupExisted para config group taked over alreay
ErrParaNodeGroupExisted = errors.New("ErrParaNodesExisted")
//ErrParaNodeGroupLastAddr last super node not be allow to quite
ErrParaNodeGroupLastAddr = errors.New("ErrParaNodeGroupLastAddr")
//ErrParaNodeVoteSelf vote self not allow
ErrParaNodeVoteSelf = errors.New("ErrParaNodeVoteSelf")
) )
...@@ -70,6 +70,7 @@ const ( ...@@ -70,6 +70,7 @@ const (
ParacrossActionAssetTransfer = iota + paraCrossTransferActionTypeStart ParacrossActionAssetTransfer = iota + paraCrossTransferActionTypeStart
// ParacrossActionAssetWithdraw paracross asset withdraw key // ParacrossActionAssetWithdraw paracross asset withdraw key
ParacrossActionAssetWithdraw ParacrossActionAssetWithdraw
//ParacrossActionNodeConfig para super node config
ParacrossActionNodeConfig ParacrossActionNodeConfig
) )
...@@ -83,26 +84,24 @@ const ( ...@@ -83,26 +84,24 @@ const (
// node config op // node config op
const ( const (
ParaNodeAdd = "add" ParaNodeJoin = "join"
ParaNodeDelete = "delete" ParaNodeQuit = "quit"
ParaNodeVote = "vote" ParaNodeVote = "vote"
ParaNodeTakeover = "takeover" ParaNodeTakeover = "takeover"
ParaNodeVotePass = "pass" ParaNodeVoteYes = "yes"
ParaNodeVoteNo = "no" ParaNodeVoteNo = "no"
) )
const ( const (
// ParacrossNodeAdding apply for adding group // ParacrossNodeAdding apply for adding group
ParacrossNodeAdding = iota ParacrossNodeAdding = iota + 1
// ParacrossNodeAdded, pass to add by votes // ParacrossNodeAdded pass to add by votes
ParacrossNodeAdded ParacrossNodeAdded
// ParacrossNodeQuiting, apply for quiting // ParacrossNodeQuiting apply for quiting
ParacrossNodeQuiting ParacrossNodeQuiting
// ParacrossNodeQuited, pass to quite by votes // ParacrossNodeQuited pass to quite by votes
ParacrossNodeQuited ParacrossNodeQuited
// ParacrossNodeRefused, refused by votes, add or quite
ParacrossNodeRefused
) )
var ( var (
......
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