Commit a2bd1eb4 authored by liuyuhang's avatar liuyuhang

add update boards

parent d0e912b3
......@@ -87,6 +87,8 @@ func addProposalBoardFlags(cmd *cobra.Command) {
cmd.Flags().Int32P("year", "y", 0, "year")
cmd.Flags().Int32P("month", "m", 0, "month")
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.MarkFlagRequired("startBlock")
cmd.Flags().Int64P("endBlock", "e", 0, "end block height")
......@@ -102,6 +104,7 @@ func proposalBoard(cmd *cobra.Command, args []string) {
month, _ := cmd.Flags().GetInt32("month")
day, _ := cmd.Flags().GetInt32("day")
update, _ := cmd.Flags().GetBool("update")
startBlock, _ := cmd.Flags().GetInt64("startBlock")
endBlock, _ := cmd.Flags().GetInt64("endBlock")
boardstr, _ := cmd.Flags().GetString("boards")
......@@ -112,6 +115,7 @@ func proposalBoard(cmd *cobra.Command, args []string) {
Year: year,
Month: month,
Day: day,
Update: update,
Boards: boards,
StartBlockHeight: startBlock,
EndBlockHeight: endBlock,
......
......@@ -52,17 +52,16 @@ func newAction(a *Autonomy, tx *types.Transaction, index int32) *action {
}
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 ||
prob.StartBlockHeight+startEndBlockPeriod > prob.EndBlockHeight {
alog.Error("propBoard height invaild", "StartBlockHeight", prob.StartBlockHeight, "EndBlockHeight",
prob.EndBlockHeight, "height", a.height)
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{})
for _, board := range prob.Boards {
......@@ -79,6 +78,33 @@ func (a *action) propBoard(prob *auty.ProposalBoard) (*types.Receipt, error) {
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()
if err != nil {
......@@ -101,6 +127,7 @@ func (a *action) propBoard(prob *auty.ProposalBoard) (*types.Receipt, error) {
cur := &auty.AutonomyProposalBoard{
PropBoard: prob,
CurRule: rule,
Board: act,
VoteResult: &auty.VoteResult{},
Status: auty.AutonomyStatusProposalBoard,
Address: a.fromaddr,
......@@ -275,11 +302,10 @@ func (a *action) votePropBoard(voteProb *auty.VoteProposalBoard) (*types.Receipt
// 更新当前具有权利的董事会成员
if cur.VoteResult.Pass {
act := &auty.ActiveBoard{
Boards: cur.PropBoard.Boards,
StartHeight: a.height,
if !cur.PropBoard.Update { // 非update才进行高度重写
cur.Board.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
......@@ -344,11 +370,10 @@ func (a *action) tmintPropBoard(tmintProb *auty.TerminateProposalBoard) (*types.
// 更新当前具有权利的董事会成员
if cur.VoteResult.Pass {
act := &auty.ActiveBoard{
Boards: cur.PropBoard.Boards,
StartHeight: a.height,
if !cur.PropBoard.Update { // 非update才进行高度重写
cur.Board.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)
......@@ -518,6 +543,14 @@ func copyAutonomyProposalBoard(cur *auty.AutonomyProposalBoard) *auty.AutonomyPr
newRule := *cur.GetCurRule()
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 {
newRes := *cur.GetVoteResult()
newAut.VoteResult = &newRes
......
......@@ -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) {
env, exec, stateDB, kvdb := InitEnv()
// PropBoard
......@@ -556,6 +626,7 @@ func TestCopyAutonomyProposalBoard(t *testing.T) {
assert.Nil(t, copyAutonomyProposalBoard(nil))
cur := &auty.AutonomyProposalBoard{
PropBoard: &auty.ProposalBoard{Year: 1900, Month: 1},
Board: &auty.ActiveBoard{Boards:[]string{"111", "112"}, Revboards:[]string{"113", "114"}},
CurRule: &auty.RuleConfig{BoardApproveRatio: 100},
VoteResult: &auty.VoteResult{TotalVotes: 100},
Status: 2,
......@@ -564,13 +635,16 @@ func TestCopyAutonomyProposalBoard(t *testing.T) {
pre := copyAutonomyProposalBoard(cur)
cur.PropBoard.Year = 1800
cur.PropBoard.Month = 2
cur.Board.Boards = []string{"211", "212"}
cur.Board.Revboards = []string{"113", "114"}
cur.CurRule.BoardApproveRatio = 90
cur.VoteResult.TotalVotes = 50
cur.Address = "234"
cur.Status = 1
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.VoteResult.TotalVotes))
assert.Equal(t, "123", pre.Address)
......
......@@ -523,6 +523,10 @@ func copyAutonomyProposalProject(cur *auty.AutonomyProposalProject) *auty.Autono
newRule := *cur.GetCurRule()
newAut.CurRule = &newRule
}
if len(cur.Boards) > 0 {
newAut.Boards = make([]string, len(cur.Boards))
copy(newAut.Boards, cur.Boards)
}
if cur.BoardVoteRes != nil {
newRes := *cur.GetBoardVoteRes()
newAut.BoardVoteRes = &newRes
......
......@@ -13,14 +13,16 @@ message AutonomyProposalBoard {
ProposalBoard propBoard = 1;
// 投票该提案的规则
RuleConfig curRule = 2;
// 投票董事会
ActiveBoard board = 3;
// 全体持票人投票结果
VoteResult voteResult = 3;
VoteResult voteResult = 4;
// 状态
int32 status = 4;
string address = 5;
int64 height = 6;
int32 index = 7;
string proposalID = 8;
int32 status = 5;
string address = 6;
int64 height = 7;
int32 index = 8;
string proposalID = 9;
}
// action
......@@ -30,13 +32,15 @@ message ProposalBoard {
int32 month = 2;
int32 day = 3;
// 是否更新
bool update = 4;
// 提案董事会成员
repeated string boards = 4;
repeated string boards = 5;
// 投票相关
int64 startBlockHeight = 5; // 提案开始投票高度
int64 endBlockHeight = 6; // 提案结束投票高度
int64 realEndBlockHeight = 7; // 实际提案结束投票高度
int64 startBlockHeight = 6; // 提案开始投票高度
int64 endBlockHeight = 7; // 提案结束投票高度
int64 realEndBlockHeight = 8; // 实际提案结束投票高度
}
message RevokeProposalBoard {
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
......@@ -37,6 +37,6 @@ var (
ErrRepeatAddr = errors.New("ErrRepeatAddr")
// ErrNotEnoughFund 重复地址
ErrNotEnoughFund = errors.New("ErrNotEnoughFund")
// ErrSetBlockHeight
// ErrSetBlockHeight block height not match
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