func ClassifyClusterReConfig(currentConfig, updatedConfig *types.ClusterConfig) (nodes bool, consensus bool, ca bool, admins bool) {
	nodes = changedNodes(currentConfig.GetNodes(), updatedConfig.GetNodes())
	curConsensus := currentConfig.GetConsensusConfig()
	updConsensus := updatedConfig.GetConsensusConfig()
	consensus = !proto.Equal(curConsensus, updConsensus)
	curCA := currentConfig.GetCertAuthConfig()
	updCA := updatedConfig.GetCertAuthConfig()
	ca = !proto.Equal(curCA, updCA)
	admins = changedAdmins(currentConfig.GetAdmins(), updatedConfig.GetAdmins())
	return nodes, consensus, ca, admins
}
ClassifyClusterReConfig detects the kind of changes that happened in the ClusterConfig.
package replication
import (
	"fmt"
	"hash/crc64"
	"github.com/hyperledger-labs/orion-server/pkg/types"
	"github.com/golang/protobuf/proto"
	"go.etcd.io/etcd/raft"
	"go.etcd.io/etcd/raft/raftpb"
)
func raftPeers(config *types.ClusterConfig) []raft.Peer {
	var peers []raft.Peer
	for _, m := range config.ConsensusConfig.Members {
		peers = append(peers, raft.Peer{ID: m.GetRaftId()})
	}
	return peers
}
func raftEntryString(e raftpb.Entry) string {
	h := crc64.New(crc64.MakeTable(crc64.ISO))
	h.Write(e.Data)
	return fmt.Sprintf("{Term:%d Index:%d Type:%v Data(len):%d Data(hash):%X}",
		e.Term, e.Index, e.Type, len(e.Data), h.Sum64())
}