From 3401cb349b88c39ebf87a95151928c885b8cdf7e Mon Sep 17 00:00:00 2001 From: whyrusleeping Date: Fri, 11 Sep 2020 23:07:20 -0700 Subject: [PATCH] add mpool push and chainHead --- cmd/lotus-gateway/api.go | 52 ++++++++++++++++++++++++++++++++++------ 1 file changed, 45 insertions(+), 7 deletions(-) diff --git a/cmd/lotus-gateway/api.go b/cmd/lotus-gateway/api.go index 06c9a3ae5..42e9e4829 100644 --- a/cmd/lotus-gateway/api.go +++ b/cmd/lotus-gateway/api.go @@ -8,6 +8,7 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/lotus/api" "github.com/filecoin-project/lotus/chain/types" + "github.com/ipfs/go-cid" "go.opencensus.io/trace" ) @@ -35,18 +36,55 @@ func (a *GatewayAPI) getTipsetTimestamp(ctx context.Context, tsk types.TipSetKey return time.Unix(int64(ts.Blocks()[0].Timestamp), 0), nil } +func (a *GatewayAPI) checkTipset(ctx context.Context, ts types.TipSetKey) error { + when, err := a.getTipsetTimestamp(ctx, ts) + if err != nil { + return err + } + + if time.Since(when) > time.Hour { + return ErrLookbackTooLong + } + + return nil +} + func (a *GatewayAPI) StateGetActor(ctx context.Context, actor address.Address, ts types.TipSetKey) (*types.Actor, error) { ctx, span := trace.StartSpan(ctx, "StateGetActor") defer span.End() - when, err := a.getTipsetTimestamp(ctx, ts) - if err != nil { - return nil, err - } - - if time.Since(when) > time.Hour { - return nil, ErrLookbackTooLong + if err := a.checkTipset(ctx, ts); err != nil { + return nil, fmt.Errorf("bad tipset: %w", err) } return a.api.StateGetActor(ctx, actor, ts) } + +func (a *GatewayAPI) ChainHead(ctx context.Context) (*types.TipSet, error) { + ctx, span := trace.StartSpan(ctx, "ChainHead") + defer span.End() + // TODO: cache and invalidate cache when timestamp is up (or have internal ChainNotify) + + return a.api.ChainHead(ctx) +} + +func (a *GatewayAPI) ChainGetTipSet(ctx context.Context, tsk types.TipSetKey) (*types.TipSet, error) { + ctx, span := trace.StartSpan(ctx, "ChainGetTipSet") + defer span.End() + + if err := a.checkTipset(ctx, tsk); err != nil { + return nil, fmt.Errorf("bad tipset: %w", err) + } + + // TODO: since we're limiting lookbacks, should just cache this (could really even cache the json response bytes) + return a.api.ChainGetTipSet(ctx, tsk) +} + +func (a *GatewayAPI) MpoolPush(ctx context.Context, sm *types.SignedMessage) (cid.Cid, error) { + ctx, span := trace.StartSpan(ctx, "MpoolPush") + defer span.End() + + // TODO: additional anti-spam checks + + return a.api.MpoolPush(ctx, sm) +}