github.com/cranelv/ethereum_mpc@v0.0.0-20191031014521-23aeb1415092/consensus_pbft/message/messageStruct.go (about)

     1  package message
     2  
     3  import (
     4  	"github.com/ethereum/go-ethereum/consensus_pbft/pbftTypes"
     5  	"github.com/ethereum/go-ethereum/consensus_pbft/singletons"
     6  	"github.com/pkg/errors"
     7  )
     8  
     9  type MessageInterface interface {
    10  	Marshal()([]byte,error)
    11  	Sender()pbftTypes.ReplicaID
    12  }
    13  type RawMessage struct {
    14  	Type uint32
    15  	Payload []byte
    16  }
    17  func MarshalMsgList(msgType uint32,msgList interface{})([]byte,error){
    18  	payload,err := singletons.Marshaler.Marshal(msgList)
    19  	if err != nil {
    20  		return nil,err
    21  	}
    22  	rmsg := RawMessage{
    23  		Type: msgType,
    24  		Payload:payload,
    25  	}
    26  	return singletons.Marshaler.Marshal(rmsg)
    27  }
    28  func MarshalMsg(msgType uint32,msg MessageInterface)([]byte,error){
    29  	payload,err := singletons.Marshaler.Marshal(msg)
    30  	if err != nil {
    31  		return nil,err
    32  	}
    33  	rmsg := RawMessage{
    34  		Type: msgType,
    35  		Payload:payload,
    36  	}
    37  	return singletons.Marshaler.Marshal(rmsg)
    38  }
    39  func UnmarshalMsgList(buff []byte) (interface{},error){
    40  	var rmsg RawMessage
    41  	err := singletons.Marshaler.Unmarshal(buff,&rmsg)
    42  	if err != nil{
    43  		return nil,err
    44  	}
    45  	var msg interface{}
    46  	switch rmsg.Type {
    47  	case Message_Request:
    48  		msg = &[]*Request{}
    49  	case Message_RequestBatch:
    50  		msg = &[]RequestBatch{}
    51  	case Message_PrePrepare:
    52  		msg = &[]PrePrepare{}
    53  	case Message_Prepare:
    54  		msg = &[]Prepare{}
    55  	case Message_Commit:
    56  		msg = &[]Commit{}
    57  	case Message_Checkpoint:
    58  		msg = &[]Checkpoint{}
    59  	case Message_ViewChange:
    60  		msg = &[]ViewChange{}
    61  	case Message_NewView:
    62  		msg = &[]NewView{}
    63  	case Message_FetchRequestBatch:
    64  		msg = &[]FetchRequestBatch{}
    65  	case Message_ReturnRequestBatch:
    66  		msg = &[]ReturnRequestBatch{}
    67  	default:
    68  		return nil,errors.Errorf("Missing Message Type %d !",rmsg.Type)
    69  	}
    70  	err = singletons.Marshaler.Unmarshal(rmsg.Payload,msg)
    71  	return msg,err
    72  }
    73  func UnmarshalMsg(buff []byte,msg *MessageInterface)error{
    74  	var rmsg RawMessage
    75  	err := singletons.Marshaler.Unmarshal(buff,&rmsg)
    76  	if err != nil{
    77  		return err
    78  	}
    79  	switch rmsg.Type {
    80  	case Message_Request:
    81  		*msg = &Request{}
    82  	case Message_RequestBatch:
    83  		*msg = &RequestBatch{}
    84  	case Message_PrePrepare:
    85  		*msg = &PrePrepare{}
    86  	case Message_Prepare:
    87  		*msg = &Prepare{}
    88  	case Message_Commit:
    89  		*msg = &Commit{}
    90  	case Message_Checkpoint:
    91  		*msg = &Checkpoint{}
    92  	case Message_ViewChange:
    93  		*msg = &ViewChange{}
    94  	case Message_NewView:
    95  		*msg = &NewView{}
    96  	case Message_FetchRequestBatch:
    97  		*msg = &FetchRequestBatch{}
    98  	case Message_ReturnRequestBatch:
    99  		*msg = &ReturnRequestBatch{}
   100  	default:
   101  		return errors.Errorf("Missing Message Type %d !",rmsg.Type)
   102  	}
   103  	return singletons.Marshaler.Unmarshal(rmsg.Payload,*msg)
   104  }
   105  func Digest(msg MessageInterface)pbftTypes.MessageDigest{
   106  	payload,_ := msg.Marshal()
   107  	return singletons.Hasher.Hash(payload)
   108  }
   109  type Request struct {
   110  	Timestamp uint64
   111  	ReplicaId      pbftTypes.ReplicaID
   112  	Tasks []*Task
   113  	Signature []byte
   114  }
   115  func (req*Request)Marshal()([]byte,error){
   116  	return MarshalMsg(Message_Request,req)
   117  }
   118  func (req*Request)Sender()pbftTypes.ReplicaID{
   119  	return req.ReplicaId
   120  }
   121  type RequestBatch []*Request
   122  func (req *RequestBatch)Marshal()([]byte,error){
   123  	return MarshalMsg(Message_RequestBatch,req)
   124  }
   125  func (req*RequestBatch)Sender()pbftTypes.ReplicaID{
   126  	return pbftTypes.ReplicaID(0)
   127  }
   128  type PrePrepare struct {
   129  	View           uint64        `protobuf:"varint,1,opt,name=view" json:"view,omitempty"`
   130  	SequenceNumber uint64        `protobuf:"varint,2,opt,name=sequence_number,json=sequenceNumber" json:"sequence_number,omitempty"`
   131  	BatchDigest    pbftTypes.MessageDigest        `protobuf:"bytes,3,opt,name=batch_digest,json=batchDigest" json:"batch_digest,omitempty"`
   132  	RequestBatch   *RequestBatch		 `protobuf:"bytes,4,opt,name=request_batch,json=requestBatch" json:"request_batch,omitempty"`
   133  	ReplicaId      pbftTypes.ReplicaID        `protobuf:"varint,5,opt,name=replica_id,json=replicaId" json:"replica_id,omitempty"`
   134  }
   135  func (pp *PrePrepare)Marshal()([]byte,error){
   136  	return MarshalMsg(Message_PrePrepare,pp)
   137  }
   138  func (pp *PrePrepare)Sender()pbftTypes.ReplicaID{
   139  	return pp.ReplicaId
   140  }
   141  type Prepare struct {
   142  	View           uint64 `protobuf:"varint,1,opt,name=view" json:"view,omitempty"`
   143  	SequenceNumber uint64 `protobuf:"varint,2,opt,name=sequence_number,json=sequenceNumber" json:"sequence_number,omitempty"`
   144  	BatchDigest    pbftTypes.MessageDigest `protobuf:"bytes,3,opt,name=batch_digest,json=batchDigest" json:"batch_digest,omitempty"`
   145  	ReplicaId      pbftTypes.ReplicaID `protobuf:"varint,4,opt,name=replica_id,json=replicaId" json:"replica_id,omitempty"`
   146  }
   147  func (pre *Prepare)Marshal()([]byte,error){
   148  	return MarshalMsg(Message_Prepare,pre)
   149  }
   150  func (pp *Prepare)Sender()pbftTypes.ReplicaID{
   151  	return pp.ReplicaId
   152  }
   153  type Commit struct {
   154  	View           uint64 `protobuf:"varint,1,opt,name=view" json:"view,omitempty"`
   155  	SequenceNumber uint64 `protobuf:"varint,2,opt,name=sequence_number,json=sequenceNumber" json:"sequence_number,omitempty"`
   156  	BatchDigest    pbftTypes.MessageDigest `protobuf:"bytes,3,opt,name=batch_digest,json=batchDigest" json:"batch_digest,omitempty"`
   157  	ReplicaId      pbftTypes.ReplicaID `protobuf:"varint,4,opt,name=replica_id,json=replicaId" json:"replica_id,omitempty"`
   158  }
   159  func (cmt *Commit)Marshal()([]byte,error){
   160  	return MarshalMsg(Message_Commit,cmt)
   161  }
   162  func (pp *Commit)Sender()pbftTypes.ReplicaID{
   163  	return pp.ReplicaId
   164  }
   165  type Checkpoint struct {
   166  	SequenceNumber uint64 `protobuf:"varint,1,opt,name=sequence_number,json=sequenceNumber" json:"sequence_number,omitempty"`
   167  	ReplicaId      pbftTypes.ReplicaID `protobuf:"varint,2,opt,name=replica_id,json=replicaId" json:"replica_id,omitempty"`
   168  	Id             string `protobuf:"bytes,3,opt,name=id" json:"id,omitempty"`
   169  }
   170  func (cpt *Checkpoint)Marshal()([]byte,error){
   171  	return MarshalMsg(Message_Checkpoint,cpt)
   172  }
   173  func (pp *Checkpoint)Sender()pbftTypes.ReplicaID{
   174  	return pp.ReplicaId
   175  }
   176  // This message should go away and become a checkpoint once replica_id is removed
   177  type ViewChange_C struct {
   178  	SequenceNumber uint64 `protobuf:"varint,1,opt,name=sequence_number,json=sequenceNumber" json:"sequence_number,omitempty"`
   179  	Id             string `protobuf:"bytes,3,opt,name=id" json:"id,omitempty"`
   180  }
   181  
   182  type ViewChange_PQ struct {
   183  	SequenceNumber uint64 `protobuf:"varint,1,opt,name=sequence_number,json=sequenceNumber" json:"sequence_number,omitempty"`
   184  	BatchDigest    pbftTypes.MessageDigest `protobuf:"bytes,2,opt,name=batch_digest,json=batchDigest" json:"batch_digest,omitempty"`
   185  	View           uint64 `protobuf:"varint,3,opt,name=view" json:"view,omitempty"`
   186  }
   187  
   188  type ViewChange struct {
   189  	View      uint64           `protobuf:"varint,1,opt,name=view" json:"view,omitempty"`
   190  	H         uint64           `protobuf:"varint,2,opt,name=h" json:"h,omitempty"`
   191  	Cset      []*ViewChange_C  `protobuf:"bytes,3,rep,name=cset" json:"cset,omitempty"`
   192  	Pset      []*ViewChange_PQ `protobuf:"bytes,4,rep,name=pset" json:"pset,omitempty"`
   193  	Qset      []*ViewChange_PQ `protobuf:"bytes,5,rep,name=qset" json:"qset,omitempty"`
   194  	ReplicaId pbftTypes.ReplicaID           `protobuf:"varint,6,opt,name=replica_id,json=replicaId" json:"replica_id,omitempty"`
   195  	Signature []byte           `protobuf:"bytes,7,opt,name=signature,proto3" json:"signature,omitempty"`
   196  }
   197  func (pp *ViewChange)Sender()pbftTypes.ReplicaID{
   198  	return pp.ReplicaId
   199  }
   200  func (vc *ViewChange)Marshal()([]byte,error){
   201  	return MarshalMsg(Message_ViewChange,vc)
   202  }
   203  func (vc *ViewChange) GetSignature() []byte {
   204  	return vc.Signature
   205  }
   206  
   207  func (vc *ViewChange) SetSignature(sig []byte) {
   208  	vc.Signature = sig
   209  }
   210  
   211  func (vc *ViewChange) GetID() pbftTypes.ReplicaID  {
   212  	return vc.ReplicaId
   213  }
   214  
   215  func (vc *ViewChange) SetID(id pbftTypes.ReplicaID ) {
   216  	vc.ReplicaId = id
   217  }
   218  
   219  func (vc *ViewChange) Serialize() ([]byte, error) {
   220  	return vc.Marshal()
   221  }
   222  
   223  type NewView struct {
   224  	View      uint64            `protobuf:"varint,1,opt,name=view" json:"view,omitempty"`
   225  	Vset      []*ViewChange     `protobuf:"bytes,2,rep,name=vset" json:"vset,omitempty"`
   226  	Xset      map[uint64]pbftTypes.MessageDigest `protobuf:"bytes,3,rep,name=xset" json:"xset,omitempty" protobuf_key:"varint,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"`
   227  	ReplicaId pbftTypes.ReplicaID            `protobuf:"varint,4,opt,name=replica_id,json=replicaId" json:"replica_id,omitempty"`
   228  }
   229  func (pp *NewView)Sender()pbftTypes.ReplicaID{
   230  	return pp.ReplicaId
   231  }
   232  func (nv *NewView)Marshal()([]byte,error){
   233  	return MarshalMsg(Message_NewView,nv)
   234  }
   235  type FetchRequestBatch struct {
   236  	BatchDigest pbftTypes.MessageDigest `protobuf:"bytes,1,opt,name=batch_digest,json=batchDigest" json:"batch_digest,omitempty"`
   237  	ReplicaId   pbftTypes.ReplicaID `protobuf:"varint,2,opt,name=replica_id,json=replicaId" json:"replica_id,omitempty"`
   238  }
   239  func (pp *FetchRequestBatch)Sender()pbftTypes.ReplicaID{
   240  	return pp.ReplicaId
   241  }
   242  func (fr *FetchRequestBatch)Marshal()([]byte,error){
   243  	return MarshalMsg(Message_FetchRequestBatch,fr)
   244  }
   245  type ReturnRequestBatch []*Request
   246  func (req *ReturnRequestBatch)Marshal()([]byte,error){
   247  	return MarshalMsg(Message_ReturnRequestBatch,req)
   248  }
   249  func (pp *ReturnRequestBatch)Sender()pbftTypes.ReplicaID{
   250  	return pbftTypes.ReplicaID(0)
   251  }