package types import ( "bytes" "encoding/json" "github.com/ipfs/go-cid" block "github.com/ipfs/go-libipfs/blocks" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/crypto" ) func (sm *SignedMessage) ToStorageBlock() (block.Block, error) { if sm.Signature.Type == crypto.SigTypeBLS { return sm.Message.ToStorageBlock() } data, err := sm.Serialize() if err != nil { return nil, err } c, err := abi.CidBuilder.Sum(data) if err != nil { return nil, err } return block.NewBlockWithCid(data, c) } func (sm *SignedMessage) Cid() cid.Cid { if sm.Signature.Type == crypto.SigTypeBLS { return sm.Message.Cid() } sb, err := sm.ToStorageBlock() if err != nil { panic(err) } return sb.Cid() } type SignedMessage struct { Message Message Signature crypto.Signature } func DecodeSignedMessage(data []byte) (*SignedMessage, error) { var msg SignedMessage if err := msg.UnmarshalCBOR(bytes.NewReader(data)); err != nil { return nil, err } return &msg, nil } func (sm *SignedMessage) Serialize() ([]byte, error) { buf := new(bytes.Buffer) if err := sm.MarshalCBOR(buf); err != nil { return nil, err } return buf.Bytes(), nil } type smCid struct { *RawSignedMessage CID cid.Cid } type RawSignedMessage SignedMessage func (sm *SignedMessage) MarshalJSON() ([]byte, error) { return json.Marshal(&smCid{ RawSignedMessage: (*RawSignedMessage)(sm), CID: sm.Cid(), }) } func (sm *SignedMessage) ChainLength() int { var ser []byte var err error if sm.Signature.Type == crypto.SigTypeBLS { // BLS chain message length doesn't include signature ser, err = sm.Message.Serialize() } else { ser, err = sm.Serialize() } if err != nil { panic(err) } return len(ser) } func (sm *SignedMessage) Size() int { serdata, err := sm.Serialize() if err != nil { log.Errorf("serializing message failed: %s", err) return 0 } return len(serdata) } func (sm *SignedMessage) VMMessage() *Message { return &sm.Message }