fix: vm: always set the root message in execution traces in the FVM
Even when disabled. This mimics the behavior or the lotus VM.
This commit is contained in:
parent
c3d91ddf80
commit
23239c0393
@ -314,7 +314,8 @@ func NewFVM(ctx context.Context, opts *VMOpts) (*FVM, error) {
|
|||||||
|
|
||||||
func (vm *FVM) ApplyMessage(ctx context.Context, cmsg types.ChainMsg) (*ApplyRet, error) {
|
func (vm *FVM) ApplyMessage(ctx context.Context, cmsg types.ChainMsg) (*ApplyRet, error) {
|
||||||
start := build.Clock.Now()
|
start := build.Clock.Now()
|
||||||
msgBytes, err := cmsg.VMMessage().Serialize()
|
vmMsg := cmsg.VMMessage()
|
||||||
|
msgBytes, err := vmMsg.Serialize()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, xerrors.Errorf("serializing msg: %w", err)
|
return nil, xerrors.Errorf("serializing msg: %w", err)
|
||||||
}
|
}
|
||||||
@ -324,11 +325,11 @@ func (vm *FVM) ApplyMessage(ctx context.Context, cmsg types.ChainMsg) (*ApplyRet
|
|||||||
return nil, xerrors.Errorf("applying msg: %w", err)
|
return nil, xerrors.Errorf("applying msg: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
var et FvmExecutionTrace
|
duration := time.Since(start)
|
||||||
if len(ret.ExecTraceBytes) != 0 {
|
receipt := types.MessageReceipt{
|
||||||
if err = et.UnmarshalCBOR(bytes.NewReader(ret.ExecTraceBytes)); err != nil {
|
Return: ret.Return,
|
||||||
return nil, xerrors.Errorf("failed to unmarshal exectrace: %w", err)
|
ExitCode: exitcode.ExitCode(ret.ExitCode),
|
||||||
}
|
GasUsed: ret.GasUsed,
|
||||||
}
|
}
|
||||||
|
|
||||||
var aerr aerrors.ActorError
|
var aerr aerrors.ActorError
|
||||||
@ -340,12 +341,24 @@ func (vm *FVM) ApplyMessage(ctx context.Context, cmsg types.ChainMsg) (*ApplyRet
|
|||||||
aerr = aerrors.New(exitcode.ExitCode(ret.ExitCode), amsg)
|
aerr = aerrors.New(exitcode.ExitCode(ret.ExitCode), amsg)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var et types.ExecutionTrace
|
||||||
|
if len(ret.ExecTraceBytes) != 0 {
|
||||||
|
var fvmEt FvmExecutionTrace
|
||||||
|
if err = fvmEt.UnmarshalCBOR(bytes.NewReader(ret.ExecTraceBytes)); err != nil {
|
||||||
|
return nil, xerrors.Errorf("failed to unmarshal exectrace: %w", err)
|
||||||
|
}
|
||||||
|
et = fvmEt.ToExecutionTrace()
|
||||||
|
} else {
|
||||||
|
et.Msg = vmMsg
|
||||||
|
et.MsgRct = &receipt
|
||||||
|
et.Duration = duration
|
||||||
|
if aerr != nil {
|
||||||
|
et.Error = aerr.Error()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return &ApplyRet{
|
return &ApplyRet{
|
||||||
MessageReceipt: types.MessageReceipt{
|
MessageReceipt: receipt,
|
||||||
Return: ret.Return,
|
|
||||||
ExitCode: exitcode.ExitCode(ret.ExitCode),
|
|
||||||
GasUsed: ret.GasUsed,
|
|
||||||
},
|
|
||||||
GasCosts: &GasOutputs{
|
GasCosts: &GasOutputs{
|
||||||
BaseFeeBurn: ret.BaseFeeBurn,
|
BaseFeeBurn: ret.BaseFeeBurn,
|
||||||
OverEstimationBurn: ret.OverEstimationBurn,
|
OverEstimationBurn: ret.OverEstimationBurn,
|
||||||
@ -356,14 +369,15 @@ func (vm *FVM) ApplyMessage(ctx context.Context, cmsg types.ChainMsg) (*ApplyRet
|
|||||||
GasBurned: ret.GasBurned,
|
GasBurned: ret.GasBurned,
|
||||||
},
|
},
|
||||||
ActorErr: aerr,
|
ActorErr: aerr,
|
||||||
ExecutionTrace: et.ToExecutionTrace(),
|
ExecutionTrace: et,
|
||||||
Duration: time.Since(start),
|
Duration: duration,
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (vm *FVM) ApplyImplicitMessage(ctx context.Context, cmsg *types.Message) (*ApplyRet, error) {
|
func (vm *FVM) ApplyImplicitMessage(ctx context.Context, cmsg *types.Message) (*ApplyRet, error) {
|
||||||
start := build.Clock.Now()
|
start := build.Clock.Now()
|
||||||
msgBytes, err := cmsg.VMMessage().Serialize()
|
vmMsg := cmsg.VMMessage()
|
||||||
|
msgBytes, err := vmMsg.Serialize()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, xerrors.Errorf("serializing msg: %w", err)
|
return nil, xerrors.Errorf("serializing msg: %w", err)
|
||||||
}
|
}
|
||||||
@ -372,11 +386,11 @@ func (vm *FVM) ApplyImplicitMessage(ctx context.Context, cmsg *types.Message) (*
|
|||||||
return nil, xerrors.Errorf("applying msg: %w", err)
|
return nil, xerrors.Errorf("applying msg: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
var et FvmExecutionTrace
|
duration := time.Since(start)
|
||||||
if len(ret.ExecTraceBytes) != 0 {
|
receipt := types.MessageReceipt{
|
||||||
if err = et.UnmarshalCBOR(bytes.NewReader(ret.ExecTraceBytes)); err != nil {
|
Return: ret.Return,
|
||||||
return nil, xerrors.Errorf("failed to unmarshal exectrace: %w", err)
|
ExitCode: exitcode.ExitCode(ret.ExitCode),
|
||||||
}
|
GasUsed: ret.GasUsed,
|
||||||
}
|
}
|
||||||
|
|
||||||
var aerr aerrors.ActorError
|
var aerr aerrors.ActorError
|
||||||
@ -388,15 +402,27 @@ func (vm *FVM) ApplyImplicitMessage(ctx context.Context, cmsg *types.Message) (*
|
|||||||
aerr = aerrors.New(exitcode.ExitCode(ret.ExitCode), amsg)
|
aerr = aerrors.New(exitcode.ExitCode(ret.ExitCode), amsg)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var et types.ExecutionTrace
|
||||||
|
if len(ret.ExecTraceBytes) != 0 {
|
||||||
|
var fvmEt FvmExecutionTrace
|
||||||
|
if err = fvmEt.UnmarshalCBOR(bytes.NewReader(ret.ExecTraceBytes)); err != nil {
|
||||||
|
return nil, xerrors.Errorf("failed to unmarshal exectrace: %w", err)
|
||||||
|
}
|
||||||
|
et = fvmEt.ToExecutionTrace()
|
||||||
|
} else {
|
||||||
|
et.Msg = vmMsg
|
||||||
|
et.MsgRct = &receipt
|
||||||
|
et.Duration = duration
|
||||||
|
if aerr != nil {
|
||||||
|
et.Error = aerr.Error()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return &ApplyRet{
|
return &ApplyRet{
|
||||||
MessageReceipt: types.MessageReceipt{
|
MessageReceipt: receipt,
|
||||||
Return: ret.Return,
|
|
||||||
ExitCode: exitcode.ExitCode(ret.ExitCode),
|
|
||||||
GasUsed: ret.GasUsed,
|
|
||||||
},
|
|
||||||
ActorErr: aerr,
|
ActorErr: aerr,
|
||||||
ExecutionTrace: et.ToExecutionTrace(),
|
ExecutionTrace: et,
|
||||||
Duration: time.Since(start),
|
Duration: duration,
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user