/
power.go
118 lines (97 loc) · 3.95 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
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
package migration
import (
"context"
"github.com/filecoin-project/go-state-types/abi"
"github.com/filecoin-project/go-state-types/builtin/v11/util/smoothing"
"github.com/filecoin-project/go-address"
power11 "github.com/filecoin-project/go-state-types/builtin/v11/power"
adt10 "github.com/filecoin-project/go-state-types/builtin/v10/util/adt"
"github.com/filecoin-project/go-state-types/builtin"
power10 "github.com/filecoin-project/go-state-types/builtin/v10/power"
adt11 "github.com/filecoin-project/go-state-types/builtin/v11/util/adt"
"github.com/filecoin-project/go-state-types/migration"
"github.com/ipfs/go-cid"
cbor "github.com/ipfs/go-ipld-cbor"
"golang.org/x/xerrors"
)
// The powerMigrator performs the following migrations:
// - FIP-0061: Updates all claims in the power table to based on V1_1 proof types
type powerMigrator struct {
OutCodeCID cid.Cid
}
func (m powerMigrator) MigratedCodeCID() cid.Cid {
return m.OutCodeCID
}
func (m powerMigrator) MigrateState(ctx context.Context, store cbor.IpldStore, in migration.ActorMigrationInput) (*migration.ActorMigrationResult, error) {
var inState power10.State
if err := store.Get(ctx, in.Head, &inState); err != nil {
return nil, xerrors.Errorf("failed to load power state: %w", err)
}
ctxStore := adt11.WrapStore(ctx, store)
inClaims, err := adt10.AsMap(ctxStore, inState.Claims, builtin.DefaultHamtBitwidth)
if err != nil {
return nil, xerrors.Errorf("failed to load claims: %w", err)
}
emptyClaimsMapCid, err := adt11.StoreEmptyMap(ctxStore, builtin.DefaultHamtBitwidth)
if err != nil {
return nil, xerrors.Errorf("failed to construct empty claims: %w", err)
}
outClaims, err := adt11.AsMap(ctxStore, emptyClaimsMapCid, builtin.DefaultHamtBitwidth)
if err != nil {
return nil, xerrors.Errorf("failed to load empty claims: %w", err)
}
var inClaim power10.Claim
if err := inClaims.ForEach(&inClaim, func(key string) error {
addr, err := address.NewFromBytes([]byte(key))
if err != nil {
return xerrors.Errorf("failed to get addr: %w", err)
}
newProofType, err := inClaim.WindowPoStProofType.ToV1_1PostProof()
if err != nil {
return xerrors.Errorf("failed to convert proof type %d for miner %s: %w", inClaim.WindowPoStProofType, addr, err)
}
outClaim := power11.Claim{
WindowPoStProofType: newProofType,
RawBytePower: inClaim.RawBytePower,
QualityAdjPower: inClaim.QualityAdjPower,
}
if err := outClaims.Put(abi.AddrKey(addr), &outClaim); err != nil {
return xerrors.Errorf("failed to put new claim for miner %s: %w", addr, err)
}
return nil
}); err != nil {
return nil, xerrors.Errorf("failed to iterate over inClaims: %w", err)
}
outClaimsRoot, err := outClaims.Root()
if err != nil {
return nil, xerrors.Errorf("failed to flush outClaims: %w", err)
}
outState := power11.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: smoothing.FilterEstimate(inState.ThisEpochQAPowerSmoothed),
MinerCount: inState.MinerCount,
MinerAboveMinPowerCount: inState.MinerAboveMinPowerCount,
CronEventQueue: inState.CronEventQueue,
FirstCronEpoch: inState.FirstCronEpoch,
Claims: outClaimsRoot,
ProofValidationBatch: inState.ProofValidationBatch,
}
newHead, err := store.Put(ctx, &outState)
if err != nil {
return nil, xerrors.Errorf("failed to put new state: %w", err)
}
return &migration.ActorMigrationResult{
NewCodeCID: m.MigratedCodeCID(),
NewHead: newHead,
}, nil
}
func (m powerMigrator) Deferred() bool {
return false
}