This repository has been archived by the owner on Jun 6, 2023. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 102
/
power.go
99 lines (87 loc) · 3.34 KB
/
power.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
package nv10
import (
"context"
adt2 "github.com/filecoin-project/specs-actors/actors/util/adt"
power2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/power"
cid "github.com/ipfs/go-cid"
cbor "github.com/ipfs/go-ipld-cbor"
builtin3 "github.com/filecoin-project/specs-actors/v4/actors/builtin"
power3 "github.com/filecoin-project/specs-actors/v4/actors/builtin/power"
adt3 "github.com/filecoin-project/specs-actors/v4/actors/util/adt"
smoothing3 "github.com/filecoin-project/specs-actors/v4/actors/util/smoothing"
)
type powerMigrator struct{}
func (m powerMigrator) migrateState(ctx context.Context, store cbor.IpldStore, in actorMigrationInput) (*actorMigrationResult, error) {
var inState power2.State
if err := store.Get(ctx, in.head, &inState); err != nil {
return nil, err
}
var proofValidationBatchOut *cid.Cid
if inState.ProofValidationBatch != nil {
proofValidationBatchOutCID, err := migrateHAMTAMTRaw(ctx, store, *inState.ProofValidationBatch, builtin3.DefaultHamtBitwidth, power3.ProofValidationBatchAmtBitwidth)
if err != nil {
return nil, err
}
proofValidationBatchOut = &proofValidationBatchOutCID
}
claimsOut, err := m.migrateClaims(ctx, store, inState.Claims)
if err != nil {
return nil, err
}
cronEventQueueOut, err := migrateHAMTAMTRaw(ctx, store, inState.CronEventQueue, power3.CronQueueHamtBitwidth, power3.CronQueueAmtBitwidth)
if err != nil {
return nil, err
}
outState := power3.State{
TotalRawBytePower: inState.TotalRawBytePower,
TotalBytesCommitted: inState.TotalBytesCommitted,
TotalQualityAdjPower: inState.TotalQualityAdjPower,
TotalQABytesCommitted: inState.TotalQABytesCommitted,
TotalPledgeCollateral: inState.TotalPledgeCollateral,
ThisEpochRawBytePower: inState.ThisEpochRawBytePower,
ThisEpochQualityAdjPower: inState.ThisEpochQualityAdjPower,
ThisEpochPledgeCollateral: inState.ThisEpochPledgeCollateral,
ThisEpochQAPowerSmoothed: smoothing3.FilterEstimate(inState.ThisEpochQAPowerSmoothed),
MinerCount: inState.MinerCount,
MinerAboveMinPowerCount: inState.MinerAboveMinPowerCount,
CronEventQueue: cronEventQueueOut,
FirstCronEpoch: inState.FirstCronEpoch,
Claims: claimsOut,
ProofValidationBatch: proofValidationBatchOut,
}
newHead, err := store.Put(ctx, &outState)
return &actorMigrationResult{
newCodeCID: m.migratedCodeCID(),
newHead: newHead,
}, err
}
func (m powerMigrator) migratedCodeCID() cid.Cid {
return builtin3.StoragePowerActorCodeID
}
func (m powerMigrator) migrateClaims(ctx context.Context, store cbor.IpldStore, root cid.Cid) (cid.Cid, error) {
astore := adt3.WrapStore(ctx, store)
inClaims, err := adt2.AsMap(astore, root)
if err != nil {
return cid.Undef, err
}
outClaims, err := adt3.MakeEmptyMap(astore, builtin3.DefaultHamtBitwidth)
if err != nil {
return cid.Undef, err
}
var inClaim power2.Claim
if err = inClaims.ForEach(&inClaim, func(key string) error {
postProof, err := inClaim.SealProofType.RegisteredWindowPoStProof()
if err != nil {
return err
}
outClaim := power3.Claim{
WindowPoStProofType: postProof,
RawBytePower: inClaim.RawBytePower,
QualityAdjPower: inClaim.QualityAdjPower,
}
return outClaims.Put(StringKey(key), &outClaim)
}); err != nil {
return cid.Undef, err
}
return outClaims.Root()
}