From 2bbd1e0690d10e17aa2142e66ab1b7ff40d47ad9 Mon Sep 17 00:00:00 2001 From: Cassandra Heart <7929478+CassOnMars@users.noreply.github.com> Date: Sat, 25 May 2024 00:22:50 -0500 Subject: [PATCH] v1.4.18 (#193) * Remove bootstrap peer (#189) * Change bootstrap servers to DHT-only peers (#187) * support voucher file-based claims (#183) * Change bootstrap servers to DHT-only peers Changing my bootstrap servers to DHT-only peers with somewhat lower specs. One of the new ones is in the US and the other one is in Switzerland. Both use reliable providers and have 10Gbps network interfaces. --------- Co-authored-by: Cassandra Heart <7929478+CassOnMars@users.noreply.github.com> * Don't run self-test in DHT-only mode (#186) * support voucher file-based claims (#183) * Don't run self-test in DHT-only mode The node tries to create a self-test when ran with the `-dht-only` flag, but it doesn't load the KZG ceremony data in DHT-only mode which leads to a crash. Don't run self-test when the `-dht-only` flag is set. I tested by starting a node locally with and without existing self-test and with the `-dht-only` flag. --------- Co-authored-by: Cassandra Heart <7929478+CassOnMars@users.noreply.github.com> * Embed json files in binary (#182) * Embed ceremony.json in binary * Embed retroactive_peers.json in binary * Signers build and verification tasks (#181) * add signers specific Taskfile * add verify tasks * move signer task under signer folder * create docker image specific for signers * map current user into docker image and container * ignore node-tmp-* * add verify:build:internal * prevent tasks with docker commands from being run inside a container * rename *:internal to *:container * add README.md * add pem files to git * Updating Q Guide link (#173) * Update README.md Updated link to Quilibrium guide to new website * Update README.md * feat: network switching and namespaced announce strings/bitmasks (#190) * feat: network switching and namespaced announce strings/bitmasks * bump version name and logo * feat: mini pomw proofs as part of peer manifest (#191) * shift default config directory under current folder (#176) * feat: signature check (#192) * feat: signature check * adjust docker command so it doesn't invoke sigcheck * remove old version * add binaries and digests * fix bug, revert build * shasum has weird byte at end * proper binaries and digests * Signatory #13 added * Signatory #3 added * Signer 4 (#194) * Signatory #5 added * Signatory #9 added (#195) * Signatory #1 added * added sig.6 files (#196) * Signatories #8 and #16 added * Signatory #12 added * Add signature (#197) * reset build for v1.4.18 after testnet bug * updated build, resigned by #13 * Signatory #16 added * added sig.6 files (#198) * Signatory #8 added * Signatory #17 added * Signatory #1 added * Signatory #7 added * Signatory #4 added * Signatory #14 added * remove binaries, ready to ship --------- Co-authored-by: littleblackcloud <163544315+littleblackcloud@users.noreply.github.com> Co-authored-by: Agost Biro <5764438+agostbiro@users.noreply.github.com> Co-authored-by: Marius Scurtescu Co-authored-by: Demipoet <161999657+demipoet@users.noreply.github.com> Co-authored-by: 0xOzgur <29779769+0xOzgur@users.noreply.github.com> Co-authored-by: Freekers <1370857+Freekers@users.noreply.github.com> --- .gitignore | 3 + README.md | 4 +- client/cmd/root.go | 4 +- docker-compose.yml | 1 + node/app/db_console.go | 44 +-- node/app/node.go | 6 +- node/app/wire_gen.go | 10 +- node/config/config.go | 7 +- node/config/p2p.go | 1 + node/config/version.go | 6 +- node/consensus/master/broadcast_messaging.go | 59 ++++ node/consensus/master/consensus_frames.go | 2 +- .../master/master_clock_consensus_engine.go | 31 +- node/crypto/frame_prover.go | 11 + node/{ => crypto/kzg}/ceremony.json | 0 node/crypto/kzg/kzg.go | 9 +- node/crypto/kzg/kzg_test.go | 2 +- node/crypto/kzg_inclusion_prover_test.go | 2 +- node/crypto/wesolowski_frame_prover.go | 74 +++++ node/crypto/wesolowski_frame_prover_test.go | 8 + .../ceremony/ceremony_execution_engine.go | 15 +- .../ceremony}/retroactive_peers.json | 0 node/main.go | 162 ++++++++-- node/node-1.4.17-darwin-arm64.dgst | 1 - node/node-1.4.17-darwin-arm64.dgst.sig.1 | Bin 114 -> 0 bytes node/node-1.4.17-darwin-arm64.dgst.sig.11 | Bin 114 -> 0 bytes node/node-1.4.17-darwin-arm64.dgst.sig.12 | Bin 114 -> 0 bytes node/node-1.4.17-darwin-arm64.dgst.sig.13 | Bin 114 -> 0 bytes node/node-1.4.17-darwin-arm64.dgst.sig.14 | Bin 114 -> 0 bytes node/node-1.4.17-darwin-arm64.dgst.sig.15 | Bin 114 -> 0 bytes node/node-1.4.17-darwin-arm64.dgst.sig.16 | Bin 114 -> 0 bytes node/node-1.4.17-darwin-arm64.dgst.sig.3 | Bin 114 -> 0 bytes node/node-1.4.17-darwin-arm64.dgst.sig.4 | Bin 114 -> 0 bytes node/node-1.4.17-darwin-arm64.dgst.sig.6 | Bin 114 -> 0 bytes node/node-1.4.17-darwin-arm64.dgst.sig.8 | Bin 114 -> 0 bytes node/node-1.4.17-linux-amd64.dgst | 1 - node/node-1.4.17-linux-amd64.dgst.sig.1 | Bin 114 -> 0 bytes node/node-1.4.17-linux-amd64.dgst.sig.11 | Bin 114 -> 0 bytes node/node-1.4.17-linux-amd64.dgst.sig.12 | Bin 114 -> 0 bytes node/node-1.4.17-linux-amd64.dgst.sig.13 | Bin 114 -> 0 bytes node/node-1.4.17-linux-amd64.dgst.sig.14 | Bin 114 -> 0 bytes node/node-1.4.17-linux-amd64.dgst.sig.15 | Bin 114 -> 0 bytes node/node-1.4.17-linux-amd64.dgst.sig.16 | Bin 114 -> 0 bytes node/node-1.4.17-linux-amd64.dgst.sig.3 | Bin 114 -> 0 bytes node/node-1.4.17-linux-amd64.dgst.sig.4 | Bin 114 -> 0 bytes node/node-1.4.17-linux-amd64.dgst.sig.6 | Bin 114 -> 0 bytes node/node-1.4.17-linux-amd64.dgst.sig.8 | Bin 114 -> 0 bytes node/node-1.4.17-linux-arm64.dgst | 1 - node/node-1.4.17-linux-arm64.dgst.sig.1 | Bin 114 -> 0 bytes node/node-1.4.17-linux-arm64.dgst.sig.11 | Bin 114 -> 0 bytes node/node-1.4.17-linux-arm64.dgst.sig.12 | Bin 114 -> 0 bytes node/node-1.4.17-linux-arm64.dgst.sig.13 | Bin 114 -> 0 bytes node/node-1.4.17-linux-arm64.dgst.sig.14 | Bin 114 -> 0 bytes node/node-1.4.17-linux-arm64.dgst.sig.15 | Bin 114 -> 0 bytes node/node-1.4.17-linux-arm64.dgst.sig.16 | Bin 114 -> 0 bytes node/node-1.4.17-linux-arm64.dgst.sig.3 | Bin 114 -> 0 bytes node/node-1.4.17-linux-arm64.dgst.sig.4 | Bin 114 -> 0 bytes node/node-1.4.17-linux-arm64.dgst.sig.6 | Bin 114 -> 0 bytes node/node-1.4.17-linux-arm64.dgst.sig.8 | Bin 114 -> 0 bytes node/node-1.4.18-darwin-arm64.dgst | 1 + node/node-1.4.18-darwin-arm64.dgst.sig.1 | Bin 0 -> 114 bytes node/node-1.4.18-darwin-arm64.dgst.sig.13 | Bin 0 -> 114 bytes node/node-1.4.18-darwin-arm64.dgst.sig.14 | Bin 0 -> 114 bytes node/node-1.4.18-darwin-arm64.dgst.sig.16 | Bin 0 -> 114 bytes node/node-1.4.18-darwin-arm64.dgst.sig.17 | Bin 0 -> 114 bytes node/node-1.4.18-darwin-arm64.dgst.sig.4 | Bin 0 -> 114 bytes node/node-1.4.18-darwin-arm64.dgst.sig.6 | Bin 0 -> 114 bytes node/node-1.4.18-darwin-arm64.dgst.sig.7 | Bin 0 -> 114 bytes node/node-1.4.18-darwin-arm64.dgst.sig.8 | Bin 0 -> 114 bytes node/node-1.4.18-linux-amd64.dgst | 1 + node/node-1.4.18-linux-amd64.dgst.sig.1 | Bin 0 -> 114 bytes node/node-1.4.18-linux-amd64.dgst.sig.13 | Bin 0 -> 114 bytes node/node-1.4.18-linux-amd64.dgst.sig.14 | Bin 0 -> 114 bytes node/node-1.4.18-linux-amd64.dgst.sig.16 | Bin 0 -> 114 bytes node/node-1.4.18-linux-amd64.dgst.sig.17 | Bin 0 -> 114 bytes node/node-1.4.18-linux-amd64.dgst.sig.4 | Bin 0 -> 114 bytes node/node-1.4.18-linux-amd64.dgst.sig.6 | Bin 0 -> 114 bytes node/node-1.4.18-linux-amd64.dgst.sig.7 | Bin 0 -> 114 bytes node/node-1.4.18-linux-amd64.dgst.sig.8 | Bin 0 -> 114 bytes node/node-1.4.18-linux-arm64.dgst | 1 + node/node-1.4.18-linux-arm64.dgst.sig.1 | Bin 0 -> 114 bytes node/node-1.4.18-linux-arm64.dgst.sig.13 | Bin 0 -> 114 bytes node/node-1.4.18-linux-arm64.dgst.sig.14 | Bin 0 -> 114 bytes node/node-1.4.18-linux-arm64.dgst.sig.16 | Bin 0 -> 114 bytes node/node-1.4.18-linux-arm64.dgst.sig.17 | Bin 0 -> 114 bytes node/node-1.4.18-linux-arm64.dgst.sig.4 | Bin 0 -> 114 bytes node/node-1.4.18-linux-arm64.dgst.sig.6 | Bin 0 -> 114 bytes node/node-1.4.18-linux-arm64.dgst.sig.7 | Bin 0 -> 114 bytes node/node-1.4.18-linux-arm64.dgst.sig.8 | Bin 0 -> 114 bytes node/p2p/blossomsub.go | 75 +++-- node/p2p/peer_info_manager.go | 1 + node/poor_mans_cd.sh | 60 ---- node/protobufs/node.pb.go | 297 ++++++++++-------- node/protobufs/node.proto | 4 + signers/.env.example | 7 + signers/Dockerfile | 18 ++ signers/README.md | 20 ++ signers/Taskfile.yaml | 202 ++++++++++++ signers/pems/1.pem | 4 + signers/pems/10.pem | 4 + signers/pems/11.pem | 4 + signers/pems/12.pem | 4 + signers/pems/13.pem | 4 + signers/pems/14.pem | 4 + signers/pems/15.pem | 4 + signers/pems/2.pem | 4 + signers/pems/3.pem | 4 + signers/pems/4.pem | 4 + signers/pems/5.pem | 4 + signers/pems/6.pem | 4 + signers/pems/7.pem | 4 + signers/pems/8.pem | 4 + signers/pems/9.pem | 4 + 113 files changed, 903 insertions(+), 308 deletions(-) rename node/{ => crypto/kzg}/ceremony.json (100%) rename node/{ => execution/intrinsics/ceremony}/retroactive_peers.json (100%) delete mode 100644 node/node-1.4.17-darwin-arm64.dgst delete mode 100644 node/node-1.4.17-darwin-arm64.dgst.sig.1 delete mode 100644 node/node-1.4.17-darwin-arm64.dgst.sig.11 delete mode 100644 node/node-1.4.17-darwin-arm64.dgst.sig.12 delete mode 100644 node/node-1.4.17-darwin-arm64.dgst.sig.13 delete mode 100644 node/node-1.4.17-darwin-arm64.dgst.sig.14 delete mode 100644 node/node-1.4.17-darwin-arm64.dgst.sig.15 delete mode 100644 node/node-1.4.17-darwin-arm64.dgst.sig.16 delete mode 100644 node/node-1.4.17-darwin-arm64.dgst.sig.3 delete mode 100644 node/node-1.4.17-darwin-arm64.dgst.sig.4 delete mode 100644 node/node-1.4.17-darwin-arm64.dgst.sig.6 delete mode 100644 node/node-1.4.17-darwin-arm64.dgst.sig.8 delete mode 100644 node/node-1.4.17-linux-amd64.dgst delete mode 100644 node/node-1.4.17-linux-amd64.dgst.sig.1 delete mode 100644 node/node-1.4.17-linux-amd64.dgst.sig.11 delete mode 100644 node/node-1.4.17-linux-amd64.dgst.sig.12 delete mode 100644 node/node-1.4.17-linux-amd64.dgst.sig.13 delete mode 100644 node/node-1.4.17-linux-amd64.dgst.sig.14 delete mode 100644 node/node-1.4.17-linux-amd64.dgst.sig.15 delete mode 100644 node/node-1.4.17-linux-amd64.dgst.sig.16 delete mode 100644 node/node-1.4.17-linux-amd64.dgst.sig.3 delete mode 100644 node/node-1.4.17-linux-amd64.dgst.sig.4 delete mode 100644 node/node-1.4.17-linux-amd64.dgst.sig.6 delete mode 100644 node/node-1.4.17-linux-amd64.dgst.sig.8 delete mode 100644 node/node-1.4.17-linux-arm64.dgst delete mode 100644 node/node-1.4.17-linux-arm64.dgst.sig.1 delete mode 100644 node/node-1.4.17-linux-arm64.dgst.sig.11 delete mode 100644 node/node-1.4.17-linux-arm64.dgst.sig.12 delete mode 100644 node/node-1.4.17-linux-arm64.dgst.sig.13 delete mode 100644 node/node-1.4.17-linux-arm64.dgst.sig.14 delete mode 100644 node/node-1.4.17-linux-arm64.dgst.sig.15 delete mode 100644 node/node-1.4.17-linux-arm64.dgst.sig.16 delete mode 100644 node/node-1.4.17-linux-arm64.dgst.sig.3 delete mode 100644 node/node-1.4.17-linux-arm64.dgst.sig.4 delete mode 100644 node/node-1.4.17-linux-arm64.dgst.sig.6 delete mode 100644 node/node-1.4.17-linux-arm64.dgst.sig.8 create mode 100644 node/node-1.4.18-darwin-arm64.dgst create mode 100644 node/node-1.4.18-darwin-arm64.dgst.sig.1 create mode 100644 node/node-1.4.18-darwin-arm64.dgst.sig.13 create mode 100644 node/node-1.4.18-darwin-arm64.dgst.sig.14 create mode 100644 node/node-1.4.18-darwin-arm64.dgst.sig.16 create mode 100644 node/node-1.4.18-darwin-arm64.dgst.sig.17 create mode 100644 node/node-1.4.18-darwin-arm64.dgst.sig.4 create mode 100644 node/node-1.4.18-darwin-arm64.dgst.sig.6 create mode 100644 node/node-1.4.18-darwin-arm64.dgst.sig.7 create mode 100644 node/node-1.4.18-darwin-arm64.dgst.sig.8 create mode 100644 node/node-1.4.18-linux-amd64.dgst create mode 100644 node/node-1.4.18-linux-amd64.dgst.sig.1 create mode 100644 node/node-1.4.18-linux-amd64.dgst.sig.13 create mode 100644 node/node-1.4.18-linux-amd64.dgst.sig.14 create mode 100644 node/node-1.4.18-linux-amd64.dgst.sig.16 create mode 100644 node/node-1.4.18-linux-amd64.dgst.sig.17 create mode 100644 node/node-1.4.18-linux-amd64.dgst.sig.4 create mode 100644 node/node-1.4.18-linux-amd64.dgst.sig.6 create mode 100644 node/node-1.4.18-linux-amd64.dgst.sig.7 create mode 100644 node/node-1.4.18-linux-amd64.dgst.sig.8 create mode 100644 node/node-1.4.18-linux-arm64.dgst create mode 100644 node/node-1.4.18-linux-arm64.dgst.sig.1 create mode 100644 node/node-1.4.18-linux-arm64.dgst.sig.13 create mode 100644 node/node-1.4.18-linux-arm64.dgst.sig.14 create mode 100644 node/node-1.4.18-linux-arm64.dgst.sig.16 create mode 100644 node/node-1.4.18-linux-arm64.dgst.sig.17 create mode 100644 node/node-1.4.18-linux-arm64.dgst.sig.4 create mode 100644 node/node-1.4.18-linux-arm64.dgst.sig.6 create mode 100644 node/node-1.4.18-linux-arm64.dgst.sig.7 create mode 100644 node/node-1.4.18-linux-arm64.dgst.sig.8 delete mode 100755 node/poor_mans_cd.sh create mode 100644 signers/.env.example create mode 100644 signers/Dockerfile create mode 100644 signers/README.md create mode 100644 signers/Taskfile.yaml create mode 100644 signers/pems/1.pem create mode 100644 signers/pems/10.pem create mode 100644 signers/pems/11.pem create mode 100644 signers/pems/12.pem create mode 100644 signers/pems/13.pem create mode 100644 signers/pems/14.pem create mode 100644 signers/pems/15.pem create mode 100644 signers/pems/2.pem create mode 100644 signers/pems/3.pem create mode 100644 signers/pems/4.pem create mode 100644 signers/pems/5.pem create mode 100644 signers/pems/6.pem create mode 100644 signers/pems/7.pem create mode 100644 signers/pems/8.pem create mode 100644 signers/pems/9.pem diff --git a/.gitignore b/.gitignore index 5255caa..2768a9c 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,6 @@ ceremony-client .DS_Store *.mprof .env +.env.signers +.task +node-tmp-* diff --git a/README.md b/README.md index 83b2b15..88e24b9 100644 --- a/README.md +++ b/README.md @@ -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
< ### 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)
+- A detailed beginners' guide for how to setup a Quilibrium Node, created by [@demipoet](https://www.github.com/demipoet) - [link](https://quilibrium.guide/)
## Pull Requests diff --git a/client/cmd/root.go b/client/cmd/root.go index accd8ee..bc272e4 100644 --- a/client/cmd/root.go +++ b/client/cmd/root.go @@ -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/)", ) } diff --git a/docker-compose.yml b/docker-compose.yml index 1d93017..10d6265 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -7,6 +7,7 @@ services: node: image: ${QUILIBRIUM_IMAGE_NAME:-quilibrium} restart: unless-stopped + command: ["--signature-check=false"] deploy: resources: limits: diff --git a/node/app/db_console.go b/node/app/db_console.go index c82b041..f1bdbdc 100644 --- a/node/app/db_console.go +++ b/node/app/db_console.go @@ -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 } diff --git a/node/app/node.go b/node/app/node.go index e743181..d6e172e 100644 --- a/node/app/node.go +++ b/node/app/node.go @@ -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, diff --git a/node/app/wire_gen.go b/node/app/wire_gen.go index 02e3180..232e93d 100644 --- a/node/app/wire_gen.go +++ b/node/app/wire_gen.go @@ -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 } diff --git a/node/config/config.go b/node/config/config.go index 749401f..414693e 100644 --- a/node/config/config.go +++ b/node/config/config.go @@ -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", diff --git a/node/config/p2p.go b/node/config/p2p.go index 41e7d86..2493c58 100644 --- a/node/config/p2p.go +++ b/node/config/p2p.go @@ -37,4 +37,5 @@ type P2PConfig struct { PeerPrivKey string `yaml:"peerPrivKey"` TraceLogFile string `yaml:"traceLogFile"` MinPeers int `yaml:"minPeers"` + Network uint8 `yaml:"network"` } diff --git a/node/config/version.go b/node/config/version.go index 874a5e8..c5b5200 100644 --- a/node/config/version.go +++ b/node/config/version.go @@ -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 { diff --git a/node/consensus/master/broadcast_messaging.go b/node/consensus/master/broadcast_messaging.go index ea5c998..b0339ee 100644 --- a/node/consensus/master/broadcast_messaging.go +++ b/node/consensus/master/broadcast_messaging.go @@ -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 } diff --git a/node/consensus/master/consensus_frames.go b/node/consensus/master/consensus_frames.go index c0d127d..4243b37 100644 --- a/node/consensus/master/consensus_frames.go +++ b/node/consensus/master/consensus_frames.go @@ -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 { diff --git a/node/consensus/master/master_clock_consensus_engine.go b/node/consensus/master/master_clock_consensus_engine.go index d8c6ae8..b82f4bb 100644 --- a/node/consensus/master/master_clock_consensus_engine.go +++ b/node/consensus/master/master_clock_consensus_engine.go @@ -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 { diff --git a/node/crypto/frame_prover.go b/node/crypto/frame_prover.go index ea57e95..71a2e07 100644 --- a/node/crypto/frame_prover.go +++ b/node/crypto/frame_prover.go @@ -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 } diff --git a/node/ceremony.json b/node/crypto/kzg/ceremony.json similarity index 100% rename from node/ceremony.json rename to node/crypto/kzg/ceremony.json diff --git a/node/crypto/kzg/kzg.go b/node/crypto/kzg/kzg.go index 9da890a..5a3c0b2 100644 --- a/node/crypto/kzg/kzg.go +++ b/node/crypto/kzg/kzg.go @@ -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{} diff --git a/node/crypto/kzg/kzg_test.go b/node/crypto/kzg/kzg_test.go index 12eefc2..946e6db 100644 --- a/node/crypto/kzg/kzg_test.go +++ b/node/crypto/kzg/kzg_test.go @@ -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) } diff --git a/node/crypto/kzg_inclusion_prover_test.go b/node/crypto/kzg_inclusion_prover_test.go index c869173..2fe608b 100644 --- a/node/crypto/kzg_inclusion_prover_test.go +++ b/node/crypto/kzg_inclusion_prover_test.go @@ -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) diff --git a/node/crypto/wesolowski_frame_prover.go b/node/crypto/wesolowski_frame_prover.go index 868471c..6b04325 100644 --- a/node/crypto/wesolowski_frame_prover.go +++ b/node/crypto/wesolowski_frame_prover.go @@ -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 +} diff --git a/node/crypto/wesolowski_frame_prover_test.go b/node/crypto/wesolowski_frame_prover_test.go index 8d35e68..78064cb 100644 --- a/node/crypto/wesolowski_frame_prover_test.go +++ b/node/crypto/wesolowski_frame_prover_test.go @@ -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)) +} diff --git a/node/execution/intrinsics/ceremony/ceremony_execution_engine.go b/node/execution/intrinsics/ceremony/ceremony_execution_engine.go index 33fcb60..9ff71c1 100644 --- a/node/execution/intrinsics/ceremony/ceremony_execution_engine.go +++ b/node/execution/intrinsics/ceremony/ceremony_execution_engine.go @@ -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) } diff --git a/node/retroactive_peers.json b/node/execution/intrinsics/ceremony/retroactive_peers.json similarity index 100% rename from node/retroactive_peers.json rename to node/execution/intrinsics/ceremony/retroactive_peers.json diff --git a/node/main.go b/node/main.go index 4f90cf1..3d4362e 100644 --- a/node/main.go +++ b/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") } diff --git a/node/node-1.4.17-darwin-arm64.dgst b/node/node-1.4.17-darwin-arm64.dgst deleted file mode 100644 index 6ff184c..0000000 --- a/node/node-1.4.17-darwin-arm64.dgst +++ /dev/null @@ -1 +0,0 @@ -SHA3-256(node-1.4.17-darwin-arm64.bin)= c9eee4d66e1a98a9d63dbe54cbe043e1d7fc4014bcf7e78e46d56b33b4b7c9da diff --git a/node/node-1.4.17-darwin-arm64.dgst.sig.1 b/node/node-1.4.17-darwin-arm64.dgst.sig.1 deleted file mode 100644 index 69190729090c7864db8e4cd32874130d4b055858..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 114 zcmV-&0FD0u3@v~7Y8gF|H#KarxZV+zR6iTM@T`52c8F)9RcTn6midJk6RYQ_ZTGkvg2}xC>Sw7ot%W5ROQ+7sJQFmq{i(&#m1I< U=dOhhqGeNke>F|u+=?$306+&dDgXcg diff --git a/node/node-1.4.17-darwin-arm64.dgst.sig.11 b/node/node-1.4.17-darwin-arm64.dgst.sig.11 deleted file mode 100644 index e210296339c6725bd4244898ac708ffc7cff7126..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 114 zcmV-&0FD3nIb|oQbhhvI-M0(31?ajObkhiZ?d^-f4=dkCizdu0%=+=lAzJE~fNWCj zoey}aOJx>ZLvsp%B(<2h6YLh`FMR|U-rk15nISbiha5^)3vpyN$OPn>1=kRbQkm4a UzWPr!uVg#MWp+DOE)|m=u6X2%BRbufi)Hs0A(dI@Bjb+ diff --git a/node/node-1.4.17-darwin-arm64.dgst.sig.13 b/node/node-1.4.17-darwin-arm64.dgst.sig.13 deleted file mode 100644 index a123f5b2aef3a210b3a300099509595be56e752b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 114 zcmV-&0FD14t{nAaxNCuY%o>uT6x-j?3iAS=w>ODi-njOQ=EAP)Md1mcE?UNd-col UxxkM}V_X+}9MdLu{gPrN0O(&kJpcdz diff --git a/node/node-1.4.17-darwin-arm64.dgst.sig.15 b/node/node-1.4.17-darwin-arm64.dgst.sig.15 deleted file mode 100644 index 92e8a15ab2f1da7aa8f1560173a855e18aa272bb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 114 zcmV-&0FD3q>PkJ7y#wTplGvG1b@WCF+JnTJkb~1&2yGe9k~P6NK21JEXaj;5>d~o@$p80s&=kDcY0S#(lV2eg94`nT Uc>3ttm557J(p4>01eSR8~^|S diff --git a/node/node-1.4.17-darwin-arm64.dgst.sig.3 b/node/node-1.4.17-darwin-arm64.dgst.sig.3 deleted file mode 100644 index 42363ab0cd93426c758babbf6ad8728f1676f718..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 114 zcmV-&0FD28CF?u`RNh!l2N=Q?w49G2!4HP6Y5WFmCOmaWUf9NG$7{AvKJnQC$&7cS zB#Qf$4k(|ZBI|g7_HH+(OsQC${M-JDKQG{_rt7Y+aK$j`r1lK7K^_#ew4sp98=KyR U?rMNDAiiN`2Ij;59x6T}0A(OJZ2$lO diff --git a/node/node-1.4.17-darwin-arm64.dgst.sig.4 b/node/node-1.4.17-darwin-arm64.dgst.sig.4 deleted file mode 100644 index 6337ff168452bd15c32033c24c37637da4b46427..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 114 zcmV-&0FD0{Vyw6_Fh}`hnWGbrfkJwv>EfoQkV}2B-!?1EUM(BQN=3Mzl_*Qp^AgtW z)-wtyxdRhMJW%$4VH6dA^2(h9O+dUYRJkzZB)t)eT= UR8U%ovSe*RedW6&gDsy70N9c;XaE2J diff --git a/node/node-1.4.17-darwin-arm64.dgst.sig.6 b/node/node-1.4.17-darwin-arm64.dgst.sig.6 deleted file mode 100644 index 8789ad1f3ef8075a0418f9b598831b6958b0d0bc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 114 zcmV-&0FD2yw9H5b`j=1W34sdF%8(Actofh2ay7ybd*_NQIW8A+XkBcjp&+$r14(uNjJ3F(h#j+^rFtj;JJdQ4BB1`utY62m$b|C zpHA33y#g;5g^A>V|Kpuxq=WCiAAC~bLic73$^8 z&&BgT)5?I`U2v`dAh@Jkq(`D3vB~r|Y97vDUG!$34wk+;N#c4qI5S0_^KFO7it}D- U%F4)Ek#k@Yqg2H@I?0y-0QfOEIsgCw diff --git a/node/node-1.4.17-linux-amd64.dgst.sig.13 b/node/node-1.4.17-linux-amd64.dgst.sig.13 deleted file mode 100644 index 86c462fb6807250a113523232f41e8ef498a86f5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 114 zcmV-&0FD0_jj+JldycB-A^&e&aFiJV-$2 zSRV4eNp5&`**0$g-vcan3v_gA<>dnCvDk&a!T1zvbJr^apnvrBpTRy=CeLDyx1WYX UveH4O$F*~gS=RC~nsQ?*0ANTv5C8xG diff --git a/node/node-1.4.17-linux-amd64.dgst.sig.14 b/node/node-1.4.17-linux-amd64.dgst.sig.14 deleted file mode 100644 index a5ad292a6b7aecf3823a8fd721309fd642866efe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 114 zcmV-&0FD1!22YEK`;e0-jt4>-N;UlY{lB&s1yNkd+s9lGPks-XAf>k-9iWw?e3+pF z^Z%zpGzrBe=nZ**FwIx(sc4}plehFXyhY_Qb4YyOsWKzofq>1iH_|S!ZOCz#!}Hqarr zd#?I*+6^S=KOzi(%Qk2)+|}tVP8@{4Tw2bGfnVbwXP70?+11xWBb68OM{GPTXQ(Py UYwZ6?2XL&12AetyNYS+q08Df>O#lD@ diff --git a/node/node-1.4.17-linux-amd64.dgst.sig.16 b/node/node-1.4.17-linux-amd64.dgst.sig.16 deleted file mode 100644 index b1ba48a1823e303360fa6bf367e93a6ead879edf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 114 zcmV-&0FD2)Pq22KX#rDLF;YAa6(fzvV<3`be6#bgCb2xFZBtU^N&k2{avT~|hNOlp ze~Klc1sE3)lv^QydbQRFx{g;#f^(f0Dy_zJT(@?Z%0+X?- U2JHK7bQ|aIj@#hh)W^*@06keYxc~qF diff --git a/node/node-1.4.17-linux-amd64.dgst.sig.3 b/node/node-1.4.17-linux-amd64.dgst.sig.3 deleted file mode 100644 index 0cd377cca2f2bc822dca4586c8c7ab146617f71f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 114 zcmV-&0FD1QoFwU_Mv5cK<>(=`nA{l=`gh97+qP%T1E0N*SUDYkRz9eu$;V0Eid^ca zN5URBmBXlhdH2$3)|#<_qc UVXFd`n&M}jXPwl|p)61q0I diff --git a/node/node-1.4.17-linux-amd64.dgst.sig.4 b/node/node-1.4.17-linux-amd64.dgst.sig.4 deleted file mode 100644 index 36eeb738b5ea03a816e8ca77d49a0bdf21b54b93..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 114 zcmV-&0FD1W4BLAwt`1J{$B{ZsUCq4ynKq`sUr&B^64h{mHou2u|5W72V8fzPMq=?N zEaF*O1e^l7pKU3 UN0mXFf!nItc#VfW)Hrk$0ExdhTL1t6 diff --git a/node/node-1.4.17-linux-amd64.dgst.sig.6 b/node/node-1.4.17-linux-amd64.dgst.sig.6 deleted file mode 100644 index 21938e7f22ae233304c7c6fc6763ede6c96d34d6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 114 zcmV-&0FD1RR)tOKq@WtNN#Wkbdl&+EGLk6URf*J2zL729D~`@(#WS-e5eZ>{bNn@H z=v`JHA9Dn@`Gz2XP*xC#<-J09rscm;e9( diff --git a/node/node-1.4.17-linux-amd64.dgst.sig.8 b/node/node-1.4.17-linux-amd64.dgst.sig.8 deleted file mode 100644 index 746a0806be1336e3951b1c4feae4df15d5047546..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 114 zcmV-&0FD1*1~*Ixfw7rXnbScCCnm1cFpBG>Np5JcXY}pPuebT@<&+(w)3)sYjaWno zP0XpB;iKUqR z*z&?y@2T3oXKMq1vpp*e_mz2@j*wMmCyNu>rOUAm1`IF}F~GLoTrm&&v%UIt!WU@a!a? zPnOd^ninpeN#jX?#;_;q(RQ<~=3i%0Bp((_0Q>SLeY&;`GJV2-@Ab{Eyt<05XJQ$q UPf5P4QX}B-)4LFyqbQmK0Lc41Q~&?~ diff --git a/node/node-1.4.17-linux-arm64.dgst.sig.12 b/node/node-1.4.17-linux-arm64.dgst.sig.12 deleted file mode 100644 index a0546774e40cec18d6c42e2c2143dbabf26a0d75..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 114 zcmV-&0FD0}CGiYQA~(s<)(do}j_~8(R>UJjIp1#p)m;#uQ9GeuBEOE?ba}|W2TgOe zncP;a>nWYp#5%Wth+reaQXe3=q&zr3) zsblo?dcF#hd_!yiw=ZNO@Cg_;mk@AbT1vLZ7e0GlH?B>(^b diff --git a/node/node-1.4.17-linux-arm64.dgst.sig.14 b/node/node-1.4.17-linux-arm64.dgst.sig.14 deleted file mode 100644 index cc80d2454f87cbbd303b7887ca6e1679be2bb98f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 114 zcmV-&0FD2{n@h8g-uj`3`z}d%Qipo8K^Izdbfgc`YBx`E%d5;^!VV2$G}BtJxTJ<7 zeyoAX&>}5RS`o?stjc$PG*zC3LOoh})`1QDLLmo9LCu2A=9-rW>vapy62f+yonNjr UV!b;x7m8;G__*jbr__!y0CCzj1poj5 diff --git a/node/node-1.4.17-linux-arm64.dgst.sig.15 b/node/node-1.4.17-linux-arm64.dgst.sig.15 deleted file mode 100644 index a0833d1332e9f9dfce74433ef5137204d40e5ab0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 114 zcmV-&0FD25@ZDcb-0)#@ikCRe3i?3;BBI0 z_0cz-Pfm(Hxb-1`fr9|u&aIdejBxY>=6FyGv!2qeoGG$ U@;0PH*bLZZ@f`tz|EK>904Z!c>Hq)$ diff --git a/node/node-1.4.17-linux-arm64.dgst.sig.16 b/node/node-1.4.17-linux-arm64.dgst.sig.16 deleted file mode 100644 index 85fb52eb743260de7eb05d20965ced0ec95f8d4a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 114 zcmV-&0FD1CF9y!*NSa_+!Qd_$>sBTAv)|Z9C?oj*$6N~>+UH+-qyQU_ni+Kq5#71> zCHRfo8aJ6L$`b{E(k|X>zG%7Srl}_N(k<8^L#M`JD{iiTmlSw!only|F(bBL04ISpwg3PC diff --git a/node/node-1.4.17-linux-arm64.dgst.sig.3 b/node/node-1.4.17-linux-arm64.dgst.sig.3 deleted file mode 100644 index 11cf43af958e5eda4cb5902db377e89852b4e2b2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 114 zcmV-&0FD1aqmx;nl(BIWgxJtG0fO?fO$uG35RpsQt8M4KpLcivzmsX{DB UHcDoEw*FV|?fFAzEFD_~009p^4gdfE diff --git a/node/node-1.4.17-linux-arm64.dgst.sig.4 b/node/node-1.4.17-linux-arm64.dgst.sig.4 deleted file mode 100644 index 112929f787a7c939f478f2c8835cf272c784190d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 114 zcmV-&0FD3ij$eq6M|qFm-lTggX5E^q_>URzQ<3~QvcIVU37-S`dtIAGUpmYz;fO`< z(By@MlI$Hn-5ptgzO5^g1?n>!URme_i8S`=^ z10auxZ%>R*{PGz95CBzsIZPB`I_j!DvvDh(l$7JS_^S#o!0XX~z UpP-#`zH7rS!-KEOOWSU8xeqPB(-HqBx zWbf^nt)DH`mk4`+AqYv=tM$pLrf77mVfnsRmWV4Xj~gNtmeFpKL#csT?n6LKypI}N Urq5hbnIFv1Z;22*w?)`E0MTWY1e(=Eh|Cqj79;JcXQ2n)#y_h49PaB@%Y-`PEYP82o z8aZ(;SS(k57VO0U@_{~3E$MqK;9U)4XzHD)9?4=$m7z#lbVs6bM^bS$#g`91p%yPr Uve$N$7^R((Nzn$os;UPb0FZDsQ2+n{ literal 0 HcmV?d00001 diff --git a/node/node-1.4.18-darwin-arm64.dgst.sig.16 b/node/node-1.4.18-darwin-arm64.dgst.sig.16 new file mode 100644 index 0000000000000000000000000000000000000000..a0fb9df605b93393bf7484bb2e5add7f98e09d25 GIT binary patch literal 114 zcmV-&0FD0_ruE!6eNT0Nk}a8~^|S literal 0 HcmV?d00001 diff --git a/node/node-1.4.18-darwin-arm64.dgst.sig.17 b/node/node-1.4.18-darwin-arm64.dgst.sig.17 new file mode 100644 index 0000000000000000000000000000000000000000..fb6a0f368878737d180a4b13eb5f6f991d4c2ea6 GIT binary patch literal 114 zcmV-&0FD2~c!hBYp8-w2p4`#&@r?T)Wx5Qzz`I=*yF($&kGHgTcw>GqL6?w8*=UyL z-13)a-P5Y@Ji*I==xq+%Sac2uhR)POMb$(MoJkm~ UE#+o-8+_sStt-Ad-)OZf0NMvU0RR91 literal 0 HcmV?d00001 diff --git a/node/node-1.4.18-darwin-arm64.dgst.sig.4 b/node/node-1.4.18-darwin-arm64.dgst.sig.4 new file mode 100644 index 0000000000000000000000000000000000000000..a0e4578458e2d5f3bbf97dbde26e1626da2d3da8 GIT binary patch literal 114 zcmV-&0FD3Ymb|k_OgNYxFg$!Drd8bd$KzxJWU3MHmd2m`UtejQNpx1ZA&<%-^OE7d z%OH4tVomx(;{yBVlmUT%L`U7DI1j%~5Ua@?mn|5%c->=SYnJPLClqR9rK Un+md1E}3>LFVJ81!beaW01Fd0ng9R* literal 0 HcmV?d00001 diff --git a/node/node-1.4.18-darwin-arm64.dgst.sig.6 b/node/node-1.4.18-darwin-arm64.dgst.sig.6 new file mode 100644 index 0000000000000000000000000000000000000000..05d3b24486bc03f9215c49eeae74658de7313aed GIT binary patch literal 114 zcmV-&0FD2Q>^zYocBCu#D~cuQgRc8E1uyC}%)_Cp_fkZYtk4gK4Cbr5vf9m&7Zjfu zT$-n_93j^Wq0)5#_HZQl3B%XbLSm95$EA?o^lfufL*vBJQP|_V32&zLT$7? UyBqHgjwS~lA{wdzh*(oN09n*IQ~&?~ literal 0 HcmV?d00001 diff --git a/node/node-1.4.18-darwin-arm64.dgst.sig.7 b/node/node-1.4.18-darwin-arm64.dgst.sig.7 new file mode 100644 index 0000000000000000000000000000000000000000..6424f6225fa1975e70222bf8975fb8dd76d8a17f GIT binary patch literal 114 zcmV-&0FD1$B5d{)!UPD*E|J+Jykw=rfM+@usc&HX)|)Vox8*TVl&ZmC1>`5zw%~6Ux6l8J}aj( UWM9Bf*B^)bV$1x8Hs!`40J~B$JOBUy literal 0 HcmV?d00001 diff --git a/node/node-1.4.18-darwin-arm64.dgst.sig.8 b/node/node-1.4.18-darwin-arm64.dgst.sig.8 new file mode 100644 index 0000000000000000000000000000000000000000..7d6e423defe6e01ad20c9d41bc0168601f1a4179 GIT binary patch literal 114 zcmV-&0FD1-u3x;`BC_WH`XVKSNfn{MGJqCU*{EwMK53&R$EYsK;bFZEW5hw0;*agk z$2(equE(B87qs|*a*iQFaPulIV`QC0=+6DOVAfCq@hqGZovg)fSI*pkEZv`K3@cKi UamzlcaTC)K3`i#}Nf!JA03TmBO#lD@ literal 0 HcmV?d00001 diff --git a/node/node-1.4.18-linux-amd64.dgst b/node/node-1.4.18-linux-amd64.dgst new file mode 100644 index 0000000..2e89a8e --- /dev/null +++ b/node/node-1.4.18-linux-amd64.dgst @@ -0,0 +1 @@ +SHA3-256(node-1.4.18-linux-amd64)= e24acbaab0dca79a26c1ac80561eb2dc69abf381fff73b5bb4092084143ba2c9 diff --git a/node/node-1.4.18-linux-amd64.dgst.sig.1 b/node/node-1.4.18-linux-amd64.dgst.sig.1 new file mode 100644 index 0000000000000000000000000000000000000000..2bfd324e73b986cd7135f485d137c9e0976efb38 GIT binary patch literal 114 zcmV-&0FD3Vn!`m6Ki19M22u@EQ-f5>7<8Zs+bfcI8~1D3ACy831wWn>g#c{L`@TPJ zMX89eaWIXFnrhepQM{?`IB~QI+mG-$qu4ArS7}&teJR96l7N8o4RJvcKsJO1*@6Wl U(=DSxoKYEhzxGAx(BSSU0GT*62mk;8 literal 0 HcmV?d00001 diff --git a/node/node-1.4.18-linux-amd64.dgst.sig.13 b/node/node-1.4.18-linux-amd64.dgst.sig.13 new file mode 100644 index 0000000000000000000000000000000000000000..84f6ef20ce43a2bcce34703f5de15e61d86803c5 GIT binary patch literal 114 zcmV-&0FD3kbg!Xi#m5ibb-#ac7~Pgv@h~rzykL285edhpU)|41F{TqAcuP$QFtHx9 z!Cg)NIk*qOA$XMluOsy>5!%N!H?ToN?gqujEsVGYt#5`hN!#Y0emcWUwgypZeH{}8 UKTG_`%?j=|MP@0tJvdJ>049Yq0{{R3 literal 0 HcmV?d00001 diff --git a/node/node-1.4.18-linux-amd64.dgst.sig.14 b/node/node-1.4.18-linux-amd64.dgst.sig.14 new file mode 100644 index 0000000000000000000000000000000000000000..1199c5a107216998808dbb32dc94421ddb1fbbe7 GIT binary patch literal 114 zcmV-&0FD1qUxz&LOn)zO5ct0UycxILiTme=_|?=O=P>5`w^H?-Vg&wgpSTl6tqSw0 z@5Zqs@R_)>R$(syTn3jT%yVTnS=0E*H&0ssI2 literal 0 HcmV?d00001 diff --git a/node/node-1.4.18-linux-amd64.dgst.sig.16 b/node/node-1.4.18-linux-amd64.dgst.sig.16 new file mode 100644 index 0000000000000000000000000000000000000000..8b6e43b5393068ca619d8d2f2d72869ec374837a GIT binary patch literal 114 zcmV-&0FD2RGZY1edrP)(V#fMrPFb9F4XI@~P8b4ZNerv0lrG{Eo4T!T3RrJ5y9_-e zQc7|Yp}%A0!P9*JQXcSV@FXwb=Fi%Q0%~JTP}cM$TeyXEHFBl>5eo$KaYImmfS&7u UhYv;vS=N;>b%7 literal 0 HcmV?d00001 diff --git a/node/node-1.4.18-linux-amd64.dgst.sig.17 b/node/node-1.4.18-linux-amd64.dgst.sig.17 new file mode 100644 index 0000000000000000000000000000000000000000..c6f22f18fbe86e8c9fe83ce5f737397fbd7da188 GIT binary patch literal 114 zcmV-&0FD0*;ge%JlLOP+SaC7+?uez=ksyaT1>&Xl0)4M+KB&p-@1ly5(*`!9ICF0Q zhS9q?9x91mjZEBtR5c69ObVrT#|qldE-wP@^YZ*r-)r&KQ>2x#_D0gH;WT0rdjgAh UqG|&cfe1JF{4eaz06hL005RSRJX;NXwn-8qDx{c}Hh!(%R3fdl@$6kg^xv6%XT-jypZ9n#Mv U$Nn%q6pp^(+-p=xdA)xQ0IdN#r~m)} literal 0 HcmV?d00001 diff --git a/node/node-1.4.18-linux-amd64.dgst.sig.6 b/node/node-1.4.18-linux-amd64.dgst.sig.6 new file mode 100644 index 0000000000000000000000000000000000000000..f1619670f5eb0e3075fc6894ea4aa3076f4ca9b8 GIT binary patch literal 114 zcmV-&0FD1s7h^BVMP6U4$=kNqp@v3c!I{|Loe__5Rw z9ar08NgR-PS-bFn&zV>|p^s!7SrX;&H4=>p`l$k*VIf?_#&Oh~cZp&L3yU_F^A8BF U(ZC+_B8?Uk&KRcOfWVGw%8}&Ai6JQd*{hFR{(m{AAw4< zAAM5o!LO2_|Iz6HIMNH;xy;q$Qw+NMQm60JI%-PwM3c-ymo}0#T9r4mb-1lra+-gL U?!(y^15F`onLJf9!0jR*02Ea_#sB~S literal 0 HcmV?d00001 diff --git a/node/node-1.4.18-linux-arm64.dgst b/node/node-1.4.18-linux-arm64.dgst new file mode 100644 index 0000000..33f07f5 --- /dev/null +++ b/node/node-1.4.18-linux-arm64.dgst @@ -0,0 +1 @@ +SHA3-256(node-1.4.18-linux-arm64)= 888228bb59dc0b7fc103bd886906cfecdf3877dcedc138a1fd4cf694ab527409 diff --git a/node/node-1.4.18-linux-arm64.dgst.sig.1 b/node/node-1.4.18-linux-arm64.dgst.sig.1 new file mode 100644 index 0000000000000000000000000000000000000000..01bf4cebbc0eed6ae90b6e5c9a2369732420ed22 GIT binary patch literal 114 zcmV-&0FD3hG0=ODe_BN+=`^-sq*0EUVg_H@7I3yCz4jKtm+ca>=WkU+IstJ3CRBZ) zm*~%^Moc*;u?HsrygL6hgiL{ZZwPGb19Sc1V^BGpH7}51{z3w=z5%#+d!`b$xpBv~ Ub~C=rRw^rqcYv#uDM7?00L;}hw*UYD literal 0 HcmV?d00001 diff --git a/node/node-1.4.18-linux-arm64.dgst.sig.13 b/node/node-1.4.18-linux-arm64.dgst.sig.13 new file mode 100644 index 0000000000000000000000000000000000000000..e821217802ed4cc6ea39d2039e9a3889f3d86d9c GIT binary patch literal 114 zcmV-&0FD3FqDwRSjqWacpg6^aKikmjpmzAS%7%@{kz*sI?6S$pr9hGayTU^}z>F|}021Uo)&Kwi literal 0 HcmV?d00001 diff --git a/node/node-1.4.18-linux-arm64.dgst.sig.14 b/node/node-1.4.18-linux-arm64.dgst.sig.14 new file mode 100644 index 0000000000000000000000000000000000000000..ac0054eb0530b902fc8e4ca9256bfcb0d11a4f01 GIT binary patch literal 114 zcmV-&0FD1iBkpPR4tQE9pz2vGq+)$H+nIekrti`n4q?k!XOafTzFleBv_ z?#F*K(bX4zUwdwV-9)6$O)QiYr*8umdSS@?Ws$0{D$_v9<0bWpuUGXUfOHLRu4NM{ Ul=cZsyrgcb`R9=i0y;L!=H9 UYtt){_lU9iqpl2sPXcfs09773fB*mh literal 0 HcmV?d00001 diff --git a/node/node-1.4.18-linux-arm64.dgst.sig.17 b/node/node-1.4.18-linux-arm64.dgst.sig.17 new file mode 100644 index 0000000000000000000000000000000000000000..7d61205af113e2e42a816733b8ceb027f0e1ed9e GIT binary patch literal 114 zcmV-&0FD2lw`(bllj))q!1MTCKt?l7uxepS_Dd23nIyMay`r=k6;!u0fx}4Hui~;b zbROpRwdri~uG=dB%WIIL$ENd6VfuQlHP#y(LO2Wb>QTgMi@#lhNOK+haaQlwi$9^N U5AjhjS`qjRWuYJyH8dm_01lZqNB{r; literal 0 HcmV?d00001 diff --git a/node/node-1.4.18-linux-arm64.dgst.sig.4 b/node/node-1.4.18-linux-arm64.dgst.sig.4 new file mode 100644 index 0000000000000000000000000000000000000000..be1b26d08663c91ed2abae920f691bba04d9b694 GIT binary patch literal 114 zcmV-&0FD29XFMw~zKi*%q%r;r0E-7v<4~Wf20}7QtP*t|?IHD81%JEK7Y366LrA#~ z6pPs!sHLU}GQqEaW{&OtG>YOf%T&_2D<$8Yxh;7WHu$Wjc(=Z0-)c&4bAtC@<3n+8 U17RjK1M1|wo`)0D39Hj70C%!9n*aa+ literal 0 HcmV?d00001 diff --git a/node/node-1.4.18-linux-arm64.dgst.sig.6 b/node/node-1.4.18-linux-arm64.dgst.sig.6 new file mode 100644 index 0000000000000000000000000000000000000000..c1c4b7f8426b0b52bf1b1a52951d9d7fe8862f3e GIT binary patch literal 114 zcmV-&0FD2Gx&-4X_cW7(qP6dAZkGfY*&KWuRgs4bK_=kD0K^JkCDuVuo+IddMHpSl zdk9jV`WCvGc^=FFQ^HPlT&NDG5*)LO${5N-Ga%ICoQ^+joy{^T!mWxVL!?O5=d3jf Uvr^=oKHmmtv_TBVT&Zj`0DMd{3;+NC literal 0 HcmV?d00001 diff --git a/node/node-1.4.18-linux-arm64.dgst.sig.7 b/node/node-1.4.18-linux-arm64.dgst.sig.7 new file mode 100644 index 0000000000000000000000000000000000000000..d620c2758e35983a1fba820d3a823ac718cd573c GIT binary patch literal 114 zcmV-&0FD1>`(tR_mp5+~W_GZY{GLK;O8PE9Es`yWLVeNy^4D90^t|Jp_$lCBtlOt- z{k@2BB4;gtBhUf>;ELgIPanVdE(cP&QF{6Qxu?qC3;ar+#xc62}! UIdoIse0mG^PLIG8S(PXj07-YE!07GXvvj6}9 literal 0 HcmV?d00001 diff --git a/node/p2p/blossomsub.go b/node/p2p/blossomsub.go index dcc6ad6..f16fe9c 100644 --- a/node/p2p/blossomsub.go +++ b/node/p2p/blossomsub.go @@ -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 +} diff --git a/node/p2p/peer_info_manager.go b/node/p2p/peer_info_manager.go index 3b2dde3..63bd671 100644 --- a/node/p2p/peer_info_manager.go +++ b/node/p2p/peer_info_manager.go @@ -39,6 +39,7 @@ type PeerManifest struct { Capabilities []Capability MasterHeadFrame uint64 Bandwidth uint64 + LastSeen int64 } type InMemoryPeerInfoManager struct { diff --git a/node/poor_mans_cd.sh b/node/poor_mans_cd.sh deleted file mode 100755 index 2beb9e3..0000000 --- a/node/poor_mans_cd.sh +++ /dev/null @@ -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 diff --git a/node/protobufs/node.pb.go b/node/protobufs/node.pb.go index 1c0c710..c666428 100644 --- a/node/protobufs/node.pb.go +++ b/node/protobufs/node.pb.go @@ -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 ( diff --git a/node/protobufs/node.proto b/node/protobufs/node.proto index bd783a1..3116196 100644 --- a/node/protobufs/node.proto +++ b/node/protobufs/node.proto @@ -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 { diff --git a/signers/.env.example b/signers/.env.example new file mode 100644 index 0000000..e7b9271 --- /dev/null +++ b/signers/.env.example @@ -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= + diff --git a/signers/Dockerfile b/signers/Dockerfile new file mode 100644 index 0000000..6b1fce7 --- /dev/null +++ b/signers/Dockerfile @@ -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} diff --git a/signers/README.md b/signers/README.md new file mode 100644 index 0000000..d858551 --- /dev/null +++ b/signers/README.md @@ -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 diff --git a/signers/Taskfile.yaml b/signers/Taskfile.yaml new file mode 100644 index 0000000..dd5b67e --- /dev/null +++ b/signers/Taskfile.yaml @@ -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}} diff --git a/signers/pems/1.pem b/signers/pems/1.pem new file mode 100644 index 0000000..7acb83e --- /dev/null +++ b/signers/pems/1.pem @@ -0,0 +1,4 @@ +-----BEGIN PUBLIC KEY----- +MEMwBQYDK2VxAzoAsSFNp/NV9antt7zCPUA733ifBwzKENsrTK3CLy2DevtlCUSF +PjXV9C7zxBBbgCsUS0B31dMlPkEA +-----END PUBLIC KEY----- diff --git a/signers/pems/10.pem b/signers/pems/10.pem new file mode 100644 index 0000000..4cf82b3 --- /dev/null +++ b/signers/pems/10.pem @@ -0,0 +1,4 @@ +-----BEGIN PUBLIC KEY----- +MEMwBQYDK2VxAzoARQdib3Fk59jDBMB/+NLiPBE/4QiyIdLmBnL00HdQNFgV4rSz +zD3000Zr8vZpw1wxcuBlEScGEqsA +-----END PUBLIC KEY----- diff --git a/signers/pems/11.pem b/signers/pems/11.pem new file mode 100644 index 0000000..4cabb8b --- /dev/null +++ b/signers/pems/11.pem @@ -0,0 +1,4 @@ +-----BEGIN PUBLIC KEY----- +MEMwBQYDK2VxAzoAT7JTc0Xka+PV+WNAwUQQB1AXAt1b+vbb9pQ7vvzsqPsrlOwK +ihovSYUPvh0QJEiJpPQKv6ngyeAA +-----END PUBLIC KEY----- diff --git a/signers/pems/12.pem b/signers/pems/12.pem new file mode 100644 index 0000000..b4f265d --- /dev/null +++ b/signers/pems/12.pem @@ -0,0 +1,4 @@ +-----BEGIN PUBLIC KEY----- +MEMwBQYDK2VxAzoAV74oYfrw//y/0SLIXHcBDc6PITAwkFeBuFtvNF2RLHtazhd5 +fZgQiZ37jRPnyDaVlXQHJas91b0A +-----END PUBLIC KEY----- diff --git a/signers/pems/13.pem b/signers/pems/13.pem new file mode 100644 index 0000000..ceed2f0 --- /dev/null +++ b/signers/pems/13.pem @@ -0,0 +1,4 @@ +-----BEGIN PUBLIC KEY----- +MEMwBQYDK2VxAzoAYWKL7vj2lkRm/QeNaiuQo5erB3ehS5coIn/RnzZ1L5RRsajX +gHQKC5qM499ficp7n/F96SdKJwmA +-----END PUBLIC KEY----- diff --git a/signers/pems/14.pem b/signers/pems/14.pem new file mode 100644 index 0000000..4a09da4 --- /dev/null +++ b/signers/pems/14.pem @@ -0,0 +1,4 @@ +-----BEGIN PUBLIC KEY----- +MEMwBQYDK2VxAzoAVUevxxsCgh4vW/3TD74TdMOFOJje/yChtcxym46BZw+7udHp +F/hdFT6ksmu/b5xUbcG2S5kWYI2A +-----END PUBLIC KEY----- diff --git a/signers/pems/15.pem b/signers/pems/15.pem new file mode 100644 index 0000000..929e64f --- /dev/null +++ b/signers/pems/15.pem @@ -0,0 +1,4 @@ +-----BEGIN PUBLIC KEY----- +MEMwBQYDK2VxAzoAgdY6RfBoYp9WjegS8YvlgHv+goqDAJfwnPAjMNas0142B0Ad +8/2giwO2jqbmiv1QayNQaxHoeg+A +-----END PUBLIC KEY----- diff --git a/signers/pems/2.pem b/signers/pems/2.pem new file mode 100644 index 0000000..37c8a40 --- /dev/null +++ b/signers/pems/2.pem @@ -0,0 +1,4 @@ +-----BEGIN PUBLIC KEY----- +MEMwBQYDK2VxAzoA3kz+cIMQS/4y8NQIL6AgBGTYsQgEqBFlPu3aN278rWTdIi8P +DOsLiuWKvoMNen4/Oy151pExjaoA +-----END PUBLIC KEY----- diff --git a/signers/pems/3.pem b/signers/pems/3.pem new file mode 100644 index 0000000..cfb8ffa --- /dev/null +++ b/signers/pems/3.pem @@ -0,0 +1,4 @@ +-----BEGIN PUBLIC KEY----- +MEMwBQYDK2VxAzoAVAI3o14SSILWtk57tXGCc/ozjlU/dyt3/pBXDkUwN2KzQTG9 +y2wLnyz545PZx+D1Ru6rC8u9iBaA +-----END PUBLIC KEY----- diff --git a/signers/pems/4.pem b/signers/pems/4.pem new file mode 100644 index 0000000..7c9a9af --- /dev/null +++ b/signers/pems/4.pem @@ -0,0 +1,4 @@ +-----BEGIN PUBLIC KEY----- +MEMwBQYDK2VxAzoA++QWbjf5P5DS6/BjBTFa4Rs35QHQlZb4veEbqdNDA0+8qA8l +IgWqL1gqUSpyrSk983G6pYLaBykA +-----END PUBLIC KEY----- diff --git a/signers/pems/5.pem b/signers/pems/5.pem new file mode 100644 index 0000000..3135a3c --- /dev/null +++ b/signers/pems/5.pem @@ -0,0 +1,4 @@ +-----BEGIN PUBLIC KEY----- +MEMwBQYDK2VxAzoAQWBXLkk+G/FcROBVsRv3UjDHbH0sZ7SAZncKsD39XtNMl7mk +MewYV4yDoN+SULg2LDgGhlDosBQA +-----END PUBLIC KEY----- diff --git a/signers/pems/6.pem b/signers/pems/6.pem new file mode 100644 index 0000000..397f92b --- /dev/null +++ b/signers/pems/6.pem @@ -0,0 +1,4 @@ +-----BEGIN PUBLIC KEY----- +MEMwBQYDK2VxAzoARRcLYmiEuF1hrhCfKqmw4ezBixgVCEMepjCPOGnyra5J2peZ +oKWU6qTvOtSSUY+xcp3s1EFp1A0A +-----END PUBLIC KEY----- diff --git a/signers/pems/7.pem b/signers/pems/7.pem new file mode 100644 index 0000000..416d24a --- /dev/null +++ b/signers/pems/7.pem @@ -0,0 +1,4 @@ +-----BEGIN PUBLIC KEY----- +MEMwBQYDK2VxAzoAks2O5TYvOuJ0p1q5RxAk28FEv/RB7Yr30ZdQrFEv9R5A5/ew +Hk+WtjRd1Yh4VllIw+tSxT8lC1CA +-----END PUBLIC KEY----- diff --git a/signers/pems/8.pem b/signers/pems/8.pem new file mode 100644 index 0000000..24a9a22 --- /dev/null +++ b/signers/pems/8.pem @@ -0,0 +1,4 @@ +-----BEGIN PUBLIC KEY----- +MEMwBQYDK2VxAzoAABpMv85dmut+IGZbDSNnIbIooy8LruYv+nf0W4Lsr1d+iji3 +75H899LS0rUE8IVGE5jTCySrsdcA +-----END PUBLIC KEY----- diff --git a/signers/pems/9.pem b/signers/pems/9.pem new file mode 100644 index 0000000..a3324b7 --- /dev/null +++ b/signers/pems/9.pem @@ -0,0 +1,4 @@ +-----BEGIN PUBLIC KEY----- +MEMwBQYDK2VxAzoAZbg1BxcxxueFuy0QfH2F2KU315xDXD9Cuy+HAn+T+FjXs3xZ +jO8mel20bjRfem+BlptGVoZlfR4A +-----END PUBLIC KEY-----