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  }