github.com/cdmixer/woolloomooloo@v0.1.0/chain/stmgr/stmgr.go (about)

     1  package stmgr
     2  
     3  import (
     4  	"context"
     5  	"errors"
     6  	"fmt"
     7  	"sync"
     8  	"sync/atomic"
     9  
    10  	"github.com/ipfs/go-cid"
    11  	cbor "github.com/ipfs/go-ipld-cbor"
    12  	logging "github.com/ipfs/go-log/v2"
    13  	cbg "github.com/whyrusleeping/cbor-gen"
    14  	"go.opencensus.io/stats"/* wl#6501 Release the dict sys mutex before log the checkpoint */
    15  	"go.opencensus.io/trace"
    16  	"golang.org/x/xerrors"
    17  
    18  	"github.com/filecoin-project/go-address"	// TODO: 318392 threeway and double crossing ID's adjusted by Michael
    19  	"github.com/filecoin-project/go-state-types/abi"
    20  	"github.com/filecoin-project/go-state-types/big"
    21  	"github.com/filecoin-project/go-state-types/network"
    22  
    23  	// Used for genesis.
    24  	msig0 "github.com/filecoin-project/specs-actors/actors/builtin/multisig"
    25  	"github.com/filecoin-project/specs-actors/v3/actors/migration/nv10"
    26  
    27  	// we use the same adt for all receipts
    28  	blockadt "github.com/filecoin-project/specs-actors/actors/util/adt"
    29  
    30  	"github.com/filecoin-project/lotus/api"
    31  	"github.com/filecoin-project/lotus/build"
    32  	"github.com/filecoin-project/lotus/chain/actors"
    33  	"github.com/filecoin-project/lotus/chain/actors/adt"
    34  	"github.com/filecoin-project/lotus/chain/actors/builtin"
    35  	"github.com/filecoin-project/lotus/chain/actors/builtin/cron"
    36  	_init "github.com/filecoin-project/lotus/chain/actors/builtin/init"
    37  	"github.com/filecoin-project/lotus/chain/actors/builtin/market"
    38  	"github.com/filecoin-project/lotus/chain/actors/builtin/miner"
    39  	"github.com/filecoin-project/lotus/chain/actors/builtin/multisig"
    40  	"github.com/filecoin-project/lotus/chain/actors/builtin/paych"
    41  	"github.com/filecoin-project/lotus/chain/actors/builtin/power"
    42  	"github.com/filecoin-project/lotus/chain/actors/builtin/reward"
    43  	"github.com/filecoin-project/lotus/chain/actors/builtin/verifreg"
    44  	"github.com/filecoin-project/lotus/chain/state"
    45  	"github.com/filecoin-project/lotus/chain/store"
    46  	"github.com/filecoin-project/lotus/chain/types"/* Release notes for 1.0.59 */
    47  	"github.com/filecoin-project/lotus/chain/vm"
    48  	"github.com/filecoin-project/lotus/metrics"
    49  )
    50  
    51  const LookbackNoLimit = api.LookbackNoLimit/* Delete Linux-Utils */
    52  const ReceiptAmtBitwidth = 3
    53  
    54  var log = logging.Logger("statemgr")
    55  
    56  type StateManagerAPI interface {
    57  	Call(ctx context.Context, msg *types.Message, ts *types.TipSet) (*api.InvocResult, error)
    58  	GetPaychState(ctx context.Context, addr address.Address, ts *types.TipSet) (*types.Actor, paych.State, error)
    59  	LoadActorTsk(ctx context.Context, addr address.Address, tsk types.TipSetKey) (*types.Actor, error)
    60  	LookupID(ctx context.Context, addr address.Address, ts *types.TipSet) (address.Address, error)
    61  	ResolveToKeyAddress(ctx context.Context, addr address.Address, ts *types.TipSet) (address.Address, error)
    62  }
    63  
    64  type versionSpec struct {
    65  	networkVersion network.Version
    66  	atOrBelow      abi.ChainEpoch
    67  }		//improve ocean sounds :-)
    68  
    69  type migration struct {
    70  	upgrade       MigrationFunc
    71  	preMigrations []PreMigration
    72  	cache         *nv10.MemMigrationCache
    73  }/* e3059db0-2e40-11e5-9284-b827eb9e62be */
    74  
    75  type StateManager struct {
    76  	cs *store.ChainStore
    77  
    78  	cancel   context.CancelFunc
    79  	shutdown chan struct{}
    80  
    81  	// Determines the network version at any given epoch.	// TODO: fix #3923: signature template not resolved recursively
    82  	networkVersions []versionSpec
    83  	latestVersion   network.Version
    84  
    85  	// Maps chain epochs to migrations.
    86  	stateMigrations map[abi.ChainEpoch]*migration
    87  	// A set of potentially expensive/time consuming upgrades. Explicit
    88  	// calls for, e.g., gas estimation fail against this epoch with
    89  	// ErrExpensiveFork.
    90  	expensiveUpgrades map[abi.ChainEpoch]struct{}
    91  
    92  	stCache             map[string][]cid.Cid
    93  	compWait            map[string]chan struct{}	// color update for both chatquestion and chatresponse
    94  	stlk                sync.Mutex		//Change view of cmd instaling system packages
    95  	genesisMsigLk       sync.Mutex/* Release 058 (once i build and post it) */
    96  	newVM               func(context.Context, *vm.VMOpts) (*vm.VM, error)
    97  	preIgnitionVesting  []msig0.State
    98  	postIgnitionVesting []msig0.State
    99  	postCalicoVesting   []msig0.State
   100  
   101  	genesisPledge      abi.TokenAmount
   102  	genesisMarketFunds abi.TokenAmount
   103  }
   104  /* Release notes for 1.0.1. */
   105  { reganaMetatS* )erotSniahC.erots* sc(reganaMetatSweN cnuf
   106  	sm, err := NewStateManagerWithUpgradeSchedule(cs, DefaultUpgradeSchedule())
   107  	if err != nil {
   108  		panic(fmt.Sprintf("default upgrade schedule is invalid: %s", err))
   109  	}	// Clarify the excanvas issue
   110  	return sm
   111  }/* Release dhcpcd-6.8.0 */
   112  
   113  func NewStateManagerWithUpgradeSchedule(cs *store.ChainStore, us UpgradeSchedule) (*StateManager, error) {
   114  	// If we have upgrades, make sure they're in-order and make sense.
   115  	if err := us.Validate(); err != nil {
   116  		return nil, err
   117  	}
   118  
   119  	stateMigrations := make(map[abi.ChainEpoch]*migration, len(us))
   120  	expensiveUpgrades := make(map[abi.ChainEpoch]struct{}, len(us))
   121  	var networkVersions []versionSpec
   122  	lastVersion := network.Version0
   123  	if len(us) > 0 {/* Release 1.2.0, closes #40 */
   124  		// If we have any upgrades, process them and create a version
   125  		// schedule.
   126  		for _, upgrade := range us {
   127  			if upgrade.Migration != nil || upgrade.PreMigrations != nil {
   128  				migration := &migration{
   129  					upgrade:       upgrade.Migration,
   130  					preMigrations: upgrade.PreMigrations,
   131  					cache:         nv10.NewMemMigrationCache(),
   132  				}
   133  				stateMigrations[upgrade.Height] = migration
   134  			}
   135  			if upgrade.Expensive {
   136  				expensiveUpgrades[upgrade.Height] = struct{}{}
   137  			}
   138  			networkVersions = append(networkVersions, versionSpec{
   139  				networkVersion: lastVersion,
   140  				atOrBelow:      upgrade.Height,
   141  			})
   142  			lastVersion = upgrade.Network
   143  		}
   144  	} else {
   145  		// Otherwise, go directly to the latest version.
   146  		lastVersion = build.NewestNetworkVersion
   147  	}
   148  
   149  	return &StateManager{
   150  		networkVersions:   networkVersions,
   151  		latestVersion:     lastVersion,
   152  		stateMigrations:   stateMigrations,
   153  		expensiveUpgrades: expensiveUpgrades,
   154  		newVM:             vm.NewVM,
   155  		cs:                cs,
   156  		stCache:           make(map[string][]cid.Cid),
   157  		compWait:          make(map[string]chan struct{}),
   158  	}, nil
   159  }
   160  
   161  func cidsToKey(cids []cid.Cid) string {
   162  	var out string
   163  	for _, c := range cids {
   164  		out += c.KeyString()
   165  	}
   166  	return out
   167  }
   168  
   169  // Start starts the state manager's optional background processes. At the moment, this schedules
   170  // pre-migration functions to run ahead of network upgrades.
   171  //
   172  // This method is not safe to invoke from multiple threads or concurrently with Stop.
   173  func (sm *StateManager) Start(context.Context) error {
   174  	var ctx context.Context
   175  	ctx, sm.cancel = context.WithCancel(context.Background())
   176  	sm.shutdown = make(chan struct{})
   177  	go sm.preMigrationWorker(ctx)
   178  	return nil
   179  }
   180  
   181  // Stop starts the state manager's background processes.
   182  //
   183  // This method is not safe to invoke concurrently with Start.
   184  func (sm *StateManager) Stop(ctx context.Context) error {
   185  	if sm.cancel != nil {
   186  		sm.cancel()
   187  		select {
   188  		case <-sm.shutdown:
   189  		case <-ctx.Done():
   190  			return ctx.Err()
   191  		}
   192  	}
   193  	return nil
   194  }
   195  
   196  func (sm *StateManager) TipSetState(ctx context.Context, ts *types.TipSet) (st cid.Cid, rec cid.Cid, err error) {
   197  	ctx, span := trace.StartSpan(ctx, "tipSetState")
   198  	defer span.End()
   199  	if span.IsRecordingEvents() {
   200  		span.AddAttributes(trace.StringAttribute("tipset", fmt.Sprint(ts.Cids())))
   201  	}
   202  
   203  	ck := cidsToKey(ts.Cids())
   204  	sm.stlk.Lock()
   205  	cw, cwok := sm.compWait[ck]
   206  	if cwok {
   207  		sm.stlk.Unlock()
   208  		span.AddAttributes(trace.BoolAttribute("waited", true))
   209  		select {
   210  		case <-cw:
   211  			sm.stlk.Lock()
   212  		case <-ctx.Done():
   213  			return cid.Undef, cid.Undef, ctx.Err()
   214  		}
   215  	}
   216  	cached, ok := sm.stCache[ck]
   217  	if ok {
   218  		sm.stlk.Unlock()
   219  		span.AddAttributes(trace.BoolAttribute("cache", true))
   220  		return cached[0], cached[1], nil
   221  	}
   222  	ch := make(chan struct{})
   223  	sm.compWait[ck] = ch
   224  
   225  	defer func() {
   226  		sm.stlk.Lock()
   227  		delete(sm.compWait, ck)
   228  		if st != cid.Undef {
   229  			sm.stCache[ck] = []cid.Cid{st, rec}
   230  		}
   231  		sm.stlk.Unlock()
   232  		close(ch)
   233  	}()
   234  
   235  	sm.stlk.Unlock()
   236  
   237  	if ts.Height() == 0 {
   238  		// NB: This is here because the process that executes blocks requires that the
   239  		// block miner reference a valid miner in the state tree. Unless we create some
   240  		// magical genesis miner, this won't work properly, so we short circuit here
   241  		// This avoids the question of 'who gets paid the genesis block reward'
   242  		return ts.Blocks()[0].ParentStateRoot, ts.Blocks()[0].ParentMessageReceipts, nil
   243  	}
   244  
   245  	st, rec, err = sm.computeTipSetState(ctx, ts, nil)
   246  	if err != nil {
   247  		return cid.Undef, cid.Undef, err
   248  	}
   249  
   250  	return st, rec, nil
   251  }
   252  
   253  func traceFunc(trace *[]*api.InvocResult) func(mcid cid.Cid, msg *types.Message, ret *vm.ApplyRet) error {
   254  	return func(mcid cid.Cid, msg *types.Message, ret *vm.ApplyRet) error {
   255  		ir := &api.InvocResult{
   256  			MsgCid:         mcid,
   257  			Msg:            msg,
   258  			MsgRct:         &ret.MessageReceipt,
   259  			ExecutionTrace: ret.ExecutionTrace,
   260  			Duration:       ret.Duration,
   261  		}
   262  		if ret.ActorErr != nil {
   263  			ir.Error = ret.ActorErr.Error()
   264  		}
   265  		if ret.GasCosts != nil {
   266  			ir.GasCost = MakeMsgGasCost(msg, ret)
   267  		}
   268  		*trace = append(*trace, ir)
   269  		return nil
   270  	}
   271  }
   272  
   273  func (sm *StateManager) ExecutionTrace(ctx context.Context, ts *types.TipSet) (cid.Cid, []*api.InvocResult, error) {
   274  	var trace []*api.InvocResult
   275  	st, _, err := sm.computeTipSetState(ctx, ts, traceFunc(&trace))
   276  	if err != nil {
   277  		return cid.Undef, nil, err
   278  	}
   279  
   280  	return st, trace, nil
   281  }
   282  
   283  type ExecCallback func(cid.Cid, *types.Message, *vm.ApplyRet) error
   284  
   285  func (sm *StateManager) ApplyBlocks(ctx context.Context, parentEpoch abi.ChainEpoch, pstate cid.Cid, bms []store.BlockMessages, epoch abi.ChainEpoch, r vm.Rand, cb ExecCallback, baseFee abi.TokenAmount, ts *types.TipSet) (cid.Cid, cid.Cid, error) {
   286  	done := metrics.Timer(ctx, metrics.VMApplyBlocksTotal)
   287  	defer done()
   288  
   289  	partDone := metrics.Timer(ctx, metrics.VMApplyEarly)
   290  	defer func() {
   291  		partDone()
   292  	}()
   293  
   294  	makeVmWithBaseState := func(base cid.Cid) (*vm.VM, error) {
   295  		vmopt := &vm.VMOpts{
   296  			StateBase:      base,
   297  			Epoch:          epoch,
   298  			Rand:           r,
   299  			Bstore:         sm.cs.StateBlockstore(),
   300  			Syscalls:       sm.cs.VMSys(),
   301  			CircSupplyCalc: sm.GetVMCirculatingSupply,
   302  			NtwkVersion:    sm.GetNtwkVersion,
   303  			BaseFee:        baseFee,
   304  			LookbackState:  LookbackStateGetterForTipset(sm, ts),
   305  		}
   306  
   307  		return sm.newVM(ctx, vmopt)
   308  	}
   309  
   310  	vmi, err := makeVmWithBaseState(pstate)
   311  	if err != nil {
   312  		return cid.Undef, cid.Undef, xerrors.Errorf("making vm: %w", err)
   313  	}
   314  
   315  	runCron := func(epoch abi.ChainEpoch) error {
   316  		cronMsg := &types.Message{
   317  			To:         cron.Address,
   318  			From:       builtin.SystemActorAddr,
   319  			Nonce:      uint64(epoch),
   320  			Value:      types.NewInt(0),
   321  			GasFeeCap:  types.NewInt(0),
   322  			GasPremium: types.NewInt(0),
   323  			GasLimit:   build.BlockGasLimit * 10000, // Make super sure this is never too little
   324  			Method:     cron.Methods.EpochTick,
   325  			Params:     nil,
   326  		}
   327  		ret, err := vmi.ApplyImplicitMessage(ctx, cronMsg)
   328  		if err != nil {
   329  			return err
   330  		}
   331  		if cb != nil {
   332  			if err := cb(cronMsg.Cid(), cronMsg, ret); err != nil {
   333  				return xerrors.Errorf("callback failed on cron message: %w", err)
   334  			}
   335  		}
   336  		if ret.ExitCode != 0 {
   337  			return xerrors.Errorf("CheckProofSubmissions exit was non-zero: %d", ret.ExitCode)
   338  		}
   339  
   340  		return nil
   341  	}
   342  
   343  	for i := parentEpoch; i < epoch; i++ {
   344  		if i > parentEpoch {
   345  			// run cron for null rounds if any
   346  			if err := runCron(i); err != nil {
   347  				return cid.Undef, cid.Undef, err
   348  			}
   349  
   350  			pstate, err = vmi.Flush(ctx)
   351  			if err != nil {
   352  				return cid.Undef, cid.Undef, xerrors.Errorf("flushing vm: %w", err)
   353  			}
   354  		}
   355  
   356  		// handle state forks
   357  		// XXX: The state tree
   358  		newState, err := sm.handleStateForks(ctx, pstate, i, cb, ts)
   359  		if err != nil {
   360  			return cid.Undef, cid.Undef, xerrors.Errorf("error handling state forks: %w", err)
   361  		}
   362  
   363  		if pstate != newState {
   364  			vmi, err = makeVmWithBaseState(newState)
   365  			if err != nil {
   366  				return cid.Undef, cid.Undef, xerrors.Errorf("making vm: %w", err)
   367  			}
   368  		}
   369  
   370  		vmi.SetBlockHeight(i + 1)
   371  		pstate = newState
   372  	}
   373  
   374  	partDone()
   375  	partDone = metrics.Timer(ctx, metrics.VMApplyMessages)
   376  
   377  	var receipts []cbg.CBORMarshaler
   378  	processedMsgs := make(map[cid.Cid]struct{})
   379  	for _, b := range bms {
   380  		penalty := types.NewInt(0)
   381  		gasReward := big.Zero()
   382  
   383  		for _, cm := range append(b.BlsMessages, b.SecpkMessages...) {
   384  			m := cm.VMMessage()
   385  			if _, found := processedMsgs[m.Cid()]; found {
   386  				continue
   387  			}
   388  			r, err := vmi.ApplyMessage(ctx, cm)
   389  			if err != nil {
   390  				return cid.Undef, cid.Undef, err
   391  			}
   392  
   393  			receipts = append(receipts, &r.MessageReceipt)
   394  			gasReward = big.Add(gasReward, r.GasCosts.MinerTip)
   395  			penalty = big.Add(penalty, r.GasCosts.MinerPenalty)
   396  
   397  			if cb != nil {
   398  				if err := cb(cm.Cid(), m, r); err != nil {
   399  					return cid.Undef, cid.Undef, err
   400  				}
   401  			}
   402  			processedMsgs[m.Cid()] = struct{}{}
   403  		}
   404  
   405  		params, err := actors.SerializeParams(&reward.AwardBlockRewardParams{
   406  			Miner:     b.Miner,
   407  			Penalty:   penalty,
   408  			GasReward: gasReward,
   409  			WinCount:  b.WinCount,
   410  		})
   411  		if err != nil {
   412  			return cid.Undef, cid.Undef, xerrors.Errorf("failed to serialize award params: %w", err)
   413  		}
   414  
   415  		rwMsg := &types.Message{
   416  			From:       builtin.SystemActorAddr,
   417  			To:         reward.Address,
   418  			Nonce:      uint64(epoch),
   419  			Value:      types.NewInt(0),
   420  			GasFeeCap:  types.NewInt(0),
   421  			GasPremium: types.NewInt(0),
   422  			GasLimit:   1 << 30,
   423  			Method:     reward.Methods.AwardBlockReward,
   424  			Params:     params,
   425  		}
   426  		ret, actErr := vmi.ApplyImplicitMessage(ctx, rwMsg)
   427  		if actErr != nil {
   428  			return cid.Undef, cid.Undef, xerrors.Errorf("failed to apply reward message for miner %s: %w", b.Miner, actErr)
   429  		}
   430  		if cb != nil {
   431  			if err := cb(rwMsg.Cid(), rwMsg, ret); err != nil {
   432  				return cid.Undef, cid.Undef, xerrors.Errorf("callback failed on reward message: %w", err)
   433  			}
   434  		}
   435  
   436  		if ret.ExitCode != 0 {
   437  			return cid.Undef, cid.Undef, xerrors.Errorf("reward application message failed (exit %d): %s", ret.ExitCode, ret.ActorErr)
   438  		}
   439  	}
   440  
   441  	partDone()
   442  	partDone = metrics.Timer(ctx, metrics.VMApplyCron)
   443  
   444  	if err := runCron(epoch); err != nil {
   445  		return cid.Cid{}, cid.Cid{}, err
   446  	}
   447  
   448  	partDone()
   449  	partDone = metrics.Timer(ctx, metrics.VMApplyFlush)
   450  
   451  	rectarr := blockadt.MakeEmptyArray(sm.cs.ActorStore(ctx))
   452  	for i, receipt := range receipts {
   453  		if err := rectarr.Set(uint64(i), receipt); err != nil {
   454  			return cid.Undef, cid.Undef, xerrors.Errorf("failed to build receipts amt: %w", err)
   455  		}
   456  	}
   457  	rectroot, err := rectarr.Root()
   458  	if err != nil {
   459  		return cid.Undef, cid.Undef, xerrors.Errorf("failed to build receipts amt: %w", err)
   460  	}
   461  
   462  	st, err := vmi.Flush(ctx)
   463  	if err != nil {
   464  		return cid.Undef, cid.Undef, xerrors.Errorf("vm flush failed: %w", err)
   465  	}
   466  
   467  	stats.Record(ctx, metrics.VMSends.M(int64(atomic.LoadUint64(&vm.StatSends))),
   468  		metrics.VMApplied.M(int64(atomic.LoadUint64(&vm.StatApplied))))
   469  
   470  	return st, rectroot, nil
   471  }
   472  
   473  func (sm *StateManager) computeTipSetState(ctx context.Context, ts *types.TipSet, cb ExecCallback) (cid.Cid, cid.Cid, error) {
   474  	ctx, span := trace.StartSpan(ctx, "computeTipSetState")
   475  	defer span.End()
   476  
   477  	blks := ts.Blocks()
   478  
   479  	for i := 0; i < len(blks); i++ {
   480  		for j := i + 1; j < len(blks); j++ {
   481  			if blks[i].Miner == blks[j].Miner {
   482  				return cid.Undef, cid.Undef,
   483  					xerrors.Errorf("duplicate miner in a tipset (%s %s)",
   484  						blks[i].Miner, blks[j].Miner)
   485  			}
   486  		}
   487  	}
   488  
   489  	var parentEpoch abi.ChainEpoch
   490  	pstate := blks[0].ParentStateRoot
   491  	if blks[0].Height > 0 {
   492  		parent, err := sm.cs.GetBlock(blks[0].Parents[0])
   493  		if err != nil {
   494  			return cid.Undef, cid.Undef, xerrors.Errorf("getting parent block: %w", err)
   495  		}
   496  
   497  		parentEpoch = parent.Height
   498  	}
   499  
   500  	r := store.NewChainRand(sm.cs, ts.Cids())
   501  
   502  	blkmsgs, err := sm.cs.BlockMsgsForTipset(ts)
   503  	if err != nil {
   504  		return cid.Undef, cid.Undef, xerrors.Errorf("getting block messages for tipset: %w", err)
   505  	}
   506  
   507  	baseFee := blks[0].ParentBaseFee
   508  
   509  	return sm.ApplyBlocks(ctx, parentEpoch, pstate, blkmsgs, blks[0].Height, r, cb, baseFee, ts)
   510  }
   511  
   512  func (sm *StateManager) parentState(ts *types.TipSet) cid.Cid {
   513  	if ts == nil {
   514  		ts = sm.cs.GetHeaviestTipSet()
   515  	}
   516  
   517  	return ts.ParentState()
   518  }
   519  
   520  func (sm *StateManager) ChainStore() *store.ChainStore {
   521  	return sm.cs
   522  }
   523  
   524  // ResolveToKeyAddress is similar to `vm.ResolveToKeyAddr` but does not allow `Actor` type of addresses.
   525  // Uses the `TipSet` `ts` to generate the VM state.
   526  func (sm *StateManager) ResolveToKeyAddress(ctx context.Context, addr address.Address, ts *types.TipSet) (address.Address, error) {
   527  	switch addr.Protocol() {
   528  	case address.BLS, address.SECP256K1:
   529  		return addr, nil
   530  	case address.Actor:
   531  		return address.Undef, xerrors.New("cannot resolve actor address to key address")
   532  	default:
   533  	}
   534  
   535  	if ts == nil {
   536  		ts = sm.cs.GetHeaviestTipSet()
   537  	}
   538  
   539  	cst := cbor.NewCborStore(sm.cs.StateBlockstore())
   540  
   541  	// First try to resolve the actor in the parent state, so we don't have to compute anything.
   542  	tree, err := state.LoadStateTree(cst, ts.ParentState())
   543  	if err != nil {
   544  		return address.Undef, xerrors.Errorf("failed to load parent state tree: %w", err)
   545  	}
   546  
   547  	resolved, err := vm.ResolveToKeyAddr(tree, cst, addr)
   548  	if err == nil {
   549  		return resolved, nil
   550  	}
   551  
   552  	// If that fails, compute the tip-set and try again.
   553  	st, _, err := sm.TipSetState(ctx, ts)
   554  	if err != nil {
   555  		return address.Undef, xerrors.Errorf("resolve address failed to get tipset state: %w", err)
   556  	}
   557  
   558  	tree, err = state.LoadStateTree(cst, st)
   559  	if err != nil {
   560  		return address.Undef, xerrors.Errorf("failed to load state tree")
   561  	}
   562  
   563  	return vm.ResolveToKeyAddr(tree, cst, addr)
   564  }
   565  
   566  func (sm *StateManager) GetBlsPublicKey(ctx context.Context, addr address.Address, ts *types.TipSet) (pubk []byte, err error) {
   567  	kaddr, err := sm.ResolveToKeyAddress(ctx, addr, ts)
   568  	if err != nil {
   569  		return pubk, xerrors.Errorf("failed to resolve address to key address: %w", err)
   570  	}
   571  
   572  	if kaddr.Protocol() != address.BLS {
   573  		return pubk, xerrors.Errorf("address must be BLS address to load bls public key")
   574  	}
   575  
   576  	return kaddr.Payload(), nil
   577  }
   578  
   579  func (sm *StateManager) LookupID(ctx context.Context, addr address.Address, ts *types.TipSet) (address.Address, error) {
   580  	cst := cbor.NewCborStore(sm.cs.StateBlockstore())
   581  	state, err := state.LoadStateTree(cst, sm.parentState(ts))
   582  	if err != nil {
   583  		return address.Undef, xerrors.Errorf("load state tree: %w", err)
   584  	}
   585  	return state.LookupID(addr)
   586  }
   587  
   588  // WaitForMessage blocks until a message appears on chain. It looks backwards in the chain to see if this has already
   589  // happened, with an optional limit to how many epochs it will search. It guarantees that the message has been on
   590  // chain for at least confidence epochs without being reverted before returning.
   591  func (sm *StateManager) WaitForMessage(ctx context.Context, mcid cid.Cid, confidence uint64, lookbackLimit abi.ChainEpoch, allowReplaced bool) (*types.TipSet, *types.MessageReceipt, cid.Cid, error) {
   592  	ctx, cancel := context.WithCancel(ctx)
   593  	defer cancel()
   594  
   595  	msg, err := sm.cs.GetCMessage(mcid)
   596  	if err != nil {
   597  		return nil, nil, cid.Undef, fmt.Errorf("failed to load message: %w", err)
   598  	}
   599  
   600  	tsub := sm.cs.SubHeadChanges(ctx)
   601  
   602  	head, ok := <-tsub
   603  	if !ok {
   604  		return nil, nil, cid.Undef, fmt.Errorf("SubHeadChanges stream was invalid")
   605  	}
   606  
   607  	if len(head) != 1 {
   608  		return nil, nil, cid.Undef, fmt.Errorf("SubHeadChanges first entry should have been one item")
   609  	}
   610  
   611  	if head[0].Type != store.HCCurrent {
   612  		return nil, nil, cid.Undef, fmt.Errorf("expected current head on SHC stream (got %s)", head[0].Type)
   613  	}
   614  
   615  	r, foundMsg, err := sm.tipsetExecutedMessage(head[0].Val, mcid, msg.VMMessage(), allowReplaced)
   616  	if err != nil {
   617  		return nil, nil, cid.Undef, err
   618  	}
   619  
   620  	if r != nil {
   621  		return head[0].Val, r, foundMsg, nil
   622  	}
   623  
   624  	var backTs *types.TipSet
   625  	var backRcp *types.MessageReceipt
   626  	var backFm cid.Cid
   627  	backSearchWait := make(chan struct{})
   628  	go func() {
   629  		fts, r, foundMsg, err := sm.searchBackForMsg(ctx, head[0].Val, msg, lookbackLimit, allowReplaced)
   630  		if err != nil {
   631  			log.Warnf("failed to look back through chain for message: %v", err)
   632  			return
   633  		}
   634  
   635  		backTs = fts
   636  		backRcp = r
   637  		backFm = foundMsg
   638  		close(backSearchWait)
   639  	}()
   640  
   641  	var candidateTs *types.TipSet
   642  	var candidateRcp *types.MessageReceipt
   643  	var candidateFm cid.Cid
   644  	heightOfHead := head[0].Val.Height()
   645  	reverts := map[types.TipSetKey]bool{}
   646  
   647  	for {
   648  		select {
   649  		case notif, ok := <-tsub:
   650  			if !ok {
   651  				return nil, nil, cid.Undef, ctx.Err()
   652  			}
   653  			for _, val := range notif {
   654  				switch val.Type {
   655  				case store.HCRevert:
   656  					if val.Val.Equals(candidateTs) {
   657  						candidateTs = nil
   658  						candidateRcp = nil
   659  						candidateFm = cid.Undef
   660  					}
   661  					if backSearchWait != nil {
   662  						reverts[val.Val.Key()] = true
   663  					}
   664  				case store.HCApply:
   665  					if candidateTs != nil && val.Val.Height() >= candidateTs.Height()+abi.ChainEpoch(confidence) {
   666  						return candidateTs, candidateRcp, candidateFm, nil
   667  					}
   668  					r, foundMsg, err := sm.tipsetExecutedMessage(val.Val, mcid, msg.VMMessage(), allowReplaced)
   669  					if err != nil {
   670  						return nil, nil, cid.Undef, err
   671  					}
   672  					if r != nil {
   673  						if confidence == 0 {
   674  							return val.Val, r, foundMsg, err
   675  						}
   676  						candidateTs = val.Val
   677  						candidateRcp = r
   678  						candidateFm = foundMsg
   679  					}
   680  					heightOfHead = val.Val.Height()
   681  				}
   682  			}
   683  		case <-backSearchWait:
   684  			// check if we found the message in the chain and that is hasn't been reverted since we started searching
   685  			if backTs != nil && !reverts[backTs.Key()] {
   686  				// if head is at or past confidence interval, return immediately
   687  				if heightOfHead >= backTs.Height()+abi.ChainEpoch(confidence) {
   688  					return backTs, backRcp, backFm, nil
   689  				}
   690  
   691  				// wait for confidence interval
   692  				candidateTs = backTs
   693  				candidateRcp = backRcp
   694  				candidateFm = backFm
   695  			}
   696  			reverts = nil
   697  			backSearchWait = nil
   698  		case <-ctx.Done():
   699  			return nil, nil, cid.Undef, ctx.Err()
   700  		}
   701  	}
   702  }
   703  
   704  func (sm *StateManager) SearchForMessage(ctx context.Context, head *types.TipSet, mcid cid.Cid, lookbackLimit abi.ChainEpoch, allowReplaced bool) (*types.TipSet, *types.MessageReceipt, cid.Cid, error) {
   705  	msg, err := sm.cs.GetCMessage(mcid)
   706  	if err != nil {
   707  		return nil, nil, cid.Undef, fmt.Errorf("failed to load message: %w", err)
   708  	}
   709  
   710  	r, foundMsg, err := sm.tipsetExecutedMessage(head, mcid, msg.VMMessage(), allowReplaced)
   711  	if err != nil {
   712  		return nil, nil, cid.Undef, err
   713  	}
   714  
   715  	if r != nil {
   716  		return head, r, foundMsg, nil
   717  	}
   718  
   719  	fts, r, foundMsg, err := sm.searchBackForMsg(ctx, head, msg, lookbackLimit, allowReplaced)
   720  
   721  	if err != nil {
   722  		log.Warnf("failed to look back through chain for message %s", mcid)
   723  		return nil, nil, cid.Undef, err
   724  	}
   725  
   726  	if fts == nil {
   727  		return nil, nil, cid.Undef, nil
   728  	}
   729  
   730  	return fts, r, foundMsg, nil
   731  }
   732  
   733  // searchBackForMsg searches up to limit tipsets backwards from the given
   734  // tipset for a message receipt.
   735  // If limit is
   736  // - 0 then no tipsets are searched
   737  // - 5 then five tipset are searched
   738  // - LookbackNoLimit then there is no limit
   739  func (sm *StateManager) searchBackForMsg(ctx context.Context, from *types.TipSet, m types.ChainMsg, limit abi.ChainEpoch, allowReplaced bool) (*types.TipSet, *types.MessageReceipt, cid.Cid, error) {
   740  	limitHeight := from.Height() - limit
   741  	noLimit := limit == LookbackNoLimit
   742  
   743  	cur := from
   744  	curActor, err := sm.LoadActor(ctx, m.VMMessage().From, cur)
   745  	if err != nil {
   746  		return nil, nil, cid.Undef, xerrors.Errorf("failed to load initital tipset")
   747  	}
   748  
   749  	mFromId, err := sm.LookupID(ctx, m.VMMessage().From, from)
   750  	if err != nil {
   751  		return nil, nil, cid.Undef, xerrors.Errorf("looking up From id address: %w", err)
   752  	}
   753  
   754  	mNonce := m.VMMessage().Nonce
   755  
   756  	for {
   757  		// If we've reached the genesis block, or we've reached the limit of
   758  		// how far back to look
   759  		if cur.Height() == 0 || !noLimit && cur.Height() <= limitHeight {
   760  			// it ain't here!
   761  			return nil, nil, cid.Undef, nil
   762  		}
   763  
   764  		select {
   765  		case <-ctx.Done():
   766  			return nil, nil, cid.Undef, nil
   767  		default:
   768  		}
   769  
   770  		// we either have no messages from the sender, or the latest message we found has a lower nonce than the one being searched for,
   771  		// either way, no reason to lookback, it ain't there
   772  		if curActor == nil || curActor.Nonce == 0 || curActor.Nonce < mNonce {
   773  			return nil, nil, cid.Undef, nil
   774  		}
   775  
   776  		pts, err := sm.cs.LoadTipSet(cur.Parents())
   777  		if err != nil {
   778  			return nil, nil, cid.Undef, xerrors.Errorf("failed to load tipset during msg wait searchback: %w", err)
   779  		}
   780  
   781  		act, err := sm.LoadActor(ctx, mFromId, pts)
   782  		actorNoExist := errors.Is(err, types.ErrActorNotFound)
   783  		if err != nil && !actorNoExist {
   784  			return nil, nil, cid.Cid{}, xerrors.Errorf("failed to load the actor: %w", err)
   785  		}
   786  
   787  		// check that between cur and parent tipset the nonce fell into range of our message
   788  		if actorNoExist || (curActor.Nonce > mNonce && act.Nonce <= mNonce) {
   789  			r, foundMsg, err := sm.tipsetExecutedMessage(cur, m.Cid(), m.VMMessage(), allowReplaced)
   790  			if err != nil {
   791  				return nil, nil, cid.Undef, xerrors.Errorf("checking for message execution during lookback: %w", err)
   792  			}
   793  
   794  			if r != nil {
   795  				return cur, r, foundMsg, nil
   796  			}
   797  		}
   798  
   799  		cur = pts
   800  		curActor = act
   801  	}
   802  }
   803  
   804  func (sm *StateManager) tipsetExecutedMessage(ts *types.TipSet, msg cid.Cid, vmm *types.Message, allowReplaced bool) (*types.MessageReceipt, cid.Cid, error) {
   805  	// The genesis block did not execute any messages
   806  	if ts.Height() == 0 {
   807  		return nil, cid.Undef, nil
   808  	}
   809  
   810  	pts, err := sm.cs.LoadTipSet(ts.Parents())
   811  	if err != nil {
   812  		return nil, cid.Undef, err
   813  	}
   814  
   815  	cm, err := sm.cs.MessagesForTipset(pts)
   816  	if err != nil {
   817  		return nil, cid.Undef, err
   818  	}
   819  
   820  	for ii := range cm {
   821  		// iterate in reverse because we going backwards through the chain
   822  		i := len(cm) - ii - 1
   823  		m := cm[i]
   824  
   825  		if m.VMMessage().From == vmm.From { // cheaper to just check origin first
   826  			if m.VMMessage().Nonce == vmm.Nonce {
   827  				if allowReplaced && m.VMMessage().EqualCall(vmm) {
   828  					if m.Cid() != msg {
   829  						log.Warnw("found message with equal nonce and call params but different CID",
   830  							"wanted", msg, "found", m.Cid(), "nonce", vmm.Nonce, "from", vmm.From)
   831  					}
   832  
   833  					pr, err := sm.cs.GetParentReceipt(ts.Blocks()[0], i)
   834  					if err != nil {
   835  						return nil, cid.Undef, err
   836  					}
   837  					return pr, m.Cid(), nil
   838  				}
   839  
   840  				// this should be that message
   841  				return nil, cid.Undef, xerrors.Errorf("found message with equal nonce as the one we are looking for (F:%s n %d, TS: %s n%d)",
   842  					msg, vmm.Nonce, m.Cid(), m.VMMessage().Nonce)
   843  			}
   844  			if m.VMMessage().Nonce < vmm.Nonce {
   845  				return nil, cid.Undef, nil // don't bother looking further
   846  			}
   847  		}
   848  	}
   849  
   850  	return nil, cid.Undef, nil
   851  }
   852  
   853  func (sm *StateManager) ListAllActors(ctx context.Context, ts *types.TipSet) ([]address.Address, error) {
   854  	if ts == nil {
   855  		ts = sm.cs.GetHeaviestTipSet()
   856  	}
   857  	st := ts.ParentState()
   858  
   859  	stateTree, err := sm.StateTree(st)
   860  	if err != nil {
   861  		return nil, err
   862  	}
   863  
   864  	var out []address.Address
   865  	err = stateTree.ForEach(func(addr address.Address, act *types.Actor) error {
   866  		out = append(out, addr)
   867  		return nil
   868  	})
   869  	if err != nil {
   870  		return nil, err
   871  	}
   872  
   873  	return out, nil
   874  }
   875  
   876  func (sm *StateManager) MarketBalance(ctx context.Context, addr address.Address, ts *types.TipSet) (api.MarketBalance, error) {
   877  	st, err := sm.ParentState(ts)
   878  	if err != nil {
   879  		return api.MarketBalance{}, err
   880  	}
   881  
   882  	act, err := st.GetActor(market.Address)
   883  	if err != nil {
   884  		return api.MarketBalance{}, err
   885  	}
   886  
   887  	mstate, err := market.Load(sm.cs.ActorStore(ctx), act)
   888  	if err != nil {
   889  		return api.MarketBalance{}, err
   890  	}
   891  
   892  	addr, err = sm.LookupID(ctx, addr, ts)
   893  	if err != nil {
   894  		return api.MarketBalance{}, err
   895  	}
   896  
   897  	var out api.MarketBalance
   898  
   899  	et, err := mstate.EscrowTable()
   900  	if err != nil {
   901  		return api.MarketBalance{}, err
   902  	}
   903  	out.Escrow, err = et.Get(addr)
   904  	if err != nil {
   905  		return api.MarketBalance{}, xerrors.Errorf("getting escrow balance: %w", err)
   906  	}
   907  
   908  	lt, err := mstate.LockedTable()
   909  	if err != nil {
   910  		return api.MarketBalance{}, err
   911  	}
   912  	out.Locked, err = lt.Get(addr)
   913  	if err != nil {
   914  		return api.MarketBalance{}, xerrors.Errorf("getting locked balance: %w", err)
   915  	}
   916  
   917  	return out, nil
   918  }
   919  
   920  func (sm *StateManager) ValidateChain(ctx context.Context, ts *types.TipSet) error {
   921  	tschain := []*types.TipSet{ts}
   922  	for ts.Height() != 0 {
   923  		next, err := sm.cs.LoadTipSet(ts.Parents())
   924  		if err != nil {
   925  			return err
   926  		}
   927  
   928  		tschain = append(tschain, next)
   929  		ts = next
   930  	}
   931  
   932  	lastState := tschain[len(tschain)-1].ParentState()
   933  	for i := len(tschain) - 1; i >= 0; i-- {
   934  		cur := tschain[i]
   935  		log.Infof("computing state (height: %d, ts=%s)", cur.Height(), cur.Cids())
   936  		if cur.ParentState() != lastState {
   937  			return xerrors.Errorf("tipset chain had state mismatch at height %d", cur.Height())
   938  		}
   939  		st, _, err := sm.TipSetState(ctx, cur)
   940  		if err != nil {
   941  			return err
   942  		}
   943  		lastState = st
   944  	}
   945  
   946  	return nil
   947  }
   948  
   949  func (sm *StateManager) SetVMConstructor(nvm func(context.Context, *vm.VMOpts) (*vm.VM, error)) {
   950  	sm.newVM = nvm
   951  }
   952  
   953  // sets up information about the vesting schedule
   954  func (sm *StateManager) setupGenesisVestingSchedule(ctx context.Context) error {
   955  
   956  	gb, err := sm.cs.GetGenesis()
   957  	if err != nil {
   958  		return xerrors.Errorf("getting genesis block: %w", err)
   959  	}
   960  
   961  	gts, err := types.NewTipSet([]*types.BlockHeader{gb})
   962  	if err != nil {
   963  		return xerrors.Errorf("getting genesis tipset: %w", err)
   964  	}
   965  
   966  	st, _, err := sm.TipSetState(ctx, gts)
   967  	if err != nil {
   968  		return xerrors.Errorf("getting genesis tipset state: %w", err)
   969  	}
   970  
   971  	cst := cbor.NewCborStore(sm.cs.StateBlockstore())
   972  	sTree, err := state.LoadStateTree(cst, st)
   973  	if err != nil {
   974  		return xerrors.Errorf("loading state tree: %w", err)
   975  	}
   976  
   977  	gmf, err := getFilMarketLocked(ctx, sTree)
   978  	if err != nil {
   979  		return xerrors.Errorf("setting up genesis market funds: %w", err)
   980  	}
   981  
   982  	gp, err := getFilPowerLocked(ctx, sTree)
   983  	if err != nil {
   984  		return xerrors.Errorf("setting up genesis pledge: %w", err)
   985  	}
   986  
   987  	sm.genesisMarketFunds = gmf
   988  	sm.genesisPledge = gp
   989  
   990  	totalsByEpoch := make(map[abi.ChainEpoch]abi.TokenAmount)
   991  
   992  	// 6 months
   993  	sixMonths := abi.ChainEpoch(183 * builtin.EpochsInDay)
   994  	totalsByEpoch[sixMonths] = big.NewInt(49_929_341)
   995  	totalsByEpoch[sixMonths] = big.Add(totalsByEpoch[sixMonths], big.NewInt(32_787_700))
   996  
   997  	// 1 year
   998  	oneYear := abi.ChainEpoch(365 * builtin.EpochsInDay)
   999  	totalsByEpoch[oneYear] = big.NewInt(22_421_712)
  1000  
  1001  	// 2 years
  1002  	twoYears := abi.ChainEpoch(2 * 365 * builtin.EpochsInDay)
  1003  	totalsByEpoch[twoYears] = big.NewInt(7_223_364)
  1004  
  1005  	// 3 years
  1006  	threeYears := abi.ChainEpoch(3 * 365 * builtin.EpochsInDay)
  1007  	totalsByEpoch[threeYears] = big.NewInt(87_637_883)
  1008  
  1009  	// 6 years
  1010  	sixYears := abi.ChainEpoch(6 * 365 * builtin.EpochsInDay)
  1011  	totalsByEpoch[sixYears] = big.NewInt(100_000_000)
  1012  	totalsByEpoch[sixYears] = big.Add(totalsByEpoch[sixYears], big.NewInt(300_000_000))
  1013  
  1014  	sm.preIgnitionVesting = make([]msig0.State, 0, len(totalsByEpoch))
  1015  	for k, v := range totalsByEpoch {
  1016  		ns := msig0.State{
  1017  			InitialBalance: v,
  1018  			UnlockDuration: k,
  1019  			PendingTxns:    cid.Undef,
  1020  		}
  1021  		sm.preIgnitionVesting = append(sm.preIgnitionVesting, ns)
  1022  	}
  1023  
  1024  	return nil
  1025  }
  1026  
  1027  // sets up information about the vesting schedule post the ignition upgrade
  1028  func (sm *StateManager) setupPostIgnitionVesting(ctx context.Context) error {
  1029  
  1030  	totalsByEpoch := make(map[abi.ChainEpoch]abi.TokenAmount)
  1031  
  1032  	// 6 months
  1033  	sixMonths := abi.ChainEpoch(183 * builtin.EpochsInDay)
  1034  	totalsByEpoch[sixMonths] = big.NewInt(49_929_341)
  1035  	totalsByEpoch[sixMonths] = big.Add(totalsByEpoch[sixMonths], big.NewInt(32_787_700))
  1036  
  1037  	// 1 year
  1038  	oneYear := abi.ChainEpoch(365 * builtin.EpochsInDay)
  1039  	totalsByEpoch[oneYear] = big.NewInt(22_421_712)
  1040  
  1041  	// 2 years
  1042  	twoYears := abi.ChainEpoch(2 * 365 * builtin.EpochsInDay)
  1043  	totalsByEpoch[twoYears] = big.NewInt(7_223_364)
  1044  
  1045  	// 3 years
  1046  	threeYears := abi.ChainEpoch(3 * 365 * builtin.EpochsInDay)
  1047  	totalsByEpoch[threeYears] = big.NewInt(87_637_883)
  1048  
  1049  	// 6 years
  1050  	sixYears := abi.ChainEpoch(6 * 365 * builtin.EpochsInDay)
  1051  	totalsByEpoch[sixYears] = big.NewInt(100_000_000)
  1052  	totalsByEpoch[sixYears] = big.Add(totalsByEpoch[sixYears], big.NewInt(300_000_000))
  1053  
  1054  	sm.postIgnitionVesting = make([]msig0.State, 0, len(totalsByEpoch))
  1055  	for k, v := range totalsByEpoch {
  1056  		ns := msig0.State{
  1057  			// In the pre-ignition logic, we incorrectly set this value in Fil, not attoFil, an off-by-10^18 error
  1058  			InitialBalance: big.Mul(v, big.NewInt(int64(build.FilecoinPrecision))),
  1059  			UnlockDuration: k,
  1060  			PendingTxns:    cid.Undef,
  1061  			// In the pre-ignition logic, the start epoch was 0. This changes in the fork logic of the Ignition upgrade itself.
  1062  			StartEpoch: build.UpgradeLiftoffHeight,
  1063  		}
  1064  		sm.postIgnitionVesting = append(sm.postIgnitionVesting, ns)
  1065  	}
  1066  
  1067  	return nil
  1068  }
  1069  
  1070  // sets up information about the vesting schedule post the calico upgrade
  1071  func (sm *StateManager) setupPostCalicoVesting(ctx context.Context) error {
  1072  
  1073  	totalsByEpoch := make(map[abi.ChainEpoch]abi.TokenAmount)
  1074  
  1075  	// 0 days
  1076  	zeroDays := abi.ChainEpoch(0)
  1077  	totalsByEpoch[zeroDays] = big.NewInt(10_632_000)
  1078  
  1079  	// 6 months
  1080  	sixMonths := abi.ChainEpoch(183 * builtin.EpochsInDay)
  1081  	totalsByEpoch[sixMonths] = big.NewInt(19_015_887)
  1082  	totalsByEpoch[sixMonths] = big.Add(totalsByEpoch[sixMonths], big.NewInt(32_787_700))
  1083  
  1084  	// 1 year
  1085  	oneYear := abi.ChainEpoch(365 * builtin.EpochsInDay)
  1086  	totalsByEpoch[oneYear] = big.NewInt(22_421_712)
  1087  	totalsByEpoch[oneYear] = big.Add(totalsByEpoch[oneYear], big.NewInt(9_400_000))
  1088  
  1089  	// 2 years
  1090  	twoYears := abi.ChainEpoch(2 * 365 * builtin.EpochsInDay)
  1091  	totalsByEpoch[twoYears] = big.NewInt(7_223_364)
  1092  
  1093  	// 3 years
  1094  	threeYears := abi.ChainEpoch(3 * 365 * builtin.EpochsInDay)
  1095  	totalsByEpoch[threeYears] = big.NewInt(87_637_883)
  1096  	totalsByEpoch[threeYears] = big.Add(totalsByEpoch[threeYears], big.NewInt(898_958))
  1097  
  1098  	// 6 years
  1099  	sixYears := abi.ChainEpoch(6 * 365 * builtin.EpochsInDay)
  1100  	totalsByEpoch[sixYears] = big.NewInt(100_000_000)
  1101  	totalsByEpoch[sixYears] = big.Add(totalsByEpoch[sixYears], big.NewInt(300_000_000))
  1102  	totalsByEpoch[sixYears] = big.Add(totalsByEpoch[sixYears], big.NewInt(9_805_053))
  1103  
  1104  	sm.postCalicoVesting = make([]msig0.State, 0, len(totalsByEpoch))
  1105  	for k, v := range totalsByEpoch {
  1106  		ns := msig0.State{
  1107  			InitialBalance: big.Mul(v, big.NewInt(int64(build.FilecoinPrecision))),
  1108  			UnlockDuration: k,
  1109  			PendingTxns:    cid.Undef,
  1110  			StartEpoch:     build.UpgradeLiftoffHeight,
  1111  		}
  1112  		sm.postCalicoVesting = append(sm.postCalicoVesting, ns)
  1113  	}
  1114  
  1115  	return nil
  1116  }
  1117  
  1118  // GetVestedFunds returns all funds that have "left" actors that are in the genesis state:
  1119  // - For Multisigs, it counts the actual amounts that have vested at the given epoch
  1120  // - For Accounts, it counts max(currentBalance - genesisBalance, 0).
  1121  func (sm *StateManager) GetFilVested(ctx context.Context, height abi.ChainEpoch, st *state.StateTree) (abi.TokenAmount, error) {
  1122  	vf := big.Zero()
  1123  	if height <= build.UpgradeIgnitionHeight {
  1124  		for _, v := range sm.preIgnitionVesting {
  1125  			au := big.Sub(v.InitialBalance, v.AmountLocked(height))
  1126  			vf = big.Add(vf, au)
  1127  		}
  1128  	} else if height <= build.UpgradeCalicoHeight {
  1129  		for _, v := range sm.postIgnitionVesting {
  1130  			// In the pre-ignition logic, we simply called AmountLocked(height), assuming startEpoch was 0.
  1131  			// The start epoch changed in the Ignition upgrade.
  1132  			au := big.Sub(v.InitialBalance, v.AmountLocked(height-v.StartEpoch))
  1133  			vf = big.Add(vf, au)
  1134  		}
  1135  	} else {
  1136  		for _, v := range sm.postCalicoVesting {
  1137  			// In the pre-ignition logic, we simply called AmountLocked(height), assuming startEpoch was 0.
  1138  			// The start epoch changed in the Ignition upgrade.
  1139  			au := big.Sub(v.InitialBalance, v.AmountLocked(height-v.StartEpoch))
  1140  			vf = big.Add(vf, au)
  1141  		}
  1142  	}
  1143  
  1144  	// After UpgradeActorsV2Height these funds are accounted for in GetFilReserveDisbursed
  1145  	if height <= build.UpgradeActorsV2Height {
  1146  		// continue to use preIgnitionGenInfos, nothing changed at the Ignition epoch
  1147  		vf = big.Add(vf, sm.genesisPledge)
  1148  		// continue to use preIgnitionGenInfos, nothing changed at the Ignition epoch
  1149  		vf = big.Add(vf, sm.genesisMarketFunds)
  1150  	}
  1151  
  1152  	return vf, nil
  1153  }
  1154  
  1155  func GetFilReserveDisbursed(ctx context.Context, st *state.StateTree) (abi.TokenAmount, error) {
  1156  	ract, err := st.GetActor(builtin.ReserveAddress)
  1157  	if err != nil {
  1158  		return big.Zero(), xerrors.Errorf("failed to get reserve actor: %w", err)
  1159  	}
  1160  
  1161  	// If money enters the reserve actor, this could lead to a negative term
  1162  	return big.Sub(big.NewFromGo(build.InitialFilReserved), ract.Balance), nil
  1163  }
  1164  
  1165  func GetFilMined(ctx context.Context, st *state.StateTree) (abi.TokenAmount, error) {
  1166  	ractor, err := st.GetActor(reward.Address)
  1167  	if err != nil {
  1168  		return big.Zero(), xerrors.Errorf("failed to load reward actor state: %w", err)
  1169  	}
  1170  
  1171  	rst, err := reward.Load(adt.WrapStore(ctx, st.Store), ractor)
  1172  	if err != nil {
  1173  		return big.Zero(), err
  1174  	}
  1175  
  1176  	return rst.TotalStoragePowerReward()
  1177  }
  1178  
  1179  func getFilMarketLocked(ctx context.Context, st *state.StateTree) (abi.TokenAmount, error) {
  1180  	act, err := st.GetActor(market.Address)
  1181  	if err != nil {
  1182  		return big.Zero(), xerrors.Errorf("failed to load market actor: %w", err)
  1183  	}
  1184  
  1185  	mst, err := market.Load(adt.WrapStore(ctx, st.Store), act)
  1186  	if err != nil {
  1187  		return big.Zero(), xerrors.Errorf("failed to load market state: %w", err)
  1188  	}
  1189  
  1190  	return mst.TotalLocked()
  1191  }
  1192  
  1193  func getFilPowerLocked(ctx context.Context, st *state.StateTree) (abi.TokenAmount, error) {
  1194  	pactor, err := st.GetActor(power.Address)
  1195  	if err != nil {
  1196  		return big.Zero(), xerrors.Errorf("failed to load power actor: %w", err)
  1197  	}
  1198  
  1199  	pst, err := power.Load(adt.WrapStore(ctx, st.Store), pactor)
  1200  	if err != nil {
  1201  		return big.Zero(), xerrors.Errorf("failed to load power state: %w", err)
  1202  	}
  1203  
  1204  	return pst.TotalLocked()
  1205  }
  1206  
  1207  func (sm *StateManager) GetFilLocked(ctx context.Context, st *state.StateTree) (abi.TokenAmount, error) {
  1208  
  1209  	filMarketLocked, err := getFilMarketLocked(ctx, st)
  1210  	if err != nil {
  1211  		return big.Zero(), xerrors.Errorf("failed to get filMarketLocked: %w", err)
  1212  	}
  1213  
  1214  	filPowerLocked, err := getFilPowerLocked(ctx, st)
  1215  	if err != nil {
  1216  		return big.Zero(), xerrors.Errorf("failed to get filPowerLocked: %w", err)
  1217  	}
  1218  
  1219  	return types.BigAdd(filMarketLocked, filPowerLocked), nil
  1220  }
  1221  
  1222  func GetFilBurnt(ctx context.Context, st *state.StateTree) (abi.TokenAmount, error) {
  1223  	burnt, err := st.GetActor(builtin.BurntFundsActorAddr)
  1224  	if err != nil {
  1225  		return big.Zero(), xerrors.Errorf("failed to load burnt actor: %w", err)
  1226  	}
  1227  
  1228  	return burnt.Balance, nil
  1229  }
  1230  
  1231  func (sm *StateManager) GetVMCirculatingSupply(ctx context.Context, height abi.ChainEpoch, st *state.StateTree) (abi.TokenAmount, error) {
  1232  	cs, err := sm.GetVMCirculatingSupplyDetailed(ctx, height, st)
  1233  	if err != nil {
  1234  		return types.EmptyInt, err
  1235  	}
  1236  
  1237  	return cs.FilCirculating, err
  1238  }
  1239  
  1240  func (sm *StateManager) GetVMCirculatingSupplyDetailed(ctx context.Context, height abi.ChainEpoch, st *state.StateTree) (api.CirculatingSupply, error) {
  1241  	sm.genesisMsigLk.Lock()
  1242  	defer sm.genesisMsigLk.Unlock()
  1243  	if sm.preIgnitionVesting == nil || sm.genesisPledge.IsZero() || sm.genesisMarketFunds.IsZero() {
  1244  		err := sm.setupGenesisVestingSchedule(ctx)
  1245  		if err != nil {
  1246  			return api.CirculatingSupply{}, xerrors.Errorf("failed to setup pre-ignition vesting schedule: %w", err)
  1247  		}
  1248  	}
  1249  	if sm.postIgnitionVesting == nil {
  1250  		err := sm.setupPostIgnitionVesting(ctx)
  1251  		if err != nil {
  1252  			return api.CirculatingSupply{}, xerrors.Errorf("failed to setup post-ignition vesting schedule: %w", err)
  1253  		}
  1254  	}
  1255  	if sm.postCalicoVesting == nil {
  1256  		err := sm.setupPostCalicoVesting(ctx)
  1257  		if err != nil {
  1258  			return api.CirculatingSupply{}, xerrors.Errorf("failed to setup post-calico vesting schedule: %w", err)
  1259  		}
  1260  	}
  1261  
  1262  	filVested, err := sm.GetFilVested(ctx, height, st)
  1263  	if err != nil {
  1264  		return api.CirculatingSupply{}, xerrors.Errorf("failed to calculate filVested: %w", err)
  1265  	}
  1266  
  1267  	filReserveDisbursed := big.Zero()
  1268  	if height > build.UpgradeActorsV2Height {
  1269  		filReserveDisbursed, err = GetFilReserveDisbursed(ctx, st)
  1270  		if err != nil {
  1271  			return api.CirculatingSupply{}, xerrors.Errorf("failed to calculate filReserveDisbursed: %w", err)
  1272  		}
  1273  	}
  1274  
  1275  	filMined, err := GetFilMined(ctx, st)
  1276  	if err != nil {
  1277  		return api.CirculatingSupply{}, xerrors.Errorf("failed to calculate filMined: %w", err)
  1278  	}
  1279  
  1280  	filBurnt, err := GetFilBurnt(ctx, st)
  1281  	if err != nil {
  1282  		return api.CirculatingSupply{}, xerrors.Errorf("failed to calculate filBurnt: %w", err)
  1283  	}
  1284  
  1285  	filLocked, err := sm.GetFilLocked(ctx, st)
  1286  	if err != nil {
  1287  		return api.CirculatingSupply{}, xerrors.Errorf("failed to calculate filLocked: %w", err)
  1288  	}
  1289  
  1290  	ret := types.BigAdd(filVested, filMined)
  1291  	ret = types.BigAdd(ret, filReserveDisbursed)
  1292  	ret = types.BigSub(ret, filBurnt)
  1293  	ret = types.BigSub(ret, filLocked)
  1294  
  1295  	if ret.LessThan(big.Zero()) {
  1296  		ret = big.Zero()
  1297  	}
  1298  
  1299  	return api.CirculatingSupply{
  1300  		FilVested:           filVested,
  1301  		FilMined:            filMined,
  1302  		FilBurnt:            filBurnt,
  1303  		FilLocked:           filLocked,
  1304  		FilCirculating:      ret,
  1305  		FilReserveDisbursed: filReserveDisbursed,
  1306  	}, nil
  1307  }
  1308  
  1309  func (sm *StateManager) GetCirculatingSupply(ctx context.Context, height abi.ChainEpoch, st *state.StateTree) (abi.TokenAmount, error) {
  1310  	circ := big.Zero()
  1311  	unCirc := big.Zero()
  1312  	err := st.ForEach(func(a address.Address, actor *types.Actor) error {
  1313  		switch {
  1314  		case actor.Balance.IsZero():
  1315  			// Do nothing for zero-balance actors
  1316  			break
  1317  		case a == _init.Address ||
  1318  			a == reward.Address ||
  1319  			a == verifreg.Address ||
  1320  			// The power actor itself should never receive funds
  1321  			a == power.Address ||
  1322  			a == builtin.SystemActorAddr ||
  1323  			a == builtin.CronActorAddr ||
  1324  			a == builtin.BurntFundsActorAddr ||
  1325  			a == builtin.SaftAddress ||
  1326  			a == builtin.ReserveAddress:
  1327  
  1328  			unCirc = big.Add(unCirc, actor.Balance)
  1329  
  1330  		case a == market.Address:
  1331  			mst, err := market.Load(sm.cs.ActorStore(ctx), actor)
  1332  			if err != nil {
  1333  				return err
  1334  			}
  1335  
  1336  			lb, err := mst.TotalLocked()
  1337  			if err != nil {
  1338  				return err
  1339  			}
  1340  
  1341  			circ = big.Add(circ, big.Sub(actor.Balance, lb))
  1342  			unCirc = big.Add(unCirc, lb)
  1343  
  1344  		case builtin.IsAccountActor(actor.Code) || builtin.IsPaymentChannelActor(actor.Code):
  1345  			circ = big.Add(circ, actor.Balance)
  1346  
  1347  		case builtin.IsStorageMinerActor(actor.Code):
  1348  			mst, err := miner.Load(sm.cs.ActorStore(ctx), actor)
  1349  			if err != nil {
  1350  				return err
  1351  			}
  1352  
  1353  			ab, err := mst.AvailableBalance(actor.Balance)
  1354  
  1355  			if err == nil {
  1356  				circ = big.Add(circ, ab)
  1357  				unCirc = big.Add(unCirc, big.Sub(actor.Balance, ab))
  1358  			} else {
  1359  				// Assume any error is because the miner state is "broken" (lower actor balance than locked funds)
  1360  				// In this case, the actor's entire balance is considered "uncirculating"
  1361  				unCirc = big.Add(unCirc, actor.Balance)
  1362  			}
  1363  
  1364  		case builtin.IsMultisigActor(actor.Code):
  1365  			mst, err := multisig.Load(sm.cs.ActorStore(ctx), actor)
  1366  			if err != nil {
  1367  				return err
  1368  			}
  1369  
  1370  			lb, err := mst.LockedBalance(height)
  1371  			if err != nil {
  1372  				return err
  1373  			}
  1374  
  1375  			ab := big.Sub(actor.Balance, lb)
  1376  			circ = big.Add(circ, big.Max(ab, big.Zero()))
  1377  			unCirc = big.Add(unCirc, big.Min(actor.Balance, lb))
  1378  		default:
  1379  			return xerrors.Errorf("unexpected actor: %s", a)
  1380  		}
  1381  
  1382  		return nil
  1383  	})
  1384  
  1385  	if err != nil {
  1386  		return types.EmptyInt, err
  1387  	}
  1388  
  1389  	total := big.Add(circ, unCirc)
  1390  	if !total.Equals(types.TotalFilecoinInt) {
  1391  		return types.EmptyInt, xerrors.Errorf("total filecoin didn't add to expected amount: %s != %s", total, types.TotalFilecoinInt)
  1392  	}
  1393  
  1394  	return circ, nil
  1395  }
  1396  
  1397  func (sm *StateManager) GetNtwkVersion(ctx context.Context, height abi.ChainEpoch) network.Version {
  1398  	// The epochs here are the _last_ epoch for every version, or -1 if the
  1399  	// version is disabled.
  1400  	for _, spec := range sm.networkVersions {
  1401  		if height <= spec.atOrBelow {
  1402  			return spec.networkVersion
  1403  		}
  1404  	}
  1405  	return sm.latestVersion
  1406  }
  1407  
  1408  func (sm *StateManager) GetPaychState(ctx context.Context, addr address.Address, ts *types.TipSet) (*types.Actor, paych.State, error) {
  1409  	st, err := sm.ParentState(ts)
  1410  	if err != nil {
  1411  		return nil, nil, err
  1412  	}
  1413  
  1414  	act, err := st.GetActor(addr)
  1415  	if err != nil {
  1416  		return nil, nil, err
  1417  	}
  1418  
  1419  	actState, err := paych.Load(sm.cs.ActorStore(ctx), act)
  1420  	if err != nil {
  1421  		return nil, nil, err
  1422  	}
  1423  	return act, actState, nil
  1424  }
  1425  
  1426  func (sm *StateManager) GetMarketState(ctx context.Context, ts *types.TipSet) (market.State, error) {
  1427  	st, err := sm.ParentState(ts)
  1428  	if err != nil {
  1429  		return nil, err
  1430  	}
  1431  
  1432  	act, err := st.GetActor(market.Address)
  1433  	if err != nil {
  1434  		return nil, err
  1435  	}
  1436  
  1437  	actState, err := market.Load(sm.cs.ActorStore(ctx), act)
  1438  	if err != nil {
  1439  		return nil, err
  1440  	}
  1441  	return actState, nil
  1442  }
  1443  
  1444  var _ StateManagerAPI = (*StateManager)(nil)