From bbf89ab7f5e04981bb644702eb723a5210ce8c6d Mon Sep 17 00:00:00 2001 From: jzh <1092431698@qq.com> Date: Fri, 17 Jan 2025 11:53:13 +0800 Subject: [PATCH] fix(dpos): remove history by real changes --- test/unit/dposkeyframe_test.go | 4 +++- test/unit/txvalidator_test.go | 2 +- utils/history.go | 20 ++++++++++++++++++-- 3 files changed, 22 insertions(+), 4 deletions(-) diff --git a/test/unit/dposkeyframe_test.go b/test/unit/dposkeyframe_test.go index b1d9017fd..de5f7b2c6 100644 --- a/test/unit/dposkeyframe_test.go +++ b/test/unit/dposkeyframe_test.go @@ -74,7 +74,8 @@ func dposCheckPointsEqual(first *state.CheckPoint, second *state.CheckPoint) boo second.CurrentReward.TotalVotesInRound || second.NextReward.TotalVotesInRound != second.NextReward.TotalVotesInRound || - first.ForceChanged != second.ForceChanged { + first.ForceChanged != second.ForceChanged || + first.NeedNextTurnDPOSInfo != second.NeedNextTurnDPOSInfo { return false } @@ -366,6 +367,7 @@ func randomDPOSStateKeyFrame() *state.StateKeyFrame { VersionStartHeight: rand.Uint32(), VersionEndHeight: rand.Uint32(), DPoSV2ActiveHeight: rand.Uint32(), + NeedNextTurnDPOSInfo: randomBool(), } for i := 0; i < 5; i++ { diff --git a/test/unit/txvalidator_test.go b/test/unit/txvalidator_test.go index 37c281558..2aafc2f99 100644 --- a/test/unit/txvalidator_test.go +++ b/test/unit/txvalidator_test.go @@ -7623,7 +7623,7 @@ func (s *txValidatorTestSuite) TestArbitersAccumulateReward() { ownerPubKeyStr := "0306e3deefee78e0e25f88e98f1f3290ccea98f08dd3a890616755f1a066c4b9b8" nodePubKeyStr := "0250c5019a00f8bb4fd59bb6d613c70a39bb3026b87cfa247fd26f59fd04987855" - _, err := hex.DecodeString(ownerPubKeyStr) + ownerPubKey, err := hex.DecodeString(ownerPubKeyStr) if err != nil { fmt.Println("err", err) } diff --git a/utils/history.go b/utils/history.go index 99c9c75ad..9dfe6dd4c 100644 --- a/utils/history.go +++ b/utils/history.go @@ -132,9 +132,25 @@ func (h *History) Commit(height uint32) { h.changes[i].commit() } + // same height changes is just one + holdHeight := make(map[uint32]bool, 0) + var lastHeight uint32 + lastHeightChangesCount := 0 + for i, change := range h.changes { + if i == 0 { + lastHeight = change.height + } + if change.height == lastHeight { + lastHeightChangesCount++ + } + _, ok := holdHeight[change.height] + if !ok { + holdHeight[change.height] = true + } + } // if changes overflows history's capacity, remove the oldest change. - if len(h.changes) >= h.capacity { - h.changes = h.changes[1:] + if len(holdHeight) >= h.capacity { + h.changes = h.changes[lastHeightChangesCount:] } // if no cached changes, create an empty height change.