package types import ( "bytes" "github.com/filecoin-project/specs-actors/actors/crypto" block "github.com/ipfs/go-block-format" "github.com/ipfs/go-cid" "github.com/multiformats/go-multihash" ) func (m *SignedMessage) ToStorageBlock() (block.Block, error) { if m.Signature.Type == crypto.SigTypeBLS { return m.Message.ToStorageBlock() } data, err := m.Serialize() if err != nil { return nil, err } pref := cid.NewPrefixV1(cid.DagCBOR, multihash.BLAKE2B_MIN+31) c, err := pref.Sum(data) if err != nil { return nil, err } return block.NewBlockWithCid(data, c) } func (m *SignedMessage) Cid() cid.Cid { if m.Signature.Type == crypto.SigTypeBLS { return m.Message.Cid() } sb, err := m.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 } func (m *SignedMessage) ChainLength() int { ser, err := m.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 }