Commit a077e677 authored by mdj33's avatar mdj33 Committed by vipwzw

fix error

parent 8b458a6e
......@@ -52,7 +52,7 @@ func (client *commitMsgClient) handler() {
var sendingMsgs []*pt.ParacrossNodeStatus
var readTick <-chan time.Time
var ticker *time.Ticker
var authAccountIn bool
var lastAuthAccountIn bool
client.paraClient.wg.Add(1)
consensusCh := make(chan *commitConsensRsp, 1)
......@@ -169,10 +169,10 @@ out:
plog.Debug("para consensus rcv", "consensBlockHash", common.ToHex(rsp.status.BlockHash))
//每次账户加入nodegroup 重新设置finishHeight 重新发送,防止曾经发送过,又退出group场景
if !authAccountIn && rsp.authAccountIn && finishHeight > consensHeight {
if !lastAuthAccountIn && rsp.authAccountIn {
finishHeight = consensHeight
}
authAccountIn = rsp.authAccountIn
lastAuthAccountIn = rsp.authAccountIn
if notification == nil || isRollback || !rsp.authAccountIn {
isSync = false
......
......@@ -432,6 +432,7 @@ func (a *action) Commit(commit *pt.ParacrossCommitAction) (*types.Receipt, error
//用commit.MainBlockHeight 判断更准确,如果用a.exec.MainHeight也可以,但是可能收到MainHeight之前的高度共识tx,
// 后面loopCommitTxDone时候也是用当前共识高度大于分叉高度判断
if commit.Status.MainBlockHeight >= getDappForkHeight(pt.ForkLoopCheckCommitTxDone) {
stat.BlockDetails = &pt.ParacrossStatusBlockDetails{}
updateCommitBlockHashs(stat, commit.Status)
}
......@@ -464,6 +465,7 @@ func (a *action) Commit(commit *pt.ParacrossCommitAction) (*types.Receipt, error
if types.IsDappFork(commit.Status.MainBlockHeight, pt.ParaX, pt.ForkCommitTx) {
updateCommitAddrs(stat, nodes)
}
saveTitleHeight(a.db, calcTitleHeightKey(stat.Title, stat.Height), stat)
if commit.Status.Height > titleStatus.Height+1 {
saveTitleHeight(a.db, calcTitleHeightKey(commit.Status.Title, commit.Status.Height), stat)
......@@ -476,11 +478,19 @@ func (a *action) Commit(commit *pt.ParacrossCommitAction) (*types.Receipt, error
return receipt, nil
}
}
return a.commitTxDone(commit.Status, stat, titleStatus, nodes, receipt)
r, err := a.commitTxDone(commit.Status, stat, titleStatus, nodes)
if err != nil {
return nil, err
}
receipt = mergeReceipt(receipt, r)
return receipt, nil
}
//分叉以前stat里面只记录了blockhash的信息,没有crossTxHash等信息,无法通过stat直接重构出mostCommitStatus
func (a *action) commitTxDone(nodeStatus *pt.ParacrossNodeStatus, stat *pt.ParacrossHeightStatus, titleStatus *pt.ParacrossStatus,
nodes map[string]struct{}, receipt *types.Receipt) (*types.Receipt, error) {
nodes map[string]struct{}) (*types.Receipt, error) {
receipt := &types.Receipt{}
clog.Debug("paracross.Commit commit", "stat.title", stat.Title, "stat.height", stat.Height, "notes", len(nodes))
for i, v := range stat.Details.Addrs {
clog.Debug("paracross.Commit commit detail", "addr", v, "hash", hex.EncodeToString(stat.Details.BlockHash[i]))
......@@ -489,7 +499,6 @@ func (a *action) commitTxDone(nodeStatus *pt.ParacrossNodeStatus, stat *pt.Parac
commitCount := len(stat.Details.Addrs)
most, mostHash := getMostCommit(stat)
if !isCommitDone(nodes, most) {
saveTitleHeight(a.db, calcTitleHeightKey(stat.Title, stat.Height), stat)
return receipt, nil
}
clog.Debug("paracross.Commit commit ----pass", "most", most, "mostHash", hex.EncodeToString([]byte(mostHash)))
......@@ -506,11 +515,16 @@ func (a *action) commitTxDone(nodeStatus *pt.ParacrossNodeStatus, stat *pt.Parac
receiptDone := makeDoneReceipt(a.exec.GetMainHeight(), nodeStatus, int32(most), int32(commitCount), int32(len(nodes)))
receipt = mergeReceipt(receipt, receiptDone)
return a.commitTxDoneStep2(nodeStatus, stat, titleStatus, receipt)
r, err := a.commitTxDoneStep2(nodeStatus, stat, titleStatus)
if err != nil {
return nil, err
}
receipt = mergeReceipt(receipt, r)
return receipt, nil
}
func (a *action) commitTxDoneStep2(nodeStatus *pt.ParacrossNodeStatus, stat *pt.ParacrossHeightStatus, titleStatus *pt.ParacrossStatus,
receipt *types.Receipt) (*types.Receipt, error) {
func (a *action) commitTxDoneStep2(nodeStatus *pt.ParacrossNodeStatus, stat *pt.ParacrossHeightStatus, titleStatus *pt.ParacrossStatus) (*types.Receipt, error) {
receipt := &types.Receipt{}
titleStatus.Title = nodeStatus.Title
titleStatus.Height = nodeStatus.Height
......@@ -611,7 +625,6 @@ func (a *action) loopCommitTxDone(title string) (*types.Receipt, error) {
}
func (a *action) checkCommitTxDone(title string, stat *pt.ParacrossHeightStatus, nodes map[string]struct{}) (*types.Receipt, error) {
receipt := &types.Receipt{}
status, err := getTitle(a.db, calcTitleKey(title))
if err != nil {
return nil, errors.Wrapf(err, "getTitle:%s", title)
......@@ -622,14 +635,13 @@ func (a *action) checkCommitTxDone(title string, stat *pt.ParacrossHeightStatus,
return nil, nil
}
return a.commitTxDoneByStat(stat, status, nodes, receipt)
return a.commitTxDoneByStat(stat, status, nodes)
}
//只根据stat的信息在commitDone之后重构一个commitStatus做后续处理
func (a *action) commitTxDoneByStat(stat *pt.ParacrossHeightStatus, titleStatus *pt.ParacrossStatus,
nodes map[string]struct{}, receipt *types.Receipt) (*types.Receipt, error) {
//只根据stat的信息在commitDone之后重构一个commitMostStatus做后续处理
func (a *action) commitTxDoneByStat(stat *pt.ParacrossHeightStatus, titleStatus *pt.ParacrossStatus, nodes map[string]struct{}) (*types.Receipt, error) {
receipt := &types.Receipt{}
clog.Debug("paracross.commitTxDoneByStat", "stat.title", stat.Title, "stat.height", stat.Height, "notes", len(nodes))
for i, v := range stat.Details.Addrs {
clog.Debug("paracross.commitTxDoneByStat detail", "addr", v, "hash", hex.EncodeToString(stat.Details.BlockHash[i]))
......@@ -665,7 +677,12 @@ func (a *action) commitTxDoneByStat(stat *pt.ParacrossHeightStatus, titleStatus
receiptDone := makeDoneReceipt(a.exec.GetMainHeight(), mostStatus, int32(most), int32(commitCount), int32(len(nodes)))
receipt = mergeReceipt(receipt, receiptDone)
return a.commitTxDoneStep2(mostStatus, stat, titleStatus, receipt)
r, err := a.commitTxDoneStep2(mostStatus, stat, titleStatus)
if err != nil {
return nil, err
}
receipt = mergeReceipt(receipt, r)
return receipt, nil
}
//平行链自共识无缝切换条件:1,平行链没有共识过,2:commit高度是大于自共识分叉高度且上一次共识的主链高度小于自共识分叉高度,保证只运行一次,
......
......@@ -770,3 +770,44 @@ func createParaNormalTx(s suite.Suite, privFrom string, to []byte) (*types.Trans
return tx, nil
}
func TestUpdateCommitBlockHashs(t *testing.T) {
stat := &pt.ParacrossHeightStatus{}
stat.BlockDetails = &pt.ParacrossStatusBlockDetails{}
commit := &pt.ParacrossNodeStatus{
MainBlockHash: []byte("main"),
MainBlockHeight: 1,
BlockHash: []byte("1122"),
StateHash: []byte("statehash"),
TxResult: []byte(""),
TxHashs: [][]byte{nil},
CrossTxResult: []byte(""),
CrossTxHashs: [][]byte{nil},
}
updateCommitBlockHashs(stat, commit)
assert.Equal(t, int(1), len(stat.BlockDetails.BlockHashs))
assert.Equal(t, commit.BlockHash, stat.BlockDetails.BlockHashs[0])
updateCommitBlockHashs(stat, commit)
assert.Equal(t, int(1), len(stat.BlockDetails.BlockHashs))
assert.Equal(t, commit.BlockHash, stat.BlockDetails.BlockHashs[0])
commit2 := &pt.ParacrossNodeStatus{
MainBlockHash: []byte("main"),
MainBlockHeight: 1,
BlockHash: []byte("2233"),
StateHash: []byte("statehash"),
TxResult: []byte("11"),
TxHashs: [][]byte{[]byte("hash2")},
CrossTxResult: []byte("11"),
CrossTxHashs: [][]byte{[]byte("hash2")},
}
updateCommitBlockHashs(stat, commit2)
assert.Equal(t, int(2), len(stat.BlockDetails.BlockHashs))
assert.Equal(t, int(2), len(stat.BlockDetails.CrossTxHashs))
assert.Equal(t, commit2.BlockHash, stat.BlockDetails.BlockHashs[1])
assert.Equal(t, commit.CrossTxHashs[0], stat.BlockDetails.CrossTxHashs[0])
assert.Equal(t, commit2.CrossTxHashs[0], stat.BlockDetails.CrossTxHashs[1])
}
......@@ -657,7 +657,7 @@ func unpdateNodeGroup(db dbm.KV, title, addr string, add bool) (*types.Receipt,
if add {
item.GetArr().Value = append(item.GetArr().Value, addr)
item.Addr = addr
clog.Info("unpdateNodeGroup", "add key", string(key), "from", copyItem.GetArr().Value, "to", item.GetArr().Value)
clog.Info("unpdateNodeGroup add", "addr", addr, "from", copyItem.GetArr().Value, "to", item.GetArr().Value)
} else {
//必须保留至少1个授权账户
......@@ -667,11 +667,11 @@ func unpdateNodeGroup(db dbm.KV, title, addr string, add bool) (*types.Receipt,
item.Addr = addr
item.GetArr().Value = make([]string, 0)
for _, value := range copyItem.GetArr().Value {
clog.Info("unpdateNodeGroup", "key delete", string(key), "current", value)
if value != addr {
item.GetArr().Value = append(item.GetArr().Value, value)
}
}
clog.Info("unpdateNodeGroup delete", "addr", addr)
}
err = db.Set(key, types.Encode(&item))
if err != nil {
......
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