Merge pull request #276 from filecoin-project/fix/block-printing
improve accuracy of block printing with getblock
This commit is contained in:
commit
b6d50c07c8
@ -54,7 +54,8 @@ type FullNode interface {
|
|||||||
ChainWaitMsg(context.Context, cid.Cid) (*MsgWait, error)
|
ChainWaitMsg(context.Context, cid.Cid) (*MsgWait, error)
|
||||||
ChainGetBlock(context.Context, cid.Cid) (*types.BlockHeader, error)
|
ChainGetBlock(context.Context, cid.Cid) (*types.BlockHeader, error)
|
||||||
ChainGetBlockMessages(context.Context, cid.Cid) (*BlockMessages, 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)
|
ChainGetTipSetByHeight(context.Context, uint64, *types.TipSet) (*types.TipSet, error)
|
||||||
ChainReadObj(context.Context, cid.Cid) ([]byte, error)
|
ChainReadObj(context.Context, cid.Cid) ([]byte, error)
|
||||||
|
|
||||||
|
@ -44,7 +44,8 @@ type FullNodeStruct struct {
|
|||||||
ChainWaitMsg func(context.Context, cid.Cid) (*MsgWait, error) `perm:"read"`
|
ChainWaitMsg func(context.Context, cid.Cid) (*MsgWait, error) `perm:"read"`
|
||||||
ChainGetBlock func(context.Context, cid.Cid) (*types.BlockHeader, error) `perm:"read"`
|
ChainGetBlock func(context.Context, cid.Cid) (*types.BlockHeader, error) `perm:"read"`
|
||||||
ChainGetBlockMessages func(context.Context, cid.Cid) (*BlockMessages, 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"`
|
ChainGetTipSetByHeight func(context.Context, uint64, *types.TipSet) (*types.TipSet, error) `perm:"read"`
|
||||||
ChainReadObj func(context.Context, cid.Cid) ([]byte, 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)
|
return c.Internal.ChainGetBlockMessages(ctx, b)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *FullNodeStruct) ChainGetBlockReceipts(ctx context.Context, b cid.Cid) ([]*types.MessageReceipt, error) {
|
func (c *FullNodeStruct) ChainGetParentReceipts(ctx context.Context, b cid.Cid) ([]*types.MessageReceipt, error) {
|
||||||
return c.Internal.ChainGetBlockReceipts(ctx, b)
|
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) {
|
func (c *FullNodeStruct) ChainNotify(ctx context.Context) (<-chan []*store.HeadChange, error) {
|
||||||
|
@ -617,7 +617,7 @@ func (cs *ChainStore) MessagesForBlock(b *types.BlockHeader) ([]*types.Message,
|
|||||||
return blsmsgs, secpkmsgs, nil
|
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)
|
bs := amt.WrapBlockstore(cs.bs)
|
||||||
a, err := amt.LoadAMT(bs, b.ParentMessageReceipts)
|
a, err := amt.LoadAMT(bs, b.ParentMessageReceipts)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -718,39 +718,7 @@ func (cs *ChainStore) tipsetExecutedMessage(ts *types.TipSet, msg cid.Cid) (*typ
|
|||||||
|
|
||||||
for i, m := range cm {
|
for i, m := range cm {
|
||||||
if m.Cid() == msg {
|
if m.Cid() == msg {
|
||||||
return cs.GetReceipt(ts.Blocks()[0], i)
|
return cs.GetParentReceipt(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))
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
25
cli/chain.go
25
cli/chain.go
@ -4,6 +4,7 @@ import (
|
|||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
|
"golang.org/x/xerrors"
|
||||||
"gopkg.in/urfave/cli.v2"
|
"gopkg.in/urfave/cli.v2"
|
||||||
|
|
||||||
types "github.com/filecoin-project/go-lotus/chain/types"
|
types "github.com/filecoin-project/go-lotus/chain/types"
|
||||||
@ -69,7 +70,7 @@ var chainGetBlock = &cli.Command{
|
|||||||
|
|
||||||
blk, err := api.ChainGetBlock(ctx, bcid)
|
blk, err := api.ChainGetBlock(ctx, bcid)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return xerrors.Errorf("get block failed: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if cctx.Bool("raw") {
|
if cctx.Bool("raw") {
|
||||||
@ -84,25 +85,33 @@ var chainGetBlock = &cli.Command{
|
|||||||
|
|
||||||
msgs, err := api.ChainGetBlockMessages(ctx, bcid)
|
msgs, err := api.ChainGetBlockMessages(ctx, bcid)
|
||||||
if err != nil {
|
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 {
|
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 {
|
cblock := struct {
|
||||||
types.BlockHeader
|
types.BlockHeader
|
||||||
BlsMessages []*types.Message
|
BlsMessages []*types.Message
|
||||||
SecpkMessages []*types.SignedMessage
|
SecpkMessages []*types.SignedMessage
|
||||||
MessageReceipts []*types.MessageReceipt
|
ParentReceipts []*types.MessageReceipt
|
||||||
|
ParentMessages []cid.Cid
|
||||||
}{}
|
}{}
|
||||||
|
|
||||||
cblock.BlockHeader = *blk
|
cblock.BlockHeader = *blk
|
||||||
cblock.BlsMessages = msgs.BlsMessages
|
cblock.BlsMessages = msgs.BlsMessages
|
||||||
cblock.SecpkMessages = msgs.SecpkMessages
|
cblock.SecpkMessages = msgs.SecpkMessages
|
||||||
cblock.MessageReceipts = recpts
|
cblock.ParentReceipts = recpts
|
||||||
|
cblock.ParentMessages = pmsgs
|
||||||
|
|
||||||
out, err := json.MarshalIndent(cblock, "", " ")
|
out, err := json.MarshalIndent(cblock, "", " ")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -93,21 +93,51 @@ func (a *ChainAPI) ChainGetBlockMessages(ctx context.Context, msg cid.Cid) (*api
|
|||||||
}, nil
|
}, 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)
|
b, err := a.Chain.GetBlock(bcid)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: need to get the number of messages better than this
|
// 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 {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
var out []*types.MessageReceipt
|
var out []*types.MessageReceipt
|
||||||
for i := 0; i < len(bm)+len(sm); i++ {
|
for i := 0; i < len(cm); i++ {
|
||||||
r, err := a.Chain.GetReceipt(b, i)
|
r, err := a.Chain.GetParentReceipt(b, i)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user