mirror of
				https://source.quilibrium.com/quilibrium/ceremonyclient.git
				synced 2025-04-04 19:36:54 +00:00 
			
		
		
		
	v1.4.18
This commit is contained in:
		
							parent
							
								
									54f123ede8
								
							
						
					
					
						commit
						06947eb307
					
				
							
								
								
									
										3
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @ -5,3 +5,6 @@ ceremony-client | ||||
| .DS_Store | ||||
| *.mprof | ||||
| .env | ||||
| .env.signers | ||||
| .task | ||||
| node-tmp-* | ||||
|  | ||||
| @ -1,4 +1,4 @@ | ||||
| # Quilibrium - Dawn | ||||
| # Quilibrium - Aurora | ||||
| 
 | ||||
| Quilibrium is a decentralized alternative to platform as a service providers. | ||||
| This release, mirrored to GitHub, is the Dawn release, which contains the | ||||
| @ -94,7 +94,7 @@ This section contains community-built clients, applications, guides, etc <br />< | ||||
| 
 | ||||
| ### 1. The Q Guide - Beginners’ Guide | ||||
| 
 | ||||
| - A detailed beginners' guide for how to setup a Quilibrium Node (on VPS, Ubuntu 22.04) - [link](https://github.com/demipoet/demipoet.github.io)<br/> | ||||
| - A detailed beginners' guide for how to setup a Quilibrium Node, created by [@demipoet](https://www.github.com/demipoet) - [link](https://quilibrium.guide/)<br/> | ||||
| 
 | ||||
|    | ||||
| ## Pull Requests | ||||
|  | ||||
| @ -25,7 +25,7 @@ func init() { | ||||
| 	rootCmd.PersistentFlags().StringVar( | ||||
| 		&configDirectory, | ||||
| 		"config", | ||||
| 		"../node/.config/", | ||||
| 		"config directory (default is ../node/.config/)", | ||||
| 		".config/", | ||||
| 		"config directory (default is .config/)", | ||||
| 	) | ||||
| } | ||||
|  | ||||
| @ -7,6 +7,7 @@ services: | ||||
|   node: | ||||
|     image: ${QUILIBRIUM_IMAGE_NAME:-quilibrium} | ||||
|     restart: unless-stopped | ||||
|     command: ["--signature-check=false"] | ||||
|     deploy: | ||||
|       resources: | ||||
|         limits: | ||||
|  | ||||
| @ -865,26 +865,26 @@ func logoVersion(width int) string { | ||||
| 	var out string | ||||
| 
 | ||||
| 	if width >= 83 { | ||||
| 		out = "                                   %#########\n" | ||||
| 		out += "                          #############################\n" | ||||
| 		out += "                    ########################################&\n" | ||||
| 		out += "                 ###############################################\n" | ||||
| 		out += "             &#####################%        %######################\n" | ||||
| 		out += "           #################                         #################\n" | ||||
| 		out += "         ###############                                 ###############\n" | ||||
| 		out += "       #############                                        ##############\n" | ||||
| 		out += "     #############                                             ############&\n" | ||||
| 		out += "    ############                                                 ############\n" | ||||
| 		out += "   ###########                     ##########                     &###########\n" | ||||
| 		out += "  ###########                    ##############                     ###########\n" | ||||
| 		out += " ###########                     ##############                      ##########&\n" | ||||
| 		out += " ##########                      ##############                       ##########\n" | ||||
| 		out += "%##########                        ##########                         ##########\n" | ||||
| 		out += "##########                                                            ##########\n" | ||||
| 		out += "##########                                                            &#########\n" | ||||
| 		out += "##########                    #######      #######                    ##########\n" | ||||
| 		out += "%#########                 &#########################                 ##########\n" | ||||
| 		out += " ##########              ##############% ##############              &##########\n" | ||||
| 		out = "                                   ..-------..\n" | ||||
| 		out += "                          ..---''''           ''''---..\n" | ||||
| 		out += "                    .---''                             ''---.\n" | ||||
| 		out += "                 .-'                                         '-.\n" | ||||
| 		out += "             ..-'            ..--'''''''''''%######################\n" | ||||
| 		out += "           .'           .--''                         #################\n" | ||||
| 		out += "        .''         ..-'                                 ###############\n" | ||||
| 		out += "       '           '                                        ##############\n" | ||||
| 		out += "     ''         .''                                             ############&\n" | ||||
| 		out += "    '         ''                                                 ############\n" | ||||
| 		out += "   '         '                     ##########                     &###########\n" | ||||
| 		out += "  '         '                    ##############                     ###########\n" | ||||
| 		out += " '         '                     ##############                      ##########&\n" | ||||
| 		out += " '        '                      ##############                       ##########\n" | ||||
| 		out += "'        '                         ##########                         ##########\n" | ||||
| 		out += "'        '                                                            ##########\n" | ||||
| 		out += "'        '                                                            &#########\n" | ||||
| 		out += "'        '                    #######      #######                    ##########\n" | ||||
| 		out += "'        '                 &#########################                 ##########\n" | ||||
| 		out += " '        '              ##############% ##############              &##########\n" | ||||
| 		out += " '         '          &##############      ###############           ##########\n" | ||||
| 		out += "  '         '       ###############           ##############%       ###########\n" | ||||
| 		out += "   '         '.       ##########                ###############       ########\n" | ||||
| @ -899,11 +899,11 @@ func logoVersion(width int) string { | ||||
| 		out += "                          ''---..              ...---''               ##\n" | ||||
| 		out += "                                 ''----------''\n" | ||||
| 		out += " \n" | ||||
| 		out += "                        Quilibrium Node - v" + config.GetVersionString() + " – Sunset\n" | ||||
| 		out += "                        Quilibrium Node - v" + config.GetVersionString() + " – Nebula\n" | ||||
| 		out += " \n" | ||||
| 		out += "                                   DB Console\n" | ||||
| 	} else { | ||||
| 		out = "Quilibrium Node - v" + config.GetVersionString() + " – Sunset - DB Console\n" | ||||
| 		out = "Quilibrium Node - v" + config.GetVersionString() + " – Nebula - DB Console\n" | ||||
| 	} | ||||
| 	return out | ||||
| } | ||||
|  | ||||
| @ -8,7 +8,6 @@ import ( | ||||
| 	"source.quilibrium.com/quilibrium/monorepo/node/consensus" | ||||
| 	"source.quilibrium.com/quilibrium/monorepo/node/consensus/master" | ||||
| 	"source.quilibrium.com/quilibrium/monorepo/node/execution" | ||||
| 	"source.quilibrium.com/quilibrium/monorepo/node/execution/intrinsics/ceremony" | ||||
| 	"source.quilibrium.com/quilibrium/monorepo/node/execution/intrinsics/ceremony/application" | ||||
| 	"source.quilibrium.com/quilibrium/monorepo/node/keys" | ||||
| 	"source.quilibrium.com/quilibrium/monorepo/node/p2p" | ||||
| @ -44,7 +43,7 @@ func newNode( | ||||
| 	clockStore store.ClockStore, | ||||
| 	keyManager keys.KeyManager, | ||||
| 	pubSub p2p.PubSub, | ||||
| 	ceremonyExecutionEngine *ceremony.CeremonyExecutionEngine, | ||||
| 	// execution engines wire in here
 | ||||
| 	engine consensus.ConsensusEngine, | ||||
| ) (*Node, error) { | ||||
| 	if engine == nil { | ||||
| @ -52,9 +51,6 @@ func newNode( | ||||
| 	} | ||||
| 
 | ||||
| 	execEngines := make(map[string]execution.ExecutionEngine) | ||||
| 	if ceremonyExecutionEngine != nil { | ||||
| 		execEngines[ceremonyExecutionEngine.GetName()] = ceremonyExecutionEngine | ||||
| 	} | ||||
| 
 | ||||
| 	return &Node{ | ||||
| 		logger, | ||||
|  | ||||
| @ -45,13 +45,10 @@ func NewDebugNode(configConfig *config.Config, selfTestReport *protobufs.SelfTes | ||||
| 	blossomSub := p2p.NewBlossomSub(p2PConfig, zapLogger) | ||||
| 	engineConfig := configConfig.Engine | ||||
| 	wesolowskiFrameProver := crypto.NewWesolowskiFrameProver(zapLogger) | ||||
| 	kzgInclusionProver := crypto.NewKZGInclusionProver(zapLogger) | ||||
| 	masterTimeReel := time.NewMasterTimeReel(zapLogger, pebbleClockStore, engineConfig, wesolowskiFrameProver) | ||||
| 	inMemoryPeerInfoManager := p2p.NewInMemoryPeerInfoManager(zapLogger) | ||||
| 	pebbleKeyStore := store.NewPebbleKeyStore(pebbleDB, zapLogger) | ||||
| 	ceremonyExecutionEngine := ceremony.NewCeremonyExecutionEngine(zapLogger, engineConfig, fileKeyManager, blossomSub, wesolowskiFrameProver, kzgInclusionProver, pebbleClockStore, masterTimeReel, inMemoryPeerInfoManager, pebbleKeyStore) | ||||
| 	masterClockConsensusEngine := master.NewMasterClockConsensusEngine(engineConfig, zapLogger, pebbleClockStore, fileKeyManager, blossomSub, wesolowskiFrameProver, masterTimeReel, inMemoryPeerInfoManager, selfTestReport) | ||||
| 	node, err := newNode(zapLogger, pebbleClockStore, fileKeyManager, blossomSub, ceremonyExecutionEngine, masterClockConsensusEngine) | ||||
| 	node, err := newNode(zapLogger, pebbleClockStore, fileKeyManager, blossomSub, masterClockConsensusEngine) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| @ -69,13 +66,10 @@ func NewNode(configConfig *config.Config, selfTestReport *protobufs.SelfTestRepo | ||||
| 	blossomSub := p2p.NewBlossomSub(p2PConfig, zapLogger) | ||||
| 	engineConfig := configConfig.Engine | ||||
| 	wesolowskiFrameProver := crypto.NewWesolowskiFrameProver(zapLogger) | ||||
| 	kzgInclusionProver := crypto.NewKZGInclusionProver(zapLogger) | ||||
| 	masterTimeReel := time.NewMasterTimeReel(zapLogger, pebbleClockStore, engineConfig, wesolowskiFrameProver) | ||||
| 	inMemoryPeerInfoManager := p2p.NewInMemoryPeerInfoManager(zapLogger) | ||||
| 	pebbleKeyStore := store.NewPebbleKeyStore(pebbleDB, zapLogger) | ||||
| 	ceremonyExecutionEngine := ceremony.NewCeremonyExecutionEngine(zapLogger, engineConfig, fileKeyManager, blossomSub, wesolowskiFrameProver, kzgInclusionProver, pebbleClockStore, masterTimeReel, inMemoryPeerInfoManager, pebbleKeyStore) | ||||
| 	masterClockConsensusEngine := master.NewMasterClockConsensusEngine(engineConfig, zapLogger, pebbleClockStore, fileKeyManager, blossomSub, wesolowskiFrameProver, masterTimeReel, inMemoryPeerInfoManager, selfTestReport) | ||||
| 	node, err := newNode(zapLogger, pebbleClockStore, fileKeyManager, blossomSub, ceremonyExecutionEngine, masterClockConsensusEngine) | ||||
| 	node, err := newNode(zapLogger, pebbleClockStore, fileKeyManager, blossomSub, masterClockConsensusEngine) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
|  | ||||
| @ -54,16 +54,14 @@ var BootstrapPeers = []string{ | ||||
| 	"/dns/quidditch.quilibrium.com/udp/8336/quic/p2p/QmbZEGuinaCndj4XLb6fteZmjmP3C1Tsgijmc5BGuUk8Ma", | ||||
| 	"/dns/quagmire.quilibrium.com/udp/8336/quic/p2p/QmaQ9KAaKtqXhYSQ5ARQNnn8B8474cWGvvD6PgJ4gAtMrx", | ||||
| 	"/ip4/204.186.74.46/udp/8316/quic/p2p/QmeqBjm3iX7sdTieyto1gys5ruQrQNPKfaTGcVQQWJPYDV", | ||||
| 	"/ip4/185.209.178.115/udp/8336/quic/p2p/Qmekz5obb9qCRP5CrZ4D8Tmabbr5mJf6mgBJHTaitrx7Fx", | ||||
| 	"/ip4/186.233.187.185/udp/8336/quic/p2p/QmR7jT9NKL3yZ1iRjLxPJjAVNbk38HAfDtAKF5SCZmHdpK", | ||||
| 	"/ip4/149.86.224.152/udp/8336/quic/p2p/QmaVaJ93mKaaqDnsYbHGEUBzEtbWhb3s4DAutt6JeJC5Wz", | ||||
| 	"/ip4/103.219.170.9/udp/8336/quic/p2p/QmfEdMfmdhNoYuGVhhw5LBApHHG1rbVAHXwGWpW8s9bXeg", | ||||
| 	"/ip4/185.143.102.84/udp/8336/quic/p2p/Qmce68gLLq9eMdwCcmd1ptfoC2nVoe861LF1cjdVHC2DwK", | ||||
| 	"/ip4/65.109.17.13/udp/8336/quic/p2p/Qmc35n99eojSvW3PkbfBczJoSX92WmnnKh3Fg114ok3oo4", | ||||
| 	"/ip4/65.108.194.84/udp/8336/quic/p2p/QmP8C7g9ZRiWzhqN2AgFu5onS6HwHzR6Vv1TCHxAhnCSnq", | ||||
| 	"/dns/quil.dfcnodes.eu/udp/8336/quic/p2p/QmQaFmbYVrKSwoen5UQdaqyDq4QhXfSSLDVnYpYD4SF9tX", | ||||
| 	"/ip4/87.98.167.207/udp/8336/quic/p2p/QmafiAXLu1JWktyfzDtD67i78GRBYCfQ4doTfq7pp7wfQ1", | ||||
| 	"/ip4/216.244.76.122/udp/8336/quic/p2p/QmUSbMytVBUYiiGE266aZHrHrP17vLx5UJFd7o74HkDoaV", | ||||
| 	"/ip4/216.244.79.194/udp/8336/quic/p2p/QmQn3bWk5aqaNSv9dwPjBg4qdeGBGNEB72tvuhgEc64Ki5", | ||||
| 	"/ip4/5.199.168.233/udp/8336/quic/p2p/QmeV1f11qjPTPaPspkJfdUb7p8kJ3fgsCqqozBtaW4nGFh", | ||||
| 	// purged peers (keep your node online to return to this list)
 | ||||
| 	// "/ip4/204.186.74.47/udp/8317/quic/p2p/Qmd233pLUDvcDW3ama27usfbG1HxKNh1V9dmWVW1SXp1pd",
 | ||||
| 	// "/ip4/186.233.184.181/udp/8336/quic/p2p/QmW6QDvKuYqJYYMP5tMZSp12X3nexywK28tZNgqtqNpEDL",
 | ||||
| @ -117,6 +115,7 @@ func LoadConfig(configPath string, proverKey string) (*Config, error) { | ||||
| 			ListenMultiaddr: "/ip4/0.0.0.0/udp/8336/quic", | ||||
| 			BootstrapPeers:  BootstrapPeers, | ||||
| 			PeerPrivKey:     "", | ||||
| 			Network:         0, | ||||
| 		}, | ||||
| 		Engine: &EngineConfig{ | ||||
| 			ProvingKeyId:         "default-proving-key", | ||||
|  | ||||
| @ -37,4 +37,5 @@ type P2PConfig struct { | ||||
| 	PeerPrivKey               string        `yaml:"peerPrivKey"` | ||||
| 	TraceLogFile              string        `yaml:"traceLogFile"` | ||||
| 	MinPeers                  int           `yaml:"minPeers"` | ||||
| 	Network                   uint8         `yaml:"network"` | ||||
| } | ||||
|  | ||||
| @ -6,15 +6,15 @@ import ( | ||||
| ) | ||||
| 
 | ||||
| func GetMinimumVersionCutoff() time.Time { | ||||
| 	return time.Date(2024, time.April, 4, 6, 20, 0, 0, time.UTC) | ||||
| 	return time.Date(2024, time.May, 24, 4, 0, 0, 0, time.UTC) | ||||
| } | ||||
| 
 | ||||
| func GetMinimumVersion() []byte { | ||||
| 	return []byte{0x01, 0x04, 0x10} | ||||
| 	return []byte{0x01, 0x04, 0x12} | ||||
| } | ||||
| 
 | ||||
| func GetVersion() []byte { | ||||
| 	return []byte{0x01, 0x04, 0x11} | ||||
| 	return []byte{0x01, 0x04, 0x12} | ||||
| } | ||||
| 
 | ||||
| func GetVersionString() string { | ||||
|  | ||||
| @ -8,6 +8,7 @@ import ( | ||||
| 	"time" | ||||
| 
 | ||||
| 	"github.com/iden3/go-iden3-crypto/poseidon" | ||||
| 	"github.com/libp2p/go-libp2p/core/peer" | ||||
| 	"github.com/mr-tron/base58" | ||||
| 	"github.com/pkg/errors" | ||||
| 	"go.uber.org/zap" | ||||
| @ -124,9 +125,31 @@ func (e *MasterClockConsensusEngine) handleSelfTestReport( | ||||
| 		return errors.Wrap(err, "handle self test report") | ||||
| 	} | ||||
| 
 | ||||
| 	// minimum proof size is one timestamp, one vdf proof, must match one fewer
 | ||||
| 	// than core count
 | ||||
| 	if len(report.Proof) < 516+8 || | ||||
| 		((len(report.Proof)-8)/516) != int(report.Cores-1) { | ||||
| 		e.logger.Warn( | ||||
| 			"received invalid proof from peer", | ||||
| 			zap.String("peer_id", peer.ID(peerID).String()), | ||||
| 		) | ||||
| 		e.pubSub.SetPeerScore(peerID, -1000) | ||||
| 		return errors.Wrap(errors.New("invalid report"), "handle self test report") | ||||
| 	} | ||||
| 
 | ||||
| 	e.logger.Debug( | ||||
| 		"received proof from peer", | ||||
| 		zap.String("peer_id", peer.ID(peerID).String()), | ||||
| 	) | ||||
| 
 | ||||
| 	info := e.peerInfoManager.GetPeerInfo(peerID) | ||||
| 	if info != nil { | ||||
| 		if (time.Now().UnixMilli() - info.LastSeen) < (270 * 1000) { | ||||
| 			return nil | ||||
| 		} | ||||
| 
 | ||||
| 		info.MasterHeadFrame = report.MasterHeadFrame | ||||
| 
 | ||||
| 		if info.Bandwidth <= 1048576 { | ||||
| 			go func() { | ||||
| 				ctx, cancel := context.WithTimeout(context.TODO(), 5*time.Minute) | ||||
| @ -141,6 +164,42 @@ func (e *MasterClockConsensusEngine) handleSelfTestReport( | ||||
| 				} | ||||
| 			}() | ||||
| 		} | ||||
| 
 | ||||
| 		proof := report.Proof | ||||
| 		timestamp := binary.BigEndian.Uint64(proof[:8]) | ||||
| 		proof = proof[8:] | ||||
| 
 | ||||
| 		// Ignore outdated reports, give 3 minutes for propagation delay
 | ||||
| 		if int64(timestamp) < (time.Now().UnixMilli() - (480 * 1000)) { | ||||
| 			return nil | ||||
| 		} | ||||
| 
 | ||||
| 		challenge := binary.BigEndian.AppendUint64([]byte{}, report.MasterHeadFrame) | ||||
| 		challenge = append(challenge, peerID...) | ||||
| 
 | ||||
| 		proofs := make([][]byte, (len(report.Proof)-8)/516) | ||||
| 		for i := 0; i < len(proofs); i++ { | ||||
| 			proofs[i] = proof[i*516 : (i+1)*516] | ||||
| 		} | ||||
| 		if !e.frameProver.VerifyChallengeProof( | ||||
| 			challenge, | ||||
| 			int64(timestamp), | ||||
| 			report.DifficultyMetric, | ||||
| 			proofs, | ||||
| 		) { | ||||
| 			e.logger.Warn( | ||||
| 				"received invalid proof from peer", | ||||
| 				zap.String("peer_id", peer.ID(peerID).String()), | ||||
| 			) | ||||
| 			e.pubSub.SetPeerScore(peerID, -1000) | ||||
| 
 | ||||
| 			return errors.Wrap( | ||||
| 				errors.New("invalid report"), | ||||
| 				"handle self test report", | ||||
| 			) | ||||
| 		} | ||||
| 
 | ||||
| 		info.LastSeen = time.Now().UnixMilli() | ||||
| 		return nil | ||||
| 	} | ||||
| 
 | ||||
|  | ||||
| @ -80,7 +80,7 @@ func (e *MasterClockConsensusEngine) collect( | ||||
| 
 | ||||
| 	for i := 0; i < len(peers); i++ { | ||||
| 		peer := peers[i] | ||||
| 		e.logger.Debug("setting syncing target", zap.Binary("peer_id", peer)) | ||||
| 		e.logger.Info("setting syncing target", zap.Binary("peer_id", peer)) | ||||
| 
 | ||||
| 		cc, err := e.pubSub.GetDirectChannel(peer, "validation") | ||||
| 		if err != nil { | ||||
|  | ||||
| @ -4,6 +4,7 @@ import ( | ||||
| 	"bytes" | ||||
| 	"context" | ||||
| 	"crypto/rand" | ||||
| 	"encoding/binary" | ||||
| 	"encoding/hex" | ||||
| 	"io" | ||||
| 	"math/big" | ||||
| @ -226,18 +227,42 @@ func (e *MasterClockConsensusEngine) Start() <-chan error { | ||||
| 		time.Sleep(30 * time.Second) | ||||
| 
 | ||||
| 		for { | ||||
| 			e.logger.Info("broadcasting self-test info") | ||||
| 			head, err := e.masterTimeReel.Head() | ||||
| 			if err != nil { | ||||
| 				panic(err) | ||||
| 			} | ||||
| 
 | ||||
| 			e.report.MasterHeadFrame = head.FrameNumber | ||||
| 			parallelism := e.report.Cores - 1 | ||||
| 			skew := (e.report.DifficultyMetric * 12) / 10 | ||||
| 			challenge := binary.BigEndian.AppendUint64( | ||||
| 				[]byte{}, | ||||
| 				e.report.MasterHeadFrame, | ||||
| 			) | ||||
| 			challenge = append(challenge, e.pubSub.GetPeerID()...) | ||||
| 
 | ||||
| 			ts, proofs, err := e.frameProver.CalculateChallengeProof( | ||||
| 				challenge, | ||||
| 				parallelism, | ||||
| 				skew, | ||||
| 			) | ||||
| 			if err != nil { | ||||
| 				panic(err) | ||||
| 			} | ||||
| 
 | ||||
| 			proof := binary.BigEndian.AppendUint64([]byte{}, uint64(ts)) | ||||
| 			for i := 0; i < len(proofs); i++ { | ||||
| 				proof = append(proof, proofs[i]...) | ||||
| 			} | ||||
| 			e.report.Proof = proof | ||||
| 			e.logger.Info( | ||||
| 				"broadcasting self-test info", | ||||
| 				zap.Uint64("current_frame", e.report.MasterHeadFrame), | ||||
| 			) | ||||
| 
 | ||||
| 			if err := e.publishMessage(e.filter, e.report); err != nil { | ||||
| 				e.logger.Debug("error publishing message", zap.Error(err)) | ||||
| 			} | ||||
| 			time.Sleep(5 * time.Minute) | ||||
| 		} | ||||
| 	}() | ||||
| 
 | ||||
| @ -460,6 +485,7 @@ func ( | ||||
| 			Memory:             new(big.Int).SetBytes(peerManifest.Memory).Bytes(), | ||||
| 			Storage:            new(big.Int).SetBytes(peerManifest.Storage).Bytes(), | ||||
| 			MasterHeadFrame:    peerManifest.MasterHeadFrame, | ||||
| 			LastSeen:           peerManifest.LastSeen, | ||||
| 		} | ||||
| 
 | ||||
| 		for _, capability := range peerManifest.Capabilities { | ||||
| @ -563,6 +589,7 @@ func (e *MasterClockConsensusEngine) addPeerManifestReport( | ||||
| 		Storage:            report.Storage, | ||||
| 		Capabilities:       []p2p.Capability{}, | ||||
| 		MasterHeadFrame:    report.MasterHeadFrame, | ||||
| 		LastSeen:           time.Now().UnixMilli(), | ||||
| 	} | ||||
| 
 | ||||
| 	for _, capability := range manifest.Capabilities { | ||||
|  | ||||
| @ -51,4 +51,15 @@ type FrameProver interface { | ||||
| 		proof []byte, | ||||
| 		deepVerifier *protobufs.ClockFrame, | ||||
| 	) bool | ||||
| 	CalculateChallengeProof( | ||||
| 		challenge []byte, | ||||
| 		parallelism uint32, | ||||
| 		skew int64, | ||||
| 	) (int64, [][]byte, error) | ||||
| 	VerifyChallengeProof( | ||||
| 		challenge []byte, | ||||
| 		timestamp int64, | ||||
| 		assertedDifficulty int64, | ||||
| 		proof [][]byte, | ||||
| 	) bool | ||||
| } | ||||
|  | ||||
| @ -1,6 +1,7 @@ | ||||
| package kzg | ||||
| 
 | ||||
| import ( | ||||
| 	_ "embed" | ||||
| 	"encoding/binary" | ||||
| 	"encoding/hex" | ||||
| 	"encoding/json" | ||||
| @ -292,13 +293,11 @@ func TestInit(file string) { | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| //go:embed ceremony.json
 | ||||
| var csBytes []byte | ||||
| 
 | ||||
| func Init() { | ||||
| 	// start with phase 1 ceremony:
 | ||||
| 	csBytes, err := os.ReadFile("./ceremony.json") | ||||
| 	if err != nil { | ||||
| 		panic(err) | ||||
| 	} | ||||
| 
 | ||||
| 	bls48581.Init() | ||||
| 
 | ||||
| 	cs := &CeremonyState{} | ||||
|  | ||||
| @ -17,7 +17,7 @@ import ( | ||||
| ) | ||||
| 
 | ||||
| func TestMain(m *testing.M) { | ||||
| 	csBytes, err := os.ReadFile("../../ceremony.json") | ||||
| 	csBytes, err := os.ReadFile("./ceremony.json") | ||||
| 	if err != nil { | ||||
| 		panic(err) | ||||
| 	} | ||||
|  | ||||
| @ -15,7 +15,7 @@ import ( | ||||
| ) | ||||
| 
 | ||||
| func TestKZGVerifyFrame(t *testing.T) { | ||||
| 	kzg.TestInit("../ceremony.json") | ||||
| 	kzg.TestInit("./kzg/ceremony.json") | ||||
| 	data := make([]byte, 1024) | ||||
| 	rand.Read(data) | ||||
| 
 | ||||
|  | ||||
| @ -6,6 +6,8 @@ import ( | ||||
| 	"crypto/rand" | ||||
| 	"encoding/binary" | ||||
| 	"math/big" | ||||
| 	"sync" | ||||
| 	"time" | ||||
| 
 | ||||
| 	"github.com/cloudflare/circl/sign/ed448" | ||||
| 	"github.com/iden3/go-iden3-crypto/poseidon" | ||||
| @ -593,3 +595,75 @@ func (w *WesolowskiFrameProver) VerifyWeakRecursiveProof( | ||||
| 		return false | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| func (w *WesolowskiFrameProver) CalculateChallengeProof( | ||||
| 	challenge []byte, | ||||
| 	parallelism uint32, | ||||
| 	skew int64, | ||||
| ) (int64, [][]byte, error) { | ||||
| 	now := time.Now().UnixMilli() | ||||
| 	input := binary.BigEndian.AppendUint64([]byte{}, uint64(now)) | ||||
| 	input = append(input, challenge...) | ||||
| 	outputs := make([][]byte, parallelism) | ||||
| 
 | ||||
| 	wg := sync.WaitGroup{} | ||||
| 	wg.Add(int(parallelism)) | ||||
| 
 | ||||
| 	for i := uint32(0); i < parallelism; i++ { | ||||
| 		i := i | ||||
| 		go func() { | ||||
| 			instanceInput := binary.BigEndian.AppendUint32([]byte{}, i) | ||||
| 			instanceInput = append(instanceInput, input...) | ||||
| 			b := sha3.Sum256(input) | ||||
| 
 | ||||
| 			// 4.5 minutes = 270 seconds, one increment should be ten seconds
 | ||||
| 			proofDuration := 270 * 1000 | ||||
| 			calibratedDifficulty := (int64(proofDuration) / skew) * 10000 | ||||
| 
 | ||||
| 			v := vdf.New(uint32(calibratedDifficulty), b) | ||||
| 
 | ||||
| 			v.Execute() | ||||
| 			o := v.GetOutput() | ||||
| 
 | ||||
| 			outputs[i] = make([]byte, 516) | ||||
| 			copy(outputs[i][:], o[:]) | ||||
| 			wg.Done() | ||||
| 		}() | ||||
| 	} | ||||
| 
 | ||||
| 	wg.Wait() | ||||
| 	return now, outputs, nil | ||||
| } | ||||
| 
 | ||||
| func (w *WesolowskiFrameProver) VerifyChallengeProof( | ||||
| 	challenge []byte, | ||||
| 	timestamp int64, | ||||
| 	assertedDifficulty int64, | ||||
| 	proof [][]byte, | ||||
| ) bool { | ||||
| 	input := binary.BigEndian.AppendUint64([]byte{}, uint64(timestamp)) | ||||
| 	input = append(input, challenge...) | ||||
| 
 | ||||
| 	for i := uint32(0); i < uint32(len(proof)); i++ { | ||||
| 		if len(proof[i]) != 516 { | ||||
| 			return false | ||||
| 		} | ||||
| 
 | ||||
| 		instanceInput := binary.BigEndian.AppendUint32([]byte{}, i) | ||||
| 		instanceInput = append(instanceInput, input...) | ||||
| 		b := sha3.Sum256(input) | ||||
| 
 | ||||
| 		// 4.5 minutes = 270 seconds, one increment should be ten seconds
 | ||||
| 		proofDuration := 270 * 1000 | ||||
| 		skew := (assertedDifficulty * 12) / 10 | ||||
| 		calibratedDifficulty := (int64(proofDuration) / skew) * 10000 | ||||
| 
 | ||||
| 		v := vdf.New(uint32(calibratedDifficulty), b) | ||||
| 		check := v.Verify([516]byte(proof[i])) | ||||
| 		if !check { | ||||
| 			return false | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	return true | ||||
| } | ||||
|  | ||||
| @ -26,3 +26,11 @@ func TestMasterProve(t *testing.T) { | ||||
| 	err = w.VerifyMasterClockFrame(next) | ||||
| 	assert.NoError(t, err) | ||||
| } | ||||
| 
 | ||||
| func TestChallengeProof(t *testing.T) { | ||||
| 	l, _ := zap.NewProduction() | ||||
| 	w := crypto.NewWesolowskiFrameProver(l) | ||||
| 	now, proofs, err := w.CalculateChallengeProof([]byte{0x01, 0x02, 0x03}, 3, 120000) | ||||
| 	assert.NoError(t, err) | ||||
| 	assert.True(t, w.VerifyChallengeProof([]byte{0x01, 0x02, 0x03}, now, 100000, proofs)) | ||||
| } | ||||
|  | ||||
| @ -4,12 +4,12 @@ import ( | ||||
| 	"bytes" | ||||
| 	"crypto" | ||||
| 	"crypto/rand" | ||||
| 	_ "embed" | ||||
| 	"encoding/base64" | ||||
| 	"encoding/binary" | ||||
| 	"encoding/hex" | ||||
| 	"encoding/json" | ||||
| 	"fmt" | ||||
| 	"os" | ||||
| 	"strings" | ||||
| 	"sync" | ||||
| 
 | ||||
| @ -206,6 +206,11 @@ func ( | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| // 2024-01-03: 1.2.0
 | ||||
| //
 | ||||
| //go:embed retroactive_peers.json
 | ||||
| var retroactivePeersJsonBinary []byte | ||||
| 
 | ||||
| // Creates a genesis state for the intrinsic
 | ||||
| func CreateGenesisState( | ||||
| 	logger *zap.Logger, | ||||
| @ -324,12 +329,6 @@ func CreateGenesisState( | ||||
| 		rewardTrie.Add(addrBytes, 0, 50) | ||||
| 	} | ||||
| 
 | ||||
| 	// 2024-01-03: 1.2.0
 | ||||
| 	d, err := os.ReadFile("./retroactive_peers.json") | ||||
| 	if err != nil { | ||||
| 		panic(err) | ||||
| 	} | ||||
| 
 | ||||
| 	type peerData struct { | ||||
| 		PeerId       string `json:"peer_id"` | ||||
| 		TokenBalance uint64 `json:"token_balance"` | ||||
| @ -339,7 +338,7 @@ func CreateGenesisState( | ||||
| 	} | ||||
| 
 | ||||
| 	retroEntries := &rewards{} | ||||
| 	err = json.Unmarshal(d, retroEntries) | ||||
| 	err = json.Unmarshal(retroactivePeersJsonBinary, retroEntries) | ||||
| 	if err != nil { | ||||
| 		panic(err) | ||||
| 	} | ||||
|  | ||||
							
								
								
									
										162
									
								
								node/main.go
									
									
									
									
									
								
							
							
						
						
									
										162
									
								
								node/main.go
									
									
									
									
									
								
							| @ -3,6 +3,7 @@ | ||||
| package main | ||||
| 
 | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"crypto/rand" | ||||
| 	"encoding/binary" | ||||
| 	"encoding/hex" | ||||
| @ -16,10 +17,12 @@ import ( | ||||
| 	"runtime" | ||||
| 	"runtime/pprof" | ||||
| 	"strconv" | ||||
| 	"strings" | ||||
| 	"syscall" | ||||
| 	"time" | ||||
| 
 | ||||
| 	"go.uber.org/zap" | ||||
| 	"golang.org/x/crypto/sha3" | ||||
| 	"google.golang.org/protobuf/proto" | ||||
| 	"source.quilibrium.com/quilibrium/monorepo/node/execution/intrinsics/ceremony/application" | ||||
| 	"source.quilibrium.com/quilibrium/monorepo/node/p2p" | ||||
| @ -27,6 +30,7 @@ import ( | ||||
| 	"source.quilibrium.com/quilibrium/monorepo/node/store" | ||||
| 	"source.quilibrium.com/quilibrium/monorepo/node/utils" | ||||
| 
 | ||||
| 	"github.com/cloudflare/circl/sign/ed448" | ||||
| 	"github.com/libp2p/go-libp2p/core/crypto" | ||||
| 	"github.com/libp2p/go-libp2p/core/peer" | ||||
| 	"github.com/pbnjay/memory" | ||||
| @ -89,11 +93,109 @@ var ( | ||||
| 		false, | ||||
| 		"sets a node to run strictly as a dht bootstrap peer (not full node)", | ||||
| 	) | ||||
| 	network = flag.Uint( | ||||
| 		"network", | ||||
| 		0, | ||||
| 		"sets the active network for the node (mainnet = 0, primary testnet = 1)", | ||||
| 	) | ||||
| 	signatureCheck = flag.Bool( | ||||
| 		"signature-check", | ||||
| 		true, | ||||
| 		"enables or disables signature validation (default true)", | ||||
| 	) | ||||
| ) | ||||
| 
 | ||||
| var signatories = []string{ | ||||
| 	"b1214da7f355f5a9edb7bcc23d403bdf789f070cca10db2b4cadc22f2d837afb650944853e35d5f42ef3c4105b802b144b4077d5d3253e4100", | ||||
| 	"de4cfe7083104bfe32f0d4082fa0200464d8b10804a811653eedda376efcad64dd222f0f0ceb0b8ae58abe830d7a7e3f3b2d79d691318daa00", | ||||
| 	"540237a35e124882d6b64e7bb5718273fa338e553f772b77fe90570e45303762b34131bdcb6c0b9f2cf9e393d9c7e0f546eeab0bcbbd881680", | ||||
| 	"fbe4166e37f93f90d2ebf06305315ae11b37e501d09596f8bde11ba9d343034fbca80f252205aa2f582a512a72ad293df371baa582da072900", | ||||
| 	"4160572e493e1bf15c44e055b11bf75230c76c7d2c67b48066770ab03dfd5ed34c97b9a431ec18578c83a0df9250b8362c38068650e8b01400", | ||||
| 	"45170b626884b85d61ae109f2aa9b0e1ecc18b181508431ea6308f3869f2adae49da9799a0a594eaa4ef3ad492518fb1729decd44169d40d00", | ||||
| 	"92cd8ee5362f3ae274a75ab9471024dbc144bff441ed8af7d19750ac512ff51e40e7f7b01e4f96b6345dd58878565948c3eb52c53f250b5080", | ||||
| 	"001a4cbfce5d9aeb7e20665b0d236721b228a32f0baee62ffa77f45b82ecaf577e8a38b7ef91fcf7d2d2d2b504f085461398d30b24abb1d700", | ||||
| 	"65b835071731c6e785bb2d107c7d85d8a537d79c435c3f42bb2f87027f93f858d7b37c598cef267a5db46e345f7a6f81969b465686657d1e00", | ||||
| 	"4507626f7164e7d8c304c07ff8d2e23c113fe108b221d2e60672f4d07750345815e2b4b3cc3df4d3466bf2f669c35c3172e06511270612ab00", | ||||
| 	"4fb2537345e46be3d5f96340c1441007501702dd5bfaf6dbf6943bbefceca8fb2b94ec0a8a1a2f49850fbe1d10244889a4f40abfa9e0c9e000", | ||||
| 	"57be2861faf0fffcbfd122c85c77010dce8f213030905781b85b6f345d912c7b5ace17797d9810899dfb8d13e7c8369595740725ab3dd5bd00", | ||||
| 	"61628beef8f6964466fd078d6a2b90a397ab0777a14b9728227fd19f36752f9451b1a8d780740a0b9a8ce3df5f89ca7b9ff17de9274a270980", | ||||
| 	"5547afc71b02821e2f5bfdd30fbe1374c3853898deff20a1b5cc729b8e81670fbbb9d1e917f85d153ea4b26bbf6f9c546dc1b64b9916608d80", | ||||
| 	"81d63a45f068629f568de812f18be5807bfe828a830097f09cf02330d6acd35e3607401df3fda08b03b68ea6e68afd506b23506b11e87a0f80", | ||||
| 	"6e2872f73c4868c4286bef7bfe2f5479a41c42f4e07505efa4883c7950c740252e0eea78eef10c584b19b1dcda01f7767d3135d07c33244100", | ||||
| 	"a114b061f8d35e3f3497c8c43d83ba6b4af67aa7b39b743b1b0a35f2d66110b5051dd3d86f69b57122a35b64e624b8180bee63b6152fce4280", | ||||
| } | ||||
| 
 | ||||
| func main() { | ||||
| 	flag.Parse() | ||||
| 
 | ||||
| 	if *signatureCheck { | ||||
| 		if runtime.GOOS == "windows" { | ||||
| 			fmt.Println("Signature check not available for windows yet, skipping...") | ||||
| 		} else { | ||||
| 			ex, err := os.Executable() | ||||
| 			if err != nil { | ||||
| 				panic(err) | ||||
| 			} | ||||
| 
 | ||||
| 			b, err := os.ReadFile(ex) | ||||
| 			if err != nil { | ||||
| 				fmt.Println( | ||||
| 					"Error encountered during signature check – are you running this " + | ||||
| 						"from source? (use --signature-check=false)", | ||||
| 				) | ||||
| 				panic(err) | ||||
| 			} | ||||
| 
 | ||||
| 			checksum := sha3.Sum256(b) | ||||
| 			digest, err := os.ReadFile(ex + ".dgst") | ||||
| 			if err != nil { | ||||
| 				fmt.Println("Digest file not found") | ||||
| 				os.Exit(1) | ||||
| 			} | ||||
| 
 | ||||
| 			parts := strings.Split(string(digest), " ") | ||||
| 			if len(parts) != 2 { | ||||
| 				fmt.Println("Invalid digest file format") | ||||
| 				os.Exit(1) | ||||
| 			} | ||||
| 
 | ||||
| 			digestBytes, err := hex.DecodeString(parts[1][:64]) | ||||
| 			if err != nil { | ||||
| 				fmt.Println("Invalid digest file format") | ||||
| 				os.Exit(1) | ||||
| 			} | ||||
| 
 | ||||
| 			if !bytes.Equal(checksum[:], digestBytes) { | ||||
| 				fmt.Println("Invalid digest for node") | ||||
| 				os.Exit(1) | ||||
| 			} | ||||
| 
 | ||||
| 			count := 0 | ||||
| 
 | ||||
| 			for i := 1; i <= len(signatories); i++ { | ||||
| 				signatureFile := fmt.Sprintf(ex+".dgst.sig.%d", i) | ||||
| 				sig, err := os.ReadFile(signatureFile) | ||||
| 				if err != nil { | ||||
| 					continue | ||||
| 				} | ||||
| 
 | ||||
| 				pubkey, _ := hex.DecodeString(signatories[i-1]) | ||||
| 				if !ed448.Verify(pubkey, digest, sig, "") { | ||||
| 					fmt.Printf("Failed signature check for signatory #%d\n", i) | ||||
| 					os.Exit(1) | ||||
| 				} | ||||
| 				count++ | ||||
| 			} | ||||
| 
 | ||||
| 			if count < len(signatories)/2 { | ||||
| 				fmt.Printf("Quorum on signatures not met") | ||||
| 				os.Exit(1) | ||||
| 			} | ||||
| 
 | ||||
| 			fmt.Printf("Signature check passed") | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	if *memprofile != "" { | ||||
| 		go func() { | ||||
| 			for { | ||||
| @ -173,6 +275,26 @@ func main() { | ||||
| 		panic(err) | ||||
| 	} | ||||
| 
 | ||||
| 	if *network != 0 { | ||||
| 		if nodeConfig.P2P.BootstrapPeers[0] == config.BootstrapPeers[0] { | ||||
| 			fmt.Println( | ||||
| 				"Node has specified to run outside of mainnet but is still " + | ||||
| 					"using default bootstrap list. This will fail. Exiting.", | ||||
| 			) | ||||
| 			os.Exit(1) | ||||
| 		} | ||||
| 
 | ||||
| 		nodeConfig.Engine.GenesisSeed = fmt.Sprintf( | ||||
| 			"%02x%s", | ||||
| 			byte(*network), | ||||
| 			nodeConfig.Engine.GenesisSeed, | ||||
| 		) | ||||
| 		nodeConfig.P2P.Network = uint8(*network) | ||||
| 		fmt.Println( | ||||
| 			"Node is operating outside of mainnet – be sure you intended to do this.", | ||||
| 		) | ||||
| 	} | ||||
| 
 | ||||
| 	clearIfTestData(*configDirectory, nodeConfig) | ||||
| 
 | ||||
| 	if *dbConsole { | ||||
| @ -185,13 +307,6 @@ func main() { | ||||
| 		return | ||||
| 	} | ||||
| 
 | ||||
| 	if !*dhtOnly { | ||||
| 		fmt.Println("Loading ceremony state and starting node...") | ||||
| 		kzg.Init() | ||||
| 	} | ||||
| 
 | ||||
| 	report := RunSelfTestIfNeeded(*configDirectory, nodeConfig) | ||||
| 
 | ||||
| 	if *dhtOnly { | ||||
| 		dht, err := app.NewDHTNode(nodeConfig) | ||||
| 		if err != nil { | ||||
| @ -207,6 +322,11 @@ func main() { | ||||
| 		return | ||||
| 	} | ||||
| 
 | ||||
| 	fmt.Println("Loading ceremony state and starting node...") | ||||
| 	kzg.Init() | ||||
| 
 | ||||
| 	report := RunSelfTestIfNeeded(*configDirectory, nodeConfig) | ||||
| 
 | ||||
| 	var node *app.Node | ||||
| 	if *debug { | ||||
| 		node, err = app.NewDebugNode(nodeConfig, report) | ||||
| @ -579,19 +699,19 @@ func printNodeInfo(cfg *config.Config) { | ||||
| } | ||||
| 
 | ||||
| func printLogo() { | ||||
| 	fmt.Println("                                   %#########") | ||||
| 	fmt.Println("                          #############################") | ||||
| 	fmt.Println("                    ########################################&") | ||||
| 	fmt.Println("                 ###############################################") | ||||
| 	fmt.Println("             &#####################%        %######################") | ||||
| 	fmt.Println("           #################                         #################") | ||||
| 	fmt.Println("         ###############                                 ###############") | ||||
| 	fmt.Println("       #############                                        ##############") | ||||
| 	fmt.Println("     #############                                             ############&") | ||||
| 	fmt.Println("    ############                                                 ############") | ||||
| 	fmt.Println("   ###########                     ##########                     &###########") | ||||
| 	fmt.Println("  ###########                    ##############                     ###########") | ||||
| 	fmt.Println(" ###########                     ##############                      ##########&") | ||||
| 	fmt.Println("                                   ..-------..") | ||||
| 	fmt.Println("                          ..---''''           ''''---..") | ||||
| 	fmt.Println("                    .---''                             ''---.") | ||||
| 	fmt.Println("                 .-'                                         '-.") | ||||
| 	fmt.Println("             ..-'            ..--'''''''''''%######################") | ||||
| 	fmt.Println("           .'           .--''                         #################") | ||||
| 	fmt.Println("        .''         ..-'                                 ###############") | ||||
| 	fmt.Println("       '           '                                        ##############") | ||||
| 	fmt.Println("     ''         .''                                             ############&") | ||||
| 	fmt.Println("    '         ''                                                 ############") | ||||
| 	fmt.Println("   '         '                     ##########                     &###########") | ||||
| 	fmt.Println("  '         '                    ##############                     ###########") | ||||
| 	fmt.Println(" '         '                     ##############                      ##########&") | ||||
| 	fmt.Println(" '        '                      ##############                       ##########") | ||||
| 	fmt.Println("'        '                         ##########                         ##########") | ||||
| 	fmt.Println("'        '                                                            ##########") | ||||
| @ -616,5 +736,5 @@ func printLogo() { | ||||
| 
 | ||||
| func printVersion() { | ||||
| 	fmt.Println(" ") | ||||
| 	fmt.Println("                       Quilibrium Node - v" + config.GetVersionString() + " – Aurora") | ||||
| 	fmt.Println("                       Quilibrium Node - v" + config.GetVersionString() + " – Nebula") | ||||
| } | ||||
|  | ||||
| @ -45,6 +45,7 @@ type BlossomSub struct { | ||||
| 	peerScore       map[string]int64 | ||||
| 	peerScoreMx     sync.Mutex | ||||
| 	isBootstrapPeer bool | ||||
| 	network         uint8 | ||||
| } | ||||
| 
 | ||||
| var _ PubSub = (*BlossomSub)(nil) | ||||
| @ -60,7 +61,7 @@ var BITMASK_ALL = []byte{ | ||||
| // While we iterate through these next phases, we're going to aggressively
 | ||||
| // enforce keeping updated. This will be achieved through announce strings
 | ||||
| // that will vary with each update
 | ||||
| var ANNOUNCE = "quilibrium-1.4.16-sunset-noctilucent" | ||||
| var ANNOUNCE_PREFIX = "quilibrium-1.4.18-nebula-" | ||||
| 
 | ||||
| func getPeerID(p2pConfig *config.P2PConfig) peer.ID { | ||||
| 	peerPrivKey, err := hex.DecodeString(p2pConfig.PeerPrivKey) | ||||
| @ -129,6 +130,7 @@ func NewBlossomSub( | ||||
| 		signKey:         privKey, | ||||
| 		peerScore:       make(map[string]int64), | ||||
| 		isBootstrapPeer: isBootstrapPeer, | ||||
| 		network:         p2pConfig.Network, | ||||
| 	} | ||||
| 
 | ||||
| 	h, err := libp2p.New(opts...) | ||||
| @ -140,7 +142,7 @@ func NewBlossomSub( | ||||
| 
 | ||||
| 	kademliaDHT := initDHT(ctx, p2pConfig, logger, h, isBootstrapPeer) | ||||
| 	routingDiscovery := routing.NewRoutingDiscovery(kademliaDHT) | ||||
| 	util.Advertise(ctx, routingDiscovery, ANNOUNCE) | ||||
| 	util.Advertise(ctx, routingDiscovery, getNetworkNamespace(p2pConfig.Network)) | ||||
| 
 | ||||
| 	discoverPeers(p2pConfig, ctx, logger, h, routingDiscovery) | ||||
| 
 | ||||
| @ -212,7 +214,8 @@ func NewBlossomSub( | ||||
| } | ||||
| 
 | ||||
| func (b *BlossomSub) PublishToBitmask(bitmask []byte, data []byte) error { | ||||
| 	bm, ok := b.bitmaskMap[string(bitmask)] | ||||
| 	networkBitmask := append([]byte{b.network}, bitmask...) | ||||
| 	bm, ok := b.bitmaskMap[string(networkBitmask)] | ||||
| 	if !ok { | ||||
| 		b.logger.Error( | ||||
| 			"error while publishing to bitmask", | ||||
| @ -237,19 +240,20 @@ func (b *BlossomSub) Subscribe( | ||||
| 	raw bool, | ||||
| ) { | ||||
| 	eval := func(bitmask []byte) error { | ||||
| 		_, ok := b.bitmaskMap[string(bitmask)] | ||||
| 		networkBitmask := append([]byte{b.network}, bitmask...) | ||||
| 		_, ok := b.bitmaskMap[string(networkBitmask)] | ||||
| 		if ok { | ||||
| 			return nil | ||||
| 		} | ||||
| 
 | ||||
| 		b.logger.Info("joining broadcast") | ||||
| 		bm, err := b.ps.Join(bitmask) | ||||
| 		bm, err := b.ps.Join(networkBitmask) | ||||
| 		if err != nil { | ||||
| 			b.logger.Error("join failed", zap.Error(err)) | ||||
| 			return errors.Wrap(err, "subscribe") | ||||
| 		} | ||||
| 
 | ||||
| 		b.bitmaskMap[string(bitmask)] = bm | ||||
| 		b.bitmaskMap[string(networkBitmask)] = bm | ||||
| 
 | ||||
| 		b.logger.Info("subscribe to bitmask", zap.Binary("bitmask", bitmask)) | ||||
| 		sub, err := bm.Subscribe() | ||||
| @ -293,7 +297,8 @@ func (b *BlossomSub) Subscribe( | ||||
| } | ||||
| 
 | ||||
| func (b *BlossomSub) Unsubscribe(bitmask []byte, raw bool) { | ||||
| 	bm, ok := b.bitmaskMap[string(bitmask)] | ||||
| 	networkBitmask := append([]byte{b.network}, bitmask...) | ||||
| 	bm, ok := b.bitmaskMap[string(networkBitmask)] | ||||
| 	if !ok { | ||||
| 		return | ||||
| 	} | ||||
| @ -306,7 +311,8 @@ func (b *BlossomSub) GetPeerID() []byte { | ||||
| } | ||||
| 
 | ||||
| func (b *BlossomSub) GetRandomPeer(bitmask []byte) ([]byte, error) { | ||||
| 	peers := b.ps.ListPeers(bitmask) | ||||
| 	networkBitmask := append([]byte{b.network}, bitmask...) | ||||
| 	peers := b.ps.ListPeers(networkBitmask) | ||||
| 	if len(peers) == 0 { | ||||
| 		return nil, errors.Wrap( | ||||
| 			ErrNoPeersAvailable, | ||||
| @ -351,6 +357,8 @@ func initDHT( | ||||
| 		) | ||||
| 
 | ||||
| 		defaultBootstrapPeers := append([]string{}, p2pConfig.BootstrapPeers...) | ||||
| 
 | ||||
| 		if p2pConfig.Network == 0 { | ||||
| 			for _, peer := range config.BootstrapPeers { | ||||
| 				found := false | ||||
| 				for _, existing := range defaultBootstrapPeers { | ||||
| @ -363,6 +371,7 @@ func initDHT( | ||||
| 					defaultBootstrapPeers = append(defaultBootstrapPeers, peer) | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 
 | ||||
| 		for _, peerAddr := range defaultBootstrapPeers { | ||||
| 			peerinfo, err := peer.AddrInfoFromString(peerAddr) | ||||
| @ -379,7 +388,7 @@ func initDHT( | ||||
| 			if err := h.Connect(ctx, *peerinfo); err != nil { | ||||
| 				logger.Debug("error while connecting to dht peer", zap.Error(err)) | ||||
| 			} else { | ||||
| 				logger.Info( | ||||
| 				logger.Debug( | ||||
| 					"connected to peer", | ||||
| 					zap.String("peer_id", peerinfo.ID.String()), | ||||
| 				) | ||||
| @ -417,11 +426,11 @@ func (b *BlossomSub) GetBitmaskPeers() map[string][]string { | ||||
| 	peers := map[string][]string{} | ||||
| 
 | ||||
| 	for _, k := range b.bitmaskMap { | ||||
| 		peers[fmt.Sprintf("%+x", k.Bitmask())] = []string{} | ||||
| 		peers[fmt.Sprintf("%+x", k.Bitmask()[1:])] = []string{} | ||||
| 
 | ||||
| 		for _, p := range k.ListPeers() { | ||||
| 			peers[fmt.Sprintf("%+x", k.Bitmask())] = append( | ||||
| 				peers[fmt.Sprintf("%+x", k.Bitmask())], | ||||
| 			peers[fmt.Sprintf("%+x", k.Bitmask()[1:])] = append( | ||||
| 				peers[fmt.Sprintf("%+x", k.Bitmask()[1:])], | ||||
| 				p.String(), | ||||
| 			) | ||||
| 		} | ||||
| @ -502,6 +511,8 @@ func (b *BlossomSub) GetDirectChannel(key []byte, purpose string) ( | ||||
| 		} | ||||
| 	}() | ||||
| 
 | ||||
| 	// Open question: should we prefix this so a node can run both in mainnet and
 | ||||
| 	// testnet? Feels like a bad idea and would be preferable to discourage.
 | ||||
| 	dialCtx, err = grpc.DialContext( | ||||
| 		b.ctx, | ||||
| 		base58.Encode(key), | ||||
| @ -556,7 +567,10 @@ func discoverPeers( | ||||
| 	logger.Info("initiating peer discovery") | ||||
| 
 | ||||
| 	discover := func() { | ||||
| 		peerChan, err := routingDiscovery.FindPeers(ctx, ANNOUNCE) | ||||
| 		peerChan, err := routingDiscovery.FindPeers( | ||||
| 			ctx, | ||||
| 			getNetworkNamespace(p2pConfig.Network), | ||||
| 		) | ||||
| 		if err != nil { | ||||
| 			logger.Error("could not find peers", zap.Error(err)) | ||||
| 		} | ||||
| @ -717,3 +731,20 @@ func mergeDefaults(p2pConfig *config.P2PConfig) blossomsub.BlossomSubParams { | ||||
| 		SlowHeartbeatWarning:      0.1, | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| func getNetworkNamespace(network uint8) string { | ||||
| 	var network_name string | ||||
| 	switch network { | ||||
| 	case 0: | ||||
| 		network_name = "mainnet" | ||||
| 		break | ||||
| 	case 1: | ||||
| 		network_name = "testnet-primary" | ||||
| 		break | ||||
| 	default: | ||||
| 		network_name = fmt.Sprintf("network-%d", network) | ||||
| 		break | ||||
| 	} | ||||
| 
 | ||||
| 	return ANNOUNCE_PREFIX + network_name | ||||
| } | ||||
|  | ||||
| @ -39,6 +39,7 @@ type PeerManifest struct { | ||||
| 	Capabilities       []Capability | ||||
| 	MasterHeadFrame    uint64 | ||||
| 	Bandwidth          uint64 | ||||
| 	LastSeen           int64 | ||||
| } | ||||
| 
 | ||||
| type InMemoryPeerInfoManager struct { | ||||
|  | ||||
| @ -1,60 +0,0 @@ | ||||
| #!/bin/bash | ||||
| 
 | ||||
| start_process() { | ||||
|     GOEXPERIMENT=arenas go run ./... & | ||||
|     main_process_id=$! | ||||
|     local child_process_pid=$(pgrep -P $main_process_id) | ||||
|     echo "process started with PID $main_process_id and child PID $child_process_pid" | ||||
| } | ||||
| 
 | ||||
| is_process_running() { | ||||
|     ps -p $main_process_id > /dev/null 2>&1 | ||||
|     return $? | ||||
| } | ||||
| 
 | ||||
| kill_process() { | ||||
|     local process_count=$(ps -ef | grep "exe/node" | grep -v grep | wc -l) | ||||
|     local process_pids=$(ps -ef | grep "exe/node" | grep -v grep | awk '{print $2}' | xargs) | ||||
| 
 | ||||
|     if [ $process_count -gt 0 ]; then | ||||
|         echo "killing processes $process_pids" | ||||
|         kill $process_pids | ||||
| 
 | ||||
|         local child_process_count=$(pgrep -P $process_pids | wc -l) | ||||
|         local child_process_pids=$(pgrep -P $process_pids | xargs) | ||||
|         if [ $child_process_count -gt 0 ]; then | ||||
|             echo "killing child processes $child_process_pids" | ||||
|             kill $child_process_pids | ||||
|         else | ||||
|             echo "no child processes running" | ||||
|         fi | ||||
|     else | ||||
|         echo "no processes running" | ||||
|     fi | ||||
| } | ||||
| 
 | ||||
| kill_process | ||||
| 
 | ||||
| start_process | ||||
| 
 | ||||
| while true; do | ||||
|     if ! is_process_running; then | ||||
|         echo "process crashed or stopped. restarting..." | ||||
|         start_process | ||||
|     fi | ||||
| 
 | ||||
|     git fetch | ||||
| 
 | ||||
|     local_head=$(git rev-parse HEAD) | ||||
|     remote_head=$(git rev-parse @{u}) | ||||
| 
 | ||||
|     if [ "$local_head" != "$remote_head" ]; then | ||||
|         kill_process | ||||
| 
 | ||||
|         git pull | ||||
| 
 | ||||
|         start_process | ||||
|     fi | ||||
| 
 | ||||
|     sleep 60 | ||||
| done | ||||
| @ -1094,6 +1094,8 @@ type SelfTestReport struct { | ||||
| 	Capabilities []*Capability `protobuf:"bytes,14,rep,name=capabilities,proto3" json:"capabilities,omitempty"` | ||||
| 	// The highest master frame the node has
 | ||||
| 	MasterHeadFrame uint64 `protobuf:"varint,15,opt,name=master_head_frame,json=masterHeadFrame,proto3" json:"master_head_frame,omitempty"` | ||||
| 	// A challenge proof
 | ||||
| 	Proof []byte `protobuf:"bytes,16,opt,name=proof,proto3" json:"proof,omitempty"` | ||||
| } | ||||
| 
 | ||||
| func (x *SelfTestReport) Reset() { | ||||
| @ -1233,6 +1235,13 @@ func (x *SelfTestReport) GetMasterHeadFrame() uint64 { | ||||
| 	return 0 | ||||
| } | ||||
| 
 | ||||
| func (x *SelfTestReport) GetProof() []byte { | ||||
| 	if x != nil { | ||||
| 		return x.Proof | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
| 
 | ||||
| type ValidationMessage struct { | ||||
| 	state         protoimpl.MessageState | ||||
| 	sizeCache     protoimpl.SizeCache | ||||
| @ -1456,6 +1465,8 @@ type PeerManifest struct { | ||||
| 	Capabilities []*Capability `protobuf:"bytes,15,rep,name=capabilities,proto3" json:"capabilities,omitempty"` | ||||
| 	// The highest master frame the node has
 | ||||
| 	MasterHeadFrame uint64 `protobuf:"varint,16,opt,name=master_head_frame,json=masterHeadFrame,proto3" json:"master_head_frame,omitempty"` | ||||
| 	// The last time seen tick
 | ||||
| 	LastSeen int64 `protobuf:"varint,17,opt,name=last_seen,json=lastSeen,proto3" json:"last_seen,omitempty"` | ||||
| } | ||||
| 
 | ||||
| func (x *PeerManifest) Reset() { | ||||
| @ -1602,6 +1613,13 @@ func (x *PeerManifest) GetMasterHeadFrame() uint64 { | ||||
| 	return 0 | ||||
| } | ||||
| 
 | ||||
| func (x *PeerManifest) GetLastSeen() int64 { | ||||
| 	if x != nil { | ||||
| 		return x.LastSeen | ||||
| 	} | ||||
| 	return 0 | ||||
| } | ||||
| 
 | ||||
| type PeerManifestsResponse struct { | ||||
| 	state         protoimpl.MessageState | ||||
| 	sizeCache     protoimpl.SizeCache | ||||
| @ -1780,8 +1798,8 @@ var file_node_proto_rawDesc = []byte{ | ||||
| 	0x63, 0x6f, 0x6c, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x12, 0x2f, 0x0a, | ||||
| 	0x13, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x6d, 0x65, 0x74, 0x61, | ||||
| 	0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x12, 0x61, 0x64, 0x64, 0x69, | ||||
| 	0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0xfa, | ||||
| 	0x04, 0x0a, 0x0e, 0x53, 0x65, 0x6c, 0x66, 0x54, 0x65, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x72, | ||||
| 	0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0x90, | ||||
| 	0x05, 0x0a, 0x0e, 0x53, 0x65, 0x6c, 0x66, 0x54, 0x65, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x72, | ||||
| 	0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x69, 0x66, 0x66, 0x69, 0x63, 0x75, 0x6c, 0x74, 0x79, 0x18, | ||||
| 	0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x64, 0x69, 0x66, 0x66, 0x69, 0x63, 0x75, 0x6c, 0x74, | ||||
| 	0x79, 0x12, 0x2b, 0x0a, 0x11, 0x64, 0x69, 0x66, 0x66, 0x69, 0x63, 0x75, 0x6c, 0x74, 0x79, 0x5f, | ||||
| @ -1820,151 +1838,154 @@ var file_node_proto_rawDesc = []byte{ | ||||
| 	0x79, 0x52, 0x0c, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x12, | ||||
| 	0x2a, 0x0a, 0x11, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x5f, 0x66, | ||||
| 	0x72, 0x61, 0x6d, 0x65, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0f, 0x6d, 0x61, 0x73, 0x74, | ||||
| 	0x65, 0x72, 0x48, 0x65, 0x61, 0x64, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x22, 0x33, 0x0a, 0x11, 0x56, | ||||
| 	0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, | ||||
| 	0x12, 0x1e, 0x0a, 0x0a, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, | ||||
| 	0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, | ||||
| 	0x22, 0x62, 0x0a, 0x0b, 0x53, 0x79, 0x6e, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, | ||||
| 	0x53, 0x0a, 0x0e, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, | ||||
| 	0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, | ||||
| 	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, 0x73, 0x52, 0x65, | ||||
| 	0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0d, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x52, 0x65, 0x71, | ||||
| 	0x75, 0x65, 0x73, 0x74, 0x22, 0x66, 0x0a, 0x0c, 0x53, 0x79, 0x6e, 0x63, 0x52, 0x65, 0x73, 0x70, | ||||
| 	0x6f, 0x6e, 0x73, 0x65, 0x12, 0x56, 0x0a, 0x0f, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x5f, 0x72, | ||||
| 	0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, | ||||
| 	0x65, 0x72, 0x48, 0x65, 0x61, 0x64, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x70, | ||||
| 	0x72, 0x6f, 0x6f, 0x66, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x70, 0x72, 0x6f, 0x6f, | ||||
| 	0x66, 0x22, 0x33, 0x0a, 0x11, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, | ||||
| 	0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, | ||||
| 	0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x76, 0x61, 0x6c, 0x69, | ||||
| 	0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x62, 0x0a, 0x0b, 0x53, 0x79, 0x6e, 0x63, 0x52, 0x65, | ||||
| 	0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x53, 0x0a, 0x0e, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x5f, | ||||
| 	0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, | ||||
| 	0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 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, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x0e, 0x66, 0x72, | ||||
| 	0x61, 0x6d, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x19, 0x0a, 0x17, | ||||
| 	0x47, 0x65, 0x74, 0x50, 0x65, 0x65, 0x72, 0x4d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x73, | ||||
| 	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x91, 0x05, 0x0a, 0x0c, 0x50, 0x65, 0x65, 0x72, | ||||
| 	0x4d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x70, 0x65, 0x65, 0x72, | ||||
| 	0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x70, 0x65, 0x65, 0x72, 0x49, | ||||
| 	0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x69, 0x66, 0x66, 0x69, 0x63, 0x75, 0x6c, 0x74, 0x79, 0x18, | ||||
| 	0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x64, 0x69, 0x66, 0x66, 0x69, 0x63, 0x75, 0x6c, 0x74, | ||||
| 	0x79, 0x12, 0x2b, 0x0a, 0x11, 0x64, 0x69, 0x66, 0x66, 0x69, 0x63, 0x75, 0x6c, 0x74, 0x79, 0x5f, | ||||
| 	0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x64, 0x69, | ||||
| 	0x66, 0x66, 0x69, 0x63, 0x75, 0x6c, 0x74, 0x79, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x12, 0x28, | ||||
| 	0x0a, 0x10, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x5f, 0x31, 0x36, 0x5f, 0x6d, 0x65, 0x74, 0x72, | ||||
| 	0x69, 0x63, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, | ||||
| 	0x31, 0x36, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x12, 0x2a, 0x0a, 0x11, 0x63, 0x6f, 0x6d, 0x6d, | ||||
| 	0x69, 0x74, 0x5f, 0x31, 0x32, 0x38, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x18, 0x05, 0x20, | ||||
| 	0x01, 0x28, 0x03, 0x52, 0x0f, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x31, 0x32, 0x38, 0x4d, 0x65, | ||||
| 	0x74, 0x72, 0x69, 0x63, 0x12, 0x2c, 0x0a, 0x12, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x5f, 0x31, | ||||
| 	0x30, 0x32, 0x34, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, | ||||
| 	0x52, 0x10, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x31, 0x30, 0x32, 0x34, 0x4d, 0x65, 0x74, 0x72, | ||||
| 	0x69, 0x63, 0x12, 0x2e, 0x0a, 0x13, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x5f, 0x36, 0x35, 0x35, | ||||
| 	0x33, 0x36, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, | ||||
| 	0x11, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x36, 0x35, 0x35, 0x33, 0x36, 0x4d, 0x65, 0x74, 0x72, | ||||
| 	0x69, 0x63, 0x12, 0x26, 0x0a, 0x0f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x5f, 0x31, 0x36, 0x5f, 0x6d, | ||||
| 	0x65, 0x74, 0x72, 0x69, 0x63, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x70, 0x72, 0x6f, | ||||
| 	0x6f, 0x66, 0x31, 0x36, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x12, 0x28, 0x0a, 0x10, 0x70, 0x72, | ||||
| 	0x6f, 0x6f, 0x66, 0x5f, 0x31, 0x32, 0x38, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x18, 0x09, | ||||
| 	0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x31, 0x32, 0x38, 0x4d, 0x65, | ||||
| 	0x74, 0x72, 0x69, 0x63, 0x12, 0x2a, 0x0a, 0x11, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x5f, 0x31, 0x30, | ||||
| 	0x32, 0x34, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, | ||||
| 	0x0f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x31, 0x30, 0x32, 0x34, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, | ||||
| 	0x12, 0x2c, 0x0a, 0x12, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x5f, 0x36, 0x35, 0x35, 0x33, 0x36, 0x5f, | ||||
| 	0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x70, 0x72, | ||||
| 	0x6f, 0x6f, 0x66, 0x36, 0x35, 0x35, 0x33, 0x36, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x12, 0x14, | ||||
| 	0x0a, 0x05, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x63, | ||||
| 	0x6f, 0x72, 0x65, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x18, 0x0d, | ||||
| 	0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x12, 0x18, 0x0a, 0x07, | ||||
| 	0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x73, | ||||
| 	0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x12, 0x47, 0x0a, 0x0c, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69, | ||||
| 	0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x18, 0x0f, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x71, | ||||
| 	0x61, 0x6d, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0d, 0x66, 0x72, 0x61, | ||||
| 	0x6d, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x66, 0x0a, 0x0c, 0x53, 0x79, | ||||
| 	0x6e, 0x63, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x56, 0x0a, 0x0f, 0x66, 0x72, | ||||
| 	0x61, 0x6d, 0x65, 0x73, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x01, 0x20, | ||||
| 	0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 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, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, | ||||
| 	0x73, 0x65, 0x52, 0x0e, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, | ||||
| 	0x73, 0x65, 0x22, 0x19, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x50, 0x65, 0x65, 0x72, 0x4d, 0x61, 0x6e, | ||||
| 	0x69, 0x66, 0x65, 0x73, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xae, 0x05, | ||||
| 	0x0a, 0x0c, 0x50, 0x65, 0x65, 0x72, 0x4d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x12, 0x17, | ||||
| 	0x0a, 0x07, 0x70, 0x65, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, | ||||
| 	0x06, 0x70, 0x65, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x69, 0x66, 0x66, 0x69, | ||||
| 	0x63, 0x75, 0x6c, 0x74, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x64, 0x69, 0x66, | ||||
| 	0x66, 0x69, 0x63, 0x75, 0x6c, 0x74, 0x79, 0x12, 0x2b, 0x0a, 0x11, 0x64, 0x69, 0x66, 0x66, 0x69, | ||||
| 	0x63, 0x75, 0x6c, 0x74, 0x79, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x18, 0x03, 0x20, 0x01, | ||||
| 	0x28, 0x03, 0x52, 0x10, 0x64, 0x69, 0x66, 0x66, 0x69, 0x63, 0x75, 0x6c, 0x74, 0x79, 0x4d, 0x65, | ||||
| 	0x74, 0x72, 0x69, 0x63, 0x12, 0x28, 0x0a, 0x10, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x5f, 0x31, | ||||
| 	0x36, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, | ||||
| 	0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x31, 0x36, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x12, 0x2a, | ||||
| 	0x0a, 0x11, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x5f, 0x31, 0x32, 0x38, 0x5f, 0x6d, 0x65, 0x74, | ||||
| 	0x72, 0x69, 0x63, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x63, 0x6f, 0x6d, 0x6d, 0x69, | ||||
| 	0x74, 0x31, 0x32, 0x38, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x12, 0x2c, 0x0a, 0x12, 0x63, 0x6f, | ||||
| 	0x6d, 0x6d, 0x69, 0x74, 0x5f, 0x31, 0x30, 0x32, 0x34, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, | ||||
| 	0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x31, 0x30, | ||||
| 	0x32, 0x34, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x12, 0x2e, 0x0a, 0x13, 0x63, 0x6f, 0x6d, 0x6d, | ||||
| 	0x69, 0x74, 0x5f, 0x36, 0x35, 0x35, 0x33, 0x36, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x18, | ||||
| 	0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x36, 0x35, 0x35, | ||||
| 	0x33, 0x36, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x12, 0x26, 0x0a, 0x0f, 0x70, 0x72, 0x6f, 0x6f, | ||||
| 	0x66, 0x5f, 0x31, 0x36, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x18, 0x08, 0x20, 0x01, 0x28, | ||||
| 	0x03, 0x52, 0x0d, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x31, 0x36, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, | ||||
| 	0x12, 0x28, 0x0a, 0x10, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x5f, 0x31, 0x32, 0x38, 0x5f, 0x6d, 0x65, | ||||
| 	0x74, 0x72, 0x69, 0x63, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x70, 0x72, 0x6f, 0x6f, | ||||
| 	0x66, 0x31, 0x32, 0x38, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x12, 0x2a, 0x0a, 0x11, 0x70, 0x72, | ||||
| 	0x6f, 0x6f, 0x66, 0x5f, 0x31, 0x30, 0x32, 0x34, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x18, | ||||
| 	0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x31, 0x30, 0x32, 0x34, | ||||
| 	0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x12, 0x2c, 0x0a, 0x12, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x5f, | ||||
| 	0x36, 0x35, 0x35, 0x33, 0x36, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x18, 0x0b, 0x20, 0x01, | ||||
| 	0x28, 0x03, 0x52, 0x10, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x36, 0x35, 0x35, 0x33, 0x36, 0x4d, 0x65, | ||||
| 	0x74, 0x72, 0x69, 0x63, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x18, 0x0c, 0x20, | ||||
| 	0x01, 0x28, 0x0d, 0x52, 0x05, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x65, | ||||
| 	0x6d, 0x6f, 0x72, 0x79, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x6d, 0x65, 0x6d, 0x6f, | ||||
| 	0x72, 0x79, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x18, 0x0e, 0x20, | ||||
| 	0x01, 0x28, 0x0c, 0x52, 0x07, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x12, 0x47, 0x0a, 0x0c, | ||||
| 	0x63, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x18, 0x0f, 0x20, 0x03, | ||||
| 	0x28, 0x0b, 0x32, 0x23, 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, 0x43, 0x61, 0x70, | ||||
| 	0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x52, 0x0c, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, | ||||
| 	0x69, 0x74, 0x69, 0x65, 0x73, 0x12, 0x2a, 0x0a, 0x11, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, | ||||
| 	0x68, 0x65, 0x61, 0x64, 0x5f, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x18, 0x10, 0x20, 0x01, 0x28, 0x04, | ||||
| 	0x52, 0x0f, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x48, 0x65, 0x61, 0x64, 0x46, 0x72, 0x61, 0x6d, | ||||
| 	0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x73, 0x65, 0x65, 0x6e, 0x18, 0x11, | ||||
| 	0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x6c, 0x61, 0x73, 0x74, 0x53, 0x65, 0x65, 0x6e, 0x22, 0x65, | ||||
| 	0x0a, 0x15, 0x50, 0x65, 0x65, 0x72, 0x4d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x73, 0x52, | ||||
| 	0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4c, 0x0a, 0x0e, 0x70, 0x65, 0x65, 0x72, 0x5f, | ||||
| 	0x6d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, | ||||
| 	0x25, 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, 0x50, 0x65, 0x65, 0x72, 0x4d, 0x61, | ||||
| 	0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x52, 0x0d, 0x70, 0x65, 0x65, 0x72, 0x4d, 0x61, 0x6e, 0x69, | ||||
| 	0x66, 0x65, 0x73, 0x74, 0x73, 0x32, 0xd7, 0x01, 0x0a, 0x11, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, | ||||
| 	0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x6b, 0x0a, 0x11, 0x50, | ||||
| 	0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, | ||||
| 	0x12, 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, 0x56, 0x61, 0x6c, 0x69, 0x64, | ||||
| 	0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 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, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, | ||||
| 	0x79, 0x52, 0x0c, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x12, | ||||
| 	0x2a, 0x0a, 0x11, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x5f, 0x66, | ||||
| 	0x72, 0x61, 0x6d, 0x65, 0x18, 0x10, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0f, 0x6d, 0x61, 0x73, 0x74, | ||||
| 	0x65, 0x72, 0x48, 0x65, 0x61, 0x64, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x22, 0x65, 0x0a, 0x15, 0x50, | ||||
| 	0x65, 0x65, 0x72, 0x4d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, | ||||
| 	0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4c, 0x0a, 0x0e, 0x70, 0x65, 0x65, 0x72, 0x5f, 0x6d, 0x61, 0x6e, | ||||
| 	0x69, 0x66, 0x65, 0x73, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 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, 0x50, 0x65, 0x65, 0x72, 0x4d, 0x61, 0x6e, 0x69, 0x66, | ||||
| 	0x65, 0x73, 0x74, 0x52, 0x0d, 0x70, 0x65, 0x65, 0x72, 0x4d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, | ||||
| 	0x74, 0x73, 0x32, 0xd7, 0x01, 0x0a, 0x11, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, | ||||
| 	0x6e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x6b, 0x0a, 0x11, 0x50, 0x65, 0x72, 0x66, | ||||
| 	0x6f, 0x72, 0x6d, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 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, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, | ||||
| 	0x6f, 0x6e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 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, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, | ||||
| 	0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x55, 0x0a, 0x04, 0x53, 0x79, 0x6e, 0x63, 0x12, 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, 0x53, 0x79, 0x6e, 0x63, 0x52, 0x65, 0x71, 0x75, | ||||
| 	0x65, 0x73, 0x74, 0x1a, 0x25, 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, 0x53, 0x79, | ||||
| 	0x6e, 0x63, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x30, 0x01, 0x32, 0xf6, 0x05, 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, | ||||
| 	0x6f, 0x64, 0x65, 0x2e, 0x70, 0x62, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, | ||||
| 	0x6e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x55, 0x0a, 0x04, 0x53, 0x79, 0x6e, 0x63, | ||||
| 	0x12, 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, 0x53, 0x79, 0x6e, 0x63, 0x52, | ||||
| 	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 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, 0x62, 0x2e, 0x50, 0x65, | ||||
| 	0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x65, | ||||
| 	0x0a, 0x0b, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x2b, 0x2e, | ||||
| 	0x2e, 0x53, 0x79, 0x6e, 0x63, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x30, 0x01, 0x32, | ||||
| 	0xf6, 0x05, 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, 0x62, | ||||
| 	0x2e, 0x50, 0x65, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, | ||||
| 	0x65, 0x12, 0x65, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 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, 0x4e, 0x6f, | ||||
| 	0x64, 0x65, 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, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x49, | ||||
| 	0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x71, 0x75, 0x69, | ||||
| 	0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x70, 0x62, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x66, 0x6f, | ||||
| 	0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6e, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x4e, | ||||
| 	0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x2e, 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, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, | ||||
| 	0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6e, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x4e, 0x65, 0x74, 0x77, | ||||
| 	0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x2e, 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, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 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, | ||||
| 	0x65, 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 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, 0x12, 0x74, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x50, 0x65, 0x65, 0x72, 0x4d, 0x61, 0x6e, | ||||
| 	0x69, 0x66, 0x65, 0x73, 0x74, 0x73, 0x12, 0x30, 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, 0x4d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, | ||||
| 	0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 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, 0x50, 0x65, 0x65, 0x72, 0x4d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x73, | ||||
| 	0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32, 0xcf, 0x01, 0x0a, 0x09, 0x4e, 0x6f, 0x64, | ||||
| 	0x65, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x60, 0x0a, 0x0b, 0x50, 0x75, 0x74, 0x4e, 0x6f, 0x64, | ||||
| 	0x65, 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, 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, 0x12, | ||||
| 	0x74, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x50, 0x65, 0x65, 0x72, 0x4d, 0x61, 0x6e, 0x69, 0x66, 0x65, | ||||
| 	0x73, 0x74, 0x73, 0x12, 0x30, 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, 0x4d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x73, 0x52, 0x65, | ||||
| 	0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 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, | ||||
| 	0x50, 0x65, 0x65, 0x72, 0x4d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x73, 0x52, 0x65, 0x73, | ||||
| 	0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32, 0xcf, 0x01, 0x0a, 0x09, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x74, | ||||
| 	0x61, 0x74, 0x73, 0x12, 0x60, 0x0a, 0x0b, 0x50, 0x75, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x49, 0x6e, | ||||
| 	0x66, 0x6f, 0x12, 0x2b, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, | ||||
| 	0x50, 0x75, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, | ||||
| 	0x73, 0x74, 0x1a, 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, 0x50, 0x75, 0x74, | ||||
| 	0x4e, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, | ||||
| 	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, 0x50, 0x75, 0x74, 0x52, 0x65, 0x73, | ||||
| 	0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x60, 0x0a, 0x0b, 0x50, 0x75, 0x74, 0x50, 0x65, 0x65, 0x72, | ||||
| 	0x49, 0x6e, 0x66, 0x6f, 0x12, 0x2b, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, | ||||
| 	0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x60, 0x0a, 0x0b, 0x50, 0x75, 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, 0x50, 0x75, 0x74, 0x50, 0x65, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, | ||||
| 	0x75, 0x65, 0x73, 0x74, 0x1a, 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, 0x50, | ||||
| 	0x75, 0x74, 0x50, 0x65, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, | ||||
| 	0x74, 0x1a, 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, 0x50, 0x75, 0x74, 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, | ||||
| 	0x75, 0x74, 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 ( | ||||
|  | ||||
| @ -155,6 +155,8 @@ message SelfTestReport { | ||||
|   repeated Capability capabilities = 14; | ||||
|   // The highest master frame the node has | ||||
|   uint64 master_head_frame = 15; | ||||
|   // A challenge proof | ||||
|   bytes proof = 16; | ||||
| } | ||||
| 
 | ||||
| message ValidationMessage { | ||||
| @ -216,6 +218,8 @@ message PeerManifest { | ||||
|   repeated Capability capabilities = 15; | ||||
|   // The highest master frame the node has | ||||
|   uint64 master_head_frame = 16; | ||||
|   // The last time seen tick | ||||
|   int64 last_seen = 17; | ||||
| } | ||||
| 
 | ||||
| message PeerManifestsResponse { | ||||
|  | ||||
							
								
								
									
										7
									
								
								signers/.env.example
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								signers/.env.example
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,7 @@ | ||||
| # Full path to your private key, used for signing and also the corresponding pem file number. Both required to generate signatures. | ||||
| SIGNING_KEY_PATH= | ||||
| SIGNING_KEY_ID= | ||||
| 
 | ||||
| # Full path to your public key, used to generate hex for reference. | ||||
| SIGNING_PUB_KEY_PATH= | ||||
| 
 | ||||
							
								
								
									
										18
									
								
								signers/Dockerfile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								signers/Dockerfile
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,18 @@ | ||||
| FROM golang:1.20.14-bookworm | ||||
| 
 | ||||
| ENV GOEXPERIMENT=arenas | ||||
| ENV QUILIBRIUM_DOCKER_CONTAINER=true | ||||
| 
 | ||||
| ARG USER_NAME=default | ||||
| ARG UID=1000 | ||||
| ARG GID=1000 | ||||
| 
 | ||||
| RUN groupadd -g ${GID} ${USER_NAME} \ | ||||
|     && useradd -u ${UID} -g ${USER_NAME} -s /bin/bash ${USER_NAME} | ||||
| 
 | ||||
| RUN sh -c "$(curl --location https://taskfile.dev/install.sh)" -- -d -b /usr/local/bin | ||||
| RUN apt-get update && apt-get install git | ||||
| 
 | ||||
| USER ${USER_NAME} | ||||
| 
 | ||||
| WORKDIR /home/${USER_NAME} | ||||
							
								
								
									
										20
									
								
								signers/README.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								signers/README.md
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,20 @@ | ||||
| # Release Signatories | ||||
| 
 | ||||
| Scripts in this folder are tools for release signers to build and sign Quilibrium binaries. | ||||
| 
 | ||||
| Requirements: | ||||
| - bash environment (Ubuntu, macOS, etc.) | ||||
| - openssl - digests and signatures | ||||
| - git - to checkout this branch | ||||
| - Docker - to run a container with golang and compile binaries | ||||
| - [Taskfile](https://taskfile.dev/installation/) | ||||
| 
 | ||||
| Checkout the whole repo from a release branch and then in the `signers` folder you can run `task` commands. Before you | ||||
| can run commands you have to copy `.env.example` to `.env` and fill it out. You need a local folder with all the pem | ||||
| files, required by signature verification. | ||||
| 
 | ||||
| Important tasks: | ||||
| - `task build` to build the binaries in a dedicated docker image | ||||
| - `task verify:build` to verify that you can build the exact same binaries | ||||
| - `task verify:digest` to verify the digests | ||||
| - `task verify:signatures` to verify all signatures | ||||
							
								
								
									
										202
									
								
								signers/Taskfile.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										202
									
								
								signers/Taskfile.yaml
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,202 @@ | ||||
| # https://taskfile.dev | ||||
| 
 | ||||
| version: '3' | ||||
| 
 | ||||
| dotenv: | ||||
|   - '.env' | ||||
| 
 | ||||
| env: | ||||
|   GOEXPERIMENT: arenas | ||||
| 
 | ||||
| vars: | ||||
|   VERSION: | ||||
|     sh: cat ../node/config/version.go | grep -A 1 "func GetVersion() \[\]byte {" | grep -Eo '0x[0-9a-fA-F]+' | xargs printf "%d.%d.%d" | ||||
|   MAX_KEY_ID: 15 | ||||
|   QUILIBRIUM_SIGNERS_IMAGE_NAME: 'quilibrium-signers' | ||||
|   USER_NAME: | ||||
|     sh: whoami | ||||
|   PARENT_FOLDER: | ||||
|     sh: dirname $(pwd) | ||||
|   SIGNING_KEYS_PEM_DIR: 'pems' | ||||
| 
 | ||||
| tasks: | ||||
|   status: | ||||
|     desc: Display configuration info. | ||||
|     cmds: | ||||
|       - echo -n "Version       :" && echo " {{.VERSION}}" | ||||
|       - echo -n "Priv Key Path :" && echo " {{.SIGNING_KEY_PATH}}" | ||||
|       - echo -n "Pub  Key Path :" && echo " {{.SIGNING_PUB_KEY_PATH}}" | ||||
|       - echo -n "Key ID        :" && echo " {{.SIGNING_KEY_ID}}" | ||||
|     silent: true | ||||
| 
 | ||||
|   hex: | ||||
|     desc: Print the hex representation of your public key. | ||||
|     cmds: | ||||
|       - cat {{.SIGNING_PUB_KEY_PATH}} | openssl ec -inform pem -pubin -noout -text | ||||
| 
 | ||||
|   docker:build_image: | ||||
|     desc: Build the Quilibrium Signers docker image, unless it is already built. | ||||
|     aliases: | ||||
|       - image | ||||
|     preconditions: | ||||
|       - sh: 'test -z "$QUILIBRIUM_DOCKER_CONTAINER"' | ||||
|         msg: 'This command cannot be run inside the container' | ||||
|     cmds: | ||||
|       - | | ||||
|         docker build \ | ||||
|         --build-arg USER_NAME={{.USER_NAME}} \ | ||||
|         --build-arg UID=$(id -u) \ | ||||
|         --build-arg GID=$(id -g) \ | ||||
|         -t {{.QUILIBRIUM_SIGNERS_IMAGE_NAME}}:latest \ | ||||
|         . | ||||
|     status: | ||||
|       - | | ||||
|         docker image inspect \ | ||||
|         {{.QUILIBRIUM_SIGNERS_IMAGE_NAME}} \ | ||||
|         >/dev/null 2>/dev/null | ||||
| 
 | ||||
|   build: | ||||
|     desc: Build the Quilibrium node binaries by starting a container and starting the build inside the container. | ||||
|     preconditions: | ||||
|       - sh: 'test -z "$QUILIBRIUM_DOCKER_CONTAINER"' | ||||
|         msg: 'This command cannot be run inside the container' | ||||
|     deps: | ||||
|       - docker:build_image | ||||
|     cmds: | ||||
|       - docker run --name signers --rm -it -v {{.PARENT_FOLDER}}:/home/{{.USER_NAME}}/ceremonyclient -u {{.USER_NAME}} -w /home/{{.USER_NAME}}/ceremonyclient/signers {{.QUILIBRIUM_SIGNERS_IMAGE_NAME}} task build:container | ||||
| 
 | ||||
|   build:shell: | ||||
|     desc: Start a shell in a build container. | ||||
|     aliases: | ||||
|       - shell | ||||
|     preconditions: | ||||
|       - sh: 'test -z "$QUILIBRIUM_DOCKER_CONTAINER"' | ||||
|         msg: 'This command cannot be run inside the container' | ||||
|     deps: | ||||
|       - docker:build_image | ||||
|     cmds: | ||||
|       - docker run --name signers --rm -it -v {{.PARENT_FOLDER}}:/home/{{.USER_NAME}}/ceremonyclient -u {{.USER_NAME}} -w /home/{{.USER_NAME}}/ceremonyclient/signers {{.QUILIBRIUM_SIGNERS_IMAGE_NAME}} bash | ||||
| 
 | ||||
|   build:container: | ||||
|     desc: Build the Quilibrium node binaries, inside the Docker container. | ||||
|     dir: ../node | ||||
|     sources: | ||||
|       - '**/*.go' | ||||
|     generates: | ||||
|       - node-{{.VERSION}}-*.bin | ||||
|     cmds: | ||||
|       - GOOS=darwin go build -ldflags "-s -w" -o node-{{.VERSION}}-darwin-arm64.bin | ||||
|       - GOOS=linux GOARCH=amd64 go build -ldflags "-s -w" -o node-{{.VERSION}}-linux-amd64.bin | ||||
|       - GOOS=linux GOARCH=arm64 go build -ldflags "-s -w" -o node-{{.VERSION}}-linux-arm64.bin | ||||
| 
 | ||||
|   digest: | ||||
|     desc: Generate digests for node binaries. | ||||
|     deps: [build] | ||||
|     dir: ../node | ||||
|     sources: | ||||
|       - node-{{.VERSION}}-*.bin | ||||
|     generates: | ||||
|       - node-{{.VERSION}}-*.dgst | ||||
|     cmds: | ||||
|       - openssl sha3-256 -out node-{{.VERSION}}-darwin-arm64.dgst node-{{.VERSION}}-darwin-arm64.bin    | ||||
|       - openssl sha3-256 -out node-{{.VERSION}}-linux-amd64.dgst node-{{.VERSION}}-linux-amd64.bin | ||||
|       - openssl sha3-256 -out node-{{.VERSION}}-linux-arm64.dgst node-{{.VERSION}}-linux-arm64.bin | ||||
| 
 | ||||
|   sign: | ||||
|     desc: Generate signatures for node binaries. | ||||
|     deps: [digest] | ||||
|     dir: ../node | ||||
|     preconditions: | ||||
|       - sh: 'test -n "$SIGNING_KEY_PATH"' | ||||
|         msg: 'The path to the signing key must be set in SIGNING_KEY_PATH' | ||||
|       - sh: 'test -n "$SIGNING_KEY_ID"' | ||||
|         msg: 'The signing key id must be set in SIGNING_KEY_ID' | ||||
|     sources: | ||||
|       - node-{{.VERSION}}-*.dgst | ||||
|     generates: | ||||
|       - node-{{.VERSION}}-*.dgst.sig.{{.SIGNING_KEY_ID}} | ||||
|     cmds: | ||||
|       - openssl pkeyutl -sign -inkey {{.SIGNING_KEY_PATH}} -rawin -in node-{{.VERSION}}-darwin-arm64.dgst -out node-{{.VERSION}}-darwin-arm64.dgst.sig.{{.SIGNING_KEY_ID}} | ||||
|       - openssl pkeyutl -sign -inkey {{.SIGNING_KEY_PATH}} -rawin -in node-{{.VERSION}}-linux-amd64.dgst -out node-{{.VERSION}}-linux-amd64.dgst.sig.{{.SIGNING_KEY_ID}} | ||||
|       - openssl pkeyutl -sign -inkey {{.SIGNING_KEY_PATH}} -rawin -in node-{{.VERSION}}-linux-arm64.dgst -out node-{{.VERSION}}-linux-arm64.dgst.sig.{{.SIGNING_KEY_ID}} | ||||
| 
 | ||||
|   verify:build: | ||||
|     desc: Verify that the existing binaries can be rebuilt exactly the same. | ||||
|     dir: ../node | ||||
|     preconditions: | ||||
|       - sh: 'test -z "$QUILIBRIUM_DOCKER_CONTAINER"' | ||||
|         msg: 'This command cannot be run inside the container' | ||||
|     deps: | ||||
|       - docker:build_image | ||||
|     cmds: | ||||
|       - docker run --name signers --rm -it -v {{.PARENT_FOLDER}}:/home/{{.USER_NAME}}/ceremonyclient -u {{.USER_NAME}} -w /home/{{.USER_NAME}}/ceremonyclient/signers {{.QUILIBRIUM_SIGNERS_IMAGE_NAME}} task verify:build:container | ||||
|       - diff node-{{.VERSION}}-darwin-arm64.bin node-tmp-darwin-arm64.bin | ||||
|       - diff node-{{.VERSION}}-linux-amd64.bin node-tmp-linux-amd64.bin | ||||
|       - diff node-{{.VERSION}}-linux-arm64.bin node-tmp-linux-arm64.bin | ||||
| 
 | ||||
|   verify:build:container: | ||||
|     desc: Verify that the existing binaries can be rebuilt exactly the same, inside tbe Docker container. | ||||
|     dir: ../node | ||||
|     sources: | ||||
|       - '**/*.go' | ||||
|     generates: | ||||
|       - node-tmp-*.bin | ||||
|     cmds: | ||||
|       - GOOS=darwin go build -ldflags "-s -w" -o node-tmp-darwin-arm64.bin | ||||
|       - GOOS=linux GOARCH=amd64 go build -ldflags "-s -w" -o node-tmp-linux-amd64.bin | ||||
|       - GOOS=linux GOARCH=arm64 go build -ldflags "-s -w" -o node-tmp-linux-arm64.bin | ||||
|       - diff node-{{.VERSION}}-darwin-arm64.bin node-tmp-darwin-arm64.bin | ||||
|       - diff node-{{.VERSION}}-linux-amd64.bin node-tmp-linux-amd64.bin | ||||
|       - diff node-{{.VERSION}}-linux-arm64.bin node-tmp-linux-arm64.bin | ||||
| 
 | ||||
|   verify:digest: | ||||
|     desc: Verify that the existing digests are correct. | ||||
|     dir: ../node | ||||
|     cmds: | ||||
|       - openssl sha3-256 -out node-tmp-darwin-arm64.dgst node-{{.VERSION}}-darwin-arm64.bin    | ||||
|       - openssl sha3-256 -out node-tmp-linux-amd64.dgst node-{{.VERSION}}-linux-amd64.bin | ||||
|       - openssl sha3-256 -out node-tmp-linux-arm64.dgst node-{{.VERSION}}-linux-arm64.bin | ||||
|       - diff node-{{.VERSION}}-darwin-arm64.dgst node-tmp-darwin-arm64.dgst | ||||
|       - diff node-{{.VERSION}}-linux-amd64.dgst node-tmp-linux-amd64.dgst | ||||
|       - diff node-{{.VERSION}}-linux-arm64.dgst node-tmp-linux-arm64.dgst | ||||
| 
 | ||||
|   verify:signatures: | ||||
|     desc: Verify all signatures. | ||||
|     dir: ../node | ||||
|     cmds: | ||||
|       - | | ||||
|         for i in {1..{{.MAX_KEY_ID}}} | ||||
|         do | ||||
|           if [ -f node-{{.VERSION}}-darwin-arm64.dgst.sig.$i ] | ||||
|           then | ||||
|             echo $i | ||||
|             echo "node-{{.VERSION}}-darwin-arm64" | ||||
|             openssl pkeyutl -verify -rawin -inkey {{.SIGNING_KEYS_PEM_DIR}}/$i.pem -pubin -sigfile node-{{.VERSION}}-darwin-arm64.dgst.sig.$i -in node-{{.VERSION}}-darwin-arm64.dgst | ||||
|             echo "node-{{.VERSION}}-linux-amd64" | ||||
|             openssl pkeyutl -verify -rawin -inkey {{.SIGNING_KEYS_PEM_DIR}}/$i.pem -pubin -sigfile node-{{.VERSION}}-linux-amd64.dgst.sig.$i -in node-{{.VERSION}}-linux-amd64.dgst | ||||
|             echo "node-{{.VERSION}}-linux-arm64" | ||||
|             openssl pkeyutl -verify -rawin -inkey {{.SIGNING_KEYS_PEM_DIR}}/$i.pem -pubin -sigfile node-{{.VERSION}}-linux-arm64.dgst.sig.$i -in node-{{.VERSION}}-linux-arm64.dgst | ||||
|           else | ||||
|             if [ -f node-{{.VERSION}}-linux-arm64.dgst.sig.$i ] | ||||
|             then | ||||
|               echo "$i is missing signatures" | ||||
|             else | ||||
|               if [ -f node-{{.VERSION}}-linux-amd64.dgst.sig.$i ] | ||||
|               then | ||||
|                 echo "$i is missing signatures" | ||||
|               fi | ||||
|             fi | ||||
|           fi | ||||
|         done | ||||
|     silent: true | ||||
| 
 | ||||
|   clean: | ||||
|     desc: Remove temporary files, docker containers and image. | ||||
|     dir: ../node | ||||
|     preconditions: | ||||
|       - sh: 'test -z "$QUILIBRIUM_DOCKER_CONTAINER"' | ||||
|         msg: 'This command cannot be run inside the container' | ||||
|     cmds: | ||||
|       - rm -f node-tmp-* | ||||
|       - docker container rm -f signers | ||||
|       - docker image rm -f {{.QUILIBRIUM_SIGNERS_IMAGE_NAME}} | ||||
							
								
								
									
										4
									
								
								signers/pems/1.pem
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								signers/pems/1.pem
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,4 @@ | ||||
| -----BEGIN PUBLIC KEY----- | ||||
| MEMwBQYDK2VxAzoAsSFNp/NV9antt7zCPUA733ifBwzKENsrTK3CLy2DevtlCUSF | ||||
| PjXV9C7zxBBbgCsUS0B31dMlPkEA | ||||
| -----END PUBLIC KEY----- | ||||
							
								
								
									
										4
									
								
								signers/pems/10.pem
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								signers/pems/10.pem
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,4 @@ | ||||
| -----BEGIN PUBLIC KEY----- | ||||
| MEMwBQYDK2VxAzoARQdib3Fk59jDBMB/+NLiPBE/4QiyIdLmBnL00HdQNFgV4rSz | ||||
| zD3000Zr8vZpw1wxcuBlEScGEqsA | ||||
| -----END PUBLIC KEY----- | ||||
							
								
								
									
										4
									
								
								signers/pems/11.pem
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								signers/pems/11.pem
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,4 @@ | ||||
| -----BEGIN PUBLIC KEY----- | ||||
| MEMwBQYDK2VxAzoAT7JTc0Xka+PV+WNAwUQQB1AXAt1b+vbb9pQ7vvzsqPsrlOwK | ||||
| ihovSYUPvh0QJEiJpPQKv6ngyeAA | ||||
| -----END PUBLIC KEY----- | ||||
							
								
								
									
										4
									
								
								signers/pems/12.pem
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								signers/pems/12.pem
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,4 @@ | ||||
| -----BEGIN PUBLIC KEY----- | ||||
| MEMwBQYDK2VxAzoAV74oYfrw//y/0SLIXHcBDc6PITAwkFeBuFtvNF2RLHtazhd5 | ||||
| fZgQiZ37jRPnyDaVlXQHJas91b0A | ||||
| -----END PUBLIC KEY----- | ||||
							
								
								
									
										4
									
								
								signers/pems/13.pem
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								signers/pems/13.pem
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,4 @@ | ||||
| -----BEGIN PUBLIC KEY----- | ||||
| MEMwBQYDK2VxAzoAYWKL7vj2lkRm/QeNaiuQo5erB3ehS5coIn/RnzZ1L5RRsajX | ||||
| gHQKC5qM499ficp7n/F96SdKJwmA | ||||
| -----END PUBLIC KEY----- | ||||
							
								
								
									
										4
									
								
								signers/pems/14.pem
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								signers/pems/14.pem
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,4 @@ | ||||
| -----BEGIN PUBLIC KEY----- | ||||
| MEMwBQYDK2VxAzoAVUevxxsCgh4vW/3TD74TdMOFOJje/yChtcxym46BZw+7udHp | ||||
| F/hdFT6ksmu/b5xUbcG2S5kWYI2A | ||||
| -----END PUBLIC KEY----- | ||||
							
								
								
									
										4
									
								
								signers/pems/15.pem
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								signers/pems/15.pem
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,4 @@ | ||||
| -----BEGIN PUBLIC KEY----- | ||||
| MEMwBQYDK2VxAzoAgdY6RfBoYp9WjegS8YvlgHv+goqDAJfwnPAjMNas0142B0Ad | ||||
| 8/2giwO2jqbmiv1QayNQaxHoeg+A | ||||
| -----END PUBLIC KEY----- | ||||
							
								
								
									
										4
									
								
								signers/pems/2.pem
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								signers/pems/2.pem
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,4 @@ | ||||
| -----BEGIN PUBLIC KEY----- | ||||
| MEMwBQYDK2VxAzoA3kz+cIMQS/4y8NQIL6AgBGTYsQgEqBFlPu3aN278rWTdIi8P | ||||
| DOsLiuWKvoMNen4/Oy151pExjaoA | ||||
| -----END PUBLIC KEY----- | ||||
							
								
								
									
										4
									
								
								signers/pems/3.pem
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								signers/pems/3.pem
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,4 @@ | ||||
| -----BEGIN PUBLIC KEY----- | ||||
| MEMwBQYDK2VxAzoAVAI3o14SSILWtk57tXGCc/ozjlU/dyt3/pBXDkUwN2KzQTG9 | ||||
| y2wLnyz545PZx+D1Ru6rC8u9iBaA | ||||
| -----END PUBLIC KEY----- | ||||
							
								
								
									
										4
									
								
								signers/pems/4.pem
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								signers/pems/4.pem
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,4 @@ | ||||
| -----BEGIN PUBLIC KEY----- | ||||
| MEMwBQYDK2VxAzoA++QWbjf5P5DS6/BjBTFa4Rs35QHQlZb4veEbqdNDA0+8qA8l | ||||
| IgWqL1gqUSpyrSk983G6pYLaBykA | ||||
| -----END PUBLIC KEY----- | ||||
							
								
								
									
										4
									
								
								signers/pems/5.pem
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								signers/pems/5.pem
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,4 @@ | ||||
| -----BEGIN PUBLIC KEY----- | ||||
| MEMwBQYDK2VxAzoAQWBXLkk+G/FcROBVsRv3UjDHbH0sZ7SAZncKsD39XtNMl7mk | ||||
| MewYV4yDoN+SULg2LDgGhlDosBQA | ||||
| -----END PUBLIC KEY----- | ||||
							
								
								
									
										4
									
								
								signers/pems/6.pem
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								signers/pems/6.pem
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,4 @@ | ||||
| -----BEGIN PUBLIC KEY----- | ||||
| MEMwBQYDK2VxAzoARRcLYmiEuF1hrhCfKqmw4ezBixgVCEMepjCPOGnyra5J2peZ | ||||
| oKWU6qTvOtSSUY+xcp3s1EFp1A0A | ||||
| -----END PUBLIC KEY----- | ||||
							
								
								
									
										4
									
								
								signers/pems/7.pem
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								signers/pems/7.pem
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,4 @@ | ||||
| -----BEGIN PUBLIC KEY----- | ||||
| MEMwBQYDK2VxAzoAks2O5TYvOuJ0p1q5RxAk28FEv/RB7Yr30ZdQrFEv9R5A5/ew | ||||
| Hk+WtjRd1Yh4VllIw+tSxT8lC1CA | ||||
| -----END PUBLIC KEY----- | ||||
							
								
								
									
										4
									
								
								signers/pems/8.pem
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								signers/pems/8.pem
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,4 @@ | ||||
| -----BEGIN PUBLIC KEY----- | ||||
| MEMwBQYDK2VxAzoAABpMv85dmut+IGZbDSNnIbIooy8LruYv+nf0W4Lsr1d+iji3 | ||||
| 75H899LS0rUE8IVGE5jTCySrsdcA | ||||
| -----END PUBLIC KEY----- | ||||
							
								
								
									
										4
									
								
								signers/pems/9.pem
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								signers/pems/9.pem
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,4 @@ | ||||
| -----BEGIN PUBLIC KEY----- | ||||
| MEMwBQYDK2VxAzoAZbg1BxcxxueFuy0QfH2F2KU315xDXD9Cuy+HAn+T+FjXs3xZ | ||||
| jO8mel20bjRfem+BlptGVoZlfR4A | ||||
| -----END PUBLIC KEY----- | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Cassandra Heart
						Cassandra Heart