Skip to content

Commit f8ae632

Browse files
authored
Merge branch 'master' into master
2 parents d10ad00 + 5d5ec5b commit f8ae632

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

69 files changed

+2337
-876
lines changed

action/protocol/context.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,7 @@ type (
162162
NotSlashUnproductiveDelegates bool
163163
CandidateBLSPublicKey bool
164164
NotUseMinSelfStakeToBeActive bool
165+
LoadContractStakingFromIndexer bool
165166
}
166167

167168
// FeatureWithHeightCtx provides feature check functions.
@@ -327,6 +328,7 @@ func WithFeatureCtx(ctx context.Context) context.Context {
327328
NotSlashUnproductiveDelegates: !g.IsToBeEnabled(height),
328329
CandidateBLSPublicKey: g.IsToBeEnabled(height),
329330
NotUseMinSelfStakeToBeActive: !g.IsToBeEnabled(height),
331+
LoadContractStakingFromIndexer: !g.IsToBeEnabled(height),
330332
},
331333
)
332334
}

action/protocol/mock_protocol.go

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

action/protocol/protocol.go

Lines changed: 39 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -115,21 +115,55 @@ type (
115115
Fork() View
116116
Snapshot() int
117117
Revert(int) error
118-
Commit(context.Context, StateReader) error
118+
Commit(context.Context, StateManager) error
119119
}
120120

121121
// Views stores the view for all protocols
122122
Views struct {
123-
vm map[string]View
123+
snapshotID int
124+
snapshots map[int]map[string]int
125+
vm map[string]View
124126
}
125127
)
126128

127129
func NewViews() *Views {
128130
return &Views{
129-
vm: make(map[string]View),
131+
snapshotID: 0,
132+
snapshots: make(map[int]map[string]int),
133+
vm: make(map[string]View),
130134
}
131135
}
132136

137+
func (views *Views) Snapshot() int {
138+
views.snapshotID++
139+
views.snapshots[views.snapshotID] = make(map[string]int)
140+
keys := make([]string, 0, len(views.vm))
141+
for key := range views.vm {
142+
keys = append(keys, key)
143+
}
144+
for _, key := range keys {
145+
views.snapshots[views.snapshotID][key] = views.vm[key].Snapshot()
146+
}
147+
return views.snapshotID
148+
}
149+
150+
func (views *Views) Revert(id int) error {
151+
if id > views.snapshotID || id < 0 {
152+
return errors.Errorf("invalid snapshot id %d, max id is %d", id, views.snapshotID)
153+
}
154+
for k, v := range views.snapshots[id] {
155+
if err := views.vm[k].Revert(v); err != nil {
156+
return err
157+
}
158+
}
159+
views.snapshotID = id
160+
// clean up snapshots that are not needed anymore
161+
for i := id + 1; i <= views.snapshotID; i++ {
162+
delete(views.snapshots, i)
163+
}
164+
return nil
165+
}
166+
133167
func (views *Views) Fork() *Views {
134168
fork := NewViews()
135169
for key, view := range views.vm {
@@ -138,9 +172,9 @@ func (views *Views) Fork() *Views {
138172
return fork
139173
}
140174

141-
func (views *Views) Commit(ctx context.Context, sr StateReader) error {
175+
func (views *Views) Commit(ctx context.Context, sm StateManager) error {
142176
for _, view := range views.vm {
143-
if err := view.Commit(ctx, sr); err != nil {
177+
if err := view.Commit(ctx, sm); err != nil {
144178
return err
145179
}
146180
}

action/protocol/staking/bucket_index_test.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -123,26 +123,26 @@ func TestGetPutBucketIndex(t *testing.T) {
123123

124124
// put buckets and get
125125
for i, e := range tests {
126-
_, _, err := csr.voterBucketIndices(e.voterAddr)
126+
_, _, err := csr.NativeBucketIndicesByVoter(e.voterAddr)
127127
if i == 0 {
128128
require.Equal(state.ErrStateNotExist, errors.Cause(err))
129129
}
130-
_, _, err = csr.candBucketIndices(e.candAddr)
130+
_, _, err = csr.NativeBucketIndicesByCandidate(e.candAddr)
131131
if i == 0 {
132132
require.Equal(state.ErrStateNotExist, errors.Cause(err))
133133
}
134134

135135
// put voter bucket index
136136
require.NoError(csm.putVoterBucketIndex(e.voterAddr, e.index))
137-
bis, _, err := csr.voterBucketIndices(e.voterAddr)
137+
bis, _, err := csr.NativeBucketIndicesByVoter(e.voterAddr)
138138
require.NoError(err)
139139
bucketIndices := *bis
140140
require.Equal(e.voterIndexSize, len(bucketIndices))
141141
require.Equal(bucketIndices[e.voterIndexSize-1], e.index)
142142

143143
// put candidate bucket index
144144
require.NoError(csm.putCandBucketIndex(e.candAddr, e.index))
145-
bis, _, err = csr.candBucketIndices(e.candAddr)
145+
bis, _, err = csr.NativeBucketIndicesByCandidate(e.candAddr)
146146
require.NoError(err)
147147
bucketIndices = *bis
148148
require.Equal(e.candIndexSize, len(bucketIndices))
@@ -152,7 +152,7 @@ func TestGetPutBucketIndex(t *testing.T) {
152152
for _, e := range tests {
153153
// delete voter bucket index
154154
require.NoError(csm.delVoterBucketIndex(e.voterAddr, e.index))
155-
bis, _, err := csr.voterBucketIndices(e.voterAddr)
155+
bis, _, err := csr.NativeBucketIndicesByVoter(e.voterAddr)
156156
if e.voterIndexSize != indexSize {
157157
bucketIndices := *bis
158158
require.Equal(indexSize-e.voterIndexSize, len(bucketIndices))
@@ -162,7 +162,7 @@ func TestGetPutBucketIndex(t *testing.T) {
162162

163163
// delete candidate bucket index
164164
require.NoError(csm.delCandBucketIndex(e.candAddr, e.index))
165-
bis, _, err = csr.candBucketIndices(e.candAddr)
165+
bis, _, err = csr.NativeBucketIndicesByCandidate(e.candAddr)
166166
if e.candIndexSize != indexSize {
167167
bucketIndices := *bis
168168
require.Equal(indexSize-e.candIndexSize, len(bucketIndices))

action/protocol/staking/bucket_pool.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ func (bp *BucketPool) Clone() *BucketPool {
124124
}
125125

126126
// Commit is called upon workingset commit
127-
func (bp *BucketPool) Commit(sr protocol.StateReader) error {
127+
func (bp *BucketPool) Commit() error {
128128
bp.dirty = false
129129
return nil
130130
}

action/protocol/staking/candidate_center.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -126,8 +126,8 @@ func (m *CandidateCenter) commit() error {
126126
}
127127

128128
// Commit writes the change into base
129-
func (m *CandidateCenter) Commit(ctx context.Context, sr protocol.StateReader) error {
130-
height, err := sr.Height()
129+
func (m *CandidateCenter) Commit(ctx context.Context, sm protocol.StateManager) error {
130+
height, err := sm.Height()
131131
if err != nil {
132132
return err
133133
}
@@ -292,8 +292,8 @@ func (m *CandidateCenter) WriteToStateDB(sm protocol.StateManager) error {
292292
name := m.base.candsInNameMap()
293293
op := m.base.candsInOperatorMap()
294294
owners := m.base.ownersList()
295-
if len(name) == 0 || len(op) == 0 {
296-
return ErrNilParameters
295+
if len(name) == 0 || len(op) == 0 || len(owners) == 0 {
296+
return nil
297297
}
298298
if _, err := sm.PutState(name, protocol.NamespaceOption(CandsMapNS), protocol.KeyOption(_nameKey)); err != nil {
299299
return err

action/protocol/staking/candidate_center_test.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -325,7 +325,7 @@ func TestFixAlias(t *testing.T) {
325325
} else {
326326
r.NoError(m.commit())
327327
}
328-
views.Write(_protocolID, &ViewData{
328+
views.Write(_protocolID, &viewData{
329329
candCenter: m,
330330
})
331331

@@ -376,7 +376,7 @@ func TestFixAlias(t *testing.T) {
376376
} else {
377377
r.NoError(center.commit())
378378
}
379-
views.Write(_protocolID, &ViewData{
379+
views.Write(_protocolID, &viewData{
380380
candCenter: center,
381381
})
382382
}
@@ -476,7 +476,7 @@ func TestMultipleNonStakingCandidate(t *testing.T) {
476476
r.True(testEqual(candcenter, CandidateList(cands)))
477477
// from state manager
478478
views := protocol.NewViews()
479-
views.Write(_protocolID, &ViewData{
479+
views.Write(_protocolID, &viewData{
480480
candCenter: candcenter,
481481
})
482482
candcenter = candCenterFromNewCandidateStateManager(r, views)
@@ -538,7 +538,7 @@ func candCenterFromNewCandidateStateManager(r *require.Assertions, views *protoc
538538
// get cand center: csm.ConstructBaseView
539539
v, err := views.Read(_protocolID)
540540
r.NoError(err)
541-
return v.(*ViewData).candCenter
541+
return v.(*viewData).candCenter
542542
}
543543

544544
func TestCandidateUpsert(t *testing.T) {

action/protocol/staking/candidate_statemanager.go

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -40,10 +40,10 @@ type (
4040
// CandidateStateManager is candidate state manager on top of StateManager
4141
CandidateStateManager interface {
4242
BucketSet
43-
BucketGetByIndex
43+
NativeBucketGetByIndex
4444
CandidateSet
4545
// candidate and bucket pool related
46-
DirtyView() *ViewData
46+
DirtyView() *viewData
4747
ContainsName(string) bool
4848
ContainsOwner(address.Address) bool
4949
ContainsOperator(address.Address) bool
@@ -64,7 +64,7 @@ type (
6464
ContainsSelfStakingBucket(uint64) bool
6565
GetByIdentifier(address.Address) *Candidate
6666
SR() protocol.StateReader
67-
BucketGetByIndex
67+
NativeBucketGetByIndex
6868
}
6969

7070
candSM struct {
@@ -108,15 +108,15 @@ func (csm *candSM) SR() protocol.StateReader {
108108
}
109109

110110
// DirtyView is csm's current state, which reflects base view + applying delta saved in csm's dock
111-
func (csm *candSM) DirtyView() *ViewData {
111+
func (csm *candSM) DirtyView() *viewData {
112112
v, err := csm.StateManager.ReadView(_protocolID)
113113
if err != nil {
114114
log.S().Panic("failed to read view", zap.Error(err))
115115
}
116-
return &ViewData{
116+
return &viewData{
117117
candCenter: csm.candCenter,
118118
bucketPool: csm.bucketPool,
119-
contractsStake: v.(*ViewData).contractsStake,
119+
contractsStake: v.(*viewData).contractsStake,
120120
}
121121
}
122122

@@ -175,12 +175,12 @@ func (csm *candSM) Commit(ctx context.Context) error {
175175
return csm.WriteView(_protocolID, view)
176176
}
177177

178-
func (csm *candSM) getBucket(index uint64) (*VoteBucket, error) {
179-
return newCandidateStateReader(csm).getBucket(index)
178+
func (csm *candSM) NativeBucket(index uint64) (*VoteBucket, error) {
179+
return newCandidateStateReader(csm).NativeBucket(index)
180180
}
181181

182182
func (csm *candSM) updateBucket(index uint64, bucket *VoteBucket) error {
183-
if _, err := csm.getBucket(index); err != nil {
183+
if _, err := csm.NativeBucket(index); err != nil {
184184
return err
185185
}
186186

0 commit comments

Comments
 (0)