mirror of
				https://source.quilibrium.com/quilibrium/ceremonyclient.git
				synced 2025-11-04 15:57:58 +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,16 +357,19 @@ func initDHT(
 | 
			
		||||
		)
 | 
			
		||||
 | 
			
		||||
		defaultBootstrapPeers := append([]string{}, p2pConfig.BootstrapPeers...)
 | 
			
		||||
		for _, peer := range config.BootstrapPeers {
 | 
			
		||||
			found := false
 | 
			
		||||
			for _, existing := range defaultBootstrapPeers {
 | 
			
		||||
				if existing == peer {
 | 
			
		||||
					found = true
 | 
			
		||||
					break
 | 
			
		||||
 | 
			
		||||
		if p2pConfig.Network == 0 {
 | 
			
		||||
			for _, peer := range config.BootstrapPeers {
 | 
			
		||||
				found := false
 | 
			
		||||
				for _, existing := range defaultBootstrapPeers {
 | 
			
		||||
					if existing == peer {
 | 
			
		||||
						found = true
 | 
			
		||||
						break
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
				if !found {
 | 
			
		||||
					defaultBootstrapPeers = append(defaultBootstrapPeers, peer)
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			if !found {
 | 
			
		||||
				defaultBootstrapPeers = append(defaultBootstrapPeers, peer)
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
@ -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