From bd59bba6f53bac058c80e3bb9ae874bee813e9ac Mon Sep 17 00:00:00 2001 From: jennijuju Date: Wed, 22 Nov 2023 19:19:55 +0800 Subject: [PATCH] fix merge mistake and docs gen --- build/openrpc/full.json.gz | Bin 34204 -> 34820 bytes build/openrpc/gateway.json.gz | Bin 10466 -> 11865 bytes build/openrpc/miner.json.gz | Bin 16368 -> 16368 bytes build/openrpc/worker.json.gz | Bin 6048 -> 6047 bytes documentation/en/cli-lotus-miner.md | 4 - documentation/en/cli-lotus-worker.md | 4 - documentation/en/cli-lotus.md | 4 - node/impl/full/eth.go | 1299 +++----------------------- 8 files changed, 148 insertions(+), 1163 deletions(-) diff --git a/build/openrpc/full.json.gz b/build/openrpc/full.json.gz index f66f0d586de33872dd3da951cec472e902061290..b72419e4f17c9265669e26553617b3eba8681c80 100644 GIT binary patch literal 34820 zcmZ^qQ;;Z2)TP_DZQIsq+qSz;+qP}nwr$(CZFA23XC`7^rXI3()9L`LPxZ?A

~;jcMAspS?q>RxP1d%*xcE>S5C_Q7 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 U{PFYu2LJ&7|KPc?uUGsA01j>=BLDyZ literal 34204 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 -3D@#dB;3 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 diff --git a/build/openrpc/gateway.json.gz b/build/openrpc/gateway.json.gz index 68b9752e0364b264e71baf822c98696559b83da2..90f41df1d370ca94787c61d8a572cc442c9b5a70 100644 GIT binary patch literal 11865 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 Ii~|Dr9}@Q}&j0`b literal 10466 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 Qe1G=`4#K~wg8%rx0Ho8kM*si- diff --git a/build/openrpc/miner.json.gz b/build/openrpc/miner.json.gz index ec6b20dd2db832fa35f97059de5c2c783bf094f0..f5d61d7a8fd39b629750e964b4b3cd6e3bccfefa 100644 GIT binary patch delta 14019 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 delta 5560 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

>>>>>> release/v1.25.0 COMMANDS: init Initialize a lotus miner repo diff --git a/documentation/en/cli-lotus-worker.md b/documentation/en/cli-lotus-worker.md index f67ad38c5..a47879738 100644 --- a/documentation/en/cli-lotus-worker.md +++ b/documentation/en/cli-lotus-worker.md @@ -7,11 +7,7 @@ USAGE: lotus-worker [global options] command [command options] [arguments...] VERSION: -<<<<<<< HEAD - 1.24.0 -======= 1.25.0 ->>>>>>> release/v1.25.0 COMMANDS: run Start lotus worker diff --git a/documentation/en/cli-lotus.md b/documentation/en/cli-lotus.md index 993afe817..46635abcf 100644 --- a/documentation/en/cli-lotus.md +++ b/documentation/en/cli-lotus.md @@ -7,11 +7,7 @@ USAGE: lotus [global options] command [command options] [arguments...] VERSION: -<<<<<<< HEAD - 1.24.0 -======= 1.25.0 ->>>>>>> release/v1.25.0 COMMANDS: daemon Start a lotus daemon process diff --git a/node/impl/full/eth.go b/node/impl/full/eth.go index 424756f81..2a7293956 100644 --- a/node/impl/full/eth.go +++ b/node/impl/full/eth.go @@ -3,20 +3,16 @@ package full import ( "bytes" "context" - "encoding/json" "errors" "fmt" "os" "sort" "strconv" "strings" - "sync" "time" - "github.com/google/uuid" "github.com/ipfs/go-cid" cbg "github.com/whyrusleeping/cbor-gen" - "github.com/zyedidia/generic/queue" "go.uber.org/fx" "golang.org/x/xerrors" @@ -24,10 +20,9 @@ import ( "github.com/filecoin-project/go-jsonrpc" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/big" + "github.com/filecoin-project/go-state-types/builtin" builtintypes "github.com/filecoin-project/go-state-types/builtin" - "github.com/filecoin-project/go-state-types/builtin/v10/eam" "github.com/filecoin-project/go-state-types/builtin/v10/evm" - "github.com/filecoin-project/go-state-types/crypto" "github.com/filecoin-project/go-state-types/exitcode" "github.com/filecoin-project/lotus/api" @@ -42,7 +37,6 @@ import ( "github.com/filecoin-project/lotus/chain/store" "github.com/filecoin-project/lotus/chain/types" "github.com/filecoin-project/lotus/chain/types/ethtypes" - "github.com/filecoin-project/lotus/chain/vm" "github.com/filecoin-project/lotus/node/modules/dtypes" ) @@ -77,6 +71,8 @@ type EthModuleAPI interface { EthMaxPriorityFeePerGas(ctx context.Context) (ethtypes.EthBigInt, error) EthSendRawTransaction(ctx context.Context, rawTx ethtypes.EthBytes) (ethtypes.EthHash, error) Web3ClientVersion(ctx context.Context) (string, error) + EthTraceBlock(ctx context.Context, blkNum string) ([]*ethtypes.EthTraceBlock, error) + EthTraceReplayBlockTransactions(ctx context.Context, blkNum string, traceTypes []string) ([]*ethtypes.EthTraceReplayBlockTransaction, error) } type EthEventAPI interface { @@ -241,101 +237,8 @@ func (a *EthModule) EthGetBlockByHash(ctx context.Context, blkHash ethtypes.EthH return newEthBlockFromFilecoinTipSet(ctx, ts, fullTxInfo, a.Chain, a.StateAPI) } -func (a *EthModule) getTipsetByEthBlockNumberOrHash(ctx context.Context, blkParam ethtypes.EthBlockNumberOrHash) (*types.TipSet, error) { - head := a.Chain.GetHeaviestTipSet() - - predefined := blkParam.PredefinedBlock - if predefined != nil { - if *predefined == "earliest" { - return nil, fmt.Errorf("block param \"earliest\" is not supported") - } else if *predefined == "pending" { - return head, nil - } else if *predefined == "latest" { - parent, err := a.Chain.GetTipSetFromKey(ctx, head.Parents()) - if err != nil { - return nil, fmt.Errorf("cannot get parent tipset") - } - return parent, nil - } else { - return nil, fmt.Errorf("unknown predefined block %s", *predefined) - } - } - - if blkParam.BlockNumber != nil { - height := abi.ChainEpoch(*blkParam.BlockNumber) - if height > head.Height()-1 { - return nil, fmt.Errorf("requested a future epoch (beyond 'latest')") - } - ts, err := a.ChainAPI.ChainGetTipSetByHeight(ctx, height, head.Key()) - if err != nil { - return nil, fmt.Errorf("cannot get tipset at height: %v", height) - } - return ts, nil - } - - if blkParam.BlockHash != nil { - ts, err := a.Chain.GetTipSetByCid(ctx, blkParam.BlockHash.ToCid()) - if err != nil { - return nil, fmt.Errorf("cannot get tipset by hash: %v", err) - } - - // verify that the tipset is in the canonical chain - if blkParam.RequireCanonical { - // walk up the current chain (our head) until we reach ts.Height() - walkTs, err := a.ChainAPI.ChainGetTipSetByHeight(ctx, ts.Height(), head.Key()) - if err != nil { - return nil, fmt.Errorf("cannot get tipset at height: %v", ts.Height()) - } - - // verify that it equals the expected tipset - if !walkTs.Equals(ts) { - return nil, fmt.Errorf("tipset is not canonical") - } - } - - return ts, nil - } - - return nil, errors.New("invalid block param") -} - -func (a *EthModule) parseBlkParam(ctx context.Context, blkParam string, strict bool) (*types.TipSet, error) { - if blkParam == "earliest" { - return nil, fmt.Errorf("block param \"earliest\" is not supported") - } - - head := a.Chain.GetHeaviestTipSet() - switch blkParam { - case "pending": - return head, nil - case "latest": - parent, err := a.Chain.GetTipSetFromKey(ctx, head.Parents()) - if err != nil { - return nil, fmt.Errorf("cannot get parent tipset") - } - return parent, nil - default: - var num ethtypes.EthUint64 - err := num.UnmarshalJSON([]byte(`"` + blkParam + `"`)) - if err != nil { - return nil, fmt.Errorf("cannot parse block number: %v", err) - } - if abi.ChainEpoch(num) > head.Height()-1 { - return nil, fmt.Errorf("requested a future epoch (beyond 'latest')") - } - ts, err := a.ChainAPI.ChainGetTipSetByHeight(ctx, abi.ChainEpoch(num), head.Key()) - if err != nil { - return nil, fmt.Errorf("cannot get tipset at height: %v", num) - } - if strict && ts.Height() != abi.ChainEpoch(num) { - return nil, ErrNullRound - } - return ts, nil - } -} - func (a *EthModule) EthGetBlockByNumber(ctx context.Context, blkParam string, fullTxInfo bool) (ethtypes.EthBlock, error) { - ts, err := a.parseBlkParam(ctx, blkParam, true) + ts, err := getTipsetByBlockNumber(ctx, a.Chain, blkParam, true) if err != nil { return ethtypes.EthBlock{}, err } @@ -431,7 +334,7 @@ func (a *EthModule) EthGetMessageCidByTransactionHash(ctx context.Context, txHas } func (a *EthModule) EthGetTransactionHashByCid(ctx context.Context, cid cid.Cid) (*ethtypes.EthHash, error) { - hash, err := EthTxHashFromMessageCid(ctx, cid, a.StateAPI) + hash, err := ethTxHashFromMessageCid(ctx, cid, a.StateAPI) if hash == ethtypes.EmptyEthHash { // not found return nil, nil @@ -446,7 +349,7 @@ func (a *EthModule) EthGetTransactionCount(ctx context.Context, sender ethtypes. return ethtypes.EthUint64(0), nil } - ts, err := a.getTipsetByEthBlockNumberOrHash(ctx, blkParam) + ts, err := getTipsetByEthBlockNumberOrHash(ctx, a.Chain, blkParam) if err != nil { return ethtypes.EthUint64(0), xerrors.Errorf("failed to process block param: %v; %w", blkParam, err) } @@ -534,7 +437,7 @@ func (a *EthModule) EthGetCode(ctx context.Context, ethAddr ethtypes.EthAddress, return nil, xerrors.Errorf("cannot get Filecoin address: %w", err) } - ts, err := a.getTipsetByEthBlockNumberOrHash(ctx, blkParam) + ts, err := getTipsetByEthBlockNumberOrHash(ctx, a.Chain, blkParam) if err != nil { return nil, xerrors.Errorf("failed to process block param: %v; %w", blkParam, err) } @@ -613,7 +516,7 @@ func (a *EthModule) EthGetCode(ctx context.Context, ethAddr ethtypes.EthAddress, } func (a *EthModule) EthGetStorageAt(ctx context.Context, ethAddr ethtypes.EthAddress, position ethtypes.EthBytes, blkParam ethtypes.EthBlockNumberOrHash) (ethtypes.EthBytes, error) { - ts, err := a.getTipsetByEthBlockNumberOrHash(ctx, blkParam) + ts, err := getTipsetByEthBlockNumberOrHash(ctx, a.Chain, blkParam) if err != nil { return nil, xerrors.Errorf("failed to process block param: %v; %w", blkParam, err) } @@ -709,7 +612,7 @@ func (a *EthModule) EthGetBalance(ctx context.Context, address ethtypes.EthAddre return ethtypes.EthBigInt{}, err } - ts, err := a.getTipsetByEthBlockNumberOrHash(ctx, blkParam) + ts, err := getTipsetByEthBlockNumberOrHash(ctx, a.Chain, blkParam) if err != nil { return ethtypes.EthBigInt{}, xerrors.Errorf("failed to process block param: %v; %w", blkParam, err) } @@ -790,7 +693,7 @@ func (a *EthModule) EthFeeHistory(ctx context.Context, p jsonrpc.RawParams) (eth } } - ts, err := a.parseBlkParam(ctx, params.NewestBlkNum, false) + ts, err := getTipsetByBlockNumber(ctx, a.Chain, params.NewestBlkNum, false) if err != nil { return ethtypes.EthFeeHistory{}, fmt.Errorf("bad block parameter %s: %s", params.NewestBlkNum, err) } @@ -825,10 +728,11 @@ func (a *EthModule) EthFeeHistory(ctx context.Context, p jsonrpc.RawParams) (eth } rewards, totalGasUsed := calculateRewardsAndGasUsed(rewardPercentiles, txGasRewards) + maxGas := build.BlockGasLimit * int64(len(ts.Blocks())) // arrays should be reversed at the end baseFeeArray = append(baseFeeArray, ethtypes.EthBigInt(basefee)) - gasUsedRatioArray = append(gasUsedRatioArray, float64(totalGasUsed)/float64(build.BlockGasLimit)) + gasUsedRatioArray = append(gasUsedRatioArray, float64(totalGasUsed)/float64(maxGas)) rewardsArray = append(rewardsArray, rewards) oldestBlkHeight = uint64(ts.Height()) blocksIncluded++ @@ -922,62 +826,145 @@ func (a *EthModule) Web3ClientVersion(ctx context.Context) (string, error) { return build.UserVersion(), nil } -func (a *EthModule) ethCallToFilecoinMessage(ctx context.Context, tx ethtypes.EthCall) (*types.Message, error) { - var from address.Address - if tx.From == nil || *tx.From == (ethtypes.EthAddress{}) { - // Send from the filecoin "system" address. - var err error - from, err = (ethtypes.EthAddress{}).ToFilecoinAddress() - if err != nil { - return nil, fmt.Errorf("failed to construct the ethereum system address: %w", err) - } - } else { - // The from address must be translatable to an f4 address. - var err error - from, err = tx.From.ToFilecoinAddress() - if err != nil { - return nil, fmt.Errorf("failed to translate sender address (%s): %w", tx.From.String(), err) - } - if p := from.Protocol(); p != address.Delegated { - return nil, fmt.Errorf("expected a class 4 address, got: %d: %w", p, err) - } +func (a *EthModule) EthTraceBlock(ctx context.Context, blkNum string) ([]*ethtypes.EthTraceBlock, error) { + ts, err := getTipsetByBlockNumber(ctx, a.Chain, blkNum, false) + if err != nil { + return nil, xerrors.Errorf("failed to get tipset: %w", err) } - var params []byte - if len(tx.Data) > 0 { - initcode := abi.CborBytes(tx.Data) - params2, err := actors.SerializeParams(&initcode) - if err != nil { - return nil, fmt.Errorf("failed to serialize params: %w", err) - } - params = params2 + _, trace, err := a.StateManager.ExecutionTrace(ctx, ts) + if err != nil { + return nil, xerrors.Errorf("failed when calling ExecutionTrace: %w", err) } - var to address.Address - var method abi.MethodNum - if tx.To == nil { - // this is a contract creation - to = builtintypes.EthereumAddressManagerActorAddr - method = builtintypes.MethodsEAM.CreateExternal - } else { - addr, err := tx.To.ToFilecoinAddress() - if err != nil { - return nil, xerrors.Errorf("cannot get Filecoin address: %w", err) - } - to = addr - method = builtintypes.MethodsEVM.InvokeContract + tsParent, err := a.ChainAPI.ChainGetTipSetByHeight(ctx, ts.Height()+1, a.Chain.GetHeaviestTipSet().Key()) + if err != nil { + return nil, xerrors.Errorf("cannot get tipset at height: %v", ts.Height()+1) } - return &types.Message{ - From: from, - To: to, - Value: big.Int(tx.Value), - Method: method, - Params: params, - GasLimit: build.BlockGasLimit, - GasFeeCap: big.Zero(), - GasPremium: big.Zero(), - }, nil + msgs, err := a.ChainGetParentMessages(ctx, tsParent.Blocks()[0].Cid()) + if err != nil { + return nil, xerrors.Errorf("failed to get parent messages: %w", err) + } + + cid, err := ts.Key().Cid() + if err != nil { + return nil, xerrors.Errorf("failed to get tipset key cid: %w", err) + } + + blkHash, err := ethtypes.EthHashFromCid(cid) + if err != nil { + return nil, xerrors.Errorf("failed to parse eth hash from cid: %w", err) + } + + allTraces := make([]*ethtypes.EthTraceBlock, 0, len(trace)) + msgIdx := 0 + for _, ir := range trace { + // ignore messages from system actor + if ir.Msg.From == builtinactors.SystemActorAddr { + continue + } + + // as we include TransactionPosition in the results, lets do sanity checking that the + // traces are indeed in the message execution order + if ir.Msg.Cid() != msgs[msgIdx].Message.Cid() { + return nil, xerrors.Errorf("traces are not in message execution order") + } + msgIdx++ + + txHash, err := a.EthGetTransactionHashByCid(ctx, ir.MsgCid) + if err != nil { + return nil, xerrors.Errorf("failed to get transaction hash by cid: %w", err) + } + if txHash == nil { + log.Warnf("cannot find transaction hash for cid %s", ir.MsgCid) + continue + } + + traces := []*ethtypes.EthTrace{} + err = buildTraces(ctx, &traces, nil, []int{}, ir.ExecutionTrace, int64(ts.Height()), a.StateAPI) + if err != nil { + return nil, xerrors.Errorf("failed building traces: %w", err) + } + + traceBlocks := make([]*ethtypes.EthTraceBlock, 0, len(traces)) + for _, trace := range traces { + traceBlocks = append(traceBlocks, ðtypes.EthTraceBlock{ + EthTrace: trace, + BlockHash: blkHash, + BlockNumber: int64(ts.Height()), + TransactionHash: *txHash, + TransactionPosition: msgIdx, + }) + } + + allTraces = append(allTraces, traceBlocks...) + } + + return allTraces, nil +} + +func (a *EthModule) EthTraceReplayBlockTransactions(ctx context.Context, blkNum string, traceTypes []string) ([]*ethtypes.EthTraceReplayBlockTransaction, error) { + if len(traceTypes) != 1 || traceTypes[0] != "trace" { + return nil, fmt.Errorf("only 'trace' is supported") + } + + ts, err := getTipsetByBlockNumber(ctx, a.Chain, blkNum, false) + if err != nil { + return nil, xerrors.Errorf("failed to get tipset: %w", err) + } + + _, trace, err := a.StateManager.ExecutionTrace(ctx, ts) + if err != nil { + return nil, xerrors.Errorf("failed when calling ExecutionTrace: %w", err) + } + + allTraces := make([]*ethtypes.EthTraceReplayBlockTransaction, 0, len(trace)) + for _, ir := range trace { + // ignore messages from system actor + if ir.Msg.From == builtinactors.SystemActorAddr { + continue + } + + txHash, err := a.EthGetTransactionHashByCid(ctx, ir.MsgCid) + if err != nil { + return nil, xerrors.Errorf("failed to get transaction hash by cid: %w", err) + } + if txHash == nil { + log.Warnf("cannot find transaction hash for cid %s", ir.MsgCid) + continue + } + + var output ethtypes.EthBytes + invokeCreateOnEAM := ir.Msg.To == builtin.EthereumAddressManagerActorAddr && (ir.Msg.Method == builtin.MethodsEAM.Create || ir.Msg.Method == builtin.MethodsEAM.Create2) + if ir.Msg.Method == builtin.MethodsEVM.InvokeContract || invokeCreateOnEAM { + output, err = decodePayload(ir.ExecutionTrace.MsgRct.Return, ir.ExecutionTrace.MsgRct.ReturnCodec) + if err != nil { + return nil, xerrors.Errorf("failed to decode payload: %w", err) + } + } else { + output, err = handleFilecoinMethodOutput(ir.ExecutionTrace.MsgRct.ExitCode, ir.ExecutionTrace.MsgRct.ReturnCodec, ir.ExecutionTrace.MsgRct.Return) + if err != nil { + return nil, xerrors.Errorf("could not convert output: %w", err) + } + } + + t := ethtypes.EthTraceReplayBlockTransaction{ + Output: output, + TransactionHash: *txHash, + StateDiff: nil, + VmTrace: nil, + } + + err = buildTraces(ctx, &t.Trace, nil, []int{}, ir.ExecutionTrace, int64(ts.Height()), a.StateAPI) + if err != nil { + return nil, xerrors.Errorf("failed building traces: %w", err) + } + + allTraces = append(allTraces, &t) + } + + return allTraces, nil } func (a *EthModule) applyMessage(ctx context.Context, msg *types.Message, tsk types.TipSetKey) (res *api.InvocResult, err error) { @@ -1013,7 +1000,7 @@ func (a *EthModule) applyMessage(ctx context.Context, msg *types.Message, tsk ty } func (a *EthModule) EthEstimateGas(ctx context.Context, tx ethtypes.EthCall) (ethtypes.EthUint64, error) { - msg, err := a.ethCallToFilecoinMessage(ctx, tx) + msg, err := ethCallToFilecoinMessage(ctx, tx) if err != nil { return ethtypes.EthUint64(0), err } @@ -1171,12 +1158,12 @@ func ethGasSearch( } func (a *EthModule) EthCall(ctx context.Context, tx ethtypes.EthCall, blkParam ethtypes.EthBlockNumberOrHash) (ethtypes.EthBytes, error) { - msg, err := a.ethCallToFilecoinMessage(ctx, tx) + msg, err := ethCallToFilecoinMessage(ctx, tx) if err != nil { return nil, xerrors.Errorf("failed to convert ethcall to filecoin message: %w", err) } - ts, err := a.getTipsetByEthBlockNumberOrHash(ctx, blkParam) + ts, err := getTipsetByEthBlockNumberOrHash(ctx, a.Chain, blkParam) if err != nil { return nil, xerrors.Errorf("failed to process block param: %v; %w", blkParam, err) } @@ -1577,977 +1564,6 @@ func (e *EthEvent) GC(ctx context.Context, ttl time.Duration) { } } -type filterEventCollector interface { - TakeCollectedEvents(context.Context) []*filter.CollectedEvent -} - -type filterMessageCollector interface { - TakeCollectedMessages(context.Context) []*types.SignedMessage -} - -type filterTipSetCollector interface { - TakeCollectedTipSets(context.Context) []types.TipSetKey -} - -func ethLogFromEvent(entries []types.EventEntry) (data []byte, topics []ethtypes.EthHash, ok bool) { - var ( - topicsFound [4]bool - topicsFoundCount int - dataFound bool - ) - // Topics must be non-nil, even if empty. So we might as well pre-allocate for 4 (the max). - topics = make([]ethtypes.EthHash, 0, 4) - for _, entry := range entries { - // Drop events with non-raw topics to avoid mistakes. - if entry.Codec != cid.Raw { - log.Warnw("did not expect an event entry with a non-raw codec", "codec", entry.Codec, "key", entry.Key) - return nil, nil, false - } - // Check if the key is t1..t4 - if len(entry.Key) == 2 && "t1" <= entry.Key && entry.Key <= "t4" { - // '1' - '1' == 0, etc. - idx := int(entry.Key[1] - '1') - - // Drop events with mis-sized topics. - if len(entry.Value) != 32 { - log.Warnw("got an EVM event topic with an invalid size", "key", entry.Key, "size", len(entry.Value)) - return nil, nil, false - } - - // Drop events with duplicate topics. - if topicsFound[idx] { - log.Warnw("got a duplicate EVM event topic", "key", entry.Key) - return nil, nil, false - } - topicsFound[idx] = true - topicsFoundCount++ - - // Extend the topics array - for len(topics) <= idx { - topics = append(topics, ethtypes.EthHash{}) - } - copy(topics[idx][:], entry.Value) - } else if entry.Key == "d" { - // Drop events with duplicate data fields. - if dataFound { - log.Warnw("got duplicate EVM event data") - return nil, nil, false - } - - dataFound = true - data = entry.Value - } else { - // Skip entries we don't understand (makes it easier to extend things). - // But we warn for now because we don't expect them. - log.Warnw("unexpected event entry", "key", entry.Key) - } - - } - - // Drop events with skipped topics. - if len(topics) != topicsFoundCount { - log.Warnw("EVM event topic length mismatch", "expected", len(topics), "actual", topicsFoundCount) - return nil, nil, false - } - return data, topics, true -} - -func ethFilterResultFromEvents(evs []*filter.CollectedEvent, sa StateAPI) (*ethtypes.EthFilterResult, error) { - res := ðtypes.EthFilterResult{} - for _, ev := range evs { - log := ethtypes.EthLog{ - Removed: ev.Reverted, - LogIndex: ethtypes.EthUint64(ev.EventIdx), - TransactionIndex: ethtypes.EthUint64(ev.MsgIdx), - BlockNumber: ethtypes.EthUint64(ev.Height), - } - var ( - err error - ok bool - ) - - log.Data, log.Topics, ok = ethLogFromEvent(ev.Entries) - if !ok { - continue - } - - log.Address, err = ethtypes.EthAddressFromFilecoinAddress(ev.EmitterAddr) - if err != nil { - return nil, err - } - - log.TransactionHash, err = EthTxHashFromMessageCid(context.TODO(), ev.MsgCid, sa) - if err != nil { - return nil, err - } - c, err := ev.TipSetKey.Cid() - if err != nil { - return nil, err - } - log.BlockHash, err = ethtypes.EthHashFromCid(c) - if err != nil { - return nil, err - } - - res.Results = append(res.Results, log) - } - - return res, nil -} - -func ethFilterResultFromTipSets(tsks []types.TipSetKey) (*ethtypes.EthFilterResult, error) { - res := ðtypes.EthFilterResult{} - - for _, tsk := range tsks { - c, err := tsk.Cid() - if err != nil { - return nil, err - } - hash, err := ethtypes.EthHashFromCid(c) - if err != nil { - return nil, err - } - - res.Results = append(res.Results, hash) - } - - return res, nil -} - -func ethFilterResultFromMessages(cs []*types.SignedMessage, sa StateAPI) (*ethtypes.EthFilterResult, error) { - res := ðtypes.EthFilterResult{} - - for _, c := range cs { - hash, err := EthTxHashFromSignedMessage(context.TODO(), c, sa) - if err != nil { - return nil, err - } - - res.Results = append(res.Results, hash) - } - - return res, nil -} - -type EthSubscriptionManager struct { - Chain *store.ChainStore - StateAPI StateAPI - ChainAPI ChainAPI - mu sync.Mutex - subs map[ethtypes.EthSubscriptionID]*ethSubscription -} - -func (e *EthSubscriptionManager) StartSubscription(ctx context.Context, out ethSubscriptionCallback, dropFilter func(context.Context, filter.Filter) error) (*ethSubscription, error) { // nolint - rawid, err := uuid.NewRandom() - if err != nil { - return nil, xerrors.Errorf("new uuid: %w", err) - } - id := ethtypes.EthSubscriptionID{} - copy(id[:], rawid[:]) // uuid is 16 bytes - - ctx, quit := context.WithCancel(ctx) - - sub := ðSubscription{ - Chain: e.Chain, - StateAPI: e.StateAPI, - ChainAPI: e.ChainAPI, - uninstallFilter: dropFilter, - id: id, - in: make(chan interface{}, 200), - out: out, - quit: quit, - - toSend: queue.New[[]byte](), - sendCond: make(chan struct{}, 1), - } - - e.mu.Lock() - if e.subs == nil { - e.subs = make(map[ethtypes.EthSubscriptionID]*ethSubscription) - } - e.subs[sub.id] = sub - e.mu.Unlock() - - go sub.start(ctx) - go sub.startOut(ctx) - - return sub, nil -} - -func (e *EthSubscriptionManager) StopSubscription(ctx context.Context, id ethtypes.EthSubscriptionID) error { - e.mu.Lock() - defer e.mu.Unlock() - - sub, ok := e.subs[id] - if !ok { - return xerrors.Errorf("subscription not found") - } - sub.stop() - delete(e.subs, id) - - return nil -} - -type ethSubscriptionCallback func(context.Context, jsonrpc.RawParams) error - -const maxSendQueue = 20000 - -type ethSubscription struct { - Chain *store.ChainStore - StateAPI StateAPI - ChainAPI ChainAPI - uninstallFilter func(context.Context, filter.Filter) error - id ethtypes.EthSubscriptionID - in chan interface{} - out ethSubscriptionCallback - - mu sync.Mutex - filters []filter.Filter - quit func() - - sendLk sync.Mutex - sendQueueLen int - toSend *queue.Queue[[]byte] - sendCond chan struct{} -} - -func (e *ethSubscription) addFilter(ctx context.Context, f filter.Filter) { - e.mu.Lock() - defer e.mu.Unlock() - - f.SetSubChannel(e.in) - e.filters = append(e.filters, f) -} - -// sendOut processes the final subscription queue. It's here in case the subscriber -// is slow, and we need to buffer the messages. -func (e *ethSubscription) startOut(ctx context.Context) { - for { - select { - case <-ctx.Done(): - return - case <-e.sendCond: - e.sendLk.Lock() - - for !e.toSend.Empty() { - front := e.toSend.Dequeue() - e.sendQueueLen-- - - e.sendLk.Unlock() - - if err := e.out(ctx, front); err != nil { - log.Warnw("error sending subscription response, killing subscription", "sub", e.id, "error", err) - e.stop() - return - } - - e.sendLk.Lock() - } - - e.sendLk.Unlock() - } - } -} - -func (e *ethSubscription) send(ctx context.Context, v interface{}) { - resp := ethtypes.EthSubscriptionResponse{ - SubscriptionID: e.id, - Result: v, - } - - outParam, err := json.Marshal(resp) - if err != nil { - log.Warnw("marshaling subscription response", "sub", e.id, "error", err) - return - } - - e.sendLk.Lock() - defer e.sendLk.Unlock() - - e.toSend.Enqueue(outParam) - - e.sendQueueLen++ - if e.sendQueueLen > maxSendQueue { - log.Warnw("subscription send queue full, killing subscription", "sub", e.id) - e.stop() - return - } - - select { - case e.sendCond <- struct{}{}: - default: // already signalled, and we're holding the lock so we know that the event will be processed - } -} - -func (e *ethSubscription) start(ctx context.Context) { - for { - select { - case <-ctx.Done(): - return - case v := <-e.in: - switch vt := v.(type) { - case *filter.CollectedEvent: - evs, err := ethFilterResultFromEvents([]*filter.CollectedEvent{vt}, e.StateAPI) - if err != nil { - continue - } - - for _, r := range evs.Results { - e.send(ctx, r) - } - case *types.TipSet: - ev, err := newEthBlockFromFilecoinTipSet(ctx, vt, true, e.Chain, e.StateAPI) - if err != nil { - break - } - - e.send(ctx, ev) - case *types.SignedMessage: // mpool txid - evs, err := ethFilterResultFromMessages([]*types.SignedMessage{vt}, e.StateAPI) - if err != nil { - continue - } - - for _, r := range evs.Results { - e.send(ctx, r) - } - default: - log.Warnf("unexpected subscription value type: %T", vt) - } - } - } -} - -func (e *ethSubscription) stop() { - e.mu.Lock() - if e.quit == nil { - e.mu.Unlock() - return - } - - if e.quit != nil { - e.quit() - e.quit = nil - e.mu.Unlock() - - for _, f := range e.filters { - // note: the context in actually unused in uninstallFilter - if err := e.uninstallFilter(context.TODO(), f); err != nil { - // this will leave the filter a zombie, collecting events up to the maximum allowed - log.Warnf("failed to remove filter when unsubscribing: %v", err) - } - } - } -} - -func newEthBlockFromFilecoinTipSet(ctx context.Context, ts *types.TipSet, fullTxInfo bool, cs *store.ChainStore, sa StateAPI) (ethtypes.EthBlock, error) { - parentKeyCid, err := ts.Parents().Cid() - if err != nil { - return ethtypes.EthBlock{}, err - } - parentBlkHash, err := ethtypes.EthHashFromCid(parentKeyCid) - if err != nil { - return ethtypes.EthBlock{}, err - } - - bn := ethtypes.EthUint64(ts.Height()) - - blkCid, err := ts.Key().Cid() - if err != nil { - return ethtypes.EthBlock{}, err - } - blkHash, err := ethtypes.EthHashFromCid(blkCid) - if err != nil { - return ethtypes.EthBlock{}, err - } - - msgs, rcpts, err := messagesAndReceipts(ctx, ts, cs, sa) - if err != nil { - return ethtypes.EthBlock{}, xerrors.Errorf("failed to retrieve messages and receipts: %w", err) - } - - block := ethtypes.NewEthBlock(len(msgs) > 0) - - gasUsed := int64(0) - for i, msg := range msgs { - rcpt := rcpts[i] - ti := ethtypes.EthUint64(i) - gasUsed += rcpt.GasUsed - var smsg *types.SignedMessage - switch msg := msg.(type) { - case *types.SignedMessage: - smsg = msg - case *types.Message: - smsg = &types.SignedMessage{ - Message: *msg, - Signature: crypto.Signature{ - Type: crypto.SigTypeBLS, - }, - } - default: - return ethtypes.EthBlock{}, xerrors.Errorf("failed to get signed msg %s: %w", msg.Cid(), err) - } - tx, err := newEthTxFromSignedMessage(ctx, smsg, sa) - if err != nil { - return ethtypes.EthBlock{}, xerrors.Errorf("failed to convert msg to ethTx: %w", err) - } - - tx.ChainID = ethtypes.EthUint64(build.Eip155ChainId) - tx.BlockHash = &blkHash - tx.BlockNumber = &bn - tx.TransactionIndex = &ti - - if fullTxInfo { - block.Transactions = append(block.Transactions, tx) - } else { - block.Transactions = append(block.Transactions, tx.Hash.String()) - } - } - - block.Hash = blkHash - block.Number = bn - block.ParentHash = parentBlkHash - block.Timestamp = ethtypes.EthUint64(ts.Blocks()[0].Timestamp) - block.BaseFeePerGas = ethtypes.EthBigInt{Int: ts.Blocks()[0].ParentBaseFee.Int} - block.GasUsed = ethtypes.EthUint64(gasUsed) - return block, nil -} - -func messagesAndReceipts(ctx context.Context, ts *types.TipSet, cs *store.ChainStore, sa StateAPI) ([]types.ChainMsg, []types.MessageReceipt, error) { - msgs, err := cs.MessagesForTipset(ctx, ts) - if err != nil { - return nil, nil, xerrors.Errorf("error loading messages for tipset: %v: %w", ts, err) - } - - _, rcptRoot, err := sa.StateManager.TipSetState(ctx, ts) - if err != nil { - return nil, nil, xerrors.Errorf("failed to compute state: %w", err) - } - - rcpts, err := cs.ReadReceipts(ctx, rcptRoot) - if err != nil { - return nil, nil, xerrors.Errorf("error loading receipts for tipset: %v: %w", ts, err) - } - - if len(msgs) != len(rcpts) { - return nil, nil, xerrors.Errorf("receipts and message array lengths didn't match for tipset: %v: %w", ts, err) - } - - return msgs, rcpts, nil -} - -// lookupEthAddress makes its best effort at finding the Ethereum address for a -// Filecoin address. It does the following: -// -// 1. If the supplied address is an f410 address, we return its payload as the EthAddress. -// 2. Otherwise (f0, f1, f2, f3), we look up the actor on the state tree. If it has a delegated address, we return it if it's f410 address. -// 3. Otherwise, we fall back to returning a masked ID Ethereum address. If the supplied address is an f0 address, we -// use that ID to form the masked ID address. -// 4. Otherwise, we fetch the actor's ID from the state tree and form the masked ID with it. -func lookupEthAddress(ctx context.Context, addr address.Address, sa StateAPI) (ethtypes.EthAddress, error) { - // BLOCK A: We are trying to get an actual Ethereum address from an f410 address. - // Attempt to convert directly, if it's an f4 address. - ethAddr, err := ethtypes.EthAddressFromFilecoinAddress(addr) - if err == nil && !ethAddr.IsMaskedID() { - return ethAddr, nil - } - - // Lookup on the target actor and try to get an f410 address. - if actor, err := sa.StateGetActor(ctx, addr, types.EmptyTSK); err != nil { - return ethtypes.EthAddress{}, err - } else if actor.Address != nil { - if ethAddr, err := ethtypes.EthAddressFromFilecoinAddress(*actor.Address); err == nil && !ethAddr.IsMaskedID() { - return ethAddr, nil - } - } - - // BLOCK B: We gave up on getting an actual Ethereum address and are falling back to a Masked ID address. - // Check if we already have an ID addr, and use it if possible. - if err == nil && ethAddr.IsMaskedID() { - return ethAddr, nil - } - - // Otherwise, resolve the ID addr. - idAddr, err := sa.StateLookupID(ctx, addr, types.EmptyTSK) - if err != nil { - return ethtypes.EthAddress{}, err - } - return ethtypes.EthAddressFromFilecoinAddress(idAddr) -} - -func EthTxHashFromMessageCid(ctx context.Context, c cid.Cid, sa StateAPI) (ethtypes.EthHash, error) { - smsg, err := sa.Chain.GetSignedMessage(ctx, c) - if err == nil { - // This is an Eth Tx, Secp message, Or BLS message in the mpool - return EthTxHashFromSignedMessage(ctx, smsg, sa) - } - - _, err = sa.Chain.GetMessage(ctx, c) - if err == nil { - // This is a BLS message - return ethtypes.EthHashFromCid(c) - } - - return ethtypes.EmptyEthHash, nil -} - -func EthTxHashFromSignedMessage(ctx context.Context, smsg *types.SignedMessage, sa StateAPI) (ethtypes.EthHash, error) { - if smsg.Signature.Type == crypto.SigTypeDelegated { - ethTx, err := newEthTxFromSignedMessage(ctx, smsg, sa) - if err != nil { - return ethtypes.EmptyEthHash, err - } - return ethTx.Hash, nil - } else if smsg.Signature.Type == crypto.SigTypeSecp256k1 { - return ethtypes.EthHashFromCid(smsg.Cid()) - } else { // BLS message - return ethtypes.EthHashFromCid(smsg.Message.Cid()) - } -} - -func newEthTxFromSignedMessage(ctx context.Context, smsg *types.SignedMessage, sa StateAPI) (ethtypes.EthTx, error) { - var tx ethtypes.EthTx - var err error - - // This is an eth tx - if smsg.Signature.Type == crypto.SigTypeDelegated { - tx, err = ethtypes.EthTxFromSignedEthMessage(smsg) - if err != nil { - return ethtypes.EthTx{}, xerrors.Errorf("failed to convert from signed message: %w", err) - } - - tx.Hash, err = tx.TxHash() - if err != nil { - return ethtypes.EthTx{}, xerrors.Errorf("failed to calculate hash for ethTx: %w", err) - } - - fromAddr, err := lookupEthAddress(ctx, smsg.Message.From, sa) - if err != nil { - return ethtypes.EthTx{}, xerrors.Errorf("failed to resolve Ethereum address: %w", err) - } - - tx.From = fromAddr - } else if smsg.Signature.Type == crypto.SigTypeSecp256k1 { // Secp Filecoin Message - tx = ethTxFromNativeMessage(ctx, smsg.VMMessage(), sa) - tx.Hash, err = ethtypes.EthHashFromCid(smsg.Cid()) - if err != nil { - return tx, err - } - } else { // BLS Filecoin message - tx = ethTxFromNativeMessage(ctx, smsg.VMMessage(), sa) - tx.Hash, err = ethtypes.EthHashFromCid(smsg.Message.Cid()) - if err != nil { - return tx, err - } - } - - return tx, nil -} - -// ethTxFromNativeMessage does NOT populate: -// - BlockHash -// - BlockNumber -// - TransactionIndex -// - Hash -func ethTxFromNativeMessage(ctx context.Context, msg *types.Message, sa StateAPI) ethtypes.EthTx { - // We don't care if we error here, conversion is best effort for non-eth transactions - from, _ := lookupEthAddress(ctx, msg.From, sa) - to, _ := lookupEthAddress(ctx, msg.To, sa) - return ethtypes.EthTx{ - To: &to, - From: from, - Nonce: ethtypes.EthUint64(msg.Nonce), - ChainID: ethtypes.EthUint64(build.Eip155ChainId), - Value: ethtypes.EthBigInt(msg.Value), - Type: ethtypes.Eip1559TxType, - Gas: ethtypes.EthUint64(msg.GasLimit), - MaxFeePerGas: ethtypes.EthBigInt(msg.GasFeeCap), - MaxPriorityFeePerGas: ethtypes.EthBigInt(msg.GasPremium), - AccessList: []ethtypes.EthHash{}, - } -} - -// newEthTxFromMessageLookup creates an ethereum transaction from filecoin message lookup. If a negative txIdx is passed -// into the function, it looks up the transaction index of the message in the tipset, otherwise it uses the txIdx passed into the -// function -func newEthTxFromMessageLookup(ctx context.Context, msgLookup *api.MsgLookup, txIdx int, cs *store.ChainStore, sa StateAPI) (ethtypes.EthTx, error) { - ts, err := cs.LoadTipSet(ctx, msgLookup.TipSet) - if err != nil { - return ethtypes.EthTx{}, err - } - - // This tx is located in the parent tipset - parentTs, err := cs.LoadTipSet(ctx, ts.Parents()) - if err != nil { - return ethtypes.EthTx{}, err - } - - parentTsCid, err := parentTs.Key().Cid() - if err != nil { - return ethtypes.EthTx{}, err - } - - // lookup the transactionIndex - if txIdx < 0 { - msgs, err := cs.MessagesForTipset(ctx, parentTs) - if err != nil { - return ethtypes.EthTx{}, err - } - for i, msg := range msgs { - if msg.Cid() == msgLookup.Message { - txIdx = i - break - } - } - if txIdx < 0 { - return ethtypes.EthTx{}, fmt.Errorf("cannot find the msg in the tipset") - } - } - - blkHash, err := ethtypes.EthHashFromCid(parentTsCid) - if err != nil { - return ethtypes.EthTx{}, err - } - - smsg, err := getSignedMessage(ctx, cs, msgLookup.Message) - if err != nil { - return ethtypes.EthTx{}, xerrors.Errorf("failed to get signed msg: %w", err) - } - - tx, err := newEthTxFromSignedMessage(ctx, smsg, sa) - if err != nil { - return ethtypes.EthTx{}, err - } - - var ( - bn = ethtypes.EthUint64(parentTs.Height()) - ti = ethtypes.EthUint64(txIdx) - ) - - tx.ChainID = ethtypes.EthUint64(build.Eip155ChainId) - tx.BlockHash = &blkHash - tx.BlockNumber = &bn - tx.TransactionIndex = &ti - return tx, nil -} - -func newEthTxReceipt(ctx context.Context, tx ethtypes.EthTx, lookup *api.MsgLookup, events []types.Event, cs *store.ChainStore, sa StateAPI) (api.EthTxReceipt, error) { - var ( - transactionIndex ethtypes.EthUint64 - blockHash ethtypes.EthHash - blockNumber ethtypes.EthUint64 - ) - - if tx.TransactionIndex != nil { - transactionIndex = *tx.TransactionIndex - } - if tx.BlockHash != nil { - blockHash = *tx.BlockHash - } - if tx.BlockNumber != nil { - blockNumber = *tx.BlockNumber - } - - receipt := api.EthTxReceipt{ - TransactionHash: tx.Hash, - From: tx.From, - To: tx.To, - TransactionIndex: transactionIndex, - BlockHash: blockHash, - BlockNumber: blockNumber, - Type: ethtypes.EthUint64(2), - Logs: []ethtypes.EthLog{}, // empty log array is compulsory when no logs, or libraries like ethers.js break - LogsBloom: ethtypes.EmptyEthBloom[:], - } - - if lookup.Receipt.ExitCode.IsSuccess() { - receipt.Status = 1 - } else { - receipt.Status = 0 - } - - receipt.GasUsed = ethtypes.EthUint64(lookup.Receipt.GasUsed) - - // TODO: handle CumulativeGasUsed - receipt.CumulativeGasUsed = ethtypes.EmptyEthInt - - // TODO: avoid loading the tipset twice (once here, once when we convert the message to a txn) - ts, err := cs.GetTipSetFromKey(ctx, lookup.TipSet) - if err != nil { - return api.EthTxReceipt{}, xerrors.Errorf("failed to lookup tipset %s when constructing the eth txn receipt: %w", lookup.TipSet, err) - } - - baseFee := ts.Blocks()[0].ParentBaseFee - gasOutputs := vm.ComputeGasOutputs(lookup.Receipt.GasUsed, int64(tx.Gas), baseFee, big.Int(tx.MaxFeePerGas), big.Int(tx.MaxPriorityFeePerGas), true) - totalSpent := big.Sum(gasOutputs.BaseFeeBurn, gasOutputs.MinerTip, gasOutputs.OverEstimationBurn) - - effectiveGasPrice := big.Zero() - if lookup.Receipt.GasUsed > 0 { - effectiveGasPrice = big.Div(totalSpent, big.NewInt(lookup.Receipt.GasUsed)) - } - receipt.EffectiveGasPrice = ethtypes.EthBigInt(effectiveGasPrice) - - if receipt.To == nil && lookup.Receipt.ExitCode.IsSuccess() { - // Create and Create2 return the same things. - var ret eam.CreateExternalReturn - if err := ret.UnmarshalCBOR(bytes.NewReader(lookup.Receipt.Return)); err != nil { - return api.EthTxReceipt{}, xerrors.Errorf("failed to parse contract creation result: %w", err) - } - addr := ethtypes.EthAddress(ret.EthAddress) - receipt.ContractAddress = &addr - } - - if len(events) > 0 { - receipt.Logs = make([]ethtypes.EthLog, 0, len(events)) - for i, evt := range events { - l := ethtypes.EthLog{ - Removed: false, - LogIndex: ethtypes.EthUint64(i), - TransactionHash: tx.Hash, - TransactionIndex: transactionIndex, - BlockHash: blockHash, - BlockNumber: blockNumber, - } - - data, topics, ok := ethLogFromEvent(evt.Entries) - if !ok { - // not an eth event. - continue - } - for _, topic := range topics { - ethtypes.EthBloomSet(receipt.LogsBloom, topic[:]) - } - l.Data = data - l.Topics = topics - - addr, err := address.NewIDAddress(uint64(evt.Emitter)) - if err != nil { - return api.EthTxReceipt{}, xerrors.Errorf("failed to create ID address: %w", err) - } - - l.Address, err = lookupEthAddress(ctx, addr, sa) - if err != nil { - return api.EthTxReceipt{}, xerrors.Errorf("failed to resolve Ethereum address: %w", err) - } - - ethtypes.EthBloomSet(receipt.LogsBloom, l.Address[:]) - receipt.Logs = append(receipt.Logs, l) - } - } - - return receipt, nil -} - -func (m *EthTxHashManager) Apply(ctx context.Context, from, to *types.TipSet) error { - for _, blk := range to.Blocks() { - _, smsgs, err := m.StateAPI.Chain.MessagesForBlock(ctx, blk) - if err != nil { - return err - } - - for _, smsg := range smsgs { - if smsg.Signature.Type != crypto.SigTypeDelegated { - continue - } - - hash, err := EthTxHashFromSignedMessage(ctx, smsg, m.StateAPI) - if err != nil { - return err - } - - err = m.TransactionHashLookup.UpsertHash(hash, smsg.Cid()) - if err != nil { - return err - } - } - } - - return nil -} - -type EthTxHashManager struct { - StateAPI StateAPI - TransactionHashLookup *ethhashlookup.EthTxHashLookup -} - -func (m *EthTxHashManager) Revert(ctx context.Context, from, to *types.TipSet) error { - return nil -} - -func (m *EthTxHashManager) PopulateExistingMappings(ctx context.Context, minHeight abi.ChainEpoch) error { - if minHeight < build.UpgradeHyggeHeight { - minHeight = build.UpgradeHyggeHeight - } - - ts := m.StateAPI.Chain.GetHeaviestTipSet() - for ts.Height() > minHeight { - for _, block := range ts.Blocks() { - msgs, err := m.StateAPI.Chain.SecpkMessagesForBlock(ctx, block) - if err != nil { - // If we can't find the messages, we've either imported from snapshot or pruned the store - log.Debug("exiting message mapping population at epoch ", ts.Height()) - return nil - } - - for _, msg := range msgs { - m.ProcessSignedMessage(ctx, msg) - } - } - - var err error - ts, err = m.StateAPI.Chain.GetTipSetFromKey(ctx, ts.Parents()) - if err != nil { - return err - } - } - - return nil -} - -func (m *EthTxHashManager) ProcessSignedMessage(ctx context.Context, msg *types.SignedMessage) { - if msg.Signature.Type != crypto.SigTypeDelegated { - return - } - - ethTx, err := newEthTxFromSignedMessage(ctx, msg, m.StateAPI) - if err != nil { - log.Errorf("error converting filecoin message to eth tx: %s", err) - return - } - - err = m.TransactionHashLookup.UpsertHash(ethTx.Hash, msg.Cid()) - if err != nil { - log.Errorf("error inserting tx mapping to db: %s", err) - return - } -} - -func WaitForMpoolUpdates(ctx context.Context, ch <-chan api.MpoolUpdate, manager *EthTxHashManager) { - for { - select { - case <-ctx.Done(): - return - case u := <-ch: - if u.Type != api.MpoolAdd { - continue - } - - manager.ProcessSignedMessage(ctx, u.Message) - } - } -} - -func EthTxHashGC(ctx context.Context, retentionDays int, manager *EthTxHashManager) { - if retentionDays == 0 { - return - } - - gcPeriod := 1 * time.Hour - for { - entriesDeleted, err := manager.TransactionHashLookup.DeleteEntriesOlderThan(retentionDays) - if err != nil { - log.Errorf("error garbage collecting eth transaction hash database: %s", err) - } - log.Info("garbage collection run on eth transaction hash lookup database. %d entries deleted", entriesDeleted) - time.Sleep(gcPeriod) - } -} - -func parseEthTopics(topics ethtypes.EthTopicSpec) (map[string][][]byte, error) { - keys := map[string][][]byte{} - for idx, vals := range topics { - if len(vals) == 0 { - continue - } - // Ethereum topics are emitted using `LOG{0..4}` opcodes resulting in topics1..4 - key := fmt.Sprintf("t%d", idx+1) - for _, v := range vals { - v := v // copy the ethhash to avoid repeatedly referencing the same one. - keys[key] = append(keys[key], v[:]) - } - } - return keys, nil -} - -const errorFunctionSelector = "\x08\xc3\x79\xa0" // Error(string) -const panicFunctionSelector = "\x4e\x48\x7b\x71" // Panic(uint256) -// Eth ABI (solidity) panic codes. -var panicErrorCodes map[uint64]string = map[uint64]string{ - 0x00: "Panic()", - 0x01: "Assert()", - 0x11: "ArithmeticOverflow()", - 0x12: "DivideByZero()", - 0x21: "InvalidEnumVariant()", - 0x22: "InvalidStorageArray()", - 0x31: "PopEmptyArray()", - 0x32: "ArrayIndexOutOfBounds()", - 0x41: "OutOfMemory()", - 0x51: "CalledUninitializedFunction()", -} - -// Parse an ABI encoded revert reason. This reason should be encoded as if it were the parameters to -// an `Error(string)` function call. -// -// See https://docs.soliditylang.org/en/latest/control-structures.html#panic-via-assert-and-error-via-require -func parseEthRevert(ret []byte) string { - if len(ret) == 0 { - return "none" - } - var cbytes abi.CborBytes - if err := cbytes.UnmarshalCBOR(bytes.NewReader(ret)); err != nil { - return "ERROR: revert reason is not cbor encoded bytes" - } - if len(cbytes) == 0 { - return "none" - } - // If it's not long enough to contain an ABI encoded response, return immediately. - if len(cbytes) < 4+32 { - return ethtypes.EthBytes(cbytes).String() - } - switch string(cbytes[:4]) { - case panicFunctionSelector: - cbytes := cbytes[4 : 4+32] - // Read the and check the code. - code, err := ethtypes.EthUint64FromBytes(cbytes) - if err != nil { - // If it's too big, just return the raw value. - codeInt := big.PositiveFromUnsignedBytes(cbytes) - return fmt.Sprintf("Panic(%s)", ethtypes.EthBigInt(codeInt).String()) - } - if s, ok := panicErrorCodes[uint64(code)]; ok { - return s - } - return fmt.Sprintf("Panic(0x%x)", code) - case errorFunctionSelector: - cbytes := cbytes[4:] - cbytesLen := ethtypes.EthUint64(len(cbytes)) - // Read the and check the offset. - offset, err := ethtypes.EthUint64FromBytes(cbytes[:32]) - if err != nil { - break - } - if cbytesLen < offset { - break - } - - // Read and check the length. - if cbytesLen-offset < 32 { - break - } - start := offset + 32 - length, err := ethtypes.EthUint64FromBytes(cbytes[offset : offset+32]) - if err != nil { - break - } - if cbytesLen-start < length { - break - } - // Slice the error message. - return fmt.Sprintf("Error(%s)", cbytes[start:start+length]) - } - return ethtypes.EthBytes(cbytes).String() -} - func calculateRewardsAndGasUsed(rewardPercentiles []float64, txGasRewards gasRewardSorter) ([]ethtypes.EthBigInt, int64) { var gasUsedTotal int64 for _, tx := range txGasRewards { @@ -2579,25 +1595,6 @@ func calculateRewardsAndGasUsed(rewardPercentiles []float64, txGasRewards gasRew return rewards, gasUsedTotal } -func getSignedMessage(ctx context.Context, cs *store.ChainStore, msgCid cid.Cid) (*types.SignedMessage, error) { - smsg, err := cs.GetSignedMessage(ctx, msgCid) - if err != nil { - // We couldn't find the signed message, it might be a BLS message, so search for a regular message. - msg, err := cs.GetMessage(ctx, msgCid) - if err != nil { - return nil, xerrors.Errorf("failed to find msg %s: %w", msgCid, err) - } - smsg = &types.SignedMessage{ - Message: *msg, - Signature: crypto.Signature{ - Type: crypto.SigTypeBLS, - }, - } - } - - return smsg, nil -} - type gasRewardTuple struct { gasUsed int64 premium abi.TokenAmount