github.com/ewagmig/fabric@v2.1.1+incompatible/gossip/protoext/stringers.go (about)

     1  /*
     2  Copyright IBM Corp. All Rights Reserved.
     3  
     4  SPDX-License-Identifier: Apache-2.0
     5  */
     6  
     7  package protoext
     8  
     9  import (
    10  	"encoding/hex"
    11  	"fmt"
    12  
    13  	"github.com/golang/protobuf/proto"
    14  	"github.com/hyperledger/fabric-protos-go/gossip"
    15  	"github.com/hyperledger/fabric-protos-go/msp"
    16  )
    17  
    18  // MemberToString prints Endpoint and PKI-id
    19  func MemberToString(m *gossip.Member) string {
    20  	return fmt.Sprint("Membership: Endpoint:", m.Endpoint, " PKI-id:", hex.EncodeToString(m.PkiId))
    21  }
    22  
    23  // MembershipResponseToString of MembershipResponse prints number of Alive and number of Dead
    24  func MembershipResponseToString(mr *gossip.MembershipResponse) string {
    25  	return fmt.Sprintf("MembershipResponse with Alive: %d, Dead: %d", len(mr.Alive), len(mr.Dead))
    26  }
    27  
    28  // AliveMessageToString of AliveMessage prints Alive Message, Identity and Timestamp
    29  func AliveMessageToString(am *gossip.AliveMessage) string {
    30  	if am.Membership == nil {
    31  		return "nil Membership"
    32  	}
    33  	var sI string
    34  	serializeIdentity := &msp.SerializedIdentity{}
    35  	if err := proto.Unmarshal(am.Identity, serializeIdentity); err == nil {
    36  		sI = serializeIdentity.Mspid + string(serializeIdentity.IdBytes)
    37  	}
    38  	return fmt.Sprint("Alive Message:", MemberToString(am.Membership), "Identity:", sI, "Timestamp:", am.Timestamp)
    39  }
    40  
    41  // PayloadToString prints Block message: Data and seq
    42  func PayloadToString(p *gossip.Payload) string {
    43  	return fmt.Sprintf("Block message: {Data: %d bytes, seq: %d}", len(p.Data), p.SeqNum)
    44  }
    45  
    46  // DataUpdateToString prints Type, items and nonce
    47  func DataUpdateToString(du *gossip.DataUpdate) string {
    48  	mType := gossip.PullMsgType_name[int32(du.MsgType)]
    49  	return fmt.Sprintf("Type: %s, items: %d, nonce: %d", mType, len(du.Data), du.Nonce)
    50  }
    51  
    52  // StateInfoSnapshotToString prints items
    53  func StateInfoSnapshotToString(sis *gossip.StateInfoSnapshot) string {
    54  	return fmt.Sprintf("StateInfoSnapshot with %d items", len(sis.Elements))
    55  }
    56  
    57  // MembershipRequestToString prints self information
    58  func MembershipRequestToString(mr *gossip.MembershipRequest) string {
    59  	if mr.SelfInformation == nil {
    60  		return ""
    61  	}
    62  	signGM, err := EnvelopeToGossipMessage(mr.SelfInformation)
    63  	if err != nil {
    64  		return ""
    65  	}
    66  	return fmt.Sprintf("Membership Request with self information of %s ", signGM.String())
    67  }
    68  
    69  // StateInfoPullRequestToString prints Channel MAC
    70  func StateInfoPullRequestToString(sipr *gossip.StateInfoPullRequest) string {
    71  	return fmt.Sprint("state_info_pull_req: Channel MAC:", hex.EncodeToString(sipr.Channel_MAC))
    72  }
    73  
    74  // StateInfoToString prints Timestamp and PKI-id
    75  func StateInfoToString(si *gossip.StateInfo) string {
    76  	return fmt.Sprint("state_info_message: Timestamp:", si.Timestamp, "PKI-id:", hex.EncodeToString(si.PkiId),
    77  		" channel MAC:", hex.EncodeToString(si.Channel_MAC), " properties:", si.Properties)
    78  }
    79  
    80  // formatDigests formats digest byte arrays into strings depending on the message type
    81  func formatDigests(msgType gossip.PullMsgType, givenDigests [][]byte) []string {
    82  	var digests []string
    83  	switch msgType {
    84  	case gossip.PullMsgType_BLOCK_MSG:
    85  		for _, digest := range givenDigests {
    86  			digests = append(digests, string(digest))
    87  		}
    88  	case gossip.PullMsgType_IDENTITY_MSG:
    89  		for _, digest := range givenDigests {
    90  			digests = append(digests, hex.EncodeToString(digest))
    91  		}
    92  
    93  	}
    94  	return digests
    95  }
    96  
    97  // DataDigestToString prints nonce, msg_type and digests
    98  func DataDigestToString(dig *gossip.DataDigest) string {
    99  	var digests []string
   100  	digests = formatDigests(dig.MsgType, dig.Digests)
   101  	return fmt.Sprintf("data_dig: nonce: %d , Msg_type: %s, digests: %v", dig.Nonce, dig.MsgType, digests)
   102  }
   103  
   104  // DataRequestToString prints nonce, msg_type and digests
   105  func DataRequestToString(dataReq *gossip.DataRequest) string {
   106  	var digests []string
   107  	digests = formatDigests(dataReq.MsgType, dataReq.Digests)
   108  	return fmt.Sprintf("data request: nonce: %d , Msg_type: %s, digests: %v", dataReq.Nonce, dataReq.MsgType, digests)
   109  }
   110  
   111  // LeadershipMessageToString prints PKI-id, Timestamp and Is Declaration
   112  func LeadershipMessageToString(lm *gossip.LeadershipMessage) string {
   113  	return fmt.Sprint("Leadership Message: PKI-id:", hex.EncodeToString(lm.PkiId), " Timestamp:", lm.Timestamp,
   114  		"Is Declaration ", lm.IsDeclaration)
   115  }
   116  
   117  // RemovePvtDataResponseToString returns a string representation of this RemotePvtDataResponse
   118  func RemovePvtDataResponseToString(res *gossip.RemotePvtDataResponse) string {
   119  	a := make([]string, len(res.Elements))
   120  	for i, el := range res.Elements {
   121  		a[i] = fmt.Sprintf("%s with %d elements", el.Digest.String(), len(el.Payload))
   122  	}
   123  	return fmt.Sprintf("%v", a)
   124  }