From 2baf790475e88fac843dd64e1db0439651be2f61 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Wed, 1 Mar 2023 16:02:18 -0800 Subject: [PATCH] feat: vm: switch to the new exec trace format (#10372) This is now "FVM" native. Changes include: 1. Don't treat "trace" messages like off-chain messages. E.g., don't include CIDs, versions, etc. 2. Include IPLD codecs where applicable. 3. Remove fields that aren't filled by the FVM (timing, some errors, code locations, etc.). --- CHANGELOG.md | 154 +++++ api/docgen/docgen.go | 4 +- build/openrpc/full.json.gz | Bin 33317 -> 33129 bytes build/openrpc/gateway.json.gz | Bin 9295 -> 9242 bytes chain/consensus/filcns/upgrades.go | 22 +- chain/stmgr/forks.go | 11 +- chain/types/cbor_gen.go | 658 ++++++++++++++++++++ chain/types/execresult.go | 115 +--- chain/vm/cbor_gen.go | 391 ------------ chain/vm/fvm.go | 74 +-- chain/vm/runtime.go | 20 +- chain/vm/vm.go | 29 +- cli/state.go | 102 +-- cmd/lotus-bench/import.go | 103 +-- documentation/en/api-v0-methods.md | 186 +----- documentation/en/api-v1-unstable-methods.md | 186 +----- gen/main.go | 15 +- 17 files changed, 961 insertions(+), 1109 deletions(-) delete mode 100644 chain/vm/cbor_gen.go diff --git a/CHANGELOG.md b/CHANGELOG.md index 99baf80f01d..7c3bb8c3282 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,159 @@ # Lotus changelog +# UNRELEASED + +## Execution Trace Format Changes + +Execution traces (returned from `lotus state exec-trace`, `lotus state replay`, etc.), has changed to account for changes introduced by the FVM. Specifically: + +- The `Msg` field no longer matches the Filecoin message format as many of the message fields didn't make sense in on-chain sub-calls. Instead, it now has the fields `To`, `From`, `Value`, `Method`, `Params`, and `ParamsCodec` where `ParamsCodec` is a new field indicating the IPLD codec of the parameters. + - Importantly, the `Msg.CID` field has been removed. This field is still present in top-level invocation results, just not inside the execution trace itself. +- The `MsgRct` field no longer includes a `GasUsed` field and now has a `ReturnCodec` field to indicating the IPLD codec of the return value. +- The `Error` and `Duration` fields have been removed as these are not set by the FVM. The top-level message "invocation result" retains the `Error` and `Duration` fields, they've only been removed from the trace itself. +- Gas Charges no longer include "virtual" gas fields (those starting with `v...`) or source location information (`loc`) as neither field is set by the FVM. + +A note on "codecs": FVM parameters and return values are IPLD blocks where the "codec" specifies the data encoding. The codec will generally be one of: + +- `0x51`, `0x71` - CBOR or DagCBOR. You should generally treat these as equivalent. +- `0x55` - Raw bytes. +- `0x00` - Nothing. If the codec is `0x00`, the parameter and/or return value should be empty and should be treated as "void" (not specified). + +
+ +Old ExecutionTrace: + + +```json +{ + "Msg": { + "Version": 0, + "To": "f01234", + "From": "f04321", + "Nonce": 1, + "Value": "0", + "GasLimit": 0, + "GasFeeCap": "1234", + "GasPremium": "1234", + "Method": 42, + "Params": "", + "CID": { + "/": "bafyxyz....." + }, + }, + "MsgRct": { + "ExitCode": 0, + "Return": "", + "GasUsed": 12345, + }, + "Error": "", + "Duration": 568191845, + "GasCharges": [ + { + "Name": "OnMethodInvocation", + "loc": null, + "tg": 23856, + "cg": 23856, + "sg": 0, + "vtg": 0, + "vcg": 0, + "vsg": 0, + "tt": 0 + }, + { + "Name": "wasm_exec", + "loc": null, + "tg": 1764, + "cg": 1764, + "sg": 0, + "vtg": 0, + "vcg": 0, + "vsg": 0, + "tt": 0 + }, + { + "Name": "OnSyscall", + "loc": null, + "tg": 14000, + "cg": 14000, + "sg": 0, + "vtg": 0, + "vcg": 0, + "vsg": 0, + "tt": 0 + }, + ], + "Subcalls": [ + { + "Msg": { }, + "MsgRct": { }, + "Error": "", + "Duration": 1235, + "GasCharges": [], + "Subcalls": [], + }, + ] +} +``` +
+ +
+ +New ExecutionTrace: + + +```json +{ + "Msg": { + "To": "f01234", + "From": "f04321", + "Value": "0", + "Method": 42, + "Params": "", + "ParamsCodec": 81 + }, + "MsgRct": { + "ExitCode": 0, + "Return": "", + "ReturnCodec": 81 + }, + "GasCharges": [ + { + "Name": "OnMethodInvocation", + "loc": null, + "tg": 23856, + "cg": 23856, + "tt": 0 + }, + { + "Name": "wasm_exec", + "loc": null, + "tg": 1764, + "cg": 1764, + "sg": 0, + "tt": 0 + }, + { + "Name": "OnSyscall", + "loc": null, + "tg": 14000, + "cg": 14000, + "sg": 0, + "tt": 0 + }, + ], + "Subcalls": [ + { + "Msg": { }, + "MsgRct": { }, + "GasCharges": [], + "Subcalls": [], + }, + ] +} +``` + +
+ # v1.20.4 / 2023-03-17 This is a patch release intended to alleviate performance issues reported by some users since the nv18 upgrade. diff --git a/api/docgen/docgen.go b/api/docgen/docgen.go index 0e97997a6d8..10e9c2fce57 100644 --- a/api/docgen/docgen.go +++ b/api/docgen/docgen.go @@ -152,8 +152,8 @@ func init() { addExample(map[string]int{"name": 42}) addExample(map[string]time.Time{"name": time.Unix(1615243938, 0).UTC()}) addExample(&types.ExecutionTrace{ - Msg: ExampleValue("init", reflect.TypeOf(&types.Message{}), nil).(*types.Message), - MsgRct: ExampleValue("init", reflect.TypeOf(&types.MessageReceipt{}), nil).(*types.MessageReceipt), + Msg: ExampleValue("init", reflect.TypeOf(types.MessageTrace{}), nil).(types.MessageTrace), + MsgRct: ExampleValue("init", reflect.TypeOf(types.ReturnTrace{}), nil).(types.ReturnTrace), }) addExample(map[string]types.Actor{ "t01236": ExampleValue("init", reflect.TypeOf(types.Actor{}), nil).(types.Actor), diff --git a/build/openrpc/full.json.gz b/build/openrpc/full.json.gz index 95cea8d6c978c481d8b2c7892e168437d809d2aa..fe0ffec32f83a76e57010934ad78c96a704be3a5 100644 GIT binary patch literal 33129 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

}(sNXH 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 literal 33317 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 diff --git a/build/openrpc/gateway.json.gz b/build/openrpc/gateway.json.gz index a505c3a71d16bc6259638d4783c2887a02d16a08..546c1691889aaa0c4147ad8a7eaf497f3a7c1758 100644 GIT binary patch delta 8516 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 delta 8583 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 cbg.MaxLength { + return xerrors.Errorf("Value in field t.Name was too long") + } + + if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len(t.Name))); err != nil { + return err + } + if _, err := io.WriteString(w, string(t.Name)); err != nil { + return err + } + + // t.TotalGas (int64) (int64) + if t.TotalGas >= 0 { + if err := cw.WriteMajorTypeHeader(cbg.MajUnsignedInt, uint64(t.TotalGas)); err != nil { + return err + } + } else { + if err := cw.WriteMajorTypeHeader(cbg.MajNegativeInt, uint64(-t.TotalGas-1)); err != nil { + return err + } + } + + // t.ComputeGas (int64) (int64) + if t.ComputeGas >= 0 { + if err := cw.WriteMajorTypeHeader(cbg.MajUnsignedInt, uint64(t.ComputeGas)); err != nil { + return err + } + } else { + if err := cw.WriteMajorTypeHeader(cbg.MajNegativeInt, uint64(-t.ComputeGas-1)); err != nil { + return err + } + } + + // t.StorageGas (int64) (int64) + if t.StorageGas >= 0 { + if err := cw.WriteMajorTypeHeader(cbg.MajUnsignedInt, uint64(t.StorageGas)); err != nil { + return err + } + } else { + if err := cw.WriteMajorTypeHeader(cbg.MajNegativeInt, uint64(-t.StorageGas-1)); err != nil { + return err + } + } + + // t.TimeTaken (time.Duration) (int64) + if t.TimeTaken >= 0 { + if err := cw.WriteMajorTypeHeader(cbg.MajUnsignedInt, uint64(t.TimeTaken)); err != nil { + return err + } + } else { + if err := cw.WriteMajorTypeHeader(cbg.MajNegativeInt, uint64(-t.TimeTaken-1)); err != nil { + return err + } + } + return nil +} + +func (t *GasTrace) UnmarshalCBOR(r io.Reader) (err error) { + *t = GasTrace{} + + cr := cbg.NewCborReader(r) + + maj, extra, err := cr.ReadHeader() + if err != nil { + return err + } + defer func() { + if err == io.EOF { + err = io.ErrUnexpectedEOF + } + }() + + if maj != cbg.MajArray { + return fmt.Errorf("cbor input should be of type array") + } + + if extra != 5 { + return fmt.Errorf("cbor input had wrong number of fields") + } + + // t.Name (string) (string) + + { + sval, err := cbg.ReadString(cr) + if err != nil { + return err + } + + t.Name = string(sval) + } + // t.TotalGas (int64) (int64) + { + maj, extra, err := cr.ReadHeader() + var extraI int64 + if err != nil { + return err + } + switch maj { + case cbg.MajUnsignedInt: + extraI = int64(extra) + if extraI < 0 { + return fmt.Errorf("int64 positive overflow") + } + case cbg.MajNegativeInt: + extraI = int64(extra) + if extraI < 0 { + return fmt.Errorf("int64 negative oveflow") + } + extraI = -1 - extraI + default: + return fmt.Errorf("wrong type for int64 field: %d", maj) + } + + t.TotalGas = int64(extraI) + } + // t.ComputeGas (int64) (int64) + { + maj, extra, err := cr.ReadHeader() + var extraI int64 + if err != nil { + return err + } + switch maj { + case cbg.MajUnsignedInt: + extraI = int64(extra) + if extraI < 0 { + return fmt.Errorf("int64 positive overflow") + } + case cbg.MajNegativeInt: + extraI = int64(extra) + if extraI < 0 { + return fmt.Errorf("int64 negative oveflow") + } + extraI = -1 - extraI + default: + return fmt.Errorf("wrong type for int64 field: %d", maj) + } + + t.ComputeGas = int64(extraI) + } + // t.StorageGas (int64) (int64) + { + maj, extra, err := cr.ReadHeader() + var extraI int64 + if err != nil { + return err + } + switch maj { + case cbg.MajUnsignedInt: + extraI = int64(extra) + if extraI < 0 { + return fmt.Errorf("int64 positive overflow") + } + case cbg.MajNegativeInt: + extraI = int64(extra) + if extraI < 0 { + return fmt.Errorf("int64 negative oveflow") + } + extraI = -1 - extraI + default: + return fmt.Errorf("wrong type for int64 field: %d", maj) + } + + t.StorageGas = int64(extraI) + } + // t.TimeTaken (time.Duration) (int64) + { + maj, extra, err := cr.ReadHeader() + var extraI int64 + if err != nil { + return err + } + switch maj { + case cbg.MajUnsignedInt: + extraI = int64(extra) + if extraI < 0 { + return fmt.Errorf("int64 positive overflow") + } + case cbg.MajNegativeInt: + extraI = int64(extra) + if extraI < 0 { + return fmt.Errorf("int64 negative oveflow") + } + extraI = -1 - extraI + default: + return fmt.Errorf("wrong type for int64 field: %d", maj) + } + + t.TimeTaken = time.Duration(extraI) + } + return nil +} + +var lengthBufMessageTrace = []byte{134} + +func (t *MessageTrace) MarshalCBOR(w io.Writer) error { + if t == nil { + _, err := w.Write(cbg.CborNull) + return err + } + + cw := cbg.NewCborWriter(w) + + if _, err := cw.Write(lengthBufMessageTrace); err != nil { + return err + } + + // t.From (address.Address) (struct) + if err := t.From.MarshalCBOR(cw); err != nil { + return err + } + + // t.To (address.Address) (struct) + if err := t.To.MarshalCBOR(cw); err != nil { + return err + } + + // t.Value (big.Int) (struct) + if err := t.Value.MarshalCBOR(cw); err != nil { + return err + } + + // t.Method (abi.MethodNum) (uint64) + + if err := cw.WriteMajorTypeHeader(cbg.MajUnsignedInt, uint64(t.Method)); err != nil { + return err + } + + // t.Params ([]uint8) (slice) + if len(t.Params) > cbg.ByteArrayMaxLen { + return xerrors.Errorf("Byte array in field t.Params was too long") + } + + if err := cw.WriteMajorTypeHeader(cbg.MajByteString, uint64(len(t.Params))); err != nil { + return err + } + + if _, err := cw.Write(t.Params[:]); err != nil { + return err + } + + // t.ParamsCodec (uint64) (uint64) + + if err := cw.WriteMajorTypeHeader(cbg.MajUnsignedInt, uint64(t.ParamsCodec)); err != nil { + return err + } + + return nil +} + +func (t *MessageTrace) UnmarshalCBOR(r io.Reader) (err error) { + *t = MessageTrace{} + + cr := cbg.NewCborReader(r) + + maj, extra, err := cr.ReadHeader() + if err != nil { + return err + } + defer func() { + if err == io.EOF { + err = io.ErrUnexpectedEOF + } + }() + + if maj != cbg.MajArray { + return fmt.Errorf("cbor input should be of type array") + } + + if extra != 6 { + return fmt.Errorf("cbor input had wrong number of fields") + } + + // t.From (address.Address) (struct) + + { + + if err := t.From.UnmarshalCBOR(cr); err != nil { + return xerrors.Errorf("unmarshaling t.From: %w", err) + } + + } + // t.To (address.Address) (struct) + + { + + if err := t.To.UnmarshalCBOR(cr); err != nil { + return xerrors.Errorf("unmarshaling t.To: %w", err) + } + + } + // t.Value (big.Int) (struct) + + { + + if err := t.Value.UnmarshalCBOR(cr); err != nil { + return xerrors.Errorf("unmarshaling t.Value: %w", err) + } + + } + // t.Method (abi.MethodNum) (uint64) + + { + + maj, extra, err = cr.ReadHeader() + if err != nil { + return err + } + if maj != cbg.MajUnsignedInt { + return fmt.Errorf("wrong type for uint64 field") + } + t.Method = abi.MethodNum(extra) + + } + // t.Params ([]uint8) (slice) + + maj, extra, err = cr.ReadHeader() + if err != nil { + return err + } + + if extra > cbg.ByteArrayMaxLen { + return fmt.Errorf("t.Params: byte array too large (%d)", extra) + } + if maj != cbg.MajByteString { + return fmt.Errorf("expected byte array") + } + + if extra > 0 { + t.Params = make([]uint8, extra) + } + + if _, err := io.ReadFull(cr, t.Params[:]); err != nil { + return err + } + // t.ParamsCodec (uint64) (uint64) + + { + + maj, extra, err = cr.ReadHeader() + if err != nil { + return err + } + if maj != cbg.MajUnsignedInt { + return fmt.Errorf("wrong type for uint64 field") + } + t.ParamsCodec = uint64(extra) + + } + return nil +} + +var lengthBufReturnTrace = []byte{131} + +func (t *ReturnTrace) MarshalCBOR(w io.Writer) error { + if t == nil { + _, err := w.Write(cbg.CborNull) + return err + } + + cw := cbg.NewCborWriter(w) + + if _, err := cw.Write(lengthBufReturnTrace); err != nil { + return err + } + + // t.ExitCode (exitcode.ExitCode) (int64) + if t.ExitCode >= 0 { + if err := cw.WriteMajorTypeHeader(cbg.MajUnsignedInt, uint64(t.ExitCode)); err != nil { + return err + } + } else { + if err := cw.WriteMajorTypeHeader(cbg.MajNegativeInt, uint64(-t.ExitCode-1)); err != nil { + return err + } + } + + // t.Return ([]uint8) (slice) + if len(t.Return) > cbg.ByteArrayMaxLen { + return xerrors.Errorf("Byte array in field t.Return was too long") + } + + if err := cw.WriteMajorTypeHeader(cbg.MajByteString, uint64(len(t.Return))); err != nil { + return err + } + + if _, err := cw.Write(t.Return[:]); err != nil { + return err + } + + // t.ReturnCodec (uint64) (uint64) + + if err := cw.WriteMajorTypeHeader(cbg.MajUnsignedInt, uint64(t.ReturnCodec)); err != nil { + return err + } + + return nil +} + +func (t *ReturnTrace) UnmarshalCBOR(r io.Reader) (err error) { + *t = ReturnTrace{} + + cr := cbg.NewCborReader(r) + + maj, extra, err := cr.ReadHeader() + if err != nil { + return err + } + defer func() { + if err == io.EOF { + err = io.ErrUnexpectedEOF + } + }() + + if maj != cbg.MajArray { + return fmt.Errorf("cbor input should be of type array") + } + + if extra != 3 { + return fmt.Errorf("cbor input had wrong number of fields") + } + + // t.ExitCode (exitcode.ExitCode) (int64) + { + maj, extra, err := cr.ReadHeader() + var extraI int64 + if err != nil { + return err + } + switch maj { + case cbg.MajUnsignedInt: + extraI = int64(extra) + if extraI < 0 { + return fmt.Errorf("int64 positive overflow") + } + case cbg.MajNegativeInt: + extraI = int64(extra) + if extraI < 0 { + return fmt.Errorf("int64 negative oveflow") + } + extraI = -1 - extraI + default: + return fmt.Errorf("wrong type for int64 field: %d", maj) + } + + t.ExitCode = exitcode.ExitCode(extraI) + } + // t.Return ([]uint8) (slice) + + maj, extra, err = cr.ReadHeader() + if err != nil { + return err + } + + if extra > cbg.ByteArrayMaxLen { + return fmt.Errorf("t.Return: byte array too large (%d)", extra) + } + if maj != cbg.MajByteString { + return fmt.Errorf("expected byte array") + } + + if extra > 0 { + t.Return = make([]uint8, extra) + } + + if _, err := io.ReadFull(cr, t.Return[:]); err != nil { + return err + } + // t.ReturnCodec (uint64) (uint64) + + { + + maj, extra, err = cr.ReadHeader() + if err != nil { + return err + } + if maj != cbg.MajUnsignedInt { + return fmt.Errorf("wrong type for uint64 field") + } + t.ReturnCodec = uint64(extra) + + } + return nil +} + +var lengthBufExecutionTrace = []byte{132} + +func (t *ExecutionTrace) MarshalCBOR(w io.Writer) error { + if t == nil { + _, err := w.Write(cbg.CborNull) + return err + } + + cw := cbg.NewCborWriter(w) + + if _, err := cw.Write(lengthBufExecutionTrace); err != nil { + return err + } + + // t.Msg (types.MessageTrace) (struct) + if err := t.Msg.MarshalCBOR(cw); err != nil { + return err + } + + // t.MsgRct (types.ReturnTrace) (struct) + if err := t.MsgRct.MarshalCBOR(cw); err != nil { + return err + } + + // t.GasCharges ([]*types.GasTrace) (slice) + if len(t.GasCharges) > 1000000000 { + return xerrors.Errorf("Slice value in field t.GasCharges was too long") + } + + if err := cw.WriteMajorTypeHeader(cbg.MajArray, uint64(len(t.GasCharges))); err != nil { + return err + } + for _, v := range t.GasCharges { + if err := v.MarshalCBOR(cw); err != nil { + return err + } + } + + // t.Subcalls ([]types.ExecutionTrace) (slice) + if len(t.Subcalls) > 1000000000 { + return xerrors.Errorf("Slice value in field t.Subcalls was too long") + } + + if err := cw.WriteMajorTypeHeader(cbg.MajArray, uint64(len(t.Subcalls))); err != nil { + return err + } + for _, v := range t.Subcalls { + if err := v.MarshalCBOR(cw); err != nil { + return err + } + } + return nil +} + +func (t *ExecutionTrace) UnmarshalCBOR(r io.Reader) (err error) { + *t = ExecutionTrace{} + + cr := cbg.NewCborReader(r) + + maj, extra, err := cr.ReadHeader() + if err != nil { + return err + } + defer func() { + if err == io.EOF { + err = io.ErrUnexpectedEOF + } + }() + + if maj != cbg.MajArray { + return fmt.Errorf("cbor input should be of type array") + } + + if extra != 4 { + return fmt.Errorf("cbor input had wrong number of fields") + } + + // t.Msg (types.MessageTrace) (struct) + + { + + if err := t.Msg.UnmarshalCBOR(cr); err != nil { + return xerrors.Errorf("unmarshaling t.Msg: %w", err) + } + + } + // t.MsgRct (types.ReturnTrace) (struct) + + { + + if err := t.MsgRct.UnmarshalCBOR(cr); err != nil { + return xerrors.Errorf("unmarshaling t.MsgRct: %w", err) + } + + } + // t.GasCharges ([]*types.GasTrace) (slice) + + maj, extra, err = cr.ReadHeader() + if err != nil { + return err + } + + if extra > 1000000000 { + return fmt.Errorf("t.GasCharges: array too large (%d)", extra) + } + + if maj != cbg.MajArray { + return fmt.Errorf("expected cbor array") + } + + if extra > 0 { + t.GasCharges = make([]*GasTrace, extra) + } + + for i := 0; i < int(extra); i++ { + + var v GasTrace + if err := v.UnmarshalCBOR(cr); err != nil { + return err + } + + t.GasCharges[i] = &v + } + + // t.Subcalls ([]types.ExecutionTrace) (slice) + + maj, extra, err = cr.ReadHeader() + if err != nil { + return err + } + + if extra > 1000000000 { + return fmt.Errorf("t.Subcalls: array too large (%d)", extra) + } + + if maj != cbg.MajArray { + return fmt.Errorf("expected cbor array") + } + + if extra > 0 { + t.Subcalls = make([]ExecutionTrace, extra) + } + + for i := 0; i < int(extra); i++ { + + var v ExecutionTrace + if err := v.UnmarshalCBOR(cr); err != nil { + return err + } + + t.Subcalls[i] = v + } + + return nil +} diff --git a/chain/types/execresult.go b/chain/types/execresult.go index 98d06a390ab..2a25d22e28a 100644 --- a/chain/types/execresult.go +++ b/chain/types/execresult.go @@ -2,44 +2,41 @@ package types import ( "encoding/json" - "fmt" - "regexp" - "runtime" - "strings" "time" -) - -type ExecutionTrace struct { - Msg *Message - MsgRct *MessageReceipt - Error string - Duration time.Duration - GasCharges []*GasTrace - Subcalls []ExecutionTrace -} + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/go-state-types/exitcode" +) type GasTrace struct { - Name string - - Location []Loc `json:"loc"` - TotalGas int64 `json:"tg"` - ComputeGas int64 `json:"cg"` - StorageGas int64 `json:"sg"` - TotalVirtualGas int64 `json:"vtg"` - VirtualComputeGas int64 `json:"vcg"` - VirtualStorageGas int64 `json:"vsg"` + Name string + TotalGas int64 `json:"tg"` + ComputeGas int64 `json:"cg"` + StorageGas int64 `json:"sg"` + TimeTaken time.Duration `json:"tt"` +} - TimeTaken time.Duration `json:"tt"` - Extra interface{} `json:"ex,omitempty"` +type MessageTrace struct { + From address.Address + To address.Address + Value abi.TokenAmount + Method abi.MethodNum + Params []byte + ParamsCodec uint64 +} - Callers []uintptr `json:"-"` +type ReturnTrace struct { + ExitCode exitcode.ExitCode + Return []byte + ReturnCodec uint64 } -type Loc struct { - File string - Line int - Function string +type ExecutionTrace struct { + Msg MessageTrace + MsgRct ReturnTrace + GasCharges []*GasTrace `cborgen:"maxlen=1000000000"` + Subcalls []ExecutionTrace `cborgen:"maxlen=1000000000"` } func (et ExecutionTrace) SumGas() GasTrace { @@ -52,71 +49,13 @@ func SumGas(charges []*GasTrace) GasTrace { out.TotalGas += gc.TotalGas out.ComputeGas += gc.ComputeGas out.StorageGas += gc.StorageGas - - out.TotalVirtualGas += gc.TotalVirtualGas - out.VirtualComputeGas += gc.VirtualComputeGas - out.VirtualStorageGas += gc.VirtualStorageGas } return out } -func (l Loc) Show() bool { - ignorePrefix := []string{ - "reflect.", - "github.com/filecoin-project/lotus/chain/vm.(*Invoker).transform", - "github.com/filecoin-project/go-amt-ipld/", - } - for _, pre := range ignorePrefix { - if strings.HasPrefix(l.Function, pre) { - return false - } - } - return true -} -func (l Loc) String() string { - file := strings.Split(l.File, "/") - - fn := strings.Split(l.Function, "/") - var fnpkg string - if len(fn) > 2 { - fnpkg = strings.Join(fn[len(fn)-2:], "/") - } else { - fnpkg = l.Function - } - - return fmt.Sprintf("%s@%s:%d", fnpkg, file[len(file)-1], l.Line) -} - -var importantRegex = regexp.MustCompile(`github.com/filecoin-project/specs-actors/(v\d+/)?actors/builtin`) - -func (l Loc) Important() bool { - return importantRegex.MatchString(l.Function) -} - func (gt *GasTrace) MarshalJSON() ([]byte, error) { type GasTraceCopy GasTrace - if len(gt.Location) == 0 { - if len(gt.Callers) != 0 { - frames := runtime.CallersFrames(gt.Callers) - for { - frame, more := frames.Next() - if frame.Function == "github.com/filecoin-project/lotus/chain/vm.(*VM).ApplyMessage" { - break - } - l := Loc{ - File: frame.File, - Line: frame.Line, - Function: frame.Function, - } - gt.Location = append(gt.Location, l) - if !more { - break - } - } - } - } - cpy := (*GasTraceCopy)(gt) return json.Marshal(cpy) } diff --git a/chain/vm/cbor_gen.go b/chain/vm/cbor_gen.go deleted file mode 100644 index edcf065608c..00000000000 --- a/chain/vm/cbor_gen.go +++ /dev/null @@ -1,391 +0,0 @@ -// Code generated by github.com/whyrusleeping/cbor-gen. DO NOT EDIT. - -package vm - -import ( - "fmt" - "io" - "math" - "sort" - - cid "github.com/ipfs/go-cid" - cbg "github.com/whyrusleeping/cbor-gen" - xerrors "golang.org/x/xerrors" - - types "github.com/filecoin-project/lotus/chain/types" -) - -var _ = xerrors.Errorf -var _ = cid.Undef -var _ = math.E -var _ = sort.Sort - -var lengthBufFvmExecutionTrace = []byte{133} - -func (t *FvmExecutionTrace) MarshalCBOR(w io.Writer) error { - if t == nil { - _, err := w.Write(cbg.CborNull) - return err - } - - cw := cbg.NewCborWriter(w) - - if _, err := cw.Write(lengthBufFvmExecutionTrace); err != nil { - return err - } - - // t.Msg (types.Message) (struct) - if err := t.Msg.MarshalCBOR(cw); err != nil { - return err - } - - // t.MsgRct (types.MessageReceipt) (struct) - if err := t.MsgRct.MarshalCBOR(cw); err != nil { - return err - } - - // t.Error (string) (string) - if len(t.Error) > cbg.MaxLength { - return xerrors.Errorf("Value in field t.Error was too long") - } - - if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len(t.Error))); err != nil { - return err - } - if _, err := io.WriteString(w, string(t.Error)); err != nil { - return err - } - - // t.GasCharges ([]vm.FvmGasCharge) (slice) - if len(t.GasCharges) > 1000000000 { - return xerrors.Errorf("Slice value in field t.GasCharges was too long") - } - - if err := cw.WriteMajorTypeHeader(cbg.MajArray, uint64(len(t.GasCharges))); err != nil { - return err - } - for _, v := range t.GasCharges { - if err := v.MarshalCBOR(cw); err != nil { - return err - } - } - - // t.Subcalls ([]vm.FvmExecutionTrace) (slice) - if len(t.Subcalls) > 1000000000 { - return xerrors.Errorf("Slice value in field t.Subcalls was too long") - } - - if err := cw.WriteMajorTypeHeader(cbg.MajArray, uint64(len(t.Subcalls))); err != nil { - return err - } - for _, v := range t.Subcalls { - if err := v.MarshalCBOR(cw); err != nil { - return err - } - } - return nil -} - -func (t *FvmExecutionTrace) UnmarshalCBOR(r io.Reader) (err error) { - *t = FvmExecutionTrace{} - - cr := cbg.NewCborReader(r) - - maj, extra, err := cr.ReadHeader() - if err != nil { - return err - } - defer func() { - if err == io.EOF { - err = io.ErrUnexpectedEOF - } - }() - - if maj != cbg.MajArray { - return fmt.Errorf("cbor input should be of type array") - } - - if extra != 5 { - return fmt.Errorf("cbor input had wrong number of fields") - } - - // t.Msg (types.Message) (struct) - - { - - b, err := cr.ReadByte() - if err != nil { - return err - } - if b != cbg.CborNull[0] { - if err := cr.UnreadByte(); err != nil { - return err - } - t.Msg = new(types.Message) - if err := t.Msg.UnmarshalCBOR(cr); err != nil { - return xerrors.Errorf("unmarshaling t.Msg pointer: %w", err) - } - } - - } - // t.MsgRct (types.MessageReceipt) (struct) - - { - - b, err := cr.ReadByte() - if err != nil { - return err - } - if b != cbg.CborNull[0] { - if err := cr.UnreadByte(); err != nil { - return err - } - t.MsgRct = new(types.MessageReceipt) - if err := t.MsgRct.UnmarshalCBOR(cr); err != nil { - return xerrors.Errorf("unmarshaling t.MsgRct pointer: %w", err) - } - } - - } - // t.Error (string) (string) - - { - sval, err := cbg.ReadString(cr) - if err != nil { - return err - } - - t.Error = string(sval) - } - // t.GasCharges ([]vm.FvmGasCharge) (slice) - - maj, extra, err = cr.ReadHeader() - if err != nil { - return err - } - - if extra > 1000000000 { - return fmt.Errorf("t.GasCharges: array too large (%d)", extra) - } - - if maj != cbg.MajArray { - return fmt.Errorf("expected cbor array") - } - - if extra > 0 { - t.GasCharges = make([]FvmGasCharge, extra) - } - - for i := 0; i < int(extra); i++ { - - var v FvmGasCharge - if err := v.UnmarshalCBOR(cr); err != nil { - return err - } - - t.GasCharges[i] = v - } - - // t.Subcalls ([]vm.FvmExecutionTrace) (slice) - - maj, extra, err = cr.ReadHeader() - if err != nil { - return err - } - - if extra > 1000000000 { - return fmt.Errorf("t.Subcalls: array too large (%d)", extra) - } - - if maj != cbg.MajArray { - return fmt.Errorf("expected cbor array") - } - - if extra > 0 { - t.Subcalls = make([]FvmExecutionTrace, extra) - } - - for i := 0; i < int(extra); i++ { - - var v FvmExecutionTrace - if err := v.UnmarshalCBOR(cr); err != nil { - return err - } - - t.Subcalls[i] = v - } - - return nil -} - -var lengthBufFvmGasCharge = []byte{132} - -func (t *FvmGasCharge) MarshalCBOR(w io.Writer) error { - if t == nil { - _, err := w.Write(cbg.CborNull) - return err - } - - cw := cbg.NewCborWriter(w) - - if _, err := cw.Write(lengthBufFvmGasCharge); err != nil { - return err - } - - // t.Name (string) (string) - if len(t.Name) > cbg.MaxLength { - return xerrors.Errorf("Value in field t.Name was too long") - } - - if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len(t.Name))); err != nil { - return err - } - if _, err := io.WriteString(w, string(t.Name)); err != nil { - return err - } - - // t.TotalGas (int64) (int64) - if t.TotalGas >= 0 { - if err := cw.WriteMajorTypeHeader(cbg.MajUnsignedInt, uint64(t.TotalGas)); err != nil { - return err - } - } else { - if err := cw.WriteMajorTypeHeader(cbg.MajNegativeInt, uint64(-t.TotalGas-1)); err != nil { - return err - } - } - - // t.ComputeGas (int64) (int64) - if t.ComputeGas >= 0 { - if err := cw.WriteMajorTypeHeader(cbg.MajUnsignedInt, uint64(t.ComputeGas)); err != nil { - return err - } - } else { - if err := cw.WriteMajorTypeHeader(cbg.MajNegativeInt, uint64(-t.ComputeGas-1)); err != nil { - return err - } - } - - // t.StorageGas (int64) (int64) - if t.StorageGas >= 0 { - if err := cw.WriteMajorTypeHeader(cbg.MajUnsignedInt, uint64(t.StorageGas)); err != nil { - return err - } - } else { - if err := cw.WriteMajorTypeHeader(cbg.MajNegativeInt, uint64(-t.StorageGas-1)); err != nil { - return err - } - } - return nil -} - -func (t *FvmGasCharge) UnmarshalCBOR(r io.Reader) (err error) { - *t = FvmGasCharge{} - - cr := cbg.NewCborReader(r) - - maj, extra, err := cr.ReadHeader() - if err != nil { - return err - } - defer func() { - if err == io.EOF { - err = io.ErrUnexpectedEOF - } - }() - - if maj != cbg.MajArray { - return fmt.Errorf("cbor input should be of type array") - } - - if extra != 4 { - return fmt.Errorf("cbor input had wrong number of fields") - } - - // t.Name (string) (string) - - { - sval, err := cbg.ReadString(cr) - if err != nil { - return err - } - - t.Name = string(sval) - } - // t.TotalGas (int64) (int64) - { - maj, extra, err := cr.ReadHeader() - var extraI int64 - if err != nil { - return err - } - switch maj { - case cbg.MajUnsignedInt: - extraI = int64(extra) - if extraI < 0 { - return fmt.Errorf("int64 positive overflow") - } - case cbg.MajNegativeInt: - extraI = int64(extra) - if extraI < 0 { - return fmt.Errorf("int64 negative oveflow") - } - extraI = -1 - extraI - default: - return fmt.Errorf("wrong type for int64 field: %d", maj) - } - - t.TotalGas = int64(extraI) - } - // t.ComputeGas (int64) (int64) - { - maj, extra, err := cr.ReadHeader() - var extraI int64 - if err != nil { - return err - } - switch maj { - case cbg.MajUnsignedInt: - extraI = int64(extra) - if extraI < 0 { - return fmt.Errorf("int64 positive overflow") - } - case cbg.MajNegativeInt: - extraI = int64(extra) - if extraI < 0 { - return fmt.Errorf("int64 negative oveflow") - } - extraI = -1 - extraI - default: - return fmt.Errorf("wrong type for int64 field: %d", maj) - } - - t.ComputeGas = int64(extraI) - } - // t.StorageGas (int64) (int64) - { - maj, extra, err := cr.ReadHeader() - var extraI int64 - if err != nil { - return err - } - switch maj { - case cbg.MajUnsignedInt: - extraI = int64(extra) - if extraI < 0 { - return fmt.Errorf("int64 positive overflow") - } - case cbg.MajNegativeInt: - extraI = int64(extra) - if extraI < 0 { - return fmt.Errorf("int64 negative oveflow") - } - extraI = -1 - extraI - default: - return fmt.Errorf("wrong type for int64 field: %d", maj) - } - - t.StorageGas = int64(extraI) - } - return nil -} diff --git a/chain/vm/fvm.go b/chain/vm/fvm.go index 8e78e58d9df..7c79972c7ee 100644 --- a/chain/vm/fvm.go +++ b/chain/vm/fvm.go @@ -51,57 +51,6 @@ type FvmExtern struct { base cid.Cid } -type FvmGasCharge struct { - Name string - TotalGas int64 - ComputeGas int64 - StorageGas int64 -} - -// This may eventually become identical to ExecutionTrace, but we can make incremental progress towards that -type FvmExecutionTrace struct { - Msg *types.Message - MsgRct *types.MessageReceipt - Error string - GasCharges []FvmGasCharge `cborgen:"maxlen=1000000000"` - Subcalls []FvmExecutionTrace `cborgen:"maxlen=1000000000"` -} - -func (t *FvmExecutionTrace) ToExecutionTrace() types.ExecutionTrace { - if t == nil { - return types.ExecutionTrace{} - } - - ret := types.ExecutionTrace{ - Msg: t.Msg, - MsgRct: t.MsgRct, - Error: t.Error, - Subcalls: nil, // Should be nil when there are no subcalls for backwards compatibility - } - - if len(t.GasCharges) > 0 { - ret.GasCharges = make([]*types.GasTrace, len(t.GasCharges)) - for i, v := range t.GasCharges { - ret.GasCharges[i] = &types.GasTrace{ - Name: v.Name, - TotalGas: v.TotalGas, - ComputeGas: v.ComputeGas, - StorageGas: v.StorageGas, - } - } - } - - if len(t.Subcalls) > 0 { - ret.Subcalls = make([]types.ExecutionTrace, len(t.Subcalls)) - - for i, v := range t.Subcalls { - ret.Subcalls[i] = v.ToExecutionTrace() - } - } - - return ret -} - func (x *FvmExtern) TipsetCid(ctx context.Context, epoch abi.ChainEpoch) (cid.Cid, error) { tsk, err := x.tsGet(ctx, epoch) if err != nil { @@ -487,19 +436,9 @@ func (vm *FVM) ApplyMessage(ctx context.Context, cmsg types.ChainMsg) (*ApplyRet var et types.ExecutionTrace if len(ret.ExecTraceBytes) != 0 { - var fvmEt FvmExecutionTrace - if err = fvmEt.UnmarshalCBOR(bytes.NewReader(ret.ExecTraceBytes)); err != nil { + if err = et.UnmarshalCBOR(bytes.NewReader(ret.ExecTraceBytes)); err != nil { return nil, xerrors.Errorf("failed to unmarshal exectrace: %w", err) } - et = fvmEt.ToExecutionTrace() - } - - // Set the top-level exectrace info from the message and receipt for backwards compatibility - et.Msg = vmMsg - et.MsgRct = &receipt - et.Duration = duration - if aerr != nil { - et.Error = aerr.Error() } applyRet := &ApplyRet{ @@ -562,18 +501,9 @@ func (vm *FVM) ApplyImplicitMessage(ctx context.Context, cmsg *types.Message) (* var et types.ExecutionTrace if len(ret.ExecTraceBytes) != 0 { - var fvmEt FvmExecutionTrace - if err = fvmEt.UnmarshalCBOR(bytes.NewReader(ret.ExecTraceBytes)); err != nil { + if err = et.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() - } } applyRet := &ApplyRet{ diff --git a/chain/vm/runtime.go b/chain/vm/runtime.go index daa55e4f4bd..a5b10823813 100644 --- a/chain/vm/runtime.go +++ b/chain/vm/runtime.go @@ -6,7 +6,6 @@ import ( "encoding/binary" "fmt" "os" - gruntime "runtime" "time" "github.com/ipfs/go-cid" @@ -571,35 +570,18 @@ func (rt *Runtime) chargeGasFunc(skip int) func(GasCharge) { func (rt *Runtime) chargeGasInternal(gas GasCharge, skip int) aerrors.ActorError { toUse := gas.Total() if EnableDetailedTracing { - var callers [10]uintptr - - cout := gruntime.Callers(2+skip, callers[:]) - now := build.Clock.Now() if rt.lastGasCharge != nil { rt.lastGasCharge.TimeTaken = now.Sub(rt.lastGasChargeTime) } gasTrace := types.GasTrace{ - Name: gas.Name, - Extra: gas.Extra, + Name: gas.Name, TotalGas: toUse, ComputeGas: gas.ComputeGas, StorageGas: gas.StorageGas, - - VirtualComputeGas: gas.VirtualCompute, - VirtualStorageGas: gas.VirtualStorage, - - Callers: callers[:cout], - } - if gasTrace.VirtualStorageGas == 0 { - gasTrace.VirtualStorageGas = gasTrace.StorageGas - } - if gasTrace.VirtualComputeGas == 0 { - gasTrace.VirtualComputeGas = gasTrace.ComputeGas } - gasTrace.TotalVirtualGas = gasTrace.VirtualComputeGas + gasTrace.VirtualStorageGas rt.executionTrace.GasCharges = append(rt.executionTrace.GasCharges, &gasTrace) rt.lastGasChargeTime = now diff --git a/chain/vm/vm.go b/chain/vm/vm.go index f09864c2ddc..c8e3f251907 100644 --- a/chain/vm/vm.go +++ b/chain/vm/vm.go @@ -38,6 +38,7 @@ import ( ) const MaxCallDepth = 4096 +const CborCodec = 0x51 var ( log = logging.Logger("vm") @@ -125,6 +126,10 @@ func (bs *gasChargingBlocks) Put(ctx context.Context, blk block.Block) error { } func (vm *LegacyVM) makeRuntime(ctx context.Context, msg *types.Message, parent *Runtime) *Runtime { + paramsCodec := uint64(0) + if len(msg.Params) > 0 { + paramsCodec = CborCodec + } rt := &Runtime{ ctx: ctx, vm: vm, @@ -140,7 +145,14 @@ func (vm *LegacyVM) makeRuntime(ctx context.Context, msg *types.Message, parent pricelist: PricelistByEpoch(vm.blockHeight), allowInternal: true, callerValidated: false, - executionTrace: types.ExecutionTrace{Msg: msg}, + executionTrace: types.ExecutionTrace{Msg: types.MessageTrace{ + From: msg.From, + To: msg.To, + Value: msg.Value, + Method: msg.Method, + Params: msg.Params, + ParamsCodec: paramsCodec, + }}, } if parent != nil { @@ -369,15 +381,14 @@ func (vm *LegacyVM) send(ctx context.Context, msg *types.Message, parent *Runtim return nil, nil }() - mr := types.MessageReceipt{ - ExitCode: aerrors.RetCode(err), - Return: ret, - GasUsed: rt.gasUsed, + retCodec := uint64(0) + if len(ret) > 0 { + retCodec = CborCodec } - rt.executionTrace.MsgRct = &mr - rt.executionTrace.Duration = time.Since(start) - if err != nil { - rt.executionTrace.Error = err.Error() + rt.executionTrace.MsgRct = types.ReturnTrace{ + ExitCode: aerrors.RetCode(err), + Return: ret, + ReturnCodec: retCodec, } return ret, err, rt diff --git a/cli/state.go b/cli/state.go index 3d629bb0b8f..b2926d540ed 100644 --- a/cli/state.go +++ b/cli/state.go @@ -22,7 +22,6 @@ import ( "github.com/ipfs/go-cid" cbor "github.com/ipfs/go-ipld-cbor" "github.com/multiformats/go-multiaddr" - "github.com/multiformats/go-multihash" "github.com/urfave/cli/v2" cbg "github.com/whyrusleeping/cbor-gen" "golang.org/x/xerrors" @@ -1228,7 +1227,7 @@ var compStateTemplate = `

State CID: {{.Comp.Root}}
Calls
{{range .Comp.Trace}} - {{template "message" (Call .ExecutionTrace false .Msg.Cid.String)}} + {{template "message" (Call .ExecutionTrace false .MsgCid.String)}} {{end}} @@ -1253,16 +1252,12 @@ var compStateMsg = ` -
{{.Msg.From}} -> {{.Msg.To}} ({{ToFil .Msg.Value}} FIL), M{{.Msg.Method}}
- {{if not .Subcall}}
Msg CID: {{.Msg.Cid}}
{{end}} +
{{.Msg.From}} -> {{.Msg.To}} ({{ToFil .Msg.Value}}), M{{.Msg.Method}}
+ {{if not .Subcall}}
Msg CID: {{.Hash}}
{{end}} {{if gt (len .Msg.Params) 0}}
{{JsonParams ($code) (.Msg.Method) (.Msg.Params) | html}}
{{end}} - {{if PrintTiming}} -
Took {{.Duration}}, Exit: {{.MsgRct.ExitCode}}{{if gt (len .MsgRct.Return) 0}}, Return{{end}}
- {{else}}
Exit: {{.MsgRct.ExitCode}}{{if gt (len .MsgRct.Return) 0}}, Return{{end}}
- {{end}} {{if gt (len .MsgRct.Return) 0}}
{{JsonReturn ($code) (.Msg.Method) (.MsgRct.Return) | html}}
{{end}} @@ -1274,62 +1269,26 @@ var compStateMsg = `
Gas Trace - - {{define "virt" -}} - {{- if . -}} - +({{.}}) - {{- end -}} - {{- end}} + {{define "gasC" -}} - + {{- end}} {{range .GasCharges}} - - {{template "gasC" .}} - - - {{end}} - {{with sumGas .GasCharges}} - - {{template "gasC" .}} - - - {{end}} + + + {{template "gasC" .}} + + + {{end}} + {{with sumGas .GasCharges}} + + + {{template "gasC" .}} + + + {{end}}
NameTotal/Compute/StorageTime TakenLocation
NameTotal/Compute/StorageTime Taken
{{.TotalGas}}{{template "virt" .TotalVirtualGas }}/{{.ComputeGas}}{{template "virt" .VirtualComputeGas}}/{{.StorageGas}}{{template "virt" .VirtualStorageGas}}{{.TotalGas}}/{{.ComputeGas}}/{{.StorageGas}}
{{.Name}}{{if .Extra}}:{{.Extra}}{{end}}{{if PrintTiming}}{{.TimeTaken}}{{end}} - {{ $fImp := FirstImportant .Location }} - {{ if $fImp }} -
- {{ $fImp }}
- {{ $elipOn := false }} - {{ range $index, $ele := .Location -}} - {{- if $index }}
{{end -}} - {{- if .Show -}} - {{ if $elipOn }} - {{ $elipOn = false }} - - {{end}} - - {{- if .Important }}{{end -}} - {{- . -}} - {{if .Important }}{{end}} - {{else}} - {{ if not $elipOn }} - {{ $elipOn = true }} - - {{end}} -
- {{end}} -
Sum{{if PrintTiming}}{{.TimeTaken}}{{end}}
{{.Name}}{{if PrintTiming}}{{.TimeTaken}}{{end}}
Sum{{if PrintTiming}}{{.TimeTaken}}{{end}}
@@ -1337,8 +1296,8 @@ var compStateMsg = ` {{if gt (len .Subcalls) 0}}
Subcalls:
{{$hash := .Hash}} - {{range .Subcalls}} - {{template "message" (Call . true (printf "%s-%s" $hash .Msg.Cid.String))}} + {{range $i, $call := .Subcalls}} + {{template "message" (Call $call true (printf "%s-%d" $hash $i))}} {{end}} {{end}} ` @@ -1359,20 +1318,9 @@ func ComputeStateHTMLTempl(w io.Writer, ts *types.TipSet, o *api.ComputeStateOut "IsVerySlow": isVerySlow, "IntExit": func(i exitcode.ExitCode) int64 { return int64(i) }, "sumGas": types.SumGas, - "CodeStr": codeStr, + "CodeStr": builtin.ActorNameByCode, "Call": call, "PrintTiming": func() bool { return printTiming }, - "FirstImportant": func(locs []types.Loc) *types.Loc { - if len(locs) != 0 { - for _, l := range locs { - if l.Important() { - return &l - } - } - return &locs[0] - } - return nil - }, }).Parse(compStateTemplate) if err != nil { return err @@ -1402,14 +1350,6 @@ func call(e types.ExecutionTrace, subcall bool, hash string) callMeta { } } -func codeStr(c cid.Cid) string { - cmh, err := multihash.Decode(c.Hash()) - if err != nil { - panic(err) - } - return string(cmh.Digest) -} - func getMethod(code cid.Cid, method abi.MethodNum) string { return filcns.NewActorRegistry().Methods[code][method].Name // todo: use remote } diff --git a/cmd/lotus-bench/import.go b/cmd/lotus-bench/import.go index 13824d07d62..21eba7d7249 100644 --- a/cmd/lotus-bench/import.go +++ b/cmd/lotus-bench/import.go @@ -466,14 +466,11 @@ var importBenchCmd = &cli.Command{ Duration: time.Since(start), } if enc != nil { - stripCallers(tse.Trace) - if err := enc.Encode(tse); err != nil { return xerrors.Errorf("failed to write out tipsetexec: %w", err) } } if inverseChain[i-1].ParentState() != st { - stripCallers(tse.Trace) lastTrace := tse.Trace d, err := json.MarshalIndent(lastTrace, "", " ") if err != nil { @@ -492,21 +489,6 @@ var importBenchCmd = &cli.Command{ }, } -func walkExecutionTrace(et *types.ExecutionTrace) { - for _, gc := range et.GasCharges { - gc.Callers = nil - } - for _, sub := range et.Subcalls { - walkExecutionTrace(&sub) //nolint:scopelint,gosec - } -} - -func stripCallers(trace []*api.InvocResult) { - for _, t := range trace { - walkExecutionTrace(&t.ExecutionTrace) - } -} - type Invocation struct { TipSet types.TipSetKey Invoc *api.InvocResult @@ -514,28 +496,24 @@ type Invocation struct { const GasPerNs = 10 -func countGasCosts(et *types.ExecutionTrace) (int64, int64) { - var cgas, vgas int64 +func countGasCosts(et *types.ExecutionTrace) int64 { + var cgas int64 for _, gc := range et.GasCharges { cgas += gc.ComputeGas - vgas += gc.VirtualComputeGas } for _, sub := range et.Subcalls { - c, v := countGasCosts(&sub) //nolint + c := countGasCosts(&sub) //nolint cgas += c - vgas += v } - return cgas, vgas + return cgas } type stats struct { timeTaken meanVar gasRatio meanVar - - extraCovar *covar } type covar struct { @@ -680,32 +658,8 @@ func (v1 *meanVar) Combine(v2 *meanVar) { v1.m2 = m2 } -func getExtras(ex interface{}) (*string, *float64) { - if t, ok := ex.(string); ok { - return &t, nil - } - if size, ok := ex.(float64); ok { - return nil, &size - } - if exMap, ok := ex.(map[string]interface{}); ok { - t, tok := exMap["type"].(string) - size, sok := exMap["size"].(float64) - if tok && sok { - return &t, &size - } - if tok { - return &t, nil - } - if sok { - return nil, &size - } - return nil, nil - } - return nil, nil -} - func tallyGasCharges(charges map[string]*stats, et types.ExecutionTrace) { - for i, gc := range et.GasCharges { + for _, gc := range et.GasCharges { name := gc.Name if name == "OnIpldGetEnd" { continue @@ -716,45 +670,18 @@ func tallyGasCharges(charges map[string]*stats, et types.ExecutionTrace) { // discard initial very long OnVerifyPost continue } - eType, eSize := getExtras(gc.Extra) - - if name == "OnIpldGet" { - next := &types.GasTrace{} - if i+1 < len(et.GasCharges) { - next = et.GasCharges[i+1] - } - if next.Name != "OnIpldGetEnd" { - log.Warn("OnIpldGet without OnIpldGetEnd") - } else { - _, size := getExtras(next.Extra) - eSize = size - } - } - if eType != nil { - name += "-" + *eType - } compGas := gc.ComputeGas - if compGas == 0 { - compGas = gc.VirtualComputeGas - } - if compGas == 0 { - compGas = 1 - } s := charges[name] if s == nil { s = new(stats) charges[name] = s } - if eSize != nil { - if s.extraCovar == nil { - s.extraCovar = &covar{} - } - s.extraCovar.AddPoint(*eSize, tt) - } - s.timeTaken.AddPoint(tt) + if compGas == 0 { + compGas = 1 + } ratio := tt / float64(compGas) * GasPerNs s.gasRatio.AddPoint(ratio) } @@ -880,13 +807,6 @@ var importAnalyzeCmd = &cli.Command{ } s.timeTaken.Combine(&v.timeTaken) s.gasRatio.Combine(&v.gasRatio) - - if v.extraCovar != nil { - if s.extraCovar == nil { - s.extraCovar = &covar{} - } - s.extraCovar.Combine(v.extraCovar) - } } totalTime += res.totalTime } @@ -902,13 +822,6 @@ var importAnalyzeCmd = &cli.Command{ s := charges[k] fmt.Printf("%s: incr by %.4f~%.4f; tt %.4f~%.4f\n", k, s.gasRatio.Mean(), s.gasRatio.Stddev(), s.timeTaken.Mean(), s.timeTaken.Stddev()) - if s.extraCovar != nil { - fmt.Printf("\t correll: %.2f, tt = %.2f * extra + %.2f\n", s.extraCovar.Correl(), - s.extraCovar.A(), s.extraCovar.B()) - fmt.Printf("\t covar: %.2f, extra: %.2f~%.2f, tt2: %.2f~%.2f, count %.0f\n", - s.extraCovar.Covariance(), s.extraCovar.meanX, s.extraCovar.StddevX(), - s.extraCovar.meanY, s.extraCovar.StddevY(), s.extraCovar.n) - } } sort.Slice(invocs, func(i, j int) bool { diff --git a/documentation/en/api-v0-methods.md b/documentation/en/api-v0-methods.md index 3e5d0dea4da..e0b9d940c36 100644 --- a/documentation/en/api-v0-methods.md +++ b/documentation/en/api-v0-methods.md @@ -4866,95 +4866,49 @@ Response: }, "ExecutionTrace": { "Msg": { - "Version": 42, - "To": "f01234", "From": "f01234", - "Nonce": 42, + "To": "f01234", "Value": "0", - "GasLimit": 9, - "GasFeeCap": "0", - "GasPremium": "0", "Method": 1, "Params": "Ynl0ZSBhcnJheQ==", - "CID": { - "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" - } + "ParamsCodec": 42 }, "MsgRct": { "ExitCode": 0, "Return": "Ynl0ZSBhcnJheQ==", - "GasUsed": 9, - "EventsRoot": { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - } + "ReturnCodec": 42 }, - "Error": "string value", - "Duration": 60000000000, "GasCharges": [ { "Name": "string value", - "loc": [ - { - "File": "string value", - "Line": 123, - "Function": "string value" - } - ], "tg": 9, "cg": 9, "sg": 9, - "vtg": 9, - "vcg": 9, - "vsg": 9, - "tt": 60000000000, - "ex": {} + "tt": 60000000000 } ], "Subcalls": [ { "Msg": { - "Version": 42, - "To": "f01234", "From": "f01234", - "Nonce": 42, + "To": "f01234", "Value": "0", - "GasLimit": 9, - "GasFeeCap": "0", - "GasPremium": "0", "Method": 1, "Params": "Ynl0ZSBhcnJheQ==", - "CID": { - "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" - } + "ParamsCodec": 42 }, "MsgRct": { "ExitCode": 0, "Return": "Ynl0ZSBhcnJheQ==", - "GasUsed": 9, - "EventsRoot": { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - } + "ReturnCodec": 42 }, - "Error": "string value", - "Duration": 60000000000, "GasCharges": [ { "Name": "string value", - "loc": [ - { - "File": "string value", - "Line": 123, - "Function": "string value" - } - ], "tg": 9, "cg": 9, "sg": 9, - "vtg": 9, - "vcg": 9, - "vsg": 9, - "tt": 60000000000, - "ex": {} + "tt": 60000000000 } ], "Subcalls": null @@ -5142,95 +5096,49 @@ Response: }, "ExecutionTrace": { "Msg": { - "Version": 42, - "To": "f01234", "From": "f01234", - "Nonce": 42, + "To": "f01234", "Value": "0", - "GasLimit": 9, - "GasFeeCap": "0", - "GasPremium": "0", "Method": 1, "Params": "Ynl0ZSBhcnJheQ==", - "CID": { - "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" - } + "ParamsCodec": 42 }, "MsgRct": { "ExitCode": 0, "Return": "Ynl0ZSBhcnJheQ==", - "GasUsed": 9, - "EventsRoot": { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - } + "ReturnCodec": 42 }, - "Error": "string value", - "Duration": 60000000000, "GasCharges": [ { "Name": "string value", - "loc": [ - { - "File": "string value", - "Line": 123, - "Function": "string value" - } - ], "tg": 9, "cg": 9, "sg": 9, - "vtg": 9, - "vcg": 9, - "vsg": 9, - "tt": 60000000000, - "ex": {} + "tt": 60000000000 } ], "Subcalls": [ { "Msg": { - "Version": 42, - "To": "f01234", "From": "f01234", - "Nonce": 42, + "To": "f01234", "Value": "0", - "GasLimit": 9, - "GasFeeCap": "0", - "GasPremium": "0", "Method": 1, "Params": "Ynl0ZSBhcnJheQ==", - "CID": { - "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" - } + "ParamsCodec": 42 }, "MsgRct": { "ExitCode": 0, "Return": "Ynl0ZSBhcnJheQ==", - "GasUsed": 9, - "EventsRoot": { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - } + "ReturnCodec": 42 }, - "Error": "string value", - "Duration": 60000000000, "GasCharges": [ { "Name": "string value", - "loc": [ - { - "File": "string value", - "Line": 123, - "Function": "string value" - } - ], "tg": 9, "cg": 9, "sg": 9, - "vtg": 9, - "vcg": 9, - "vsg": 9, - "tt": 60000000000, - "ex": {} + "tt": 60000000000 } ], "Subcalls": null @@ -6576,95 +6484,49 @@ Response: }, "ExecutionTrace": { "Msg": { - "Version": 42, - "To": "f01234", "From": "f01234", - "Nonce": 42, + "To": "f01234", "Value": "0", - "GasLimit": 9, - "GasFeeCap": "0", - "GasPremium": "0", "Method": 1, "Params": "Ynl0ZSBhcnJheQ==", - "CID": { - "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" - } + "ParamsCodec": 42 }, "MsgRct": { "ExitCode": 0, "Return": "Ynl0ZSBhcnJheQ==", - "GasUsed": 9, - "EventsRoot": { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - } + "ReturnCodec": 42 }, - "Error": "string value", - "Duration": 60000000000, "GasCharges": [ { "Name": "string value", - "loc": [ - { - "File": "string value", - "Line": 123, - "Function": "string value" - } - ], "tg": 9, "cg": 9, "sg": 9, - "vtg": 9, - "vcg": 9, - "vsg": 9, - "tt": 60000000000, - "ex": {} + "tt": 60000000000 } ], "Subcalls": [ { "Msg": { - "Version": 42, - "To": "f01234", "From": "f01234", - "Nonce": 42, + "To": "f01234", "Value": "0", - "GasLimit": 9, - "GasFeeCap": "0", - "GasPremium": "0", "Method": 1, "Params": "Ynl0ZSBhcnJheQ==", - "CID": { - "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" - } + "ParamsCodec": 42 }, "MsgRct": { "ExitCode": 0, "Return": "Ynl0ZSBhcnJheQ==", - "GasUsed": 9, - "EventsRoot": { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - } + "ReturnCodec": 42 }, - "Error": "string value", - "Duration": 60000000000, "GasCharges": [ { "Name": "string value", - "loc": [ - { - "File": "string value", - "Line": 123, - "Function": "string value" - } - ], "tg": 9, "cg": 9, "sg": 9, - "vtg": 9, - "vcg": 9, - "vsg": 9, - "tt": 60000000000, - "ex": {} + "tt": 60000000000 } ], "Subcalls": null diff --git a/documentation/en/api-v1-unstable-methods.md b/documentation/en/api-v1-unstable-methods.md index dc98ffae918..741b1b6e67b 100644 --- a/documentation/en/api-v1-unstable-methods.md +++ b/documentation/en/api-v1-unstable-methods.md @@ -6136,95 +6136,49 @@ Response: }, "ExecutionTrace": { "Msg": { - "Version": 42, - "To": "f01234", "From": "f01234", - "Nonce": 42, + "To": "f01234", "Value": "0", - "GasLimit": 9, - "GasFeeCap": "0", - "GasPremium": "0", "Method": 1, "Params": "Ynl0ZSBhcnJheQ==", - "CID": { - "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" - } + "ParamsCodec": 42 }, "MsgRct": { "ExitCode": 0, "Return": "Ynl0ZSBhcnJheQ==", - "GasUsed": 9, - "EventsRoot": { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - } + "ReturnCodec": 42 }, - "Error": "string value", - "Duration": 60000000000, "GasCharges": [ { "Name": "string value", - "loc": [ - { - "File": "string value", - "Line": 123, - "Function": "string value" - } - ], "tg": 9, "cg": 9, "sg": 9, - "vtg": 9, - "vcg": 9, - "vsg": 9, - "tt": 60000000000, - "ex": {} + "tt": 60000000000 } ], "Subcalls": [ { "Msg": { - "Version": 42, - "To": "f01234", "From": "f01234", - "Nonce": 42, + "To": "f01234", "Value": "0", - "GasLimit": 9, - "GasFeeCap": "0", - "GasPremium": "0", "Method": 1, "Params": "Ynl0ZSBhcnJheQ==", - "CID": { - "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" - } + "ParamsCodec": 42 }, "MsgRct": { "ExitCode": 0, "Return": "Ynl0ZSBhcnJheQ==", - "GasUsed": 9, - "EventsRoot": { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - } + "ReturnCodec": 42 }, - "Error": "string value", - "Duration": 60000000000, "GasCharges": [ { "Name": "string value", - "loc": [ - { - "File": "string value", - "Line": 123, - "Function": "string value" - } - ], "tg": 9, "cg": 9, "sg": 9, - "vtg": 9, - "vcg": 9, - "vsg": 9, - "tt": 60000000000, - "ex": {} + "tt": 60000000000 } ], "Subcalls": null @@ -6412,95 +6366,49 @@ Response: }, "ExecutionTrace": { "Msg": { - "Version": 42, - "To": "f01234", "From": "f01234", - "Nonce": 42, + "To": "f01234", "Value": "0", - "GasLimit": 9, - "GasFeeCap": "0", - "GasPremium": "0", "Method": 1, "Params": "Ynl0ZSBhcnJheQ==", - "CID": { - "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" - } + "ParamsCodec": 42 }, "MsgRct": { "ExitCode": 0, "Return": "Ynl0ZSBhcnJheQ==", - "GasUsed": 9, - "EventsRoot": { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - } + "ReturnCodec": 42 }, - "Error": "string value", - "Duration": 60000000000, "GasCharges": [ { "Name": "string value", - "loc": [ - { - "File": "string value", - "Line": 123, - "Function": "string value" - } - ], "tg": 9, "cg": 9, "sg": 9, - "vtg": 9, - "vcg": 9, - "vsg": 9, - "tt": 60000000000, - "ex": {} + "tt": 60000000000 } ], "Subcalls": [ { "Msg": { - "Version": 42, - "To": "f01234", "From": "f01234", - "Nonce": 42, + "To": "f01234", "Value": "0", - "GasLimit": 9, - "GasFeeCap": "0", - "GasPremium": "0", "Method": 1, "Params": "Ynl0ZSBhcnJheQ==", - "CID": { - "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" - } + "ParamsCodec": 42 }, "MsgRct": { "ExitCode": 0, "Return": "Ynl0ZSBhcnJheQ==", - "GasUsed": 9, - "EventsRoot": { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - } + "ReturnCodec": 42 }, - "Error": "string value", - "Duration": 60000000000, "GasCharges": [ { "Name": "string value", - "loc": [ - { - "File": "string value", - "Line": 123, - "Function": "string value" - } - ], "tg": 9, "cg": 9, "sg": 9, - "vtg": 9, - "vcg": 9, - "vsg": 9, - "tt": 60000000000, - "ex": {} + "tt": 60000000000 } ], "Subcalls": null @@ -7929,95 +7837,49 @@ Response: }, "ExecutionTrace": { "Msg": { - "Version": 42, - "To": "f01234", "From": "f01234", - "Nonce": 42, + "To": "f01234", "Value": "0", - "GasLimit": 9, - "GasFeeCap": "0", - "GasPremium": "0", "Method": 1, "Params": "Ynl0ZSBhcnJheQ==", - "CID": { - "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" - } + "ParamsCodec": 42 }, "MsgRct": { "ExitCode": 0, "Return": "Ynl0ZSBhcnJheQ==", - "GasUsed": 9, - "EventsRoot": { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - } + "ReturnCodec": 42 }, - "Error": "string value", - "Duration": 60000000000, "GasCharges": [ { "Name": "string value", - "loc": [ - { - "File": "string value", - "Line": 123, - "Function": "string value" - } - ], "tg": 9, "cg": 9, "sg": 9, - "vtg": 9, - "vcg": 9, - "vsg": 9, - "tt": 60000000000, - "ex": {} + "tt": 60000000000 } ], "Subcalls": [ { "Msg": { - "Version": 42, - "To": "f01234", "From": "f01234", - "Nonce": 42, + "To": "f01234", "Value": "0", - "GasLimit": 9, - "GasFeeCap": "0", - "GasPremium": "0", "Method": 1, "Params": "Ynl0ZSBhcnJheQ==", - "CID": { - "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" - } + "ParamsCodec": 42 }, "MsgRct": { "ExitCode": 0, "Return": "Ynl0ZSBhcnJheQ==", - "GasUsed": 9, - "EventsRoot": { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - } + "ReturnCodec": 42 }, - "Error": "string value", - "Duration": 60000000000, "GasCharges": [ { "Name": "string value", - "loc": [ - { - "File": "string value", - "Line": 123, - "Function": "string value" - } - ], "tg": 9, "cg": 9, "sg": 9, - "vtg": 9, - "vcg": 9, - "vsg": 9, - "tt": 60000000000, - "ex": {} + "tt": 60000000000 } ], "Subcalls": null diff --git a/gen/main.go b/gen/main.go index a3891778a10..0cd3999c38a 100644 --- a/gen/main.go +++ b/gen/main.go @@ -11,7 +11,6 @@ import ( "github.com/filecoin-project/lotus/chain/exchange" "github.com/filecoin-project/lotus/chain/market" "github.com/filecoin-project/lotus/chain/types" - "github.com/filecoin-project/lotus/chain/vm" "github.com/filecoin-project/lotus/cmd/lotus-shed/shedgen" "github.com/filecoin-project/lotus/node/hello" "github.com/filecoin-project/lotus/paychmgr" @@ -37,15 +36,11 @@ func main() { types.StateInfo0{}, types.Event{}, types.EventEntry{}, - ) - if err != nil { - fmt.Println(err) - os.Exit(1) - } - - err = gen.WriteTupleEncodersToFile("./chain/vm/cbor_gen.go", "vm", - vm.FvmExecutionTrace{}, - vm.FvmGasCharge{}, + // Tracing + types.GasTrace{}, + types.MessageTrace{}, + types.ReturnTrace{}, + types.ExecutionTrace{}, ) if err != nil { fmt.Println(err)