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 }