Commit a2bd1eb4 authored by liuyuhang's avatar liuyuhang

add update boards

parent d0e912b3
...@@ -87,6 +87,8 @@ func addProposalBoardFlags(cmd *cobra.Command) { ...@@ -87,6 +87,8 @@ func addProposalBoardFlags(cmd *cobra.Command) {
cmd.Flags().Int32P("year", "y", 0, "year") cmd.Flags().Int32P("year", "y", 0, "year")
cmd.Flags().Int32P("month", "m", 0, "month") cmd.Flags().Int32P("month", "m", 0, "month")
cmd.Flags().Int32P("day", "d", 0, "day") cmd.Flags().Int32P("day", "d", 0, "day")
cmd.Flags().BoolP("update", "u", false, "replace or update boards, default is replace(false); update(true)")
cmd.Flags().Int64P("startBlock", "s", 0, "start block height") cmd.Flags().Int64P("startBlock", "s", 0, "start block height")
cmd.MarkFlagRequired("startBlock") cmd.MarkFlagRequired("startBlock")
cmd.Flags().Int64P("endBlock", "e", 0, "end block height") cmd.Flags().Int64P("endBlock", "e", 0, "end block height")
...@@ -102,6 +104,7 @@ func proposalBoard(cmd *cobra.Command, args []string) { ...@@ -102,6 +104,7 @@ func proposalBoard(cmd *cobra.Command, args []string) {
month, _ := cmd.Flags().GetInt32("month") month, _ := cmd.Flags().GetInt32("month")
day, _ := cmd.Flags().GetInt32("day") day, _ := cmd.Flags().GetInt32("day")
update, _ := cmd.Flags().GetBool("update")
startBlock, _ := cmd.Flags().GetInt64("startBlock") startBlock, _ := cmd.Flags().GetInt64("startBlock")
endBlock, _ := cmd.Flags().GetInt64("endBlock") endBlock, _ := cmd.Flags().GetInt64("endBlock")
boardstr, _ := cmd.Flags().GetString("boards") boardstr, _ := cmd.Flags().GetString("boards")
...@@ -112,6 +115,7 @@ func proposalBoard(cmd *cobra.Command, args []string) { ...@@ -112,6 +115,7 @@ func proposalBoard(cmd *cobra.Command, args []string) {
Year: year, Year: year,
Month: month, Month: month,
Day: day, Day: day,
Update: update,
Boards: boards, Boards: boards,
StartBlockHeight: startBlock, StartBlockHeight: startBlock,
EndBlockHeight: endBlock, EndBlockHeight: endBlock,
......
...@@ -52,17 +52,16 @@ func newAction(a *Autonomy, tx *types.Transaction, index int32) *action { ...@@ -52,17 +52,16 @@ func newAction(a *Autonomy, tx *types.Transaction, index int32) *action {
} }
func (a *action) propBoard(prob *auty.ProposalBoard) (*types.Receipt, error) { func (a *action) propBoard(prob *auty.ProposalBoard) (*types.Receipt, error) {
if len(prob.Boards) > maxBoards || len(prob.Boards) < minBoards {
alog.Error("propBoard ", "proposal boards number is invaild", len(prob.Boards))
return nil, auty.ErrBoardNumber
}
if prob.StartBlockHeight < a.height || prob.EndBlockHeight < a.height || if prob.StartBlockHeight < a.height || prob.EndBlockHeight < a.height ||
prob.StartBlockHeight+startEndBlockPeriod > prob.EndBlockHeight { prob.StartBlockHeight+startEndBlockPeriod > prob.EndBlockHeight {
alog.Error("propBoard height invaild", "StartBlockHeight", prob.StartBlockHeight, "EndBlockHeight", alog.Error("propBoard height invaild", "StartBlockHeight", prob.StartBlockHeight, "EndBlockHeight",
prob.EndBlockHeight, "height", a.height) prob.EndBlockHeight, "height", a.height)
return nil, auty.ErrSetBlockHeight return nil, auty.ErrSetBlockHeight
} }
if len(prob.Boards) == 0 {
alog.Error("propBoard ", "proposal boards number is zero", len(prob.Boards))
return nil, auty.ErrBoardNumber
}
mpBd := make(map[string]struct{}) mpBd := make(map[string]struct{})
for _, board := range prob.Boards { for _, board := range prob.Boards {
...@@ -79,6 +78,33 @@ func (a *action) propBoard(prob *auty.ProposalBoard) (*types.Receipt, error) { ...@@ -79,6 +78,33 @@ func (a *action) propBoard(prob *auty.ProposalBoard) (*types.Receipt, error) {
mpBd[board] = struct{}{} mpBd[board] = struct{}{}
} }
var act *auty.ActiveBoard
var err error
if prob.Update {
act, err = a.getActiveBoard()
if err != nil {
alog.Error("propBoard ", "addr", a.fromaddr, "execaddr", a.execaddr, "getActiveBoard failed", err)
return nil, err
}
for _, board := range act.Boards {
if _, ok := mpBd[board]; ok {
err := auty.ErrRepeatAddr
alog.Error("propBoard ", "addr", board, "propBoard update have repeat addr ", err)
return nil, err
}
}
act.Boards = append(act.Boards, prob.Boards...)
} else {
act = &auty.ActiveBoard{
Boards: prob.Boards,
}
}
if len(act.Boards) > maxBoards || len(act.Boards) < minBoards {
alog.Error("propBoard ", "proposal boards number is invaild", len(prob.Boards))
return nil, auty.ErrBoardNumber
}
// 获取当前生效提案规则 // 获取当前生效提案规则
rule, err := a.getActiveRule() rule, err := a.getActiveRule()
if err != nil { if err != nil {
...@@ -101,6 +127,7 @@ func (a *action) propBoard(prob *auty.ProposalBoard) (*types.Receipt, error) { ...@@ -101,6 +127,7 @@ func (a *action) propBoard(prob *auty.ProposalBoard) (*types.Receipt, error) {
cur := &auty.AutonomyProposalBoard{ cur := &auty.AutonomyProposalBoard{
PropBoard: prob, PropBoard: prob,
CurRule: rule, CurRule: rule,
Board: act,
VoteResult: &auty.VoteResult{}, VoteResult: &auty.VoteResult{},
Status: auty.AutonomyStatusProposalBoard, Status: auty.AutonomyStatusProposalBoard,
Address: a.fromaddr, Address: a.fromaddr,
...@@ -275,11 +302,10 @@ func (a *action) votePropBoard(voteProb *auty.VoteProposalBoard) (*types.Receipt ...@@ -275,11 +302,10 @@ func (a *action) votePropBoard(voteProb *auty.VoteProposalBoard) (*types.Receipt
// 更新当前具有权利的董事会成员 // 更新当前具有权利的董事会成员
if cur.VoteResult.Pass { if cur.VoteResult.Pass {
act := &auty.ActiveBoard{ if !cur.PropBoard.Update { // 非update才进行高度重写
Boards: cur.PropBoard.Boards, cur.Board.StartHeight = a.height
StartHeight: a.height,
} }
kv = append(kv, &types.KeyValue{Key: activeBoardID(), Value: types.Encode(act)}) kv = append(kv, &types.KeyValue{Key: activeBoardID(), Value: types.Encode(cur.Board)})
} }
ty := auty.TyLogVotePropBoard ty := auty.TyLogVotePropBoard
...@@ -344,11 +370,10 @@ func (a *action) tmintPropBoard(tmintProb *auty.TerminateProposalBoard) (*types. ...@@ -344,11 +370,10 @@ func (a *action) tmintPropBoard(tmintProb *auty.TerminateProposalBoard) (*types.
// 更新当前具有权利的董事会成员 // 更新当前具有权利的董事会成员
if cur.VoteResult.Pass { if cur.VoteResult.Pass {
act := &auty.ActiveBoard{ if !cur.PropBoard.Update { // 非update才进行高度重写
Boards: cur.PropBoard.Boards, cur.Board.StartHeight = a.height
StartHeight: a.height,
} }
kv = append(kv, &types.KeyValue{Key: activeBoardID(), Value: types.Encode(act)}) kv = append(kv, &types.KeyValue{Key: activeBoardID(), Value: types.Encode(cur.Board)})
} }
receiptLog := getReceiptLog(pre, cur, auty.TyLogTmintPropBoard) receiptLog := getReceiptLog(pre, cur, auty.TyLogTmintPropBoard)
...@@ -518,6 +543,14 @@ func copyAutonomyProposalBoard(cur *auty.AutonomyProposalBoard) *auty.AutonomyPr ...@@ -518,6 +543,14 @@ func copyAutonomyProposalBoard(cur *auty.AutonomyProposalBoard) *auty.AutonomyPr
newRule := *cur.GetCurRule() newRule := *cur.GetCurRule()
newAut.CurRule = &newRule newAut.CurRule = &newRule
} }
if cur.Board != nil {
newBoard := *cur.GetBoard()
newBoard.Boards = make([]string, len(cur.Board.Boards))
copy(newBoard.Boards, cur.Board.Boards)
newBoard.Revboards = make([]string, len(cur.Board.Revboards))
copy(newBoard.Revboards, cur.Board.Revboards)
newAut.Board = &newBoard
}
if cur.VoteResult != nil { if cur.VoteResult != nil {
newRes := *cur.GetVoteResult() newRes := *cur.GetVoteResult()
newAut.VoteResult = &newRes newAut.VoteResult = &newRes
......
...@@ -183,6 +183,76 @@ func InitMinerAddr(stateDB dbm.KV, addrs []string, bind string) { ...@@ -183,6 +183,76 @@ func InitMinerAddr(stateDB dbm.KV, addrs []string, bind string) {
} }
} }
func TestPropBoard(t *testing.T) {
env, exec, stateDB, _ := InitEnv()
opts := []*auty.ProposalBoard{
{ // ErrRepeatAddr
Update:true,
Boards: []string{"18e1nfiux7aVSfN2zYUZhbidMRokbBSPA6", "18e1nfiux7aVSfN2zYUZhbidMRokbBSPA6"},
StartBlockHeight: env.blockHeight + 5,
EndBlockHeight: env.blockHeight + startEndBlockPeriod + 10,
},
{ // ErrRepeatAddr
Update:true,
Boards: []string{"18e1nfiux7aVSfN2zYUZhbidMRokbBSPA6", AddrA},
StartBlockHeight: env.blockHeight + 5,
EndBlockHeight: env.blockHeight + startEndBlockPeriod + 10,
},
{ // ErrBoardNumber
Update:true,
StartBlockHeight: env.blockHeight + 5,
EndBlockHeight: env.blockHeight + startEndBlockPeriod + 10,
},
{ // 正常
Update:true,
Boards: []string{"18e1nfiux7aVSfN2zYUZhbidMRokbBSPA6"},
StartBlockHeight: env.blockHeight + 5,
EndBlockHeight: env.blockHeight + startEndBlockPeriod + 10,
},
{ // ErrRepeatAddr
Update:false,
Boards: []string{"18e1nfiux7aVSfN2zYUZhbidMRokbBSPA6", "18e1nfiux7aVSfN2zYUZhbidMRokbBSPA6"},
StartBlockHeight: env.blockHeight + 5,
EndBlockHeight: env.blockHeight + startEndBlockPeriod + 10,
},
{ // ErrBoardNumber
Update:false,
Boards: []string{"18e1nfiux7aVSfN2zYUZhbidMRokbBSPA6", AddrA},
StartBlockHeight: env.blockHeight + 5,
EndBlockHeight: env.blockHeight + startEndBlockPeriod + 10,
},
{ // 正常
Update:false,
Boards: boards,
StartBlockHeight: env.blockHeight + 5,
EndBlockHeight: env.blockHeight + startEndBlockPeriod + 10,
},
}
result := []error{
auty.ErrRepeatAddr,
auty.ErrRepeatAddr,
auty.ErrBoardNumber,
nil,
auty.ErrRepeatAddr,
auty.ErrBoardNumber,
nil,
}
InitBoard(stateDB)
exec.SetStateDB(stateDB)
exec.SetEnv(env.blockHeight, env.blockTime, env.difficulty)
for i, tcase := range opts {
pbtx, err := propBoardTx(tcase)
assert.NoError(t, err)
pbtx, err = signTx(pbtx, PrivKeyA)
assert.NoError(t, err)
_, err = exec.Exec(pbtx, i)
assert.Equal(t, err, result[i])
}
}
func TestRevokeProposalBoard(t *testing.T) { func TestRevokeProposalBoard(t *testing.T) {
env, exec, stateDB, kvdb := InitEnv() env, exec, stateDB, kvdb := InitEnv()
// PropBoard // PropBoard
...@@ -556,6 +626,7 @@ func TestCopyAutonomyProposalBoard(t *testing.T) { ...@@ -556,6 +626,7 @@ func TestCopyAutonomyProposalBoard(t *testing.T) {
assert.Nil(t, copyAutonomyProposalBoard(nil)) assert.Nil(t, copyAutonomyProposalBoard(nil))
cur := &auty.AutonomyProposalBoard{ cur := &auty.AutonomyProposalBoard{
PropBoard: &auty.ProposalBoard{Year: 1900, Month: 1}, PropBoard: &auty.ProposalBoard{Year: 1900, Month: 1},
Board: &auty.ActiveBoard{Boards:[]string{"111", "112"}, Revboards:[]string{"113", "114"}},
CurRule: &auty.RuleConfig{BoardApproveRatio: 100}, CurRule: &auty.RuleConfig{BoardApproveRatio: 100},
VoteResult: &auty.VoteResult{TotalVotes: 100}, VoteResult: &auty.VoteResult{TotalVotes: 100},
Status: 2, Status: 2,
...@@ -564,13 +635,16 @@ func TestCopyAutonomyProposalBoard(t *testing.T) { ...@@ -564,13 +635,16 @@ func TestCopyAutonomyProposalBoard(t *testing.T) {
pre := copyAutonomyProposalBoard(cur) pre := copyAutonomyProposalBoard(cur)
cur.PropBoard.Year = 1800 cur.PropBoard.Year = 1800
cur.PropBoard.Month = 2 cur.PropBoard.Month = 2
cur.Board.Boards = []string{"211", "212"}
cur.Board.Revboards = []string{"113", "114"}
cur.CurRule.BoardApproveRatio = 90 cur.CurRule.BoardApproveRatio = 90
cur.VoteResult.TotalVotes = 50 cur.VoteResult.TotalVotes = 50
cur.Address = "234" cur.Address = "234"
cur.Status = 1 cur.Status = 1
assert.Equal(t, 1900, int(pre.PropBoard.Year)) assert.Equal(t, 1900, int(pre.PropBoard.Year))
assert.Equal(t, 1, int(pre.PropBoard.Month)) assert.Equal(t, []string{"111", "112"}, pre.Board.Boards)
assert.Equal(t, []string{"113", "114"}, pre.Board.Revboards)
assert.Equal(t, 100, int(pre.CurRule.BoardApproveRatio)) assert.Equal(t, 100, int(pre.CurRule.BoardApproveRatio))
assert.Equal(t, 100, int(pre.VoteResult.TotalVotes)) assert.Equal(t, 100, int(pre.VoteResult.TotalVotes))
assert.Equal(t, "123", pre.Address) assert.Equal(t, "123", pre.Address)
......
...@@ -523,6 +523,10 @@ func copyAutonomyProposalProject(cur *auty.AutonomyProposalProject) *auty.Autono ...@@ -523,6 +523,10 @@ func copyAutonomyProposalProject(cur *auty.AutonomyProposalProject) *auty.Autono
newRule := *cur.GetCurRule() newRule := *cur.GetCurRule()
newAut.CurRule = &newRule newAut.CurRule = &newRule
} }
if len(cur.Boards) > 0 {
newAut.Boards = make([]string, len(cur.Boards))
copy(newAut.Boards, cur.Boards)
}
if cur.BoardVoteRes != nil { if cur.BoardVoteRes != nil {
newRes := *cur.GetBoardVoteRes() newRes := *cur.GetBoardVoteRes()
newAut.BoardVoteRes = &newRes newAut.BoardVoteRes = &newRes
......
...@@ -13,14 +13,16 @@ message AutonomyProposalBoard { ...@@ -13,14 +13,16 @@ message AutonomyProposalBoard {
ProposalBoard propBoard = 1; ProposalBoard propBoard = 1;
// 投票该提案的规则 // 投票该提案的规则
RuleConfig curRule = 2; RuleConfig curRule = 2;
// 投票董事会
ActiveBoard board = 3;
// 全体持票人投票结果 // 全体持票人投票结果
VoteResult voteResult = 3; VoteResult voteResult = 4;
// 状态 // 状态
int32 status = 4; int32 status = 5;
string address = 5; string address = 6;
int64 height = 6; int64 height = 7;
int32 index = 7; int32 index = 8;
string proposalID = 8; string proposalID = 9;
} }
// action // action
...@@ -30,13 +32,15 @@ message ProposalBoard { ...@@ -30,13 +32,15 @@ message ProposalBoard {
int32 month = 2; int32 month = 2;
int32 day = 3; int32 day = 3;
// 是否更新
bool update = 4;
// 提案董事会成员 // 提案董事会成员
repeated string boards = 4; repeated string boards = 5;
// 投票相关 // 投票相关
int64 startBlockHeight = 5; // 提案开始投票高度 int64 startBlockHeight = 6; // 提案开始投票高度
int64 endBlockHeight = 6; // 提案结束投票高度 int64 endBlockHeight = 7; // 提案结束投票高度
int64 realEndBlockHeight = 7; // 实际提案结束投票高度 int64 realEndBlockHeight = 8; // 实际提案结束投票高度
} }
message RevokeProposalBoard { message RevokeProposalBoard {
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
...@@ -37,6 +37,6 @@ var ( ...@@ -37,6 +37,6 @@ var (
ErrRepeatAddr = errors.New("ErrRepeatAddr") ErrRepeatAddr = errors.New("ErrRepeatAddr")
// ErrNotEnoughFund 重复地址 // ErrNotEnoughFund 重复地址
ErrNotEnoughFund = errors.New("ErrNotEnoughFund") ErrNotEnoughFund = errors.New("ErrNotEnoughFund")
// ErrSetBlockHeight // ErrSetBlockHeight block height not match
ErrSetBlockHeight = errors.New("ErrSetBlockHeight") ErrSetBlockHeight = errors.New("ErrSetBlockHeight")
) )
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
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