fix: EthAPI: Make newEthBlockFromFilecoinTipSet faster and correct

This commit is contained in:
Aayush 2023-03-02 11:30:27 -05:00
parent dbbcf4b2ee
commit cfb5eac015

View File

@ -1776,6 +1776,8 @@ func newEthBlockFromFilecoinTipSet(ctx context.Context, ts *types.TipSet, fullTx
return ethtypes.EthBlock{}, err return ethtypes.EthBlock{}, err
} }
bn := ethtypes.EthUint64(ts.Height())
blkCid, err := ts.Key().Cid() blkCid, err := ts.Key().Cid()
if err != nil { if err != nil {
return ethtypes.EthBlock{}, err return ethtypes.EthBlock{}, err
@ -1792,20 +1794,35 @@ func newEthBlockFromFilecoinTipSet(ctx context.Context, ts *types.TipSet, fullTx
block := ethtypes.NewEthBlock(len(msgs) > 0) block := ethtypes.NewEthBlock(len(msgs) > 0)
// this seems to be a very expensive way to get gasUsed of the block. may need to find an efficient way to do it
gasUsed := int64(0) gasUsed := int64(0)
for txIdx, msg := range msgs { compOutput, err := sa.StateCompute(ctx, ts.Height(), nil, ts.Key())
msgLookup, err := sa.StateSearchMsg(ctx, types.EmptyTSK, msg.Cid(), api.LookbackNoLimit, false) if err != nil {
if err != nil || msgLookup == nil { return ethtypes.EthBlock{}, xerrors.Errorf("failed to compute state: %w", err)
return ethtypes.EthBlock{}, nil }
}
gasUsed += msgLookup.Receipt.GasUsed
tx, err := newEthTxFromMessageLookup(ctx, msgLookup, txIdx, cs, sa) for txIdx, msg := range compOutput.Trace {
if err != nil { // skip system messages like reward application and cron
return ethtypes.EthBlock{}, nil if msg.Msg.From == builtintypes.SystemActorAddr {
continue
} }
gasUsed += msg.MsgRct.GasUsed
smsgCid, err := getSignedMessage(ctx, cs, msg.MsgCid)
if err != nil {
return ethtypes.EthBlock{}, xerrors.Errorf("failed to get signed msg %s: %w", msg.MsgCid, err)
}
tx, err := newEthTxFromSignedMessage(ctx, smsgCid, sa)
if err != nil {
return ethtypes.EthBlock{}, xerrors.Errorf("failed to convert msg to ethTx: %w", err)
}
ti := ethtypes.EthUint64(txIdx)
tx.ChainID = ethtypes.EthUint64(build.Eip155ChainId)
tx.BlockHash = &blkHash
tx.BlockNumber = &bn
tx.TransactionIndex = &ti
if fullTxInfo { if fullTxInfo {
block.Transactions = append(block.Transactions, tx) block.Transactions = append(block.Transactions, tx)
} else { } else {
@ -1814,7 +1831,7 @@ func newEthBlockFromFilecoinTipSet(ctx context.Context, ts *types.TipSet, fullTx
} }
block.Hash = blkHash block.Hash = blkHash
block.Number = ethtypes.EthUint64(ts.Height()) block.Number = bn
block.ParentHash = parentBlkHash block.ParentHash = parentBlkHash
block.Timestamp = ethtypes.EthUint64(ts.Blocks()[0].Timestamp) block.Timestamp = ethtypes.EthUint64(ts.Blocks()[0].Timestamp)
block.BaseFeePerGas = ethtypes.EthBigInt{Int: ts.Blocks()[0].ParentBaseFee.Int} block.BaseFeePerGas = ethtypes.EthBigInt{Int: ts.Blocks()[0].ParentBaseFee.Int}
@ -1995,20 +2012,9 @@ func newEthTxFromMessageLookup(ctx context.Context, msgLookup *api.MsgLookup, tx
return ethtypes.EthTx{}, err return ethtypes.EthTx{}, err
} }
smsg, err := cs.GetSignedMessage(ctx, msgLookup.Message) smsg, err := getSignedMessage(ctx, cs, msgLookup.Message)
if err != nil { if err != nil {
// We couldn't find the signed message, it might be a BLS message, so search for a regular message. return ethtypes.EthTx{}, xerrors.Errorf("failed to get signed msg: %w", err)
msg, err := cs.GetMessage(ctx, msgLookup.Message)
if err != nil {
return ethtypes.EthTx{}, err
}
smsg = &types.SignedMessage{
Message: *msg,
Signature: crypto.Signature{
Type: crypto.SigTypeBLS,
Data: nil,
},
}
} }
tx, err := newEthTxFromSignedMessage(ctx, smsg, sa) tx, err := newEthTxFromSignedMessage(ctx, smsg, sa)
@ -2364,6 +2370,25 @@ func calculateRewardsAndGasUsed(rewardPercentiles []float64, txGasRewards gasRew
return rewards, totalGasUsed return rewards, totalGasUsed
} }
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 { type gasRewardTuple struct {
gas uint64 gas uint64
reward ethtypes.EthBigInt reward ethtypes.EthBigInt