vm

package
v1.28.0-rc5 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jul 11, 2024 License: Apache-2.0, MIT Imports: 73 Imported by: 43

Documentation

Index

Constants

View Source
const (
	// DefaultAvailableExecutionLanes is the number of available execution lanes; it is the bound of
	// concurrent active executions.
	// This is the default value in filecoin-ffi
	DefaultAvailableExecutionLanes = 4
	// DefaultPriorityExecutionLanes is the number of reserved execution lanes for priority computations.
	// This is purely userspace, but we believe it is a reasonable default, even with more available
	// lanes.
	DefaultPriorityExecutionLanes = 2
)
View Source
const MaxCallDepth = 4096
View Source
const MaxEventSliceLength = 6_000_000

Variables

View Source
var (
	StatSends   uint64
	StatApplied uint64
)

stat counters

View Source
var BatchSealVerifyParallelism = goruntime.NumCPU()
View Source
var EmptyObjectCid cid.Cid
View Source
var EnableDetailedTracing = os.Getenv("LOTUS_VM_ENABLE_TRACING") == "1"

EnableDetailedTracing has different behaviour in the LegacyVM and FVM. In the LegacyVM, it enables detailed gas tracing, slowing down execution. In the FVM, it enables execution traces, which are primarily used to observe subcalls.

View Source
var Prices = map[abi.ChainEpoch]Pricelist{
	abi.ChainEpoch(0): &pricelistV0{
		computeGasMulti: 1,
		storageGasMulti: 1000,

		onChainMessageComputeBase:    38863,
		onChainMessageStorageBase:    36,
		onChainMessageStoragePerByte: 1,

		onChainReturnValuePerByte: 1,

		sendBase:                29233,
		sendTransferFunds:       27500,
		sendTransferOnlyPremium: 159672,
		sendInvokeMethod:        -5377,

		ipldGetBase:    75242,
		ipldPutBase:    84070,
		ipldPutPerByte: 1,

		createActorCompute: 1108454,
		createActorStorage: 36 + 40,
		deleteActor:        -(36 + 40),

		verifySignature: map[crypto.SigType]int64{
			crypto.SigTypeBLS:       16598605,
			crypto.SigTypeSecp256k1: 1637292,
			crypto.SigTypeDelegated: 1637292,
		},

		hashingBase:                  31355,
		computeUnsealedSectorCidBase: 98647,
		verifySealBase:               2000,
		verifyAggregateSealBase:      0,
		verifyPostLookup: map[abi.RegisteredPoStProof]scalingCost{
			abi.RegisteredPoStProof_StackedDrgWindow512MiBV1: {
				flat:  123861062,
				scale: 9226981,
			},
			abi.RegisteredPoStProof_StackedDrgWindow32GiBV1: {
				flat:  748593537,
				scale: 85639,
			},
			abi.RegisteredPoStProof_StackedDrgWindow64GiBV1: {
				flat:  748593537,
				scale: 85639,
			},
		},
		verifyPostDiscount:   true,
		verifyConsensusFault: 495422,
	},
	abi.ChainEpoch(build.UpgradeCalicoHeight): &pricelistV0{
		computeGasMulti: 1,
		storageGasMulti: 1300,

		onChainMessageComputeBase:    38863,
		onChainMessageStorageBase:    36,
		onChainMessageStoragePerByte: 1,

		onChainReturnValuePerByte: 1,

		sendBase:                29233,
		sendTransferFunds:       27500,
		sendTransferOnlyPremium: 159672,
		sendInvokeMethod:        -5377,

		ipldGetBase:    114617,
		ipldPutBase:    353640,
		ipldPutPerByte: 1,

		createActorCompute: 1108454,
		createActorStorage: 36 + 40,
		deleteActor:        -(36 + 40),

		verifySignature: map[crypto.SigType]int64{
			crypto.SigTypeBLS:       16598605,
			crypto.SigTypeSecp256k1: 1637292,
		},

		hashingBase:                  31355,
		computeUnsealedSectorCidBase: 98647,
		verifySealBase:               2000,

		verifyAggregateSealPer: map[abi.RegisteredSealProof]int64{
			abi.RegisteredSealProof_StackedDrg32GiBV1_1: 449900,
			abi.RegisteredSealProof_StackedDrg64GiBV1_1: 359272,
		},
		verifyAggregateSealSteps: map[abi.RegisteredSealProof]stepCost{
			abi.RegisteredSealProof_StackedDrg32GiBV1_1: {
				{4, 103994170},
				{7, 112356810},
				{13, 122912610},
				{26, 137559930},
				{52, 162039100},
				{103, 210960780},
				{205, 318351180},
				{410, 528274980},
			},
			abi.RegisteredSealProof_StackedDrg64GiBV1_1: {
				{4, 102581240},
				{7, 110803030},
				{13, 120803700},
				{26, 134642130},
				{52, 157357890},
				{103, 203017690},
				{205, 304253590},
				{410, 509880640},
			},
		},

		verifyPostLookup: map[abi.RegisteredPoStProof]scalingCost{
			abi.RegisteredPoStProof_StackedDrgWindow512MiBV1: {
				flat:  117680921,
				scale: 43780,
			},
			abi.RegisteredPoStProof_StackedDrgWindow32GiBV1: {
				flat:  117680921,
				scale: 43780,
			},
			abi.RegisteredPoStProof_StackedDrgWindow64GiBV1: {
				flat:  117680921,
				scale: 43780,
			},
		},
		verifyPostDiscount:   false,
		verifyConsensusFault: 495422,

		verifyReplicaUpdate: 36316136,
	},
	build.UpgradeHyggeHeight: &pricelistV0{
		computeGasMulti: 1,
		storageGasMulti: 1300,

		onChainMessageComputeBase:    38863 + 475000,
		onChainMessageStorageBase:    36,
		onChainMessageStoragePerByte: 1,

		onChainReturnValuePerByte: 1,
	},
}

Prices are the price lists per starting epoch. Public for testing purposes (concretely to allow the test vector runner to rebase prices).

Functions

func ComputeGasOverestimationBurn added in v0.5.0

func ComputeGasOverestimationBurn(gasUsed, gasLimit int64) (int64, int64)

ComputeGasOverestimationBurn computes amount of gas to be refunded and amount of gas to be burned Result is (refund, burn)

func Copy

func Copy(ctx context.Context, from, to blockstore.Blockstore, root cid.Cid) error

func DecodeParams

func DecodeParams(b []byte, out interface{}) error

func DumpActorState

func DumpActorState(i *ActorRegistry, act *types.Actor, b []byte) (interface{}, error)

func ResolveToDeterministicAddr added in v1.20.0

func ResolveToDeterministicAddr(state types.StateTree, cst cbor.IpldStore, addr address.Address) (address.Address, error)

ResolveToDeterministicAddr returns the public key type of address (`BLS`/`SECP256K1`) of an actor identified by `addr`, or its delegated address.

func TryCreateAccountActor

func TryCreateAccountActor(rt *Runtime, addr address.Address) (*types.Actor, address.Address, aerrors.ActorError)

TryCreateAccountActor creates account actors from only BLS/SECP256K1 addresses.

Types

type ActorPredicate added in v0.9.0

type ActorPredicate func(vmr.Runtime, cid.Cid) error

An ActorPredicate returns an error if the given actor is not valid for the given runtime environment (e.g., chain height, version, etc.).

func ActorsVersionPredicate added in v0.9.0

func ActorsVersionPredicate(ver actorstypes.Version) ActorPredicate

type ActorRegistry added in v0.9.0

type ActorRegistry struct {
	Methods map[cid.Cid]map[abi.MethodNum]MethodMeta
	// contains filtered or unexported fields
}

func NewActorRegistry added in v0.9.0

func NewActorRegistry() *ActorRegistry

func (*ActorRegistry) Create added in v0.9.0

func (ar *ActorRegistry) Create(codeCid cid.Cid, rt vmr.Runtime) (*types.Actor, aerrors.ActorError)

func (*ActorRegistry) Invoke added in v0.9.0

func (ar *ActorRegistry) Invoke(codeCid cid.Cid, rt vmr.Runtime, method abi.MethodNum, params []byte) ([]byte, aerrors.ActorError)

func (*ActorRegistry) Register added in v0.9.0

func (ar *ActorRegistry) Register(av actorstypes.Version, pred ActorPredicate, vmactors []builtin.RegistryEntry)

type ApplyRet

type ApplyRet struct {
	types.MessageReceipt
	ActorErr       aerrors.ActorError
	ExecutionTrace types.ExecutionTrace
	Duration       time.Duration
	GasCosts       *GasOutputs
	Events         []types.Event
}

type CircSupplyCalculator added in v0.5.0

type CircSupplyCalculator func(context.Context, abi.ChainEpoch, *state.StateTree) (abi.TokenAmount, error)

type ExecutionLane added in v1.23.1

type ExecutionLane int
const (
	// ExecutionLaneDefault signifies a default, non prioritized execution lane.
	ExecutionLaneDefault ExecutionLane = iota
	// ExecutionLanePriority signifies a prioritized execution lane with reserved resources.
	ExecutionLanePriority
)

type FVM added in v1.15.1

type FVM struct {
	// contains filtered or unexported fields
}

func NewDebugFVM added in v1.17.0

func NewDebugFVM(ctx context.Context, opts *VMOpts) (*FVM, error)

func NewFVM added in v1.15.1

func NewFVM(ctx context.Context, opts *VMOpts) (*FVM, error)

func (*FVM) ApplyImplicitMessage added in v1.15.1

func (vm *FVM) ApplyImplicitMessage(ctx context.Context, cmsg *types.Message) (*ApplyRet, error)

func (*FVM) ApplyMessage added in v1.15.1

func (vm *FVM) ApplyMessage(ctx context.Context, cmsg types.ChainMsg) (*ApplyRet, error)

func (*FVM) Flush added in v1.15.1

func (vm *FVM) Flush(ctx context.Context) (cid.Cid, error)

type FvmExtern added in v1.15.1

type FvmExtern struct {
	rand.Rand
	blockstore.Blockstore
	// contains filtered or unexported fields
}

func (*FvmExtern) TipsetCid added in v1.20.0

func (x *FvmExtern) TipsetCid(ctx context.Context, epoch abi.ChainEpoch) (cid.Cid, error)

func (*FvmExtern) VerifyConsensusFault added in v1.15.1

func (x *FvmExtern) VerifyConsensusFault(ctx context.Context, a, b, extra []byte) (*ffi_cgo.ConsensusFault, int64)

VerifyConsensusFault is similar to the one in syscalls.go used by the Lotus VM, except it never errors Errors are logged and "no fault" is returned, which is functionally what go-actors does anyway

type GasCharge added in v0.4.0

type GasCharge struct {
	Name  string
	Extra interface{}

	ComputeGas int64
	StorageGas int64

	VirtualCompute int64
	VirtualStorage int64
}

func (GasCharge) Total added in v0.4.0

func (g GasCharge) Total() int64

func (GasCharge) WithExtra added in v0.4.0

func (g GasCharge) WithExtra(extra interface{}) GasCharge

func (GasCharge) WithVirtual added in v0.4.0

func (g GasCharge) WithVirtual(compute, storage int64) GasCharge

type GasOutputs added in v0.5.0

type GasOutputs struct {
	BaseFeeBurn        abi.TokenAmount
	OverEstimationBurn abi.TokenAmount

	MinerPenalty abi.TokenAmount
	MinerTip     abi.TokenAmount
	Refund       abi.TokenAmount

	GasRefund int64
	GasBurned int64
}

func ComputeGasOutputs added in v0.5.0

func ComputeGasOutputs(gasUsed, gasLimit int64, baseFee, feeCap, gasPremium abi.TokenAmount, chargeNetworkFee bool) GasOutputs

func ZeroGasOutputs added in v0.7.1

func ZeroGasOutputs() GasOutputs

ZeroGasOutputs returns a logically zeroed GasOutputs.

type Interface added in v1.15.1

type Interface interface {
	// Applies the given message onto the VM's current state, returning the result of the execution
	ApplyMessage(ctx context.Context, cmsg types.ChainMsg) (*ApplyRet, error)
	// Same as above but for system messages (the Cron invocation and block reward payments).
	// Must NEVER fail.
	ApplyImplicitMessage(ctx context.Context, msg *types.Message) (*ApplyRet, error)
	// Flush all buffered objects into the state store provided to the VM at construction.
	Flush(ctx context.Context) (cid.Cid, error)
}

func NewDualExecutionFVM added in v1.17.0

func NewDualExecutionFVM(ctx context.Context, opts *VMOpts) (Interface, error)

func NewVM

func NewVM(ctx context.Context, opts *VMOpts) (Interface, error)

type LegacyVM added in v1.15.1

type LegacyVM struct {
	Syscalls SyscallBuilder
	// contains filtered or unexported fields
}

func NewLegacyVM added in v1.15.1

func NewLegacyVM(ctx context.Context, opts *VMOpts) (*LegacyVM, error)

func (*LegacyVM) ActorStore added in v1.15.1

func (vm *LegacyVM) ActorStore(ctx context.Context) adt.Store

Get the buffered blockstore associated with the LegacyVM. This includes any temporary blocks produced during this LegacyVM's execution.

func (*LegacyVM) ApplyImplicitMessage added in v1.15.1

func (vm *LegacyVM) ApplyImplicitMessage(ctx context.Context, msg *types.Message) (*ApplyRet, error)

func (*LegacyVM) ApplyMessage added in v1.15.1

func (vm *LegacyVM) ApplyMessage(ctx context.Context, cmsg types.ChainMsg) (*ApplyRet, error)

func (*LegacyVM) Flush added in v1.15.1

func (vm *LegacyVM) Flush(ctx context.Context) (cid.Cid, error)

func (*LegacyVM) GetCircSupply added in v1.15.1

func (vm *LegacyVM) GetCircSupply(ctx context.Context) (abi.TokenAmount, error)

func (*LegacyVM) Invoke added in v1.15.1

func (vm *LegacyVM) Invoke(act *types.Actor, rt *Runtime, method abi.MethodNum, params []byte) ([]byte, aerrors.ActorError)

func (*LegacyVM) SetInvoker added in v1.15.1

func (vm *LegacyVM) SetInvoker(i *ActorRegistry)

func (*LegacyVM) ShouldBurn added in v1.15.1

func (vm *LegacyVM) ShouldBurn(ctx context.Context, st *state.StateTree, msg *types.Message, errcode exitcode.ExitCode) (bool, error)

func (*LegacyVM) StateTree added in v1.15.1

func (vm *LegacyVM) StateTree() types.StateTree

type LookbackStateGetter added in v1.1.2

type LookbackStateGetter func(context.Context, abi.ChainEpoch) (*state.StateTree, error)

type Message added in v0.9.0

type Message struct {
	// contains filtered or unexported fields
}

func (*Message) Caller added in v0.9.0

func (m *Message) Caller() address.Address

func (*Message) Receiver added in v0.9.0

func (m *Message) Receiver() address.Address

func (*Message) ValueReceived added in v0.9.0

func (m *Message) ValueReceived() abi.TokenAmount

type MethodMeta added in v1.11.3

type MethodMeta struct {
	Name string

	Params reflect.Type
	Ret    reflect.Type
}

type NtwkVersionGetter added in v0.6.0

type NtwkVersionGetter func(context.Context, abi.ChainEpoch) network.Version

type Pricelist added in v0.3.0

type Pricelist interface {
	// OnChainMessage returns the gas used for storing a message of a given size in the chain.
	OnChainMessage(msgSize int) GasCharge
	// OnChainReturnValue returns the gas used for storing the response of a message in the chain.
	OnChainReturnValue(dataSize int) GasCharge

	// OnMethodInvocation returns the gas used when invoking a method.
	OnMethodInvocation(value abi.TokenAmount, methodNum abi.MethodNum) GasCharge

	// OnIpldGet returns the gas used for storing an object
	OnIpldGet() GasCharge
	// OnIpldPut returns the gas used for storing an object
	OnIpldPut(dataSize int) GasCharge

	// OnCreateActor returns the gas used for creating an actor
	OnCreateActor() GasCharge
	// OnDeleteActor returns the gas used for deleting an actor
	OnDeleteActor() GasCharge

	OnVerifySignature(sigType crypto.SigType, planTextSize int) (GasCharge, error)
	OnHashing(dataSize int) GasCharge
	OnComputeUnsealedSectorCid(proofType abi.RegisteredSealProof, pieces []abi.PieceInfo) GasCharge
	OnVerifySeal(info proof7.SealVerifyInfo) GasCharge
	OnVerifyAggregateSeals(aggregate proof7.AggregateSealVerifyProofAndInfos) GasCharge
	OnVerifyReplicaUpdate(update proof7.ReplicaUpdateInfo) GasCharge
	OnVerifyPost(info proof7.WindowPoStVerifyInfo) GasCharge
	OnVerifyConsensusFault() GasCharge
}

Pricelist provides prices for operations in the LegacyVM.

Note: this interface should be APPEND ONLY since last chain checkpoint

func PricelistByEpoch added in v0.3.0

func PricelistByEpoch(epoch abi.ChainEpoch) Pricelist

PricelistByEpoch finds the latest prices for the given epoch

type Runtime added in v0.3.0

type Runtime struct {
	rt7.Message
	rt7.Syscalls
	// contains filtered or unexported fields
}

func (*Runtime) AbortStateMsg added in v0.3.0

func (rt *Runtime) AbortStateMsg(msg string)

func (*Runtime) Abortf added in v0.3.0

func (rt *Runtime) Abortf(code exitcode.ExitCode, msg string, args ...interface{})

func (*Runtime) BaseFee added in v1.10.0

func (rt *Runtime) BaseFee() abi.TokenAmount

func (*Runtime) ChargeGas added in v0.3.0

func (rt *Runtime) ChargeGas(name string, compute int64, virtual int64)

ChargeGas is spec actors function

func (*Runtime) Context added in v0.3.0

func (rt *Runtime) Context() context.Context

func (*Runtime) CreateActor added in v0.3.0

func (rt *Runtime) CreateActor(codeID cid.Cid, addr address.Address)

func (*Runtime) CurrEpoch added in v0.3.0

func (rt *Runtime) CurrEpoch() abi.ChainEpoch

func (*Runtime) CurrentBalance added in v0.3.0

func (rt *Runtime) CurrentBalance() abi.TokenAmount

func (*Runtime) DeleteActor added in v0.3.0

func (rt *Runtime) DeleteActor(beneficiary address.Address)

DeleteActor deletes the executing actor from the state tree, transferring any balance to beneficiary. Aborts if the beneficiary does not exist or is the calling actor. May only be called by the actor itself.

func (*Runtime) GetActorCodeCID added in v0.3.0

func (rt *Runtime) GetActorCodeCID(addr address.Address) (ret cid.Cid, ok bool)

func (*Runtime) GetBalance added in v0.3.0

func (rt *Runtime) GetBalance(a address.Address) (types.BigInt, aerrors.ActorError)

func (*Runtime) GetRandomnessFromBeacon added in v0.5.0

func (rt *Runtime) GetRandomnessFromBeacon(personalization crypto.DomainSeparationTag, randEpoch abi.ChainEpoch, entropy []byte) abi.Randomness

func (*Runtime) GetRandomnessFromTickets added in v0.5.0

func (rt *Runtime) GetRandomnessFromTickets(personalization crypto.DomainSeparationTag, randEpoch abi.ChainEpoch, entropy []byte) abi.Randomness

func (*Runtime) Log added in v0.5.0

func (rt *Runtime) Log(level rtt.LogLevel, msg string, args ...interface{})

func (*Runtime) NetworkVersion added in v0.6.0

func (rt *Runtime) NetworkVersion() network.Version

func (*Runtime) NewActorAddress added in v0.3.0

func (rt *Runtime) NewActorAddress() address.Address

func (*Runtime) Pricelist added in v0.3.0

func (rt *Runtime) Pricelist() Pricelist

func (*Runtime) ResolveAddress added in v0.3.0

func (rt *Runtime) ResolveAddress(addr address.Address) (ret address.Address, ok bool)

func (*Runtime) Send added in v0.3.0

func (rt *Runtime) Send(to address.Address, method abi.MethodNum, m cbor.Marshaler, value abi.TokenAmount, out cbor.Er) exitcode.ExitCode

func (*Runtime) StartSpan added in v0.3.0

func (rt *Runtime) StartSpan(name string) func()

func (*Runtime) StateCreate added in v0.7.1

func (rt *Runtime) StateCreate(obj cbor.Marshaler)

func (*Runtime) StateReadonly added in v0.7.1

func (rt *Runtime) StateReadonly(obj cbor.Unmarshaler)

func (*Runtime) StateTransaction added in v0.7.1

func (rt *Runtime) StateTransaction(obj cbor.Er, f func())

func (*Runtime) StoreGet added in v0.7.1

func (rt *Runtime) StoreGet(c cid.Cid, o cbor.Unmarshaler) bool

func (*Runtime) StorePut added in v0.7.1

func (rt *Runtime) StorePut(x cbor.Marshaler) cid.Cid

func (*Runtime) TotalFilCircSupply added in v0.3.0

func (rt *Runtime) TotalFilCircSupply() abi.TokenAmount

func (*Runtime) ValidateImmediateCallerAcceptAny added in v0.3.0

func (rt *Runtime) ValidateImmediateCallerAcceptAny()

func (*Runtime) ValidateImmediateCallerIs added in v0.3.0

func (rt *Runtime) ValidateImmediateCallerIs(as ...address.Address)

func (*Runtime) ValidateImmediateCallerType added in v0.3.0

func (rt *Runtime) ValidateImmediateCallerType(ts ...cid.Cid)

type SyscallBuilder added in v0.5.0

type SyscallBuilder func(ctx context.Context, rt *Runtime) runtime7.Syscalls

func Syscalls added in v0.2.1

func Syscalls(verifier storiface.Verifier) SyscallBuilder

type TipSetGetter added in v1.20.0

type TipSetGetter func(context.Context, abi.ChainEpoch) (types.TipSetKey, error)

type UnsafeVM added in v0.5.0

type UnsafeVM struct {
	VM *LegacyVM
}

func (*UnsafeVM) MakeRuntime added in v0.5.0

func (vm *UnsafeVM) MakeRuntime(ctx context.Context, msg *types.Message) *Runtime

type VMOpts added in v0.5.0

type VMOpts struct {
	StateBase      cid.Cid
	Epoch          abi.ChainEpoch
	Timestamp      uint64
	Rand           rand.Rand
	Bstore         blockstore.Blockstore
	Actors         *ActorRegistry
	Syscalls       SyscallBuilder
	CircSupplyCalc CircSupplyCalculator
	NetworkVersion network.Version
	BaseFee        abi.TokenAmount
	LookbackState  LookbackStateGetter
	TipSetGetter   TipSetGetter
	Tracing        bool
	// ReturnEvents decodes and returns emitted events.
	ReturnEvents bool
	// ExecutionLane specifies the execution priority of the created vm
	ExecutionLane ExecutionLane
}

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL