Skip to content

Commit 8bb7b97

Browse files
committed
refactor view
1 parent 2be66a0 commit 8bb7b97

File tree

8 files changed

+66
-115
lines changed

8 files changed

+66
-115
lines changed

action/protocol/staking/contractstakeview_mock.go

Lines changed: 6 additions & 6 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

action/protocol/staking/protocol.go

Lines changed: 3 additions & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -479,16 +479,6 @@ func (p *Protocol) CreatePreStates(ctx context.Context, sm protocol.StateManager
479479
return err
480480
}
481481
vd := v.(*viewData)
482-
indexers := []ContractStakingIndexer{}
483-
if p.contractStakingIndexer != nil {
484-
indexers = append(indexers, p.contractStakingIndexer)
485-
}
486-
if p.contractStakingIndexerV2 != nil {
487-
indexers = append(indexers, p.contractStakingIndexerV2)
488-
}
489-
if p.contractStakingIndexerV3 != nil {
490-
indexers = append(indexers, p.contractStakingIndexerV3)
491-
}
492482
if blkCtx.BlockHeight == g.ToBeEnabledBlockHeight {
493483
handler, err := newNFTBucketEventHandler(sm, func(bucket *contractstaking.Bucket, height uint64) *big.Int {
494484
vb := p.convertToVoteBucket(bucket, height)
@@ -497,42 +487,16 @@ func (p *Protocol) CreatePreStates(ctx context.Context, sm protocol.StateManager
497487
if err != nil {
498488
return err
499489
}
500-
buckets := make([]map[uint64]*contractstaking.Bucket, 3)
501-
for i, indexer := range indexers {
502-
h, bs, err := indexer.ContractStakingBuckets()
503-
if err != nil {
504-
return err
505-
}
506-
if indexer.StartHeight() <= blkCtx.BlockHeight && h != blkCtx.BlockHeight-1 {
507-
return errors.Errorf("bucket cache height %d does not match current height %d", h, blkCtx.BlockHeight-1)
508-
}
509-
buckets[i] = bs
510-
}
511-
if err := vd.contractsStake.Migrate(handler, buckets); err != nil {
490+
if err := vd.contractsStake.Migrate(ctx, handler); err != nil {
512491
return errors.Wrap(err, "failed to flush buckets for contract staking")
513492
}
514493
}
515494
if featureCtx.StoreVoteOfNFTBucketIntoView {
516-
brs := make([]BucketReader, len(indexers))
517-
for i, indexer := range indexers {
518-
brs[i] = indexer
519-
}
520-
if err := vd.contractsStake.CreatePreStates(ctx, brs); err != nil {
495+
if err := vd.contractsStake.CreatePreStates(ctx); err != nil {
521496
return err
522497
}
523498
if blkCtx.BlockHeight == g.WakeBlockHeight {
524-
buckets := make([]map[uint64]*contractstaking.Bucket, 3)
525-
for i, indexer := range indexers {
526-
h, bs, err := indexer.ContractStakingBuckets()
527-
if err != nil {
528-
return err
529-
}
530-
if indexer.StartHeight() <= blkCtx.BlockHeight && h != blkCtx.BlockHeight-1 {
531-
return errors.Errorf("bucket cache height %d does not match current height %d", h, blkCtx.BlockHeight-1)
532-
}
533-
buckets[i] = bs
534-
}
535-
vd.contractsStake.Revise(buckets)
499+
vd.contractsStake.Revise(ctx)
536500
}
537501
}
538502

@@ -1072,32 +1036,6 @@ func (p *Protocol) needToWriteCandsMap(ctx context.Context, height uint64) bool
10721036
return height >= p.config.PersistStakingPatchBlock && fCtx.CandCenterHasAlias(height)
10731037
}
10741038

1075-
func (p *Protocol) contractStakingVotesFromIndexer(ctx context.Context, candidate address.Address, height uint64) (*big.Int, error) {
1076-
featureCtx := protocol.MustGetFeatureCtx(ctx)
1077-
votes := big.NewInt(0)
1078-
indexers := []ContractStakingIndexer{}
1079-
if p.contractStakingIndexer != nil && featureCtx.AddContractStakingVotes {
1080-
indexers = append(indexers, p.contractStakingIndexer)
1081-
}
1082-
if p.contractStakingIndexerV2 != nil && !featureCtx.LimitedStakingContract {
1083-
indexers = append(indexers, p.contractStakingIndexerV2)
1084-
}
1085-
if p.contractStakingIndexerV3 != nil && featureCtx.TimestampedStakingContract {
1086-
indexers = append(indexers, p.contractStakingIndexerV3)
1087-
}
1088-
1089-
for _, indexer := range indexers {
1090-
btks, err := indexer.BucketsByCandidate(candidate, height)
1091-
if err != nil {
1092-
return nil, errors.Wrap(err, "failed to get BucketsByCandidate from contractStakingIndexer")
1093-
}
1094-
for _, b := range btks {
1095-
votes.Add(votes, p.contractBucketVotes(featureCtx, b))
1096-
}
1097-
}
1098-
return votes, nil
1099-
}
1100-
11011039
func (p *Protocol) contractStakingVotesFromView(ctx context.Context, candidate address.Address, view *viewData) (*big.Int, error) {
11021040
featureCtx := protocol.MustGetFeatureCtx(ctx)
11031041
votes := big.NewInt(0)
@@ -1121,19 +1059,6 @@ func (p *Protocol) contractStakingVotesFromView(ctx context.Context, candidate a
11211059
return votes, nil
11221060
}
11231061

1124-
func (p *Protocol) contractBucketVotes(fCtx protocol.FeatureCtx, bkt *VoteBucket) *big.Int {
1125-
votes := big.NewInt(0)
1126-
if bkt.isUnstaked() {
1127-
return votes
1128-
}
1129-
if fCtx.FixContractStakingWeightedVotes {
1130-
votes.Add(votes, p.calculateVoteWeight(bkt, false))
1131-
} else {
1132-
votes.Add(votes, bkt.StakedAmount)
1133-
}
1134-
return votes
1135-
}
1136-
11371062
func readCandCenterStateFromStateDB(sr protocol.StateReader) (CandidateList, CandidateList, CandidateList, error) {
11381063
var (
11391064
name, operator, owner CandidateList

action/protocol/staking/viewdata.go

Lines changed: 15 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -34,13 +34,13 @@ type (
3434
// Commit commits the contract stake view
3535
Commit(context.Context, protocol.StateManager) error
3636
// CreatePreStates creates pre states for the contract stake view
37-
CreatePreStates(ctx context.Context, br BucketReader) error
37+
CreatePreStates(ctx context.Context) error
3838
// Handle handles the receipt for the contract stake view
3939
Handle(ctx context.Context, receipt *action.Receipt) error
4040
// Migrate writes the bucket types and buckets to the state manager
41-
Migrate(EventHandler, map[uint64]*contractstaking.Bucket) error
41+
Migrate(context.Context, EventHandler) error
4242
// Revise updates the contract stake view with the latest bucket data
43-
Revise(map[uint64]*contractstaking.Bucket)
43+
Revise(context.Context)
4444
// BucketsByCandidate returns the buckets by candidate address
4545
CandidateStakeVotes(ctx context.Context, id address.Address) *big.Int
4646
AddBlockReceipts(ctx context.Context, receipts []*action.Receipt) error
@@ -135,37 +135,31 @@ func (v *viewData) Revert(snapshot int) error {
135135
return nil
136136
}
137137

138-
func (csv *contractStakeView) Revise(buckets []map[uint64]*contractstaking.Bucket) {
139-
idx := 0
138+
func (csv *contractStakeView) Revise(ctx context.Context) {
140139
if csv.v1 != nil {
141-
csv.v1.Revise(buckets[idx])
142-
idx++
140+
csv.v1.Revise(ctx)
143141
}
144142
if csv.v2 != nil {
145-
csv.v2.Revise(buckets[idx])
146-
idx++
143+
csv.v2.Revise(ctx)
147144
}
148145
if csv.v3 != nil {
149-
csv.v3.Revise(buckets[idx])
146+
csv.v3.Revise(ctx)
150147
}
151148
}
152149

153-
func (csv *contractStakeView) Migrate(nftHandler EventHandler, buckets []map[uint64]*contractstaking.Bucket) error {
154-
idx := 0
150+
func (csv *contractStakeView) Migrate(ctx context.Context, nftHandler EventHandler) error {
155151
if csv.v1 != nil {
156-
if err := csv.v1.Migrate(nftHandler, buckets[idx]); err != nil {
152+
if err := csv.v1.Migrate(ctx, nftHandler); err != nil {
157153
return err
158154
}
159-
idx++
160155
}
161156
if csv.v2 != nil {
162-
if err := csv.v2.Migrate(nftHandler, buckets[idx]); err != nil {
157+
if err := csv.v2.Migrate(ctx, nftHandler); err != nil {
163158
return err
164159
}
165-
idx++
166160
}
167161
if csv.v3 != nil {
168-
if err := csv.v3.Migrate(nftHandler, buckets[idx]); err != nil {
162+
if err := csv.v3.Migrate(ctx, nftHandler); err != nil {
169163
return err
170164
}
171165
}
@@ -206,22 +200,19 @@ func (csv *contractStakeView) Fork() *contractStakeView {
206200
return clone
207201
}
208202

209-
func (csv *contractStakeView) CreatePreStates(ctx context.Context, brs []BucketReader) error {
210-
idx := 0
203+
func (csv *contractStakeView) CreatePreStates(ctx context.Context) error {
211204
if csv.v1 != nil {
212-
if err := csv.v1.CreatePreStates(ctx, brs[idx]); err != nil {
205+
if err := csv.v1.CreatePreStates(ctx); err != nil {
213206
return err
214207
}
215-
idx++
216208
}
217209
if csv.v2 != nil {
218-
if err := csv.v2.CreatePreStates(ctx, brs[idx]); err != nil {
210+
if err := csv.v2.CreatePreStates(ctx); err != nil {
219211
return err
220212
}
221-
idx++
222213
}
223214
if csv.v3 != nil {
224-
if err := csv.v3.CreatePreStates(ctx, brs[idx]); err != nil {
215+
if err := csv.v3.CreatePreStates(ctx); err != nil {
225216
return err
226217
}
227218
}

blockindex/contractstaking/indexer.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ func (s *Indexer) LoadStakeView(ctx context.Context, sr protocol.StateReader) (s
132132
})
133133
processorBuilder := newEventProcessorBuilder(s.contractAddr)
134134
cfg := &stakingindex.VoteViewConfig{ContractAddr: s.contractAddr}
135-
return stakingindex.NewVoteView(cfg, s.height, cur, processorBuilder, calculateUnmutedVoteWeightAt), nil
135+
return stakingindex.NewVoteView(s, cfg, s.height, cur, processorBuilder, calculateUnmutedVoteWeightAt), nil
136136
}
137137

138138
// Stop stops the indexer

e2etest/rewarding_test.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,8 @@ func TestBlockReward(t *testing.T) {
6969
cfg.Genesis = genesis.TestDefault()
7070
initDBPaths(r, &cfg)
7171
defer func() { clearDBPaths(&cfg) }()
72+
cfg.API.GRPCPort = 0
73+
cfg.API.HTTPPort = 0
7274
cfg.Consensus.Scheme = config.RollDPoSScheme
7375
cfg.Genesis.NumDelegates = 1
7476
cfg.Genesis.NumSubEpochs = 10

e2etest/staking_test.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -196,6 +196,8 @@ func TestStakingContract(t *testing.T) {
196196
delete(cfg.Plugins, config.GatewayPlugin)
197197
}()
198198

199+
cfg.API.GRPCPort = 0
200+
cfg.API.HTTPPort = 0
199201
cfg.ActPool.MinGasPriceStr = "0"
200202
cfg.Chain.TrieDBPatchFile = ""
201203
cfg.Chain.ProducerPrivKey = "a000000000000000000000000000000000000000000000000000000000000000"

systemcontractindex/stakingindex/index.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,7 @@ func (s *Indexer) LoadStakeView(ctx context.Context, sr protocol.StateReader) (s
177177
ContractAddr: s.common.ContractAddress(),
178178
}
179179
processorBuilder := newEventProcessorBuilder(s.common.ContractAddress(), s.timestamped, s.muteHeight)
180-
return NewVoteView(cfg, s.common.Height(), s.createCandidateVotes(s.cache.buckets), processorBuilder, s.calculateContractVoteWeight), nil
180+
return NewVoteView(s, cfg, s.common.Height(), s.createCandidateVotes(s.cache.buckets), processorBuilder, s.calculateContractVoteWeight), nil
181181
}
182182

183183
// ContractStakingBuckets returns all the contract staking buckets

systemcontractindex/stakingindex/voteview.go

Lines changed: 36 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ type (
2525
Build(context.Context, staking.EventHandler) staking.EventProcessor
2626
}
2727
voteView struct {
28+
indexer staking.ContractStakingIndexer
2829
config *VoteViewConfig
2930
height uint64
3031
cur CandidateVotes
@@ -35,17 +36,21 @@ type (
3536
)
3637

3738
// NewVoteView creates a new vote view
38-
func NewVoteView(cfg *VoteViewConfig,
39+
func NewVoteView(
40+
indexer staking.ContractStakingIndexer,
41+
cfg *VoteViewConfig,
3942
height uint64,
4043
cur CandidateVotes,
4144
processorBuilder EventProcessorBuilder,
4245
fn CalculateUnmutedVoteWeightAtFn,
4346
) staking.ContractStakeView {
4447
return &voteView{
48+
indexer: indexer,
4549
config: cfg,
4650
height: height,
4751
cur: cur,
4852
processorBuilder: processorBuilder,
53+
store: newBucketStore(indexer),
4954
calculateVoteWeightFn: fn,
5055
}
5156
}
@@ -61,6 +66,7 @@ func (s *voteView) Wrap() staking.ContractStakeView {
6166
store = newBucketStore(s.store)
6267
}
6368
return &voteView{
69+
indexer: s.indexer,
6470
config: s.config,
6571
height: s.height,
6672
cur: cur,
@@ -77,6 +83,7 @@ func (s *voteView) Fork() staking.ContractStakeView {
7783
store = newBucketStore(s.store)
7884
}
7985
return &voteView{
86+
indexer: s.indexer,
8087
config: s.config,
8188
height: s.height,
8289
cur: cur,
@@ -90,7 +97,28 @@ func (s *voteView) IsDirty() bool {
9097
return s.cur.IsDirty()
9198
}
9299

93-
func (s *voteView) Migrate(handler staking.EventHandler, buckets map[uint64]*contractstaking.Bucket) error {
100+
func (s *voteView) buckets(ctx context.Context) (map[uint64]*contractstaking.Bucket, error) {
101+
h, buckets, err := s.indexer.ContractStakingBuckets()
102+
if err != nil {
103+
return nil, err
104+
}
105+
blkCtx := protocol.MustGetBlockCtx(ctx)
106+
if s.indexer.StartHeight() <= blkCtx.BlockHeight && h != blkCtx.BlockHeight-1 {
107+
return nil, errors.Errorf("bucket cache height %d does not match current height %d", h, blkCtx.BlockHeight-1)
108+
}
109+
return buckets, nil
110+
}
111+
112+
func (s *voteView) Migrate(ctx context.Context, handler staking.EventHandler) error {
113+
h, buckets, err := s.indexer.ContractStakingBuckets()
114+
if err != nil {
115+
return err
116+
}
117+
blkCtx := protocol.MustGetBlockCtx(ctx)
118+
if s.indexer.StartHeight() <= blkCtx.BlockHeight && h != blkCtx.BlockHeight-1 {
119+
return errors.Errorf("bucket cache height %d does not match current height %d", h, blkCtx.BlockHeight-1)
120+
}
121+
94122
for id := range buckets {
95123
if err := handler.PutBucket(s.config.ContractAddr, id, buckets[id]); err != nil {
96124
return err
@@ -99,7 +127,11 @@ func (s *voteView) Migrate(handler staking.EventHandler, buckets map[uint64]*con
99127
return nil
100128
}
101129

102-
func (s *voteView) Revise(buckets map[uint64]*contractstaking.Bucket) {
130+
func (s *voteView) Revise(ctx context.Context) {
131+
buckets, err := s.buckets(ctx)
132+
if err != nil {
133+
return
134+
}
103135
s.cur = AggregateCandidateVotes(buckets, func(b *contractstaking.Bucket) *big.Int {
104136
return s.calculateVoteWeightFn(b, s.height)
105137
})
@@ -113,10 +145,9 @@ func (s *voteView) CandidateStakeVotes(ctx context.Context, candidate address.Ad
113145
return s.cur.Votes(featureCtx, candidate.String())
114146
}
115147

116-
func (s *voteView) CreatePreStates(ctx context.Context, br BucketReader) error {
148+
func (s *voteView) CreatePreStates(ctx context.Context) error {
117149
blkCtx := protocol.MustGetBlockCtx(ctx)
118150
s.height = blkCtx.BlockHeight
119-
s.store = newBucketStore(br)
120151
return nil
121152
}
122153

0 commit comments

Comments
 (0)