mirror of
				https://source.quilibrium.com/quilibrium/ceremonyclient.git
				synced 2025-04-04 19:36:54 +00:00 
			
		
		
		
	PROTO-57 - Peer Version Enforcement
This commit is contained in:
		
							parent
							
								
									8c73302d27
								
							
						
					
					
						commit
						0eb4a3051a
					
				| @ -4,10 +4,13 @@ import ( | |||||||
| 	"bytes" | 	"bytes" | ||||||
| 	"crypto" | 	"crypto" | ||||||
| 	"crypto/rand" | 	"crypto/rand" | ||||||
|  | 	"encoding/binary" | ||||||
| 	"strings" | 	"strings" | ||||||
| 	"time" | 	"time" | ||||||
| 
 | 
 | ||||||
| 	"github.com/iden3/go-iden3-crypto/poseidon" | 	"github.com/iden3/go-iden3-crypto/poseidon" | ||||||
|  | 	pcrypto "github.com/libp2p/go-libp2p/core/crypto" | ||||||
|  | 	"github.com/libp2p/go-libp2p/core/peer" | ||||||
| 	"github.com/pkg/errors" | 	"github.com/pkg/errors" | ||||||
| 	"go.uber.org/zap" | 	"go.uber.org/zap" | ||||||
| 	"golang.org/x/crypto/sha3" | 	"golang.org/x/crypto/sha3" | ||||||
| @ -157,10 +160,6 @@ func (e *CeremonyDataClockConsensusEngine) handleCeremonyPeerListAnnounce( | |||||||
| 
 | 
 | ||||||
| 	e.peerMapMx.Lock() | 	e.peerMapMx.Lock() | ||||||
| 	for _, p := range announce.PeerList { | 	for _, p := range announce.PeerList { | ||||||
| 		if p.Timestamp < time.Now().UnixMilli()-PEER_INFO_TTL { |  | ||||||
| 			continue |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 		if _, ok := e.uncooperativePeersMap[string(p.PeerId)]; ok { | 		if _, ok := e.uncooperativePeersMap[string(p.PeerId)]; ok { | ||||||
| 			continue | 			continue | ||||||
| 		} | 		} | ||||||
| @ -169,12 +168,71 @@ func (e *CeremonyDataClockConsensusEngine) handleCeremonyPeerListAnnounce( | |||||||
| 			continue | 			continue | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
|  | 		if p.PublicKey == nil || p.Signature == nil || p.Version == nil { | ||||||
|  | 			if time.Now().After(consensus.GetMinimumVersionCutoff()) { | ||||||
|  | 				if bytes.Equal(p.PeerId, peerID) { | ||||||
|  | 					e.logger.Warn( | ||||||
|  | 						"peer provided outdated version, penalizing app score", | ||||||
|  | 						zap.Binary("peer_id", p.PeerId), | ||||||
|  | 					) | ||||||
|  | 					e.pubSub.SetPeerScore(p.PeerId, -100) | ||||||
|  | 				} | ||||||
|  | 				continue | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		if p.PublicKey != nil && p.Signature != nil && p.Version != nil { | ||||||
|  | 			key, err := pcrypto.UnmarshalEd448PublicKey(p.PublicKey) | ||||||
|  | 			if err != nil { | ||||||
|  | 				e.logger.Error( | ||||||
|  | 					"peer announcement contained invalid pubkey", | ||||||
|  | 					zap.Binary("public_key", p.PublicKey), | ||||||
|  | 				) | ||||||
|  | 				continue | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
|  | 			if !(peer.ID(p.PeerId)).MatchesPublicKey(key) { | ||||||
|  | 				e.logger.Error( | ||||||
|  | 					"peer announcement peer id does not match pubkey", | ||||||
|  | 					zap.Binary("peer_id", p.PeerId), | ||||||
|  | 					zap.Binary("public_key", p.PublicKey), | ||||||
|  | 				) | ||||||
|  | 				continue | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
|  | 			msg := binary.BigEndian.AppendUint64([]byte{}, p.MaxFrame) | ||||||
|  | 			msg = append(msg, p.Version...) | ||||||
|  | 			msg = binary.BigEndian.AppendUint64(msg, uint64(p.Timestamp)) | ||||||
|  | 			b, err := key.Verify(msg, p.Signature) | ||||||
|  | 			if err != nil || !b { | ||||||
|  | 				e.logger.Error( | ||||||
|  | 					"peer provided invalid signature", | ||||||
|  | 					zap.Binary("msg", msg), | ||||||
|  | 					zap.Binary("public_key", p.PublicKey), | ||||||
|  | 					zap.Binary("signature", p.Signature), | ||||||
|  | 				) | ||||||
|  | 				continue | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
|  | 			if bytes.Compare(p.Version, consensus.GetMinimumVersion()) < 0 && | ||||||
|  | 				time.Now().After(consensus.GetMinimumVersionCutoff()) { | ||||||
|  | 				e.logger.Warn( | ||||||
|  | 					"peer provided outdated version, penalizing app score", | ||||||
|  | 					zap.Binary("peer_id", p.PeerId), | ||||||
|  | 				) | ||||||
|  | 				e.pubSub.SetPeerScore(p.PeerId, -100) | ||||||
|  | 				continue | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
| 		multiaddr := p.Multiaddr | 		multiaddr := p.Multiaddr | ||||||
| 		if bytes.Equal(p.PeerId, peerID) || p.Multiaddr == "" { | 		if bytes.Equal(p.PeerId, peerID) || p.Multiaddr == "" { | ||||||
| 			// we have to fetch self-reported peer info
 | 			// we have to fetch self-reported peer info
 | ||||||
| 			multiaddr = e.pubSub.GetMultiaddrOfPeer(peerID) | 			multiaddr = e.pubSub.GetMultiaddrOfPeer(peerID) | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
|  | 		e.pubSub.SetPeerScore(p.PeerId, 10) | ||||||
|  | 
 | ||||||
| 		e.peerMap[string(p.PeerId)] = &peerInfo{ | 		e.peerMap[string(p.PeerId)] = &peerInfo{ | ||||||
| 			peerId:    p.PeerId, | 			peerId:    p.PeerId, | ||||||
| 			multiaddr: multiaddr, | 			multiaddr: multiaddr, | ||||||
| @ -182,6 +240,9 @@ func (e *CeremonyDataClockConsensusEngine) handleCeremonyPeerListAnnounce( | |||||||
| 			direct:    bytes.Equal(p.PeerId, peerID), | 			direct:    bytes.Equal(p.PeerId, peerID), | ||||||
| 			lastSeen:  time.Now().Unix(), | 			lastSeen:  time.Now().Unix(), | ||||||
| 			timestamp: p.Timestamp, | 			timestamp: p.Timestamp, | ||||||
|  | 			version:   p.Version, | ||||||
|  | 			signature: p.Signature, | ||||||
|  | 			publicKey: p.PublicKey, | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 	e.peerMapMx.Unlock() | 	e.peerMapMx.Unlock() | ||||||
|  | |||||||
| @ -2,6 +2,7 @@ package ceremony | |||||||
| 
 | 
 | ||||||
| import ( | import ( | ||||||
| 	"crypto" | 	"crypto" | ||||||
|  | 	"encoding/binary" | ||||||
| 	"math/big" | 	"math/big" | ||||||
| 	"sync" | 	"sync" | ||||||
| 	"time" | 	"time" | ||||||
| @ -33,6 +34,7 @@ const ( | |||||||
| 	SyncStatusNotSyncing = iota | 	SyncStatusNotSyncing = iota | ||||||
| 	SyncStatusAwaitingResponse | 	SyncStatusAwaitingResponse | ||||||
| 	SyncStatusSynchronizing | 	SyncStatusSynchronizing | ||||||
|  | 	SyncStatusFailed | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| type peerInfo struct { | type peerInfo struct { | ||||||
| @ -41,6 +43,9 @@ type peerInfo struct { | |||||||
| 	maxFrame  uint64 | 	maxFrame  uint64 | ||||||
| 	timestamp int64 | 	timestamp int64 | ||||||
| 	lastSeen  int64 | 	lastSeen  int64 | ||||||
|  | 	version   []byte | ||||||
|  | 	signature []byte | ||||||
|  | 	publicKey []byte | ||||||
| 	direct    bool | 	direct    bool | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -81,6 +86,7 @@ type CeremonyDataClockConsensusEngine struct { | |||||||
| 	parentSelector                 []byte | 	parentSelector                 []byte | ||||||
| 	syncingStatus                  SyncStatusType | 	syncingStatus                  SyncStatusType | ||||||
| 	syncingTarget                  []byte | 	syncingTarget                  []byte | ||||||
|  | 	previousHead                   *protobufs.ClockFrame | ||||||
| 	currentDistance                *big.Int | 	currentDistance                *big.Int | ||||||
| 	engineMx                       sync.Mutex | 	engineMx                       sync.Mutex | ||||||
| 	dependencyMapMx                sync.Mutex | 	dependencyMapMx                sync.Mutex | ||||||
| @ -248,25 +254,36 @@ func (e *CeremonyDataClockConsensusEngine) Start( | |||||||
| 				PeerList: []*protobufs.CeremonyPeer{}, | 				PeerList: []*protobufs.CeremonyPeer{}, | ||||||
| 			} | 			} | ||||||
| 
 | 
 | ||||||
|  | 			timestamp := time.Now().UnixMilli() | ||||||
|  | 			msg := binary.BigEndian.AppendUint64([]byte{}, e.frame) | ||||||
|  | 			msg = append(msg, consensus.GetVersion()...) | ||||||
|  | 			msg = binary.BigEndian.AppendUint64(msg, uint64(timestamp)) | ||||||
|  | 			sig, err := e.pubSub.SignMessage(msg) | ||||||
|  | 			if err != nil { | ||||||
|  | 				panic(err) | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
| 			e.peerMapMx.Lock() | 			e.peerMapMx.Lock() | ||||||
| 			e.peerMap[string(e.pubSub.GetPeerID())] = &peerInfo{ | 			e.peerMap[string(e.pubSub.GetPeerID())] = &peerInfo{ | ||||||
| 				peerId:    e.pubSub.GetPeerID(), | 				peerId:    e.pubSub.GetPeerID(), | ||||||
| 				multiaddr: "", | 				multiaddr: "", | ||||||
| 				maxFrame:  e.frame, | 				maxFrame:  e.frame, | ||||||
| 				timestamp: time.Now().UnixMilli(), | 				version:   consensus.GetVersion(), | ||||||
|  | 				signature: sig, | ||||||
|  | 				publicKey: e.pubSub.GetPublicKey(), | ||||||
|  | 				timestamp: timestamp, | ||||||
| 			} | 			} | ||||||
| 			deletes := []*peerInfo{} | 			deletes := []*peerInfo{} | ||||||
| 			for _, v := range e.peerMap { | 			for _, v := range e.peerMap { | ||||||
| 				if v.timestamp > time.Now().UnixMilli()-PEER_INFO_TTL { |  | ||||||
| 				list.PeerList = append(list.PeerList, &protobufs.CeremonyPeer{ | 				list.PeerList = append(list.PeerList, &protobufs.CeremonyPeer{ | ||||||
| 					PeerId:    v.peerId, | 					PeerId:    v.peerId, | ||||||
| 					Multiaddr: v.multiaddr, | 					Multiaddr: v.multiaddr, | ||||||
| 					MaxFrame:  v.maxFrame, | 					MaxFrame:  v.maxFrame, | ||||||
| 					Timestamp: v.timestamp, | 					Timestamp: v.timestamp, | ||||||
|  | 					Version:   v.version, | ||||||
|  | 					Signature: v.signature, | ||||||
|  | 					PublicKey: v.publicKey, | ||||||
| 				}) | 				}) | ||||||
| 				} else { |  | ||||||
| 					deletes = append(deletes, v) |  | ||||||
| 				} |  | ||||||
| 			} | 			} | ||||||
| 			for _, v := range e.uncooperativePeersMap { | 			for _, v := range e.uncooperativePeersMap { | ||||||
| 				if v.timestamp <= time.Now().UnixMilli()-UNCOOPERATIVE_PEER_INFO_TTL { | 				if v.timestamp <= time.Now().UnixMilli()-UNCOOPERATIVE_PEER_INFO_TTL { | ||||||
| @ -274,7 +291,6 @@ func (e *CeremonyDataClockConsensusEngine) Start( | |||||||
| 				} | 				} | ||||||
| 			} | 			} | ||||||
| 			for _, v := range deletes { | 			for _, v := range deletes { | ||||||
| 				delete(e.peerMap, string(v.peerId)) |  | ||||||
| 				delete(e.uncooperativePeersMap, string(v.peerId)) | 				delete(e.uncooperativePeersMap, string(v.peerId)) | ||||||
| 			} | 			} | ||||||
| 			e.peerMapMx.Unlock() | 			e.peerMapMx.Unlock() | ||||||
| @ -412,6 +428,9 @@ func ( | |||||||
| 			Multiaddrs: []string{v.multiaddr}, | 			Multiaddrs: []string{v.multiaddr}, | ||||||
| 			MaxFrame:   v.maxFrame, | 			MaxFrame:   v.maxFrame, | ||||||
| 			Timestamp:  v.timestamp, | 			Timestamp:  v.timestamp, | ||||||
|  | 			Version:    v.version, | ||||||
|  | 			Signature:  v.signature, | ||||||
|  | 			PublicKey:  v.publicKey, | ||||||
| 		}) | 		}) | ||||||
| 	} | 	} | ||||||
| 	for _, v := range e.uncooperativePeersMap { | 	for _, v := range e.uncooperativePeersMap { | ||||||
| @ -422,6 +441,9 @@ func ( | |||||||
| 				Multiaddrs: []string{v.multiaddr}, | 				Multiaddrs: []string{v.multiaddr}, | ||||||
| 				MaxFrame:   v.maxFrame, | 				MaxFrame:   v.maxFrame, | ||||||
| 				Timestamp:  v.timestamp, | 				Timestamp:  v.timestamp, | ||||||
|  | 				Version:    v.version, | ||||||
|  | 				Signature:  v.signature, | ||||||
|  | 				PublicKey:  v.publicKey, | ||||||
| 			}, | 			}, | ||||||
| 		) | 		) | ||||||
| 	} | 	} | ||||||
|  | |||||||
| @ -900,8 +900,8 @@ func (e *CeremonyDataClockConsensusEngine) reverseOptimisticSync( | |||||||
| 	client := protobufs.NewCeremonyServiceClient(cc) | 	client := protobufs.NewCeremonyServiceClient(cc) | ||||||
| 
 | 
 | ||||||
| 	from := latest.FrameNumber | 	from := latest.FrameNumber | ||||||
| 	if from == 0 { | 	if from <= 1 { | ||||||
| 		from = 1 | 		from = 2 | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	if maxFrame-from > 32 { | 	if maxFrame-from > 32 { | ||||||
| @ -909,7 +909,7 @@ func (e *CeremonyDataClockConsensusEngine) reverseOptimisticSync( | |||||||
| 		// respond with a valid answer, optimistically continue from this
 | 		// respond with a valid answer, optimistically continue from this
 | ||||||
| 		// frame, if we hit a fault we'll mark them as uncooperative and move
 | 		// frame, if we hit a fault we'll mark them as uncooperative and move
 | ||||||
| 		// on
 | 		// on
 | ||||||
| 		from = 1 | 		from = 2 | ||||||
| 		s, err := client.GetCompressedSyncFrames( | 		s, err := client.GetCompressedSyncFrames( | ||||||
| 			context.Background(), | 			context.Background(), | ||||||
| 			&protobufs.ClockFramesRequest{ | 			&protobufs.ClockFramesRequest{ | ||||||
| @ -941,6 +941,7 @@ func (e *CeremonyDataClockConsensusEngine) reverseOptimisticSync( | |||||||
| 			) | 			) | ||||||
| 			var next *protobufs.ClockFrame | 			var next *protobufs.ClockFrame | ||||||
| 			if next, err = e.decompressAndStoreCandidates( | 			if next, err = e.decompressAndStoreCandidates( | ||||||
|  | 				peerId, | ||||||
| 				syncMsg, | 				syncMsg, | ||||||
| 				e.logger.Info, | 				e.logger.Info, | ||||||
| 			); err != nil && !errors.Is(err, ErrNoNewFrames) { | 			); err != nil && !errors.Is(err, ErrNoNewFrames) { | ||||||
| @ -958,6 +959,7 @@ func (e *CeremonyDataClockConsensusEngine) reverseOptimisticSync( | |||||||
| 				} | 				} | ||||||
| 
 | 
 | ||||||
| 				e.syncingTarget = nil | 				e.syncingTarget = nil | ||||||
|  | 				e.syncingStatus = SyncStatusFailed | ||||||
| 				return currentLatest, errors.Wrap(err, "reverse optimistic sync") | 				return currentLatest, errors.Wrap(err, "reverse optimistic sync") | ||||||
| 			} | 			} | ||||||
| 			if next != nil { | 			if next != nil { | ||||||
| @ -970,6 +972,7 @@ func (e *CeremonyDataClockConsensusEngine) reverseOptimisticSync( | |||||||
| 			} | 			} | ||||||
| 			e.logger.Error("error while receiving sync", zap.Error(err)) | 			e.logger.Error("error while receiving sync", zap.Error(err)) | ||||||
| 			e.syncingTarget = nil | 			e.syncingTarget = nil | ||||||
|  | 			e.syncingStatus = SyncStatusFailed | ||||||
| 			return latest, errors.Wrap(err, "reverse optimistic sync") | 			return latest, errors.Wrap(err, "reverse optimistic sync") | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| @ -981,7 +984,7 @@ func (e *CeremonyDataClockConsensusEngine) reverseOptimisticSync( | |||||||
| 			context.Background(), | 			context.Background(), | ||||||
| 			&protobufs.ClockFramesRequest{ | 			&protobufs.ClockFramesRequest{ | ||||||
| 				Filter:          e.filter, | 				Filter:          e.filter, | ||||||
| 				FromFrameNumber: from, | 				FromFrameNumber: from - 1, | ||||||
| 				ToFrameNumber:   maxFrame, | 				ToFrameNumber:   maxFrame, | ||||||
| 			}, | 			}, | ||||||
| 			grpc.MaxCallRecvMsgSize(600*1024*1024), | 			grpc.MaxCallRecvMsgSize(600*1024*1024), | ||||||
| @ -995,6 +998,7 @@ func (e *CeremonyDataClockConsensusEngine) reverseOptimisticSync( | |||||||
| 			e.uncooperativePeersMap[string(peerId)] = e.peerMap[string(peerId)] | 			e.uncooperativePeersMap[string(peerId)] = e.peerMap[string(peerId)] | ||||||
| 			delete(e.peerMap, string(peerId)) | 			delete(e.peerMap, string(peerId)) | ||||||
| 			e.peerMapMx.Unlock() | 			e.peerMapMx.Unlock() | ||||||
|  | 			e.syncingStatus = SyncStatusFailed | ||||||
| 
 | 
 | ||||||
| 			if err := cc.Close(); err != nil { | 			if err := cc.Close(); err != nil { | ||||||
| 				e.logger.Error("error while closing connection", zap.Error(err)) | 				e.logger.Error("error while closing connection", zap.Error(err)) | ||||||
| @ -1011,6 +1015,7 @@ func (e *CeremonyDataClockConsensusEngine) reverseOptimisticSync( | |||||||
| 					zap.Int("proofs", len(syncMsg.Proofs)), | 					zap.Int("proofs", len(syncMsg.Proofs)), | ||||||
| 				) | 				) | ||||||
| 				if _, err = e.decompressAndStoreCandidates( | 				if _, err = e.decompressAndStoreCandidates( | ||||||
|  | 					peerId, | ||||||
| 					syncMsg, | 					syncMsg, | ||||||
| 					e.logger.Debug, | 					e.logger.Debug, | ||||||
| 				); err != nil && !errors.Is(err, ErrNoNewFrames) { | 				); err != nil && !errors.Is(err, ErrNoNewFrames) { | ||||||
| @ -1018,7 +1023,8 @@ func (e *CeremonyDataClockConsensusEngine) reverseOptimisticSync( | |||||||
| 						"could not decompress and store candidate", | 						"could not decompress and store candidate", | ||||||
| 						zap.Error(err), | 						zap.Error(err), | ||||||
| 					) | 					) | ||||||
| 
 | 					e.syncingTarget = nil | ||||||
|  | 					e.syncingStatus = SyncStatusFailed | ||||||
| 					if err := cc.Close(); err != nil { | 					if err := cc.Close(); err != nil { | ||||||
| 						e.logger.Error("error while closing connection", zap.Error(err)) | 						e.logger.Error("error while closing connection", zap.Error(err)) | ||||||
| 					} | 					} | ||||||
| @ -1026,6 +1032,8 @@ func (e *CeremonyDataClockConsensusEngine) reverseOptimisticSync( | |||||||
| 				} | 				} | ||||||
| 			} | 			} | ||||||
| 			if err != nil && err != io.EOF && !errors.Is(err, ErrNoNewFrames) { | 			if err != nil && err != io.EOF && !errors.Is(err, ErrNoNewFrames) { | ||||||
|  | 				e.syncingTarget = nil | ||||||
|  | 				e.syncingStatus = SyncStatusFailed | ||||||
| 				e.logger.Error("error while receiving sync", zap.Error(err)) | 				e.logger.Error("error while receiving sync", zap.Error(err)) | ||||||
| 				if err := cc.Close(); err != nil { | 				if err := cc.Close(); err != nil { | ||||||
| 					e.logger.Error("error while closing connection", zap.Error(err)) | 					e.logger.Error("error while closing connection", zap.Error(err)) | ||||||
| @ -1037,6 +1045,9 @@ func (e *CeremonyDataClockConsensusEngine) reverseOptimisticSync( | |||||||
| 		if err := cc.Close(); err != nil { | 		if err := cc.Close(); err != nil { | ||||||
| 			e.logger.Error("error while closing connection", zap.Error(err)) | 			e.logger.Error("error while closing connection", zap.Error(err)) | ||||||
| 		} | 		} | ||||||
|  | 
 | ||||||
|  | 		e.syncingTarget = nil | ||||||
|  | 		e.syncingStatus = SyncStatusNotSyncing | ||||||
| 	}() | 	}() | ||||||
| 
 | 
 | ||||||
| 	return latest, nil | 	return latest, nil | ||||||
| @ -1070,7 +1081,6 @@ func (e *CeremonyDataClockConsensusEngine) sync( | |||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	if maxFrame > from { | 	if maxFrame > from { | ||||||
| 		from = 1 |  | ||||||
| 		s, err := client.GetCompressedSyncFrames( | 		s, err := client.GetCompressedSyncFrames( | ||||||
| 			context.Background(), | 			context.Background(), | ||||||
| 			&protobufs.ClockFramesRequest{ | 			&protobufs.ClockFramesRequest{ | ||||||
| @ -1101,6 +1111,7 @@ func (e *CeremonyDataClockConsensusEngine) sync( | |||||||
| 			) | 			) | ||||||
| 			var next *protobufs.ClockFrame | 			var next *protobufs.ClockFrame | ||||||
| 			if next, err = e.decompressAndStoreCandidates( | 			if next, err = e.decompressAndStoreCandidates( | ||||||
|  | 				peerId, | ||||||
| 				syncMsg, | 				syncMsg, | ||||||
| 				e.logger.Info, | 				e.logger.Info, | ||||||
| 			); err != nil && !errors.Is(err, ErrNoNewFrames) { | 			); err != nil && !errors.Is(err, ErrNoNewFrames) { | ||||||
| @ -1147,6 +1158,10 @@ func (e *CeremonyDataClockConsensusEngine) collect( | |||||||
| 		e.logger.Info("collecting vdf proofs") | 		e.logger.Info("collecting vdf proofs") | ||||||
| 
 | 
 | ||||||
| 		latest := currentFramePublished | 		latest := currentFramePublished | ||||||
|  | 		if e.syncingStatus == SyncStatusFailed { | ||||||
|  | 			latest = e.previousHead | ||||||
|  | 			e.syncingStatus = SyncStatusNotSyncing | ||||||
|  | 		} | ||||||
| 		maxFrame := uint64(0) | 		maxFrame := uint64(0) | ||||||
| 		var peerId []byte | 		var peerId []byte | ||||||
| 		peerId, maxFrame, err := e.GetMostAheadPeer() | 		peerId, maxFrame, err := e.GetMostAheadPeer() | ||||||
| @ -1162,6 +1177,7 @@ func (e *CeremonyDataClockConsensusEngine) collect( | |||||||
| 			) | 			) | ||||||
| 
 | 
 | ||||||
| 			e.syncingTarget = peerId | 			e.syncingTarget = peerId | ||||||
|  | 			e.previousHead = latest | ||||||
| 			latest, err = e.reverseOptimisticSync(latest, maxFrame, peerId) | 			latest, err = e.reverseOptimisticSync(latest, maxFrame, peerId) | ||||||
| 		} else if maxFrame > latest.FrameNumber { | 		} else if maxFrame > latest.FrameNumber { | ||||||
| 			latest, err = e.sync(latest, maxFrame, peerId) | 			latest, err = e.sync(latest, maxFrame, peerId) | ||||||
|  | |||||||
| @ -78,6 +78,7 @@ func (e *CeremonyDataClockConsensusEngine) GetCompressedSyncFrames( | |||||||
| 	) | 	) | ||||||
| 
 | 
 | ||||||
| 	from := request.FromFrameNumber | 	from := request.FromFrameNumber | ||||||
|  | 	parent := request.ParentSelector | ||||||
| 
 | 
 | ||||||
| 	frame, _, err := e.clockStore.GetDataClockFrame( | 	frame, _, err := e.clockStore.GetDataClockFrame( | ||||||
| 		request.Filter, | 		request.Filter, | ||||||
| @ -91,6 +92,8 @@ func (e *CeremonyDataClockConsensusEngine) GetCompressedSyncFrames( | |||||||
| 			) | 			) | ||||||
| 			return errors.Wrap(err, "get compressed sync frames") | 			return errors.Wrap(err, "get compressed sync frames") | ||||||
| 		} else { | 		} else { | ||||||
|  | 			frames, err := e.clockStore.GetCandidateDataClockFrames(e.filter, from) | ||||||
|  | 			if err != nil || len(frames) == 0 { | ||||||
| 				e.logger.Debug( | 				e.logger.Debug( | ||||||
| 					"peer asked for undiscovered frame", | 					"peer asked for undiscovered frame", | ||||||
| 					zap.Uint64("frame_number", request.FromFrameNumber), | 					zap.Uint64("frame_number", request.FromFrameNumber), | ||||||
| @ -109,9 +112,11 @@ func (e *CeremonyDataClockConsensusEngine) GetCompressedSyncFrames( | |||||||
| 
 | 
 | ||||||
| 				return nil | 				return nil | ||||||
| 			} | 			} | ||||||
|  | 
 | ||||||
|  | 			parent = nil | ||||||
|  | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	parent := request.ParentSelector |  | ||||||
| 	if parent != nil { | 	if parent != nil { | ||||||
| 		if !bytes.Equal(frame.ParentSelector, parent) { | 		if !bytes.Equal(frame.ParentSelector, parent) { | ||||||
| 			e.logger.Info( | 			e.logger.Info( | ||||||
| @ -151,6 +156,12 @@ func (e *CeremonyDataClockConsensusEngine) GetCompressedSyncFrames( | |||||||
| 	max := e.frame | 	max := e.frame | ||||||
| 	to := request.ToFrameNumber | 	to := request.ToFrameNumber | ||||||
| 
 | 
 | ||||||
|  | 	// We need to slightly rewind, to compensate for unconfirmed frame heads on a
 | ||||||
|  | 	// given branch
 | ||||||
|  | 	if from >= 2 { | ||||||
|  | 		from-- | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 	for { | 	for { | ||||||
| 		if to == 0 || to-from > 32 { | 		if to == 0 || to-from > 32 { | ||||||
| 			if max > from+31 { | 			if max > from+31 { | ||||||
| @ -189,6 +200,7 @@ func (e *CeremonyDataClockConsensusEngine) GetCompressedSyncFrames( | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (e *CeremonyDataClockConsensusEngine) decompressAndStoreCandidates( | func (e *CeremonyDataClockConsensusEngine) decompressAndStoreCandidates( | ||||||
|  | 	peerId []byte, | ||||||
| 	syncMsg *protobufs.CeremonyCompressedSync, | 	syncMsg *protobufs.CeremonyCompressedSync, | ||||||
| 	loggerFunc func(msg string, fields ...zapcore.Field), | 	loggerFunc func(msg string, fields ...zapcore.Field), | ||||||
| ) (*protobufs.ClockFrame, error) { | ) (*protobufs.ClockFrame, error) { | ||||||
| @ -196,9 +208,13 @@ func (e *CeremonyDataClockConsensusEngine) decompressAndStoreCandidates( | |||||||
| 		return nil, ErrNoNewFrames | 		return nil, ErrNoNewFrames | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	if len(syncMsg.TruncatedClockFrames) != int( | 	if len(syncMsg.TruncatedClockFrames) < int( | ||||||
| 		syncMsg.ToFrameNumber-syncMsg.FromFrameNumber+1, | 		syncMsg.ToFrameNumber-syncMsg.FromFrameNumber+1, | ||||||
| 	) { | 	) { | ||||||
|  | 		e.peerMapMx.Lock() | ||||||
|  | 		e.uncooperativePeersMap[string(peerId)] = e.peerMap[string(peerId)] | ||||||
|  | 		delete(e.peerMap, string(peerId)) | ||||||
|  | 		e.peerMapMx.Unlock() | ||||||
| 		return nil, errors.New("invalid continuity for compressed sync response") | 		return nil, errors.New("invalid continuity for compressed sync response") | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -2,6 +2,7 @@ package consensus | |||||||
| 
 | 
 | ||||||
| import ( | import ( | ||||||
| 	"crypto" | 	"crypto" | ||||||
|  | 	"time" | ||||||
| 
 | 
 | ||||||
| 	"source.quilibrium.com/quilibrium/monorepo/node/config" | 	"source.quilibrium.com/quilibrium/monorepo/node/config" | ||||||
| 	"source.quilibrium.com/quilibrium/monorepo/node/execution" | 	"source.quilibrium.com/quilibrium/monorepo/node/execution" | ||||||
| @ -49,3 +50,15 @@ type DataConsensusEngine interface { | |||||||
| 	IsInProverTrie(key []byte) bool | 	IsInProverTrie(key []byte) bool | ||||||
| 	GetPeerInfo() *protobufs.PeerInfoResponse | 	GetPeerInfo() *protobufs.PeerInfoResponse | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | func GetMinimumVersionCutoff() time.Time { | ||||||
|  | 	return time.Date(2023, time.November, 3, 0, 0, 0, 0, time.UTC) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func GetMinimumVersion() []byte { | ||||||
|  | 	return []byte{0x01, 0x01, 0x05} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func GetVersion() []byte { | ||||||
|  | 	return []byte{0x01, 0x01, 0x05} | ||||||
|  | } | ||||||
|  | |||||||
| @ -231,5 +231,5 @@ func printLogo() { | |||||||
| 
 | 
 | ||||||
| func printVersion() { | func printVersion() { | ||||||
| 	fmt.Println(" ") | 	fmt.Println(" ") | ||||||
| 	fmt.Println("                         Quilibrium Node - v1.1.4 – Dawn") | 	fmt.Println("                         Quilibrium Node - v1.1.5 – Dawn") | ||||||
| } | } | ||||||
|  | |||||||
| @ -39,6 +39,9 @@ type BlossomSub struct { | |||||||
| 	peerID      peer.ID | 	peerID      peer.ID | ||||||
| 	bitmaskMap  map[string]*blossomsub.Bitmask | 	bitmaskMap  map[string]*blossomsub.Bitmask | ||||||
| 	h           host.Host | 	h           host.Host | ||||||
|  | 	signKey     crypto.PrivKey | ||||||
|  | 	peerScore   map[string]int64 | ||||||
|  | 	peerScoreMx sync.Mutex | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| var _ PubSub = (*BlossomSub)(nil) | var _ PubSub = (*BlossomSub)(nil) | ||||||
| @ -63,13 +66,14 @@ func NewBlossomSub( | |||||||
| 		libp2p.ListenAddrStrings(p2pConfig.ListenMultiaddr), | 		libp2p.ListenAddrStrings(p2pConfig.ListenMultiaddr), | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | 	var privKey crypto.PrivKey | ||||||
| 	if p2pConfig.PeerPrivKey != "" { | 	if p2pConfig.PeerPrivKey != "" { | ||||||
| 		peerPrivKey, err := hex.DecodeString(p2pConfig.PeerPrivKey) | 		peerPrivKey, err := hex.DecodeString(p2pConfig.PeerPrivKey) | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			panic(errors.Wrap(err, "error unmarshaling peerkey")) | 			panic(errors.Wrap(err, "error unmarshaling peerkey")) | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		privKey, err := crypto.UnmarshalEd448PrivateKey(peerPrivKey) | 		privKey, err = crypto.UnmarshalEd448PrivateKey(peerPrivKey) | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			panic(errors.Wrap(err, "error unmarshaling peerkey")) | 			panic(errors.Wrap(err, "error unmarshaling peerkey")) | ||||||
| 		} | 		} | ||||||
| @ -77,6 +81,14 @@ func NewBlossomSub( | |||||||
| 		opts = append(opts, libp2p.Identity(privKey)) | 		opts = append(opts, libp2p.Identity(privKey)) | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | 	bs := &BlossomSub{ | ||||||
|  | 		ctx:        ctx, | ||||||
|  | 		logger:     logger, | ||||||
|  | 		bitmaskMap: make(map[string]*blossomsub.Bitmask), | ||||||
|  | 		signKey:    privKey, | ||||||
|  | 		peerScore:  make(map[string]int64), | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 	h, err := libp2p.New(opts...) | 	h, err := libp2p.New(opts...) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		panic(errors.Wrap(err, "error constructing p2p")) | 		panic(errors.Wrap(err, "error constructing p2p")) | ||||||
| @ -109,6 +121,31 @@ func NewBlossomSub( | |||||||
| 	if tracer != nil { | 	if tracer != nil { | ||||||
| 		blossomOpts = append(blossomOpts, blossomsub.WithEventTracer(tracer)) | 		blossomOpts = append(blossomOpts, blossomsub.WithEventTracer(tracer)) | ||||||
| 	} | 	} | ||||||
|  | 	blossomOpts = append(blossomOpts, blossomsub.WithPeerScore( | ||||||
|  | 		&blossomsub.PeerScoreParams{ | ||||||
|  | 			SkipAtomicValidation:        false, | ||||||
|  | 			BitmaskScoreCap:             0, | ||||||
|  | 			IPColocationFactorWeight:    -1, | ||||||
|  | 			IPColocationFactorThreshold: 6, | ||||||
|  | 			BehaviourPenaltyWeight:      -1, | ||||||
|  | 			BehaviourPenaltyThreshold:   100, | ||||||
|  | 			BehaviourPenaltyDecay:       .5, | ||||||
|  | 			DecayInterval:               time.Minute, | ||||||
|  | 			DecayToZero:                 .1, | ||||||
|  | 			RetainScore:                 5 * time.Minute, | ||||||
|  | 			AppSpecificScore: func(p peer.ID) float64 { | ||||||
|  | 				return float64(bs.GetPeerScore([]byte(p))) | ||||||
|  | 			}, | ||||||
|  | 			AppSpecificWeight: 10.0, | ||||||
|  | 		}, | ||||||
|  | 		&blossomsub.PeerScoreThresholds{ | ||||||
|  | 			SkipAtomicValidation:        false, | ||||||
|  | 			GossipThreshold:             -100, | ||||||
|  | 			PublishThreshold:            -100, | ||||||
|  | 			GraylistThreshold:           -100, | ||||||
|  | 			AcceptPXThreshold:           1, | ||||||
|  | 			OpportunisticGraftThreshold: 2, | ||||||
|  | 		})) | ||||||
| 
 | 
 | ||||||
| 	params := mergeDefaults(p2pConfig) | 	params := mergeDefaults(p2pConfig) | ||||||
| 	rt := blossomsub.NewBlossomSubRouter(h, params) | 	rt := blossomsub.NewBlossomSubRouter(h, params) | ||||||
| @ -118,15 +155,12 @@ func NewBlossomSub( | |||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	peerID := h.ID() | 	peerID := h.ID() | ||||||
|  | 	bs.ps = ps | ||||||
|  | 	bs.peerID = peerID | ||||||
|  | 	bs.h = h | ||||||
|  | 	bs.signKey = privKey | ||||||
| 
 | 
 | ||||||
| 	return &BlossomSub{ | 	return bs | ||||||
| 		ps, |  | ||||||
| 		ctx, |  | ||||||
| 		logger, |  | ||||||
| 		peerID, |  | ||||||
| 		make(map[string]*blossomsub.Bitmask), |  | ||||||
| 		h, |  | ||||||
| 	} |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (b *BlossomSub) PublishToBitmask(bitmask []byte, data []byte) error { | func (b *BlossomSub) PublishToBitmask(bitmask []byte, data []byte) error { | ||||||
| @ -318,6 +352,19 @@ func initDHT( | |||||||
| 	return kademliaDHT | 	return kademliaDHT | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | func (b *BlossomSub) GetPeerScore(peerId []byte) int64 { | ||||||
|  | 	b.peerScoreMx.Lock() | ||||||
|  | 	score := b.peerScore[string(peerId)] | ||||||
|  | 	b.peerScoreMx.Unlock() | ||||||
|  | 	return score | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (b *BlossomSub) SetPeerScore(peerId []byte, score int64) { | ||||||
|  | 	b.peerScoreMx.Lock() | ||||||
|  | 	b.peerScore[string(peerId)] = score | ||||||
|  | 	b.peerScoreMx.Unlock() | ||||||
|  | } | ||||||
|  | 
 | ||||||
| func (b *BlossomSub) GetBitmaskPeers() map[string][]string { | func (b *BlossomSub) GetBitmaskPeers() map[string][]string { | ||||||
| 	peers := map[string][]string{} | 	peers := map[string][]string{} | ||||||
| 
 | 
 | ||||||
| @ -433,6 +480,16 @@ func (b *BlossomSub) GetDirectChannel(key []byte) ( | |||||||
| 	return dialCtx, nil | 	return dialCtx, nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | func (b *BlossomSub) GetPublicKey() []byte { | ||||||
|  | 	pub, _ := b.signKey.GetPublic().Raw() | ||||||
|  | 	return pub | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (b *BlossomSub) SignMessage(msg []byte) ([]byte, error) { | ||||||
|  | 	sig, err := b.signKey.Sign(msg) | ||||||
|  | 	return sig, errors.Wrap(err, "sign message") | ||||||
|  | } | ||||||
|  | 
 | ||||||
| func discoverPeers( | func discoverPeers( | ||||||
| 	p2pConfig *config.P2PConfig, | 	p2pConfig *config.P2PConfig, | ||||||
| 	ctx context.Context, | 	ctx context.Context, | ||||||
|  | |||||||
| @ -23,4 +23,8 @@ type PubSub interface { | |||||||
| 	) error | 	) error | ||||||
| 	GetDirectChannel(peerId []byte) (*grpc.ClientConn, error) | 	GetDirectChannel(peerId []byte) (*grpc.ClientConn, error) | ||||||
| 	GetNetworkInfo() *protobufs.NetworkInfoResponse | 	GetNetworkInfo() *protobufs.NetworkInfoResponse | ||||||
|  | 	SignMessage(msg []byte) ([]byte, error) | ||||||
|  | 	GetPublicKey() []byte | ||||||
|  | 	GetPeerScore(peerId []byte) int64 | ||||||
|  | 	SetPeerScore(peerId []byte, score int64) | ||||||
| } | } | ||||||
|  | |||||||
| @ -1028,6 +1028,9 @@ type CeremonyPeer struct { | |||||||
| 	Multiaddr string `protobuf:"bytes,2,opt,name=multiaddr,proto3" json:"multiaddr,omitempty"` | 	Multiaddr string `protobuf:"bytes,2,opt,name=multiaddr,proto3" json:"multiaddr,omitempty"` | ||||||
| 	MaxFrame  uint64 `protobuf:"varint,3,opt,name=max_frame,json=maxFrame,proto3" json:"max_frame,omitempty"` | 	MaxFrame  uint64 `protobuf:"varint,3,opt,name=max_frame,json=maxFrame,proto3" json:"max_frame,omitempty"` | ||||||
| 	Timestamp int64  `protobuf:"varint,4,opt,name=timestamp,proto3" json:"timestamp,omitempty"` | 	Timestamp int64  `protobuf:"varint,4,opt,name=timestamp,proto3" json:"timestamp,omitempty"` | ||||||
|  | 	Version   []byte `protobuf:"bytes,5,opt,name=version,proto3" json:"version,omitempty"` | ||||||
|  | 	Signature []byte `protobuf:"bytes,6,opt,name=signature,proto3" json:"signature,omitempty"` | ||||||
|  | 	PublicKey []byte `protobuf:"bytes,7,opt,name=public_key,json=publicKey,proto3" json:"public_key,omitempty"` | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (x *CeremonyPeer) Reset() { | func (x *CeremonyPeer) Reset() { | ||||||
| @ -1090,6 +1093,27 @@ func (x *CeremonyPeer) GetTimestamp() int64 { | |||||||
| 	return 0 | 	return 0 | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | func (x *CeremonyPeer) GetVersion() []byte { | ||||||
|  | 	if x != nil { | ||||||
|  | 		return x.Version | ||||||
|  | 	} | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (x *CeremonyPeer) GetSignature() []byte { | ||||||
|  | 	if x != nil { | ||||||
|  | 		return x.Signature | ||||||
|  | 	} | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (x *CeremonyPeer) GetPublicKey() []byte { | ||||||
|  | 	if x != nil { | ||||||
|  | 		return x.PublicKey | ||||||
|  | 	} | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
| type CeremonyCompressedSync struct { | type CeremonyCompressedSync struct { | ||||||
| 	state         protoimpl.MessageState | 	state         protoimpl.MessageState | ||||||
| 	sizeCache     protoimpl.SizeCache | 	sizeCache     protoimpl.SizeCache | ||||||
| @ -1646,7 +1670,7 @@ var file_ceremony_proto_rawDesc = []byte{ | |||||||
| 	0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, | 	0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, | ||||||
| 	0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x63, 0x65, 0x72, 0x65, 0x6d, 0x6f, 0x6e, 0x79, 0x2e, 0x70, | 	0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x63, 0x65, 0x72, 0x65, 0x6d, 0x6f, 0x6e, 0x79, 0x2e, 0x70, | ||||||
| 	0x62, 0x2e, 0x43, 0x65, 0x72, 0x65, 0x6d, 0x6f, 0x6e, 0x79, 0x50, 0x65, 0x65, 0x72, 0x52, 0x08, | 	0x62, 0x2e, 0x43, 0x65, 0x72, 0x65, 0x6d, 0x6f, 0x6e, 0x79, 0x50, 0x65, 0x65, 0x72, 0x52, 0x08, | ||||||
| 	0x70, 0x65, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x22, 0x80, 0x01, 0x0a, 0x0c, 0x43, 0x65, 0x72, | 	0x70, 0x65, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x22, 0xd7, 0x01, 0x0a, 0x0c, 0x43, 0x65, 0x72, | ||||||
| 	0x65, 0x6d, 0x6f, 0x6e, 0x79, 0x50, 0x65, 0x65, 0x72, 0x12, 0x17, 0x0a, 0x07, 0x70, 0x65, 0x65, | 	0x65, 0x6d, 0x6f, 0x6e, 0x79, 0x50, 0x65, 0x65, 0x72, 0x12, 0x17, 0x0a, 0x07, 0x70, 0x65, 0x65, | ||||||
| 	0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x70, 0x65, 0x65, 0x72, | 	0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x70, 0x65, 0x65, 0x72, | ||||||
| 	0x49, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x61, 0x64, 0x64, 0x72, 0x18, | 	0x49, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x61, 0x64, 0x64, 0x72, 0x18, | ||||||
| @ -1654,73 +1678,78 @@ var file_ceremony_proto_rawDesc = []byte{ | |||||||
| 	0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x61, 0x78, 0x5f, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, | 	0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x61, 0x78, 0x5f, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, | ||||||
| 	0x01, 0x28, 0x04, 0x52, 0x08, 0x6d, 0x61, 0x78, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, | 	0x01, 0x28, 0x04, 0x52, 0x08, 0x6d, 0x61, 0x78, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, | ||||||
| 	0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, | 	0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, | ||||||
| 	0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0xe0, 0x02, 0x0a, 0x16, | 	0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x18, 0x0a, 0x07, 0x76, | ||||||
| 	0x43, 0x65, 0x72, 0x65, 0x6d, 0x6f, 0x6e, 0x79, 0x43, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, | 	0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x76, 0x65, | ||||||
| 	0x65, 0x64, 0x53, 0x79, 0x6e, 0x63, 0x12, 0x2a, 0x0a, 0x11, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x66, | 	0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, | ||||||
| 	0x72, 0x61, 0x6d, 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, | 	0x72, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, | ||||||
| 	0x04, 0x52, 0x0f, 0x66, 0x72, 0x6f, 0x6d, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x4e, 0x75, 0x6d, 0x62, | 	0x75, 0x72, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x6b, 0x65, | ||||||
| 	0x65, 0x72, 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x6f, 0x5f, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x5f, 0x6e, | 	0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, | ||||||
| 	0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x74, 0x6f, 0x46, | 	0x65, 0x79, 0x22, 0xe0, 0x02, 0x0a, 0x16, 0x43, 0x65, 0x72, 0x65, 0x6d, 0x6f, 0x6e, 0x79, 0x43, | ||||||
| 	0x72, 0x61, 0x6d, 0x65, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x5a, 0x0a, 0x16, 0x74, 0x72, | 	0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x53, 0x79, 0x6e, 0x63, 0x12, 0x2a, 0x0a, | ||||||
| 	0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x66, 0x72, | 	0x11, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x62, | ||||||
| 	0x61, 0x6d, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x71, 0x75, 0x69, | 	0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0f, 0x66, 0x72, 0x6f, 0x6d, 0x46, 0x72, | ||||||
| 	0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x63, 0x6c, 0x6f, | 	0x61, 0x6d, 0x65, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x6f, 0x5f, | ||||||
| 	0x63, 0x6b, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x6c, 0x6f, 0x63, 0x6b, 0x46, 0x72, 0x61, 0x6d, 0x65, | 	0x66, 0x72, 0x61, 0x6d, 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, | ||||||
| 	0x52, 0x14, 0x74, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x64, 0x43, 0x6c, 0x6f, 0x63, 0x6b, | 	0x28, 0x04, 0x52, 0x0d, 0x74, 0x6f, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x4e, 0x75, 0x6d, 0x62, 0x65, | ||||||
| 	0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x47, 0x0a, 0x06, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x73, | 	0x72, 0x12, 0x5a, 0x0a, 0x16, 0x74, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x63, | ||||||
| 	0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, | 	0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, | ||||||
| 	0x69, 0x75, 0x6d, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x63, 0x65, 0x72, 0x65, 0x6d, 0x6f, 0x6e, | 	0x0b, 0x32, 0x24, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, | ||||||
| 	0x79, 0x2e, 0x70, 0x62, 0x2e, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, | 	0x6f, 0x64, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x6c, 0x6f, | ||||||
| 	0x6f, 0x6f, 0x66, 0x73, 0x4d, 0x61, 0x70, 0x52, 0x06, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x73, 0x12, | 	0x63, 0x6b, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x52, 0x14, 0x74, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, | ||||||
| 	0x4d, 0x0a, 0x08, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, | 	0x65, 0x64, 0x43, 0x6c, 0x6f, 0x63, 0x6b, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x47, 0x0a, | ||||||
| 	0x0b, 0x32, 0x31, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, | 	0x06, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, | ||||||
| 	0x6f, 0x64, 0x65, 0x2e, 0x63, 0x65, 0x72, 0x65, 0x6d, 0x6f, 0x6e, 0x79, 0x2e, 0x70, 0x62, 0x2e, | 	0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, | ||||||
| 	0x49, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, | 	0x63, 0x65, 0x72, 0x65, 0x6d, 0x6f, 0x6e, 0x79, 0x2e, 0x70, 0x62, 0x2e, 0x49, 0x6e, 0x63, 0x6c, | ||||||
| 	0x73, 0x4d, 0x61, 0x70, 0x52, 0x08, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x22, 0xa5, | 	0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x73, 0x4d, 0x61, 0x70, 0x52, 0x06, | ||||||
| 	0x01, 0x0a, 0x12, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, | 	0x70, 0x72, 0x6f, 0x6f, 0x66, 0x73, 0x12, 0x4d, 0x0a, 0x08, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, | ||||||
| 	0x66, 0x73, 0x4d, 0x61, 0x70, 0x12, 0x21, 0x0a, 0x0c, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x5f, 0x63, | 	0x74, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, | ||||||
| 	0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x66, 0x72, 0x61, | 	0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x63, 0x65, 0x72, 0x65, 0x6d, | ||||||
| 	0x6d, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x72, 0x6f, 0x6f, | 	0x6f, 0x6e, 0x79, 0x2e, 0x70, 0x62, 0x2e, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, | ||||||
| 	0x66, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x56, | 	0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x4d, 0x61, 0x70, 0x52, 0x08, 0x73, 0x65, 0x67, | ||||||
| 	0x0a, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x03, 0x20, | 	0x6d, 0x65, 0x6e, 0x74, 0x73, 0x22, 0xa5, 0x01, 0x0a, 0x12, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x73, | ||||||
| 	0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, | 	0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x73, 0x4d, 0x61, 0x70, 0x12, 0x21, 0x0a, 0x0c, | ||||||
| 	0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x63, 0x65, 0x72, 0x65, 0x6d, 0x6f, 0x6e, 0x79, 0x2e, 0x70, | 	0x66, 0x72, 0x61, 0x6d, 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x18, 0x01, 0x20, 0x01, | ||||||
| 	0x62, 0x2e, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, | 	0x28, 0x0c, 0x52, 0x0b, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x12, | ||||||
| 	0x74, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x4d, 0x61, 0x70, 0x52, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x69, | 	0x14, 0x0a, 0x05, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, | ||||||
| 	0x74, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x3e, 0x0a, 0x14, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x73, | 	0x70, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x56, 0x0a, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, | ||||||
| 	0x69, 0x6f, 0x6e, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x4d, 0x61, 0x70, 0x12, 0x12, | 	0x65, 0x6e, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x71, 0x75, 0x69, | ||||||
| 	0x0a, 0x04, 0x68, 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x68, 0x61, | 	0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x63, 0x65, 0x72, | ||||||
| 	0x73, 0x68, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, | 	0x65, 0x6d, 0x6f, 0x6e, 0x79, 0x2e, 0x70, 0x62, 0x2e, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, | ||||||
| 	0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0x7b, 0x0a, 0x17, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x73, | 	0x6f, 0x6e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x4d, 0x61, 0x70, | ||||||
| 	0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x4d, 0x61, | 	0x52, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x3e, 0x0a, | ||||||
| 	0x70, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x18, | 	0x14, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, | ||||||
| 	0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, | 	0x74, 0x73, 0x4d, 0x61, 0x70, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, | ||||||
| 	0x74, 0x12, 0x19, 0x0a, 0x08, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x02, 0x20, | 	0x01, 0x28, 0x0c, 0x52, 0x04, 0x68, 0x61, 0x73, 0x68, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, | ||||||
| 	0x01, 0x28, 0x09, 0x52, 0x07, 0x74, 0x79, 0x70, 0x65, 0x55, 0x72, 0x6c, 0x12, 0x25, 0x0a, 0x0e, | 	0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0x7b, 0x0a, | ||||||
| 	0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x18, 0x03, | 	0x17, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, | ||||||
| 	0x20, 0x03, 0x28, 0x0c, 0x52, 0x0d, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x48, 0x61, 0x73, | 	0x6d, 0x65, 0x6e, 0x74, 0x73, 0x4d, 0x61, 0x70, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6d, 0x6d, | ||||||
| 	0x68, 0x65, 0x73, 0x32, 0x89, 0x02, 0x0a, 0x0f, 0x43, 0x65, 0x72, 0x65, 0x6d, 0x6f, 0x6e, 0x79, | 	0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x63, 0x6f, | ||||||
| 	0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x7e, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x43, 0x6f, | 	0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x74, 0x79, 0x70, 0x65, | ||||||
| 	0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x53, 0x79, 0x6e, 0x63, 0x46, 0x72, 0x61, 0x6d, | 	0x5f, 0x75, 0x72, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x74, 0x79, 0x70, 0x65, | ||||||
| 	0x65, 0x73, 0x12, 0x2c, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, | 	0x55, 0x72, 0x6c, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x68, | ||||||
| 	0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x6c, | 	0x61, 0x73, 0x68, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x0d, 0x73, 0x65, 0x67, | ||||||
| 	0x6f, 0x63, 0x6b, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, | 	0x6d, 0x65, 0x6e, 0x74, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x32, 0x89, 0x02, 0x0a, 0x0f, 0x43, | ||||||
| 	0x1a, 0x33, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, 0x6f, | 	0x65, 0x72, 0x65, 0x6d, 0x6f, 0x6e, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x7e, | ||||||
| 	0x64, 0x65, 0x2e, 0x63, 0x65, 0x72, 0x65, 0x6d, 0x6f, 0x6e, 0x79, 0x2e, 0x70, 0x62, 0x2e, 0x43, | 	0x0a, 0x17, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x53, | ||||||
| 	0x65, 0x72, 0x65, 0x6d, 0x6f, 0x6e, 0x79, 0x43, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, | 	0x79, 0x6e, 0x63, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x2c, 0x2e, 0x71, 0x75, 0x69, 0x6c, | ||||||
| 	0x64, 0x53, 0x79, 0x6e, 0x63, 0x30, 0x01, 0x12, 0x76, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x50, 0x75, | 	0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x63, | ||||||
| 	0x62, 0x6c, 0x69, 0x63, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x12, 0x2e, 0x2e, 0x71, 0x75, | 	0x6b, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x6c, 0x6f, 0x63, 0x6b, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, | ||||||
| 	0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x63, 0x68, | 	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x33, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, | ||||||
| 	0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x50, 0x32, 0x50, 0x43, 0x68, 0x61, 0x6e, | 	0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x63, 0x65, 0x72, 0x65, 0x6d, 0x6f, | ||||||
| 	0x6e, 0x65, 0x6c, 0x45, 0x6e, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x1a, 0x2e, 0x2e, 0x71, 0x75, | 	0x6e, 0x79, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x65, 0x72, 0x65, 0x6d, 0x6f, 0x6e, 0x79, 0x43, 0x6f, | ||||||
| 	0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x63, 0x68, | 	0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x53, 0x79, 0x6e, 0x63, 0x30, 0x01, 0x12, 0x76, | ||||||
| 	0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x50, 0x32, 0x50, 0x43, 0x68, 0x61, 0x6e, | 	0x0a, 0x10, 0x47, 0x65, 0x74, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x43, 0x68, 0x61, 0x6e, 0x6e, | ||||||
| 	0x6e, 0x65, 0x6c, 0x45, 0x6e, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x28, 0x01, 0x30, 0x01, 0x42, | 	0x65, 0x6c, 0x12, 0x2e, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, | ||||||
| 	0x3a, 0x5a, 0x38, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, | 	0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x2e, 0x70, 0x62, 0x2e, | ||||||
| 	0x72, 0x69, 0x75, 0x6d, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, | 	0x50, 0x32, 0x50, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x45, 0x6e, 0x76, 0x65, 0x6c, 0x6f, | ||||||
| 	0x69, 0x75, 0x6d, 0x2f, 0x6d, 0x6f, 0x6e, 0x6f, 0x72, 0x65, 0x70, 0x6f, 0x2f, 0x6e, 0x6f, 0x64, | 	0x70, 0x65, 0x1a, 0x2e, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, | ||||||
| 	0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, | 	0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x2e, 0x70, 0x62, 0x2e, | ||||||
| 	0x74, 0x6f, 0x33, | 	0x50, 0x32, 0x50, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x45, 0x6e, 0x76, 0x65, 0x6c, 0x6f, | ||||||
|  | 	0x70, 0x65, 0x28, 0x01, 0x30, 0x01, 0x42, 0x3a, 0x5a, 0x38, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, | ||||||
|  | 	0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, | ||||||
|  | 	0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2f, 0x6d, 0x6f, 0x6e, 0x6f, 0x72, | ||||||
|  | 	0x65, 0x70, 0x6f, 0x2f, 0x6e, 0x6f, 0x64, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, | ||||||
|  | 	0x66, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| var ( | var ( | ||||||
|  | |||||||
| @ -136,6 +136,9 @@ message CeremonyPeer { | |||||||
|   string multiaddr = 2; |   string multiaddr = 2; | ||||||
|   uint64 max_frame = 3; |   uint64 max_frame = 3; | ||||||
|   int64 timestamp = 4; |   int64 timestamp = 4; | ||||||
|  |   bytes version = 5; | ||||||
|  |   bytes signature = 6; | ||||||
|  |   bytes public_key = 7; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| message CeremonyCompressedSync { | message CeremonyCompressedSync { | ||||||
|  | |||||||
| @ -333,6 +333,9 @@ type PeerInfo struct { | |||||||
| 	Multiaddrs []string `protobuf:"bytes,2,rep,name=multiaddrs,proto3" json:"multiaddrs,omitempty"` | 	Multiaddrs []string `protobuf:"bytes,2,rep,name=multiaddrs,proto3" json:"multiaddrs,omitempty"` | ||||||
| 	MaxFrame   uint64   `protobuf:"varint,3,opt,name=max_frame,json=maxFrame,proto3" json:"max_frame,omitempty"` | 	MaxFrame   uint64   `protobuf:"varint,3,opt,name=max_frame,json=maxFrame,proto3" json:"max_frame,omitempty"` | ||||||
| 	Timestamp  int64    `protobuf:"varint,4,opt,name=timestamp,proto3" json:"timestamp,omitempty"` | 	Timestamp  int64    `protobuf:"varint,4,opt,name=timestamp,proto3" json:"timestamp,omitempty"` | ||||||
|  | 	Version    []byte   `protobuf:"bytes,5,opt,name=version,proto3" json:"version,omitempty"` | ||||||
|  | 	Signature  []byte   `protobuf:"bytes,6,opt,name=signature,proto3" json:"signature,omitempty"` | ||||||
|  | 	PublicKey  []byte   `protobuf:"bytes,7,opt,name=public_key,json=publicKey,proto3" json:"public_key,omitempty"` | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (x *PeerInfo) Reset() { | func (x *PeerInfo) Reset() { | ||||||
| @ -395,6 +398,27 @@ func (x *PeerInfo) GetTimestamp() int64 { | |||||||
| 	return 0 | 	return 0 | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | func (x *PeerInfo) GetVersion() []byte { | ||||||
|  | 	if x != nil { | ||||||
|  | 		return x.Version | ||||||
|  | 	} | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (x *PeerInfo) GetSignature() []byte { | ||||||
|  | 	if x != nil { | ||||||
|  | 		return x.Signature | ||||||
|  | 	} | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (x *PeerInfo) GetPublicKey() []byte { | ||||||
|  | 	if x != nil { | ||||||
|  | 		return x.PublicKey | ||||||
|  | 	} | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
| type PeerInfoResponse struct { | type PeerInfoResponse struct { | ||||||
| 	state         protoimpl.MessageState | 	state         protoimpl.MessageState | ||||||
| 	sizeCache     protoimpl.SizeCache | 	sizeCache     protoimpl.SizeCache | ||||||
| @ -706,88 +730,94 @@ var file_node_proto_rawDesc = []byte{ | |||||||
| 	0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, | 	0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, | ||||||
| 	0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, | 	0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, | ||||||
| 	0x70, 0x62, 0x2e, 0x43, 0x6c, 0x6f, 0x63, 0x6b, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x52, 0x0a, 0x63, | 	0x70, 0x62, 0x2e, 0x43, 0x6c, 0x6f, 0x63, 0x6b, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x52, 0x0a, 0x63, | ||||||
| 	0x6c, 0x6f, 0x63, 0x6b, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x22, 0x7e, 0x0a, 0x08, 0x50, 0x65, 0x65, | 	0x6c, 0x6f, 0x63, 0x6b, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x22, 0xd5, 0x01, 0x0a, 0x08, 0x50, 0x65, | ||||||
| 	0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x17, 0x0a, 0x07, 0x70, 0x65, 0x65, 0x72, 0x5f, 0x69, 0x64, | 	0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x17, 0x0a, 0x07, 0x70, 0x65, 0x65, 0x72, 0x5f, 0x69, | ||||||
| 	0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x70, 0x65, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1e, | 	0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x70, 0x65, 0x65, 0x72, 0x49, 0x64, 0x12, | ||||||
| 	0x0a, 0x0a, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x61, 0x64, 0x64, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, | 	0x1e, 0x0a, 0x0a, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x61, 0x64, 0x64, 0x72, 0x73, 0x18, 0x02, 0x20, | ||||||
| 	0x28, 0x09, 0x52, 0x0a, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x61, 0x64, 0x64, 0x72, 0x73, 0x12, 0x1b, | 	0x03, 0x28, 0x09, 0x52, 0x0a, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x61, 0x64, 0x64, 0x72, 0x73, 0x12, | ||||||
| 	0x0a, 0x09, 0x6d, 0x61, 0x78, 0x5f, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, | 	0x1b, 0x0a, 0x09, 0x6d, 0x61, 0x78, 0x5f, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, | ||||||
| 	0x04, 0x52, 0x08, 0x6d, 0x61, 0x78, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, | 	0x28, 0x04, 0x52, 0x08, 0x6d, 0x61, 0x78, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, | ||||||
| 	0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, | 	0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, | ||||||
| 	0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0xad, 0x01, 0x0a, 0x10, 0x50, 0x65, | 	0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, | ||||||
| 	0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3e, | 	0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x76, 0x65, 0x72, | ||||||
| 	0x0a, 0x09, 0x70, 0x65, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x03, 0x28, | 	0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, | ||||||
| 	0x0b, 0x32, 0x21, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, | 	0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, | ||||||
| 	0x6f, 0x64, 0x65, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x70, 0x62, 0x2e, 0x50, 0x65, 0x65, 0x72, | 	0x72, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x6b, 0x65, 0x79, | ||||||
| 	0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x70, 0x65, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x59, | 	0x18, 0x07, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, | ||||||
| 	0x0a, 0x17, 0x75, 0x6e, 0x63, 0x6f, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, | 	0x79, 0x22, 0xad, 0x01, 0x0a, 0x10, 0x50, 0x65, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, | ||||||
| 	0x70, 0x65, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, | 	0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3e, 0x0a, 0x09, 0x70, 0x65, 0x65, 0x72, 0x5f, 0x69, | ||||||
| 	0x21, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, 0x6f, 0x64, | 	0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x71, 0x75, 0x69, 0x6c, | ||||||
| 	0x65, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x70, 0x62, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x49, 0x6e, | 	0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x6e, 0x6f, 0x64, 0x65, | ||||||
| 	0x66, 0x6f, 0x52, 0x15, 0x75, 0x6e, 0x63, 0x6f, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x76, | 	0x2e, 0x70, 0x62, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x70, 0x65, | ||||||
| 	0x65, 0x50, 0x65, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x65, 0x0a, 0x0b, 0x4e, 0x65, 0x74, | 	0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x59, 0x0a, 0x17, 0x75, 0x6e, 0x63, 0x6f, 0x6f, 0x70, | ||||||
| 	0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x17, 0x0a, 0x07, 0x70, 0x65, 0x65, 0x72, | 	0x65, 0x72, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x70, 0x65, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x66, | ||||||
| 	0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x70, 0x65, 0x65, 0x72, 0x49, | 	0x6f, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, | ||||||
| 	0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x61, 0x64, 0x64, 0x72, 0x73, 0x18, |  | ||||||
| 	0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x61, 0x64, 0x64, 0x72, |  | ||||||
| 	0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x65, 0x65, 0x72, 0x5f, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x18, |  | ||||||
| 	0x03, 0x20, 0x01, 0x28, 0x01, 0x52, 0x09, 0x70, 0x65, 0x65, 0x72, 0x53, 0x63, 0x6f, 0x72, 0x65, |  | ||||||
| 	0x22, 0x5e, 0x0a, 0x13, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, |  | ||||||
| 	0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x47, 0x0a, 0x0c, 0x6e, 0x65, 0x74, 0x77, 0x6f, |  | ||||||
| 	0x72, 0x6b, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, |  | ||||||
| 	0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, |  | ||||||
| 	0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x70, 0x62, 0x2e, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x49, |  | ||||||
| 	0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, |  | ||||||
| 	0x22, 0x15, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x49, 0x6e, 0x66, 0x6f, |  | ||||||
| 	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xa6, 0x01, 0x0a, 0x11, 0x54, 0x6f, 0x6b, 0x65, |  | ||||||
| 	0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x34, 0x0a, |  | ||||||
| 	0x16, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x65, 0x64, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, |  | ||||||
| 	0x5f, 0x73, 0x75, 0x70, 0x70, 0x6c, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x14, 0x63, |  | ||||||
| 	0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x65, 0x64, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x53, 0x75, 0x70, |  | ||||||
| 	0x70, 0x6c, 0x79, 0x12, 0x38, 0x0a, 0x18, 0x75, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, |  | ||||||
| 	0x65, 0x64, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x73, 0x75, 0x70, 0x70, 0x6c, 0x79, 0x18, |  | ||||||
| 	0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x16, 0x75, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, |  | ||||||
| 	0x65, 0x64, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x53, 0x75, 0x70, 0x70, 0x6c, 0x79, 0x12, 0x21, 0x0a, |  | ||||||
| 	0x0c, 0x6f, 0x77, 0x6e, 0x65, 0x64, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x18, 0x03, 0x20, |  | ||||||
| 	0x01, 0x28, 0x0c, 0x52, 0x0b, 0x6f, 0x77, 0x6e, 0x65, 0x64, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, |  | ||||||
| 	0x32, 0x99, 0x04, 0x0a, 0x0b, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, |  | ||||||
| 	0x12, 0x5f, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x29, 0x2e, |  | ||||||
| 	0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, |  | ||||||
| 	0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, |  | ||||||
| 	0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, |  | ||||||
| 	0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, |  | ||||||
| 	0x70, 0x62, 0x2e, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, |  | ||||||
| 	0x65, 0x12, 0x68, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x49, 0x6e, 0x66, |  | ||||||
| 	0x6f, 0x12, 0x2c, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, |  | ||||||
| 	0x6f, 0x64, 0x65, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x46, |  | ||||||
| 	0x72, 0x61, 0x6d, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, |  | ||||||
| 	0x2a, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, 0x6f, 0x64, |  | ||||||
| 	0x65, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x70, 0x62, 0x2e, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x49, |  | ||||||
| 	0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x65, 0x0a, 0x0b, 0x47, |  | ||||||
| 	0x65, 0x74, 0x50, 0x65, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x2b, 0x2e, 0x71, 0x75, 0x69, |  | ||||||
| 	0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x6e, 0x6f, 0x64, |  | ||||||
| 	0x65, 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x65, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, |  | ||||||
| 	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, |  | ||||||
| 	0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x70, | 	0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x70, | ||||||
| 	0x62, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, | 	0x62, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x15, 0x75, 0x6e, 0x63, 0x6f, | ||||||
| 	0x73, 0x65, 0x12, 0x6e, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, | 	0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x76, 0x65, 0x50, 0x65, 0x65, 0x72, 0x49, 0x6e, 0x66, | ||||||
| 	0x49, 0x6e, 0x66, 0x6f, 0x12, 0x2e, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, | 	0x6f, 0x22, 0x65, 0x0a, 0x0b, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, | ||||||
| 	0x6d, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x70, 0x62, 0x2e, 0x47, | 	0x12, 0x17, 0x0a, 0x07, 0x70, 0x65, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, | ||||||
| 	0x65, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, | 	0x0c, 0x52, 0x06, 0x70, 0x65, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x6d, 0x75, 0x6c, | ||||||
| 	0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, | 	0x74, 0x69, 0x61, 0x64, 0x64, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x6d, | ||||||
| 	0x6d, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x70, 0x62, 0x2e, 0x4e, | 	0x75, 0x6c, 0x74, 0x69, 0x61, 0x64, 0x64, 0x72, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x65, 0x65, | ||||||
| 	0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, | 	0x72, 0x5f, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x01, 0x52, 0x09, 0x70, | ||||||
| 	0x73, 0x65, 0x12, 0x68, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x49, 0x6e, | 	0x65, 0x65, 0x72, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x22, 0x5e, 0x0a, 0x13, 0x4e, 0x65, 0x74, 0x77, | ||||||
| 	0x66, 0x6f, 0x12, 0x2c, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, | 	0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, | ||||||
|  | 	0x47, 0x0a, 0x0c, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, | ||||||
|  | 	0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, | ||||||
|  | 	0x75, 0x6d, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x70, 0x62, 0x2e, | ||||||
|  | 	0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x6e, 0x65, 0x74, | ||||||
|  | 	0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x15, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x54, | ||||||
|  | 	0x6f, 0x6b, 0x65, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, | ||||||
|  | 	0xa6, 0x01, 0x0a, 0x11, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, | ||||||
|  | 	0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x34, 0x0a, 0x16, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, | ||||||
|  | 	0x65, 0x64, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x73, 0x75, 0x70, 0x70, 0x6c, 0x79, 0x18, | ||||||
|  | 	0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x14, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x65, 0x64, | ||||||
|  | 	0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x53, 0x75, 0x70, 0x70, 0x6c, 0x79, 0x12, 0x38, 0x0a, 0x18, 0x75, | ||||||
|  | 	0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x65, 0x64, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, | ||||||
|  | 	0x5f, 0x73, 0x75, 0x70, 0x70, 0x6c, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x16, 0x75, | ||||||
|  | 	0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x65, 0x64, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x53, | ||||||
|  | 	0x75, 0x70, 0x70, 0x6c, 0x79, 0x12, 0x21, 0x0a, 0x0c, 0x6f, 0x77, 0x6e, 0x65, 0x64, 0x5f, 0x74, | ||||||
|  | 	0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x6f, 0x77, 0x6e, | ||||||
|  | 	0x65, 0x64, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x32, 0x99, 0x04, 0x0a, 0x0b, 0x4e, 0x6f, 0x64, | ||||||
|  | 	0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x5f, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x46, | ||||||
|  | 	0x72, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x29, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, | ||||||
|  | 	0x75, 0x6d, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x70, 0x62, 0x2e, | ||||||
|  | 	0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, | ||||||
|  | 	0x1a, 0x27, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, 0x6f, | ||||||
|  | 	0x64, 0x65, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x70, 0x62, 0x2e, 0x46, 0x72, 0x61, 0x6d, 0x65, | ||||||
|  | 	0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x68, 0x0a, 0x0c, 0x47, 0x65, 0x74, | ||||||
|  | 	0x46, 0x72, 0x61, 0x6d, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x2c, 0x2e, 0x71, 0x75, 0x69, 0x6c, | ||||||
|  | 	0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x6e, 0x6f, 0x64, 0x65, | ||||||
|  | 	0x2e, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x49, 0x6e, 0x66, 0x6f, | ||||||
|  | 	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, | ||||||
|  | 	0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x70, | ||||||
|  | 	0x62, 0x2e, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, | ||||||
|  | 	0x6e, 0x73, 0x65, 0x12, 0x65, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x50, 0x65, 0x65, 0x72, 0x49, 0x6e, | ||||||
|  | 	0x66, 0x6f, 0x12, 0x2b, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, | ||||||
| 	0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, | 	0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, | ||||||
| 	0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, | 	0x50, 0x65, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, | ||||||
| 	0x1a, 0x2a, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, 0x6f, | 	0x29, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, 0x6f, 0x64, | ||||||
| 	0x64, 0x65, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x70, 0x62, 0x2e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, | 	0x65, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x70, 0x62, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x49, 0x6e, | ||||||
| 	0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x3a, 0x5a, 0x38, | 	0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6e, 0x0a, 0x0e, 0x47, 0x65, | ||||||
| 	0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, | 	0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x2e, 0x2e, 0x71, | ||||||
| 	0x6d, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, | 	0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x6e, | ||||||
| 	0x2f, 0x6d, 0x6f, 0x6e, 0x6f, 0x72, 0x65, 0x70, 0x6f, 0x2f, 0x6e, 0x6f, 0x64, 0x65, 0x2f, 0x70, | 	0x6f, 0x64, 0x65, 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, | ||||||
| 	0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, | 	0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x71, | ||||||
|  | 	0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x6e, | ||||||
|  | 	0x6f, 0x64, 0x65, 0x2e, 0x70, 0x62, 0x2e, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, | ||||||
|  | 	0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x68, 0x0a, 0x0c, 0x47, 0x65, | ||||||
|  | 	0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x2c, 0x2e, 0x71, 0x75, 0x69, | ||||||
|  | 	0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x6e, 0x6f, 0x64, | ||||||
|  | 	0x65, 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x49, 0x6e, 0x66, | ||||||
|  | 	0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, | ||||||
|  | 	0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, | ||||||
|  | 	0x70, 0x62, 0x2e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, | ||||||
|  | 	0x6f, 0x6e, 0x73, 0x65, 0x42, 0x3a, 0x5a, 0x38, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x71, | ||||||
|  | 	0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x71, 0x75, | ||||||
|  | 	0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2f, 0x6d, 0x6f, 0x6e, 0x6f, 0x72, 0x65, 0x70, | ||||||
|  | 	0x6f, 0x2f, 0x6e, 0x6f, 0x64, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x73, | ||||||
|  | 	0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| var ( | var ( | ||||||
|  | |||||||
| @ -36,6 +36,9 @@ message PeerInfo { | |||||||
|   repeated string multiaddrs = 2; |   repeated string multiaddrs = 2; | ||||||
|   uint64 max_frame = 3; |   uint64 max_frame = 3; | ||||||
|   int64 timestamp = 4; |   int64 timestamp = 4; | ||||||
|  |   bytes version = 5; | ||||||
|  |   bytes signature = 6; | ||||||
|  |   bytes public_key = 7; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| message PeerInfoResponse { | message PeerInfoResponse { | ||||||
|  | |||||||
| @ -1329,7 +1329,6 @@ func (p *PebbleClockStore) GetCompressedDataClockFrames( | |||||||
| 		if frame.FrameNumber == 0 { | 		if frame.FrameNumber == 0 { | ||||||
| 			continue | 			continue | ||||||
| 		} | 		} | ||||||
| 
 |  | ||||||
| 		for i := 0; i < len(frame.Input[516:])/74; i++ { | 		for i := 0; i < len(frame.Input[516:])/74; i++ { | ||||||
| 			aggregateCommit := frame.Input[516+(i*74) : 516+((i+1)*74)] | 			aggregateCommit := frame.Input[516+(i*74) : 516+((i+1)*74)] | ||||||
| 
 | 
 | ||||||
| @ -1399,7 +1398,6 @@ func (p *PebbleClockStore) GetCompressedDataClockFrames( | |||||||
| 			if err := proto.Unmarshal(value, frame); err != nil { | 			if err := proto.Unmarshal(value, frame); err != nil { | ||||||
| 				return nil, errors.Wrap(err, "get compressed data clock frames") | 				return nil, errors.Wrap(err, "get compressed data clock frames") | ||||||
| 			} | 			} | ||||||
| 
 |  | ||||||
| 			candidates = append(candidates, frame) | 			candidates = append(candidates, frame) | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Cassandra Heart
						Cassandra Heart