From 27f120bfcea9c9456a35b8b27a9587348a551b46 Mon Sep 17 00:00:00 2001 From: whyrusleeping Date: Thu, 3 Oct 2019 13:22:21 -0700 Subject: [PATCH] improve accuracy of block printing with getblock --- api/api.go | 3 ++- api/struct.go | 11 ++++++++--- chain/store/store.go | 36 ++---------------------------------- cli/chain.go | 25 +++++++++++++++++-------- node/impl/full/chain.go | 38 ++++++++++++++++++++++++++++++++++---- 5 files changed, 63 insertions(+), 50 deletions(-) diff --git a/api/api.go b/api/api.go index d9e7ff571..758ed2de9 100644 --- a/api/api.go +++ b/api/api.go @@ -54,7 +54,8 @@ type FullNode interface { ChainWaitMsg(context.Context, cid.Cid) (*MsgWait, error) ChainGetBlock(context.Context, cid.Cid) (*types.BlockHeader, error) ChainGetBlockMessages(context.Context, cid.Cid) (*BlockMessages, error) - ChainGetBlockReceipts(context.Context, cid.Cid) ([]*types.MessageReceipt, error) + ChainGetParentReceipts(context.Context, cid.Cid) ([]*types.MessageReceipt, error) + ChainGetParentMessages(context.Context, cid.Cid) ([]cid.Cid, error) ChainGetTipSetByHeight(context.Context, uint64, *types.TipSet) (*types.TipSet, error) ChainReadObj(context.Context, cid.Cid) ([]byte, error) diff --git a/api/struct.go b/api/struct.go index e6798dfe8..983a55f09 100644 --- a/api/struct.go +++ b/api/struct.go @@ -44,7 +44,8 @@ type FullNodeStruct struct { ChainWaitMsg func(context.Context, cid.Cid) (*MsgWait, error) `perm:"read"` ChainGetBlock func(context.Context, cid.Cid) (*types.BlockHeader, error) `perm:"read"` ChainGetBlockMessages func(context.Context, cid.Cid) (*BlockMessages, error) `perm:"read"` - ChainGetBlockReceipts func(context.Context, cid.Cid) ([]*types.MessageReceipt, error) `perm:"read"` + ChainGetParentReceipts func(context.Context, cid.Cid) ([]*types.MessageReceipt, error) `perm:"read"` + ChainGetParentMessages func(context.Context, cid.Cid) ([]cid.Cid, error) `perm:"read"` ChainGetTipSetByHeight func(context.Context, uint64, *types.TipSet) (*types.TipSet, error) `perm:"read"` ChainReadObj func(context.Context, cid.Cid) ([]byte, error) `perm:"read"` @@ -279,8 +280,12 @@ func (c *FullNodeStruct) ChainGetBlockMessages(ctx context.Context, b cid.Cid) ( return c.Internal.ChainGetBlockMessages(ctx, b) } -func (c *FullNodeStruct) ChainGetBlockReceipts(ctx context.Context, b cid.Cid) ([]*types.MessageReceipt, error) { - return c.Internal.ChainGetBlockReceipts(ctx, b) +func (c *FullNodeStruct) ChainGetParentReceipts(ctx context.Context, b cid.Cid) ([]*types.MessageReceipt, error) { + return c.Internal.ChainGetParentReceipts(ctx, b) +} + +func (c *FullNodeStruct) ChainGetParentMessages(ctx context.Context, b cid.Cid) ([]cid.Cid, error) { + return c.Internal.ChainGetParentMessages(ctx, b) } func (c *FullNodeStruct) ChainNotify(ctx context.Context) (<-chan []*store.HeadChange, error) { diff --git a/chain/store/store.go b/chain/store/store.go index 9c4d77204..d82399969 100644 --- a/chain/store/store.go +++ b/chain/store/store.go @@ -617,7 +617,7 @@ func (cs *ChainStore) MessagesForBlock(b *types.BlockHeader) ([]*types.Message, return blsmsgs, secpkmsgs, nil } -func (cs *ChainStore) GetReceipt(b *types.BlockHeader, i int) (*types.MessageReceipt, error) { +func (cs *ChainStore) GetParentReceipt(b *types.BlockHeader, i int) (*types.MessageReceipt, error) { bs := amt.WrapBlockstore(cs.bs) a, err := amt.LoadAMT(bs, b.ParentMessageReceipts) if err != nil { @@ -718,39 +718,7 @@ func (cs *ChainStore) tipsetExecutedMessage(ts *types.TipSet, msg cid.Cid) (*typ for i, m := range cm { if m.Cid() == msg { - return cs.GetReceipt(ts.Blocks()[0], i) - } - } - - return nil, nil -} - -func (cs *ChainStore) blockContainsMsg(blk *types.BlockHeader, msg cid.Cid) (*types.MessageReceipt, error) { - cst := hamt.CSTFromBstore(cs.bs) - var msgmeta types.MsgMeta - if err := cst.Get(context.TODO(), blk.Messages, &msgmeta); err != nil { - return nil, err - } - - blscids, err := cs.readAMTCids(msgmeta.BlsMessages) - if err != nil { - return nil, errors.Wrap(err, "loading bls message cids for block") - } - - for i, c := range blscids { - if c == msg { - return cs.GetReceipt(blk, i) - } - } - - secpkcids, err := cs.readAMTCids(msgmeta.SecpkMessages) - if err != nil { - return nil, errors.Wrap(err, "loading secpk message cids for block") - } - - for i, c := range secpkcids { - if c == msg { - return cs.GetReceipt(blk, i+len(blscids)) + return cs.GetParentReceipt(ts.Blocks()[0], i) } } diff --git a/cli/chain.go b/cli/chain.go index 6c7c28b0c..a2e1660f7 100644 --- a/cli/chain.go +++ b/cli/chain.go @@ -4,6 +4,7 @@ import ( "encoding/json" "fmt" + "golang.org/x/xerrors" "gopkg.in/urfave/cli.v2" types "github.com/filecoin-project/go-lotus/chain/types" @@ -69,7 +70,7 @@ var chainGetBlock = &cli.Command{ blk, err := api.ChainGetBlock(ctx, bcid) if err != nil { - return err + return xerrors.Errorf("get block failed: %w", err) } if cctx.Bool("raw") { @@ -84,25 +85,33 @@ var chainGetBlock = &cli.Command{ msgs, err := api.ChainGetBlockMessages(ctx, bcid) if err != nil { - return err + return xerrors.Errorf("failed to get messages: %w", err) } - recpts, err := api.ChainGetBlockReceipts(ctx, bcid) + pmsgs, err := api.ChainGetParentMessages(ctx, bcid) if err != nil { - return err + return xerrors.Errorf("failed to get parent messages: %w", err) + } + + recpts, err := api.ChainGetParentReceipts(ctx, bcid) + if err != nil { + log.Warn(err) + //return xerrors.Errorf("failed to get receipts: %w", err) } cblock := struct { types.BlockHeader - BlsMessages []*types.Message - SecpkMessages []*types.SignedMessage - MessageReceipts []*types.MessageReceipt + BlsMessages []*types.Message + SecpkMessages []*types.SignedMessage + ParentReceipts []*types.MessageReceipt + ParentMessages []cid.Cid }{} cblock.BlockHeader = *blk cblock.BlsMessages = msgs.BlsMessages cblock.SecpkMessages = msgs.SecpkMessages - cblock.MessageReceipts = recpts + cblock.ParentReceipts = recpts + cblock.ParentMessages = pmsgs out, err := json.MarshalIndent(cblock, "", " ") if err != nil { diff --git a/node/impl/full/chain.go b/node/impl/full/chain.go index 9ff7a8989..5bc0ec2cb 100644 --- a/node/impl/full/chain.go +++ b/node/impl/full/chain.go @@ -93,21 +93,51 @@ func (a *ChainAPI) ChainGetBlockMessages(ctx context.Context, msg cid.Cid) (*api }, nil } -func (a *ChainAPI) ChainGetBlockReceipts(ctx context.Context, bcid cid.Cid) ([]*types.MessageReceipt, error) { +func (a *ChainAPI) ChainGetParentMessages(ctx context.Context, bcid cid.Cid) ([]cid.Cid, error) { b, err := a.Chain.GetBlock(bcid) if err != nil { return nil, err } // TODO: need to get the number of messages better than this - bm, sm, err := a.Chain.MessagesForBlock(b) + pts, err := a.Chain.LoadTipSet(b.Parents) + if err != nil { + return nil, err + } + + cm, err := a.Chain.MessagesForTipset(pts) + if err != nil { + return nil, err + } + + var out []cid.Cid + for _, m := range cm { + out = append(out, m.Cid()) + } + + return out, nil +} + +func (a *ChainAPI) ChainGetParentReceipts(ctx context.Context, bcid cid.Cid) ([]*types.MessageReceipt, error) { + b, err := a.Chain.GetBlock(bcid) + if err != nil { + return nil, err + } + + // TODO: need to get the number of messages better than this + pts, err := a.Chain.LoadTipSet(b.Parents) + if err != nil { + return nil, err + } + + cm, err := a.Chain.MessagesForTipset(pts) if err != nil { return nil, err } var out []*types.MessageReceipt - for i := 0; i < len(bm)+len(sm); i++ { - r, err := a.Chain.GetReceipt(b, i) + for i := 0; i < len(cm); i++ { + r, err := a.Chain.GetParentReceipt(b, i) if err != nil { return nil, err }