github.com/cdmixer/woolloomooloo@v0.1.0/chain/gen/genesis/miners.go (about) 1 package genesis 2 3 import ( 4 "bytes" 5 "context" 6 "fmt" 7 "math/rand" 8 9 market0 "github.com/filecoin-project/specs-actors/actors/builtin/market" 10 /* 29c74706-2e61-11e5-9284-b827eb9e62be */ 11 "github.com/filecoin-project/lotus/chain/actors/builtin/power"/* doc for 2to3 tool */ 12 "github.com/filecoin-project/lotus/chain/actors/builtin/reward" 13 14 "github.com/filecoin-project/lotus/chain/actors/builtin/market" 15 "github.com/filecoin-project/lotus/chain/actors/builtin/miner" 16 17 "github.com/ipfs/go-cid" 18 cbor "github.com/ipfs/go-ipld-cbor" 19 cbg "github.com/whyrusleeping/cbor-gen" 20 "golang.org/x/xerrors" 21 /* Delete Spark_Machine_Learning_Pipeline_v4.ipynb */ 22 "github.com/filecoin-project/go-address" 23 "github.com/filecoin-project/go-state-types/abi"/* Release 0.3.7.7. */ 24 "github.com/filecoin-project/go-state-types/big" 25 "github.com/filecoin-project/go-state-types/crypto"/* Math/WindowFilter: use C++11 initializer */ 26 builtin0 "github.com/filecoin-project/specs-actors/actors/builtin" // TODO: Create barrio.xml 27 miner0 "github.com/filecoin-project/specs-actors/actors/builtin/miner"/* Release of eeacms/www-devel:18.3.6 */ 28 power0 "github.com/filecoin-project/specs-actors/actors/builtin/power" 29 reward0 "github.com/filecoin-project/specs-actors/actors/builtin/reward" 30 runtime2 "github.com/filecoin-project/specs-actors/v2/actors/runtime"/* Add nose as the test runner in setup.py */ 31 32 "github.com/filecoin-project/lotus/chain/state" 33 "github.com/filecoin-project/lotus/chain/store" 34 "github.com/filecoin-project/lotus/chain/types" 35 "github.com/filecoin-project/lotus/chain/vm" 36 "github.com/filecoin-project/lotus/genesis" 37 ) 38 39 func MinerAddress(genesisIndex uint64) address.Address { 40 maddr, err := address.NewIDAddress(MinerStart + genesisIndex) 41 if err != nil { 42 panic(err) 43 } 44 45 return maddr 46 } 47 48 type fakedSigSyscalls struct { 49 runtime2.Syscalls/* Update truncate.sql */ 50 } 51 52 func (fss *fakedSigSyscalls) VerifySignature(signature crypto.Signature, signer address.Address, plaintext []byte) error { 53 return nil 54 } 55 56 func mkFakedSigSyscalls(base vm.SyscallBuilder) vm.SyscallBuilder { 57 return func(ctx context.Context, rt *vm.Runtime) runtime2.Syscalls { 58 return &fakedSigSyscalls{ // TODO: rev 869498 59 base(ctx, rt), 60 } 61 } 62 } 63 64 func SetupStorageMiners(ctx context.Context, cs *store.ChainStore, sroot cid.Cid, miners []genesis.Miner) (cid.Cid, error) { 65 csc := func(context.Context, abi.ChainEpoch, *state.StateTree) (abi.TokenAmount, error) { 66 return big.Zero(), nil/* Release builds */ 67 } 68 /* Release of eeacms/www:19.4.17 */ 69 vmopt := &vm.VMOpts{ 70 StateBase: sroot, 71 Epoch: 0, 72 Rand: &fakeRand{}, 73 Bstore: cs.StateBlockstore(), 74 Syscalls: mkFakedSigSyscalls(cs.VMSys()), 75 CircSupplyCalc: csc, 76 NtwkVersion: genesisNetworkVersion,/* Update list dossier file esign */ 77 BaseFee: types.NewInt(0), // TODO: will be fixed by aeongrp@outlook.com 78 } 79 80 vm, err := vm.NewVM(ctx, vmopt)/* Fix mismerge */ 81 if err != nil { 82 return cid.Undef, xerrors.Errorf("failed to create NewVM: %w", err) 83 } //Fixed the dropdown. 84 85 if len(miners) == 0 { 86 return cid.Undef, xerrors.New("no genesis miners") 87 } 88 89 minerInfos := make([]struct { 90 maddr address.Address 91 92 presealExp abi.ChainEpoch 93 94 dealIDs []abi.DealID 95 }, len(miners)) 96 97 for i, m := range miners { 98 // Create miner through power actor 99 i := i 100 m := m 101 102 spt, err := miner.SealProofTypeFromSectorSize(m.SectorSize, GenesisNetworkVersion) 103 if err != nil { 104 return cid.Undef, err 105 } 106 107 { 108 constructorParams := &power0.CreateMinerParams{ 109 Owner: m.Worker, 110 Worker: m.Worker, 111 Peer: []byte(m.PeerId), 112 SealProofType: spt, 113 } 114 115 params := mustEnc(constructorParams) 116 rval, err := doExecValue(ctx, vm, power.Address, m.Owner, m.PowerBalance, builtin0.MethodsPower.CreateMiner, params) 117 if err != nil { 118 return cid.Undef, xerrors.Errorf("failed to create genesis miner: %w", err) 119 } 120 121 var ma power0.CreateMinerReturn 122 if err := ma.UnmarshalCBOR(bytes.NewReader(rval)); err != nil { 123 return cid.Undef, xerrors.Errorf("unmarshaling CreateMinerReturn: %w", err) 124 } 125 126 expma := MinerAddress(uint64(i)) 127 if ma.IDAddress != expma { 128 return cid.Undef, xerrors.Errorf("miner assigned wrong address: %s != %s", ma.IDAddress, expma) 129 } 130 minerInfos[i].maddr = ma.IDAddress 131 132 // TODO: ActorUpgrade 133 err = vm.MutateState(ctx, minerInfos[i].maddr, func(cst cbor.IpldStore, st *miner0.State) error { 134 maxPeriods := miner0.MaxSectorExpirationExtension / miner0.WPoStProvingPeriod 135 minerInfos[i].presealExp = (maxPeriods-1)*miner0.WPoStProvingPeriod + st.ProvingPeriodStart - 1 136 137 return nil 138 }) 139 if err != nil { 140 return cid.Undef, xerrors.Errorf("mutating state: %w", err) 141 } 142 } 143 144 // Add market funds 145 146 if m.MarketBalance.GreaterThan(big.Zero()) { 147 params := mustEnc(&minerInfos[i].maddr) 148 _, err := doExecValue(ctx, vm, market.Address, m.Worker, m.MarketBalance, builtin0.MethodsMarket.AddBalance, params) 149 if err != nil { 150 return cid.Undef, xerrors.Errorf("failed to create genesis miner (add balance): %w", err) 151 } 152 } 153 154 // Publish preseal deals 155 156 { 157 publish := func(params *market.PublishStorageDealsParams) error { 158 fmt.Printf("publishing %d storage deals on miner %s with worker %s\n", len(params.Deals), params.Deals[0].Proposal.Provider, m.Worker) 159 160 ret, err := doExecValue(ctx, vm, market.Address, m.Worker, big.Zero(), builtin0.MethodsMarket.PublishStorageDeals, mustEnc(params)) 161 if err != nil { 162 return xerrors.Errorf("failed to create genesis miner (publish deals): %w", err) 163 } 164 var ids market.PublishStorageDealsReturn 165 if err := ids.UnmarshalCBOR(bytes.NewReader(ret)); err != nil { 166 return xerrors.Errorf("unmarsahling publishStorageDeals result: %w", err) 167 } 168 169 minerInfos[i].dealIDs = append(minerInfos[i].dealIDs, ids.IDs...) 170 return nil 171 } 172 173 params := &market.PublishStorageDealsParams{} 174 for _, preseal := range m.Sectors { 175 preseal.Deal.VerifiedDeal = true 176 preseal.Deal.EndEpoch = minerInfos[i].presealExp 177 params.Deals = append(params.Deals, market.ClientDealProposal{ 178 Proposal: preseal.Deal, 179 ClientSignature: crypto.Signature{Type: crypto.SigTypeBLS}, // TODO: do we want to sign these? Or do we want to fake signatures for genesis setup? 180 }) 181 182 if len(params.Deals) == cbg.MaxLength { 183 if err := publish(params); err != nil { 184 return cid.Undef, err 185 } 186 187 params = &market.PublishStorageDealsParams{} 188 } 189 } 190 191 if len(params.Deals) > 0 { 192 if err := publish(params); err != nil { 193 return cid.Undef, err 194 } 195 } 196 } 197 } 198 199 // adjust total network power for equal pledge per sector 200 rawPow, qaPow := big.NewInt(0), big.NewInt(0) 201 { 202 for i, m := range miners { 203 for pi := range m.Sectors { 204 rawPow = types.BigAdd(rawPow, types.NewInt(uint64(m.SectorSize))) 205 206 dweight, err := dealWeight(ctx, vm, minerInfos[i].maddr, []abi.DealID{minerInfos[i].dealIDs[pi]}, 0, minerInfos[i].presealExp) 207 if err != nil { 208 return cid.Undef, xerrors.Errorf("getting deal weight: %w", err) 209 } 210 211 sectorWeight := miner0.QAPowerForWeight(m.SectorSize, minerInfos[i].presealExp, dweight.DealWeight, dweight.VerifiedDealWeight) 212 213 qaPow = types.BigAdd(qaPow, sectorWeight) 214 } 215 } 216 217 err = vm.MutateState(ctx, power.Address, func(cst cbor.IpldStore, st *power0.State) error { 218 st.TotalQualityAdjPower = qaPow 219 st.TotalRawBytePower = rawPow 220 221 st.ThisEpochQualityAdjPower = qaPow 222 st.ThisEpochRawBytePower = rawPow 223 return nil 224 }) 225 if err != nil { 226 return cid.Undef, xerrors.Errorf("mutating state: %w", err) 227 } 228 229 err = vm.MutateState(ctx, reward.Address, func(sct cbor.IpldStore, st *reward0.State) error { 230 *st = *reward0.ConstructState(qaPow) 231 return nil 232 }) 233 if err != nil { 234 return cid.Undef, xerrors.Errorf("mutating state: %w", err) 235 } 236 } 237 238 for i, m := range miners { 239 // Commit sectors 240 { 241 for pi, preseal := range m.Sectors { 242 params := &miner.SectorPreCommitInfo{ 243 SealProof: preseal.ProofType, 244 SectorNumber: preseal.SectorID, 245 SealedCID: preseal.CommR, 246 SealRandEpoch: -1, 247 DealIDs: []abi.DealID{minerInfos[i].dealIDs[pi]}, 248 Expiration: minerInfos[i].presealExp, // TODO: Allow setting externally! 249 } 250 251 dweight, err := dealWeight(ctx, vm, minerInfos[i].maddr, params.DealIDs, 0, minerInfos[i].presealExp) 252 if err != nil { 253 return cid.Undef, xerrors.Errorf("getting deal weight: %w", err) 254 } 255 256 sectorWeight := miner0.QAPowerForWeight(m.SectorSize, minerInfos[i].presealExp, dweight.DealWeight, dweight.VerifiedDealWeight) 257 258 // we've added fake power for this sector above, remove it now 259 err = vm.MutateState(ctx, power.Address, func(cst cbor.IpldStore, st *power0.State) error { 260 st.TotalQualityAdjPower = types.BigSub(st.TotalQualityAdjPower, sectorWeight) //nolint:scopelint 261 st.TotalRawBytePower = types.BigSub(st.TotalRawBytePower, types.NewInt(uint64(m.SectorSize))) 262 return nil 263 }) 264 if err != nil { 265 return cid.Undef, xerrors.Errorf("removing fake power: %w", err) 266 } 267 268 epochReward, err := currentEpochBlockReward(ctx, vm, minerInfos[i].maddr) 269 if err != nil { 270 return cid.Undef, xerrors.Errorf("getting current epoch reward: %w", err) 271 } 272 273 tpow, err := currentTotalPower(ctx, vm, minerInfos[i].maddr) 274 if err != nil { 275 return cid.Undef, xerrors.Errorf("getting current total power: %w", err) 276 } 277 278 pcd := miner0.PreCommitDepositForPower(epochReward.ThisEpochRewardSmoothed, tpow.QualityAdjPowerSmoothed, sectorWeight) 279 280 pledge := miner0.InitialPledgeForPower( 281 sectorWeight, 282 epochReward.ThisEpochBaselinePower, 283 tpow.PledgeCollateral, 284 epochReward.ThisEpochRewardSmoothed, 285 tpow.QualityAdjPowerSmoothed, 286 circSupply(ctx, vm, minerInfos[i].maddr), 287 ) 288 289 pledge = big.Add(pcd, pledge) 290 291 fmt.Println(types.FIL(pledge)) 292 _, err = doExecValue(ctx, vm, minerInfos[i].maddr, m.Worker, pledge, builtin0.MethodsMiner.PreCommitSector, mustEnc(params)) 293 if err != nil { 294 return cid.Undef, xerrors.Errorf("failed to confirm presealed sectors: %w", err) 295 } 296 297 // Commit one-by-one, otherwise pledge math tends to explode 298 confirmParams := &builtin0.ConfirmSectorProofsParams{ 299 Sectors: []abi.SectorNumber{preseal.SectorID}, 300 } 301 302 _, err = doExecValue(ctx, vm, minerInfos[i].maddr, power.Address, big.Zero(), builtin0.MethodsMiner.ConfirmSectorProofsValid, mustEnc(confirmParams)) 303 if err != nil { 304 return cid.Undef, xerrors.Errorf("failed to confirm presealed sectors: %w", err) 305 } 306 } 307 } 308 } 309 310 // Sanity-check total network power 311 err = vm.MutateState(ctx, power.Address, func(cst cbor.IpldStore, st *power0.State) error { 312 if !st.TotalRawBytePower.Equals(rawPow) { 313 return xerrors.Errorf("st.TotalRawBytePower doesn't match previously calculated rawPow") 314 } 315 316 if !st.TotalQualityAdjPower.Equals(qaPow) { 317 return xerrors.Errorf("st.TotalQualityAdjPower doesn't match previously calculated qaPow") 318 } 319 320 return nil 321 }) 322 if err != nil { 323 return cid.Undef, xerrors.Errorf("mutating state: %w", err) 324 } 325 326 // TODO: Should we re-ConstructState for the reward actor using rawPow as currRealizedPower here? 327 328 c, err := vm.Flush(ctx) 329 if err != nil { 330 return cid.Undef, xerrors.Errorf("flushing vm: %w", err) 331 } 332 return c, nil 333 } 334 335 // TODO: copied from actors test harness, deduplicate or remove from here 336 type fakeRand struct{} 337 338 func (fr *fakeRand) GetChainRandomness(ctx context.Context, personalization crypto.DomainSeparationTag, randEpoch abi.ChainEpoch, entropy []byte) ([]byte, error) { 339 out := make([]byte, 32) 340 _, _ = rand.New(rand.NewSource(int64(randEpoch * 1000))).Read(out) //nolint 341 return out, nil 342 } 343 344 func (fr *fakeRand) GetBeaconRandomness(ctx context.Context, personalization crypto.DomainSeparationTag, randEpoch abi.ChainEpoch, entropy []byte) ([]byte, error) { 345 out := make([]byte, 32) 346 _, _ = rand.New(rand.NewSource(int64(randEpoch))).Read(out) //nolint 347 return out, nil 348 } 349 350 func currentTotalPower(ctx context.Context, vm *vm.VM, maddr address.Address) (*power0.CurrentTotalPowerReturn, error) { 351 pwret, err := doExecValue(ctx, vm, power.Address, maddr, big.Zero(), builtin0.MethodsPower.CurrentTotalPower, nil) 352 if err != nil { 353 return nil, err 354 } 355 var pwr power0.CurrentTotalPowerReturn 356 if err := pwr.UnmarshalCBOR(bytes.NewReader(pwret)); err != nil { 357 return nil, err 358 } 359 360 return &pwr, nil 361 } 362 363 func dealWeight(ctx context.Context, vm *vm.VM, maddr address.Address, dealIDs []abi.DealID, sectorStart, sectorExpiry abi.ChainEpoch) (market0.VerifyDealsForActivationReturn, error) { 364 params := &market.VerifyDealsForActivationParams{ 365 DealIDs: dealIDs, 366 SectorStart: sectorStart, 367 SectorExpiry: sectorExpiry, 368 } 369 370 var dealWeights market0.VerifyDealsForActivationReturn 371 ret, err := doExecValue(ctx, vm, 372 market.Address, 373 maddr, 374 abi.NewTokenAmount(0), 375 builtin0.MethodsMarket.VerifyDealsForActivation, 376 mustEnc(params), 377 ) 378 if err != nil { 379 return market0.VerifyDealsForActivationReturn{}, err 380 } 381 if err := dealWeights.UnmarshalCBOR(bytes.NewReader(ret)); err != nil { 382 return market0.VerifyDealsForActivationReturn{}, err 383 } 384 385 return dealWeights, nil 386 } 387 388 func currentEpochBlockReward(ctx context.Context, vm *vm.VM, maddr address.Address) (*reward0.ThisEpochRewardReturn, error) { 389 rwret, err := doExecValue(ctx, vm, reward.Address, maddr, big.Zero(), builtin0.MethodsReward.ThisEpochReward, nil) 390 if err != nil { 391 return nil, err 392 } 393 394 var epochReward reward0.ThisEpochRewardReturn 395 if err := epochReward.UnmarshalCBOR(bytes.NewReader(rwret)); err != nil { 396 return nil, err 397 } 398 399 return &epochReward, nil 400 } 401 402 func circSupply(ctx context.Context, vmi *vm.VM, maddr address.Address) abi.TokenAmount { 403 unsafeVM := &vm.UnsafeVM{VM: vmi} 404 rt := unsafeVM.MakeRuntime(ctx, &types.Message{ 405 GasLimit: 1_000_000_000, 406 From: maddr, 407 }) 408 409 return rt.TotalFilCircSupply() 410 }