vm

package
v1.18.0 Latest Latest
Warning

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

Go to latest
Published: Nov 16, 2022 License: Apache-2.0, MIT Imports: 68 Imported by: 43

Documentation

Index

Constants

View Source
const MaxCallDepth = 4096

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,
		},

		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,
	},
}

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 ResolveToKeyAddr

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

ResolveToKeyAddr returns the public key type of address (`BLS`/`SECP256K1`) of an account actor identified by `addr`.

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
}

type CircSupplyCalculator added in v0.5.0

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

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 FvmExecutionTrace added in v1.15.3

type FvmExecutionTrace struct {
	Msg        *types.Message
	MsgRct     *types.MessageReceipt
	Error      string
	GasCharges []FvmGasCharge      `cborgen:"maxlen=1000000000"`
	Subcalls   []FvmExecutionTrace `cborgen:"maxlen=1000000000"`
}

This may eventually become identical to ExecutionTrace, but we can make incremental progress towards that

func (*FvmExecutionTrace) MarshalCBOR added in v1.15.3

func (t *FvmExecutionTrace) MarshalCBOR(w io.Writer) error

func (*FvmExecutionTrace) ToExecutionTrace added in v1.15.3

func (t *FvmExecutionTrace) ToExecutionTrace() types.ExecutionTrace

func (*FvmExecutionTrace) UnmarshalCBOR added in v1.15.3

func (t *FvmExecutionTrace) UnmarshalCBOR(r io.Reader) (err error)

type FvmExtern added in v1.15.1

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

func (*FvmExtern) VerifyBlockSig added in v1.15.1

func (x *FvmExtern) VerifyBlockSig(ctx context.Context, blk *types.BlockHeader) (int64, 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 FvmGasCharge added in v1.17.2

type FvmGasCharge struct {
	Name       string
	TotalGas   int64
	ComputeGas int64
	StorageGas int64
}

func (*FvmGasCharge) MarshalCBOR added in v1.17.2

func (t *FvmGasCharge) MarshalCBOR(w io.Writer) error

func (*FvmGasCharge) UnmarshalCBOR added in v1.17.2

func (t *FvmGasCharge) UnmarshalCBOR(r io.Reader) (err error)

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 Rand

type Rand interface {
	GetChainRandomness(ctx context.Context, pers crypto.DomainSeparationTag, round abi.ChainEpoch, entropy []byte) ([]byte, error)
	GetBeaconRandomness(ctx context.Context, pers crypto.DomainSeparationTag, round abi.ChainEpoch, entropy []byte) ([]byte, error)
}

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 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
	Rand           Rand
	Bstore         blockstore.Blockstore
	Actors         *ActorRegistry
	Syscalls       SyscallBuilder
	CircSupplyCalc CircSupplyCalculator
	NetworkVersion network.Version
	BaseFee        abi.TokenAmount
	LookbackState  LookbackStateGetter
	Tracing        bool
}

Jump to

Keyboard shortcuts

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