From 7d1320c226137079deb1a437501e2ad72bae420e Mon Sep 17 00:00:00 2001 From: Cassandra Heart Date: Mon, 3 Nov 2025 03:05:10 -0600 Subject: [PATCH] mostly finalized state for consensus --- consensus/consensus_voting.go | 20 - consensus/eventhandler/event_handler.go | 20 +- consensus/eventhandler/event_handler_test.go | 6 +- .../example/generic_consensus_example.go | 1235 --------- consensus/forks/forks.go | 26 +- consensus/forks/forks_test.go | 2 +- consensus/forks/state_container.go | 2 +- consensus/helper/quorum_certificate.go | 16 +- consensus/helper/timeout_certificate.go | 4 +- consensus/integration/assertion_test.go | 2 +- consensus/integration/connect_test.go | 4 +- consensus/integration/instance_test.go | 32 +- consensus/mocks/vote_processor_factory.go | 24 +- consensus/models/aggregated_signature.go | 4 +- consensus/models/quorum_certificate.go | 6 +- consensus/models/state.go | 6 +- consensus/notifications/log_consumer.go | 28 +- consensus/participant/participant.go | 240 ++ consensus/signature/state_signer_decoder.go | 4 +- consensus/state_machine.go | 1640 ------------ consensus/state_machine_test.go | 1055 -------- consensus/state_machine_viz.go | 360 --- consensus/stateproducer/state_producer.go | 8 +- .../timeout_processor_test.go | 4 +- consensus/validator/validator.go | 4 +- consensus/verification/common.go | 2 +- consensus/votecollector/factory_test.go | 22 +- consensus/votecollector/statemachine.go | 66 +- consensus/votecollector/statemachine_test.go | 10 +- .../votecollector/vote_processor_test.go | 2 +- protobufs/canonical_types.go | 1 + protobufs/global.go | 514 +++- protobufs/global.pb.go | 2250 +++++++++-------- protobufs/global.proto | 125 +- protobufs/keys.go | 4 + 35 files changed, 2204 insertions(+), 5544 deletions(-) delete mode 100644 consensus/example/generic_consensus_example.go create mode 100644 consensus/participant/participant.go delete mode 100644 consensus/state_machine.go delete mode 100644 consensus/state_machine_test.go delete mode 100644 consensus/state_machine_viz.go diff --git a/consensus/consensus_voting.go b/consensus/consensus_voting.go index 47537a3..593eaba 100644 --- a/consensus/consensus_voting.go +++ b/consensus/consensus_voting.go @@ -13,8 +13,6 @@ type VotingProvider[ VoteT models.Unique, PeerIDT models.Unique, ] interface { - // Sends a proposal for voting. - SendProposal(ctx context.Context, proposal *StateT) error // SignVote signs a proposal, produces an output vote for aggregation and // broadcasting. SignVote( @@ -42,22 +40,4 @@ type VotingProvider[ latestQuorumCertificateRanks []uint64, aggregatedSignature models.AggregatedSignature, ) (models.TimeoutCertificate, error) - // Re-publishes a vote message, used to help lagging peers catch up. - SendVote(ctx context.Context, vote *VoteT) (PeerIDT, error) - // IsQuorum returns a response indicating whether or not quorum has been - // reached. - IsQuorum( - ctx context.Context, - proposalVotes map[models.Identity]*VoteT, - ) (bool, error) - // FinalizeVotes performs any folding of proposed state required from VoteT - // onto StateT, proposed states and votes matched by PeerIDT, returns - // finalized state, chosen proposer PeerIDT. - FinalizeVotes( - ctx context.Context, - proposals map[models.Identity]*StateT, - proposalVotes map[models.Identity]*VoteT, - ) (*StateT, PeerIDT, error) - // SendConfirmation sends confirmation of the finalized state. - SendConfirmation(ctx context.Context, finalized *StateT) error } diff --git a/consensus/eventhandler/event_handler.go b/consensus/eventhandler/event_handler.go index 4fd05f1..0e1b154 100644 --- a/consensus/eventhandler/event_handler.go +++ b/consensus/eventhandler/event_handler.go @@ -108,7 +108,7 @@ func (e *EventHandler[ "received QC", consensus.Uint64Param("current_rank", curRank), consensus.Uint64Param("qc_rank", qc.GetRank()), - consensus.IdentityParam("state_id", qc.GetSelector()), + consensus.IdentityParam("state_id", qc.Identity()), ) e.notifier.OnReceiveQuorumCertificate(curRank, qc) defer e.notifier.OnEventProcessed() @@ -148,7 +148,7 @@ func (e *EventHandler[ ), consensus.IdentityParam( "tc_newest_qc_state_id", - tc.GetLatestQuorumCert().GetSelector(), + tc.GetLatestQuorumCert().Identity(), ), ) e.notifier.OnReceiveTimeoutCertificate(curRank, tc) @@ -168,7 +168,7 @@ func (e *EventHandler[ ), consensus.IdentityParam( "tc_newest_qc_state_id", - tc.GetLatestQuorumCert().GetSelector(), + tc.GetLatestQuorumCert().Identity(), )) return nil } @@ -183,7 +183,7 @@ func (e *EventHandler[ ), consensus.IdentityParam( "tc_newest_qc_state_id", - tc.GetLatestQuorumCert().GetSelector(), + tc.GetLatestQuorumCert().Identity(), )) return e.proposeForNewRankIfPrimary() } @@ -518,7 +518,7 @@ func (e *EventHandler[ newestQC := e.paceMaker.LatestQuorumCertificate() previousRankTimeoutCert := e.paceMaker.PriorRankTimeoutCertificate() - _, found := e.forks.GetState(newestQC.GetSelector()) + _, found := e.forks.GetState(newestQC.Identity()) if !found { // we don't know anything about state referenced by our newest QC, in this // case we can't create a valid proposal since we can't guarantee validity @@ -649,7 +649,7 @@ func (e *EventHandler[ targetPublicationTime := e.paceMaker.TargetPublicationTime( stateProposal.State.Rank, start, - stateProposal.State.ParentQuorumCertificate.GetSelector(), + stateProposal.State.ParentQuorumCertificate.Identity(), ) // determine target publication time e.tracer.Trace( "forwarding proposal to communicator for broadcasting", @@ -657,7 +657,7 @@ func (e *EventHandler[ consensus.TimeParam("target_publication", targetPublicationTime), consensus.IdentityParam("state_id", stateProposal.State.Identifier), consensus.Uint64Param("parent_rank", newestQC.GetRank()), - consensus.IdentityParam("parent_id", newestQC.GetSelector()), + consensus.IdentityParam("parent_id", newestQC.Identity()), consensus.IdentityParam("signer", stateProposal.State.ProposerID), ) @@ -729,7 +729,7 @@ func (e *EventHandler[ nextLeader models.Identity, ) error { _, found := e.forks.GetState( - proposal.State.ParentQuorumCertificate.GetSelector(), + proposal.State.ParentQuorumCertificate.Identity(), ) if !found { // we don't have parent for this proposal, we can't vote since we can't @@ -759,7 +759,7 @@ func (e *EventHandler[ ), consensus.IdentityParam( "parent_id", - proposal.State.ParentQuorumCertificate.GetSelector(), + proposal.State.ParentQuorumCertificate.Identity(), ), consensus.IdentityParam("signer", proposal.State.ProposerID[:]), ) @@ -776,7 +776,7 @@ func (e *EventHandler[ ), consensus.IdentityParam( "parent_id", - proposal.State.ParentQuorumCertificate.GetSelector(), + proposal.State.ParentQuorumCertificate.Identity(), ), consensus.IdentityParam("signer", proposal.State.ProposerID[:]), ) diff --git a/consensus/eventhandler/event_handler_test.go b/consensus/eventhandler/event_handler_test.go index 8b4e7cf..a6541a4 100644 --- a/consensus/eventhandler/event_handler_test.go +++ b/consensus/eventhandler/event_handler_test.go @@ -391,7 +391,7 @@ func (es *EventHandlerSuite) TestStartNewRank_ParentProposalNotFound() { require.NoError(es.T(), err) require.Equal(es.T(), es.endRank, es.paceMaker.CurrentRank(), "incorrect rank change") - es.forks.AssertCalled(es.T(), "GetState", newestQC.GetSelector()) + es.forks.AssertCalled(es.T(), "GetState", newestQC.Identity()) es.notifier.AssertNotCalled(es.T(), "OnOwnProposal", mock.Anything, mock.Anything) } @@ -449,7 +449,7 @@ func (es *EventHandlerSuite) TestOnReceiveProposal_NoVote_ParentProposalNotFound proposal := createProposal(es.initRank, es.initRank-1) // remove parent from known proposals - delete(es.forks.proposals, proposal.State.ParentQuorumCertificate.GetSelector()) + delete(es.forks.proposals, proposal.State.ParentQuorumCertificate.Identity()) // no vote for this proposal, no parent found err := es.eventhandler.OnReceiveProposal(proposal) @@ -842,7 +842,7 @@ func (es *EventHandlerSuite) TestLeaderBuild100States() { // for first proposal we need to store the parent otherwise it won't be voted for if i == 0 { parentState := helper.MakeState(func(state *models.State[*helper.TestState]) { - state.Identifier = proposal.State.ParentQuorumCertificate.GetSelector() + state.Identifier = proposal.State.ParentQuorumCertificate.Identity() state.Rank = proposal.State.ParentQuorumCertificate.GetRank() }) es.forks.proposals[parentState.Identifier] = parentState diff --git a/consensus/example/generic_consensus_example.go b/consensus/example/generic_consensus_example.go deleted file mode 100644 index 94a5cc2..0000000 --- a/consensus/example/generic_consensus_example.go +++ /dev/null @@ -1,1235 +0,0 @@ -package main - -import ( - "context" - "errors" - "fmt" - "log" - "slices" - "sync" - "time" - - "source.quilibrium.com/quilibrium/monorepo/consensus" - "source.quilibrium.com/quilibrium/monorepo/consensus/models" - "source.quilibrium.com/quilibrium/monorepo/consensus/pacemaker" -) - -// Example using the generic state machine from the consensus package - -// consensusData represents the state data -type consensusData struct { - Round uint64 - Hash string - Votes map[string]interface{} - Proof interface{} - IsProver bool - Timestamp time.Time - ProposerID string -} - -// Identity implements Unique interface -func (c consensusData) Identity() models.Identity { - return fmt.Sprintf("%s-%d", c.Hash, c.Round) -} - -func (c consensusData) GetRank() uint64 { - return c.Round -} - -func (c consensusData) Clone() models.Unique { - return consensusData{ - Round: c.Round, - Hash: c.Hash, - Votes: c.Votes, - Proof: c.Proof, - IsProver: c.IsProver, - Timestamp: c.Timestamp, - ProposerID: c.ProposerID, - } -} - -// Vote represents a vote in the consensus -type vote struct { - NodeID string - Round uint64 - VoteValue string - Timestamp time.Time - ProposerID string -} - -// Identity implements Unique interface -func (v vote) Identity() consensus.Identity { - return fmt.Sprintf("%s-%d-%s", v.ProposerID, v.Round, v.VoteValue) -} - -func (v vote) GetRank() uint64 { - return v.Round -} - -func (v vote) Clone() models.Unique { - return vote{ - NodeID: v.NodeID, - Round: v.Round, - VoteValue: v.VoteValue, - Timestamp: v.Timestamp, - ProposerID: v.ProposerID, - } -} - -type aggregateSignature struct { - Signature []byte - PublicKey []byte - Bitmask []byte -} - -// GetBitmask implements models.AggregatedSignature. -func (b *aggregateSignature) GetBitmask() []byte { - return b.Bitmask -} - -// GetPublicKey implements models.AggregatedSignature. -func (b *aggregateSignature) GetPublicKey() []byte { - return b.PublicKey -} - -// GetSignature implements models.AggregatedSignature. -func (b *aggregateSignature) GetSignature() []byte { - return b.Signature -} - -type quorumCertificate struct { - Filter []byte - Rank uint64 - FrameNumber uint64 - Selector []byte - Timestamp int64 - AggregatedSignature *aggregateSignature -} - -// GetAggregatedSignature implements models.QuorumCertificate. -func (q *quorumCertificate) GetAggregatedSignature() models.AggregatedSignature { - return q.AggregatedSignature -} - -// GetFilter implements models.QuorumCertificate. -func (q *quorumCertificate) GetFilter() []byte { - return q.Filter -} - -// GetFrameNumber implements models.QuorumCertificate. -func (q *quorumCertificate) GetFrameNumber() uint64 { - return q.FrameNumber -} - -// GetRank implements models.QuorumCertificate. -func (q *quorumCertificate) GetRank() uint64 { - return q.Rank -} - -// GetSelector implements models.QuorumCertificate. -func (q *quorumCertificate) GetSelector() []byte { - return q.Selector -} - -// GetTimestamp implements models.QuorumCertificate. -func (q *quorumCertificate) GetTimestamp() int64 { - return q.Timestamp -} - -var _ models.AggregatedSignature = (*aggregateSignature)(nil) -var _ models.QuorumCertificate = (*quorumCertificate)(nil) - -type store struct { - consensusState *models.ConsensusState - livenessState *models.LivenessState -} - -// GetConsensusState implements consensus.ConsensusStore. -func (s *store) GetConsensusState() (*models.ConsensusState, error) { - return s.consensusState, nil -} - -// GetLivenessState implements consensus.ConsensusStore. -func (s *store) GetLivenessState() (*models.LivenessState, error) { - return s.livenessState, nil -} - -// PutConsensusState implements consensus.ConsensusStore. -func (s *store) PutConsensusState(state *models.ConsensusState) error { - s.consensusState = state - return nil -} - -// PutLivenessState implements consensus.ConsensusStore. -func (s *store) PutLivenessState(state *models.LivenessState) error { - s.livenessState = state - return nil -} - -var _ consensus.ConsensusStore = (*store)(nil) - -// peerID represents a peer identifier -type peerID struct { - ID string -} - -// Identity implements Unique interface -func (p peerID) Identity() consensus.Identity { - return p.ID -} - -func (p peerID) GetRank() uint64 { - return 0 -} - -func (p peerID) Clone() models.Unique { - return p -} - -// CollectedData represents collected mutations -type CollectedData struct { - Round uint64 - Mutations []string - Timestamp time.Time -} - -// Identity implements Unique interface -func (c CollectedData) Identity() consensus.Identity { - return fmt.Sprintf("collected-%d", c.Timestamp.Unix()) -} - -func (c CollectedData) GetRank() uint64 { - return c.Round -} - -func (c CollectedData) Clone() models.Unique { - return CollectedData{ - Mutations: slices.Clone(c.Mutations), - Timestamp: c.Timestamp, - } -} - -// MockSyncProvider implements SyncProvider -type MockSyncProvider struct { -} - -func (m *MockSyncProvider) Synchronize( - ctx context.Context, - existing *consensusData, -) (<-chan *consensusData, <-chan error) { - dataCh := make(chan *consensusData, 1) - errCh := make(chan error, 1) - - go func() { - defer close(dataCh) - defer close(errCh) - - log.Println("synchronizing...") - select { - case <-time.After(10 * time.Millisecond): - log.Println("sync complete") - if existing != nil { - dataCh <- existing - } else { - dataCh <- &consensusData{ - Round: 0, - Hash: "genesis", - Votes: make(map[string]interface{}), - Timestamp: time.Now(), - } - } - errCh <- nil - case <-ctx.Done(): - errCh <- ctx.Err() - } - }() - - return dataCh, errCh -} - -// MockVotingProvider implements VotingProvider -type MockVotingProvider struct { - votes map[string]*vote - currentRound uint64 - voteTarget int - mu sync.Mutex - isMalicious bool - nodeID string - messageBus *MessageBus -} - -func NewMockVotingProvider( - voteTarget int, - nodeID string, -) *MockVotingProvider { - return &MockVotingProvider{ - votes: make(map[string]*vote), - voteTarget: voteTarget, - nodeID: nodeID, - } -} - -func NewMaliciousVotingProvider( - voteTarget int, - nodeID string, -) *MockVotingProvider { - return &MockVotingProvider{ - votes: make(map[string]*vote), - voteTarget: voteTarget, - isMalicious: true, - nodeID: nodeID, - } -} - -func (m *MockVotingProvider) SendProposal( - ctx context.Context, - proposal *consensusData, -) error { - log.Printf( - "sending proposal, round: %d, hash: %s\n", - proposal.Round, - proposal.Hash, - ) - - if m.messageBus != nil { - // Make a copy to avoid sharing pointers between nodes - proposalCopy := &consensusData{ - Round: proposal.Round, - Hash: proposal.Hash, - Votes: make(map[string]interface{}), - Proof: proposal.Proof, - IsProver: proposal.IsProver, - Timestamp: proposal.Timestamp, - ProposerID: proposal.ProposerID, - } - // Copy votes map - for k, v := range proposal.Votes { - proposalCopy.Votes[k] = v - } - - m.messageBus.Broadcast(Message{ - Type: "proposal", - Sender: m.nodeID, - Data: proposalCopy, - }) - } - - return nil -} - -func (m *MockVotingProvider) DecideAndSendVote( - ctx context.Context, - proposals map[consensus.Identity]*consensusData, -) (peerID, *vote, error) { - m.mu.Lock() - defer m.mu.Unlock() - - // Log available proposals - log.Printf( - "deciding vote, proposal count: %d, node id: %s\n", - len(proposals), - m.nodeID, - ) - - nodes := []string{ - "prover-node-1", - "validator-node-1", - "validator-node-2", - "validator-node-3", - } - - var chosenProposal *consensusData - var chosenID consensus.Identity - if len(proposals) > 3 { - leaderIdx := int(proposals[nodes[0]].Round % uint64(len(nodes))) - - chosenProposal = proposals[nodes[leaderIdx]] - chosenID = nodes[leaderIdx] - if chosenProposal == nil { - chosenProposal = proposals[nodes[(leaderIdx+1)%len(nodes)]] - chosenID = nodes[(leaderIdx+1)%len(nodes)] - } - log.Printf( - "found proposal, from: %s, round: %d\n", - chosenID, - chosenProposal.Round, - ) - } - if chosenProposal == nil { - return peerID{}, nil, fmt.Errorf("no proposals to vote on") - } - - vt := &vote{ - NodeID: m.nodeID, - Round: chosenProposal.Round, - VoteValue: "approve", - Timestamp: time.Now(), - ProposerID: chosenID, - } - - m.votes[vt.NodeID] = vt - log.Printf( - "decided and sent vote, node id: %s, vote: %s, round: %d, for proposal: %s\n", - vt.NodeID, - vt.VoteValue, - vt.Round, - chosenID, - ) - - if m.messageBus != nil { - // Make a copy to avoid sharing pointers - voteCopy := &vote{ - NodeID: vt.NodeID, - Round: vt.Round, - VoteValue: vt.VoteValue, - Timestamp: vt.Timestamp, - ProposerID: vt.ProposerID, - } - m.messageBus.Broadcast(Message{ - Type: "vote", - Sender: m.nodeID, - Data: voteCopy, - }) - } - - return peerID{ID: chosenID}, vt, nil -} - -func (m *MockVotingProvider) SendVote(ctx context.Context, vt *vote) ( - peerID, - error, -) { - log.Printf( - "re-sent vote, node id: %s, vote: %s, round: %d, for proposal: %s\n", - vt.NodeID, - vt.VoteValue, - vt.Round, - vt.ProposerID, - ) - - if m.messageBus != nil { - // Make a copy to avoid sharing pointers - voteCopy := &vote{ - NodeID: vt.NodeID, - Round: vt.Round, - VoteValue: vt.VoteValue, - Timestamp: vt.Timestamp, - ProposerID: vt.ProposerID, - } - m.messageBus.Broadcast(Message{ - Type: "vote", - Sender: m.nodeID, - Data: voteCopy, - }) - } - return peerID{ID: vt.ProposerID}, nil -} - -func (m *MockVotingProvider) IsQuorum( - ctx context.Context, - proposalVotes map[consensus.Identity]*vote, -) (bool, error) { - m.mu.Lock() - defer m.mu.Unlock() - - log.Printf( - "checking quorum, target: %d\n", - m.voteTarget, - ) - totalVotes := 0 - fmt.Printf("%s %+v\n", m.nodeID, proposalVotes) - voteCount := map[string]int{} - for _, votes := range proposalVotes { - count, ok := voteCount[votes.ProposerID] - if !ok { - voteCount[votes.ProposerID] = 1 - } else { - voteCount[votes.ProposerID] = count + 1 - } - totalVotes += 1 - - if count >= m.voteTarget { - return true, nil - } - } - if totalVotes >= m.voteTarget { - return false, errors.New("split quorum") - } - - return false, nil -} - -func (m *MockVotingProvider) FinalizeVotes( - ctx context.Context, - proposals map[consensus.Identity]*consensusData, - proposalVotes map[consensus.Identity]*vote, -) (*consensusData, peerID, error) { - // Count approvals - log.Printf( - "finalizing votes, total proposals: %d\n", - len(proposals), - ) - winnerCount := 0 - var winnerProposal *consensusData = nil - var winnerProposer peerID - voteCount := map[string]int{} - for _, votes := range proposalVotes { - count, ok := voteCount[votes.ProposerID] - if !ok { - voteCount[votes.ProposerID] = 1 - } else { - voteCount[votes.ProposerID] = count + 1 - } - } - for pid, proposal := range proposals { - if proposal == nil { - continue - } - voteCount := voteCount[proposal.ProposerID] - if voteCount > winnerCount { - winnerCount = voteCount - winnerProposal = proposal - winnerProposer = peerID{ID: pid} - } - } - - log.Printf( - "vote summary, approvals: %d, required: %d\n", - winnerCount, - m.voteTarget, - ) - - if winnerCount < m.voteTarget { - return nil, peerID{}, fmt.Errorf( - "not enough approvals: %d < %d", - winnerCount, - m.voteTarget, - ) - } - - if winnerProposal != nil { - return winnerProposal, winnerProposer, nil - } - - // Pick the first proposal - for id, prop := range proposals { - // Create a new finalized state based on the chosen proposal - finalizedState := &consensusData{ - Round: prop.Round, - Hash: prop.Hash, - Votes: make(map[string]interface{}), - Proof: prop.Proof, - IsProver: prop.IsProver, - Timestamp: time.Now(), - ProposerID: id, - } - // Copy votes to avoid pointer sharing - for k, v := range prop.Votes { - finalizedState.Votes[k] = v - } - - log.Printf( - "finalized state, round: %d, hash: %s, proposer: %d\n", - finalizedState.Round, - finalizedState.Hash, - id, - ) - return finalizedState, peerID{ID: id}, nil - } - - return nil, peerID{}, fmt.Errorf("no proposals to finalize") -} - -func (m *MockVotingProvider) SendConfirmation( - ctx context.Context, - finalized *consensusData, -) error { - if finalized == nil { - log.Println("cannot send confirmation for nil state") - return fmt.Errorf("cannot send confirmation for nil state") - } - - log.Printf( - "sending confirmation, round: %d, hash: %s\n", - finalized.Round, - finalized.Hash, - ) - - if m.messageBus != nil { - // Make a copy to avoid sharing pointers - confirmationCopy := &consensusData{ - Round: finalized.Round, - Hash: finalized.Hash, - Votes: make(map[string]interface{}), - Proof: finalized.Proof, - IsProver: finalized.IsProver, - Timestamp: finalized.Timestamp, - ProposerID: finalized.ProposerID, - } - // Copy votes map - for k, v := range finalized.Votes { - confirmationCopy.Votes[k] = v - } - - m.messageBus.Broadcast(Message{ - Type: "confirmation", - Sender: m.nodeID, - Data: confirmationCopy, - }) - } - - return nil -} - -func (m *MockVotingProvider) Reset() { - m.mu.Lock() - defer m.mu.Unlock() - m.votes = make(map[string]*vote) - log.Printf( - "reset voting provider, current round: %d\n", - m.currentRound, - ) -} - -func (m *MockVotingProvider) SetRound(round uint64) { - m.mu.Lock() - defer m.mu.Unlock() - m.currentRound = round - log.Printf("voting provider round updated, round: %d\n", round) -} - -// MockLeaderProvider implements LeaderProvider -type MockLeaderProvider struct { - isProver bool - nodeID string -} - -func (m *MockLeaderProvider) GetNextLeaders( - ctx context.Context, - prior *consensusData, -) ([]peerID, error) { - // Simple round-robin leader selection - round := uint64(0) - if prior != nil { - round = prior.Round - } - - nodes := []string{ - "prover-node-1", - "validator-node-1", - "validator-node-2", - "validator-node-3", - } - - // Select leader based on round - leaderIdx := int(round % uint64(len(nodes))) - leaders := []peerID{ - {ID: nodes[leaderIdx]}, - {ID: nodes[uint64(leaderIdx+1)%uint64(len(nodes))]}, - {ID: nodes[uint64(leaderIdx+2)%uint64(len(nodes))]}, - {ID: nodes[uint64(leaderIdx+3)%uint64(len(nodes))]}, - } - - fmt.Printf( - "selected next leaders, round: %d, leader: %s\n", - round, - leaders[0].ID, - ) - - return leaders, nil -} - -func (m *MockLeaderProvider) ProveNextState( - ctx context.Context, - prior *consensusData, - collected CollectedData, -) (*consensusData, error) { - priorRound := uint64(0) - if prior != nil { - priorRound = prior.Round - } - - select { - case <-time.After(500 * time.Millisecond): - proof := map[string]interface{}{ - "proof": "mock_proof_data", - "timestamp": time.Now(), - "prover": m.nodeID, - } - - newState := &consensusData{ - Round: priorRound + 1, - Hash: fmt.Sprintf("block_%d", priorRound+1), - Votes: make(map[string]interface{}), - Proof: proof, - IsProver: true, - Timestamp: time.Now(), - ProposerID: m.nodeID, - } - - return newState, nil - case <-ctx.Done(): - return nil, ctx.Err() - } -} - -// MockLivenessProvider implements LivenessProvider -type MockLivenessProvider struct { - round uint64 - nodeID string - messageBus *MessageBus -} - -func (m *MockLivenessProvider) Collect( - ctx context.Context, -) (CollectedData, error) { - fmt.Println("collecting mutations") - - // Simulate collecting some mutations - mutations := []string{ - "mutation_1", - "mutation_2", - "mutation_3", - } - - return CollectedData{ - Round: m.round, - Mutations: mutations, - Timestamp: time.Now(), - }, nil -} - -func (m *MockLivenessProvider) SendLiveness( - ctx context.Context, - prior *consensusData, - collected CollectedData, -) error { - round := uint64(0) - if prior != nil { - round = prior.Round - } - - fmt.Printf( - "sending liveness signal, round: %d, mutations: %d\n", - round, - len(collected.Mutations), - ) - - if m.messageBus != nil { - // Make a copy to avoid sharing pointers - collectedCopy := CollectedData{ - Round: round + 1, - Mutations: make([]string, len(collected.Mutations)), - Timestamp: collected.Timestamp, - } - copy(collectedCopy.Mutations, collected.Mutations) - - m.messageBus.Broadcast(Message{ - Type: "liveness_check", - Sender: m.nodeID, - Data: collectedCopy, - }) - } - - return nil -} - -// ConsensusNode represents a node using the generic state machine -type ConsensusNode struct { - p *pacemaker.Pacemaker[ - consensusData, - vote, - peerID, - CollectedData, - ] - sm *consensus.StateMachine[ - consensusData, - vote, - peerID, - CollectedData, - ] - nodeID string - ctx context.Context - cancel context.CancelFunc - messageBus *MessageBus - msgChan chan Message - votingProvider *MockVotingProvider - livenessProvider *MockLivenessProvider - isMalicious bool -} - -// NewConsensusNode creates a new consensus node -func NewConsensusNode( - nodeID string, - isProver bool, - voteTarget int, -) *ConsensusNode { - return newConsensusNodeWithBehavior( - nodeID, - isProver, - voteTarget, - false, - ) -} - -// NewMaliciousNode creates a new malicious consensus node -func NewMaliciousNode( - nodeID string, - isProver bool, - voteTarget int, -) *ConsensusNode { - return newConsensusNodeWithBehavior( - nodeID, - isProver, - voteTarget, - true, - ) -} - -func newConsensusNodeWithBehavior( - nodeID string, - isProver bool, - voteTarget int, - isMalicious bool, -) *ConsensusNode { - // Create initial consensus data - initialData := &consensusData{ - Round: 0, - Hash: "genesis", - Votes: make(map[string]interface{}), - IsProver: isProver, - Timestamp: time.Now(), - ProposerID: "genesis", - } - - // Create mock implementations - syncProvider := &MockSyncProvider{} - - var votingProvider *MockVotingProvider - if isMalicious { - votingProvider = NewMaliciousVotingProvider(voteTarget, nodeID) - } else { - votingProvider = NewMockVotingProvider(voteTarget, nodeID) - } - - leaderProvider := &MockLeaderProvider{ - isProver: isProver, - nodeID: nodeID, - } - - livenessProvider := &MockLivenessProvider{ - nodeID: nodeID, - } - - // Create the state machine - sm := consensus.NewStateMachine[consensusData, vote, peerID, CollectedData]( - peerID{ID: nodeID}, - initialData, - true, - func() uint64 { return uint64(3) }, - syncProvider, - votingProvider, - leaderProvider, - livenessProvider, - tracer{}, - ) - - p, err := pacemaker.NewPacemaker[consensusData, vote, peerID, CollectedData]( - peerID{ID: nodeID}, - func() *models.LivenessState { - return &models.LivenessState{ - Filter: nil, - CurrentRank: 0, - LatestQuorumCertificate: &quorumCertificate{}, - PriorRankTimeoutCertificate: nil, - } - }, - func() uint64 { return uint64(3) }, - votingProvider, - leaderProvider, - livenessProvider, - sm, - &store{}, - tracer{}, - ) - if err != nil { - panic(err) - } - - ctx, cancel := context.WithCancel(context.Background()) - - node := &ConsensusNode{ - p: p, - sm: sm, - nodeID: nodeID, - ctx: ctx, - cancel: cancel, - votingProvider: votingProvider, - livenessProvider: livenessProvider, - isMalicious: isMalicious, - } - - // Add transition listener - sm.AddListener(&NodeTransitionListener{ - node: node, - }) - - return node -} - -type tracer struct { -} - -// Error implements consensus.TraceLogger. -func (t tracer) Error(message string, err error) { - fmt.Println(message, err) -} - -// Trace implements consensus.TraceLogger. -func (t tracer) Trace(message string) { - fmt.Println(message) -} - -// Start begins the consensus node -func (n *ConsensusNode) Start() error { - fmt.Printf("starting consensus node, node id: %s\n", n.nodeID) - - // Start monitoring for messages - go n.monitor() - - return n.p.Start(n.ctx) -} - -// Stop halts the consensus node -func (n *ConsensusNode) Stop() error { - fmt.Printf("stopping consensus node, node id: %s\n", n.nodeID) - n.cancel() - return nil -} - -// SetMessageBus connects the node to the message bus -func (n *ConsensusNode) SetMessageBus(mb *MessageBus) { - n.messageBus = mb - n.msgChan = mb.Subscribe(n.nodeID) - - // Also set message bus on providers - if n.votingProvider != nil { - n.votingProvider.messageBus = mb - } - if n.livenessProvider != nil { - n.livenessProvider.messageBus = mb - } -} - -// monitor handles incoming messages -func (n *ConsensusNode) monitor() { - for { - select { - case <-n.ctx.Done(): - return - case msg := <-n.msgChan: - n.handleMessage(msg) - } - } -} - -// handleMessage processes messages from other nodes -func (n *ConsensusNode) handleMessage(msg Message) { - fmt.Printf( - "received message, type: %s, from: %s\n", - msg.Type, - msg.Sender, - ) - - switch msg.Type { - case "proposal": - if proposal, ok := msg.Data.(*consensusData); ok { - n.sm.ReceiveProposal(proposal.Round, peerID{ID: msg.Sender}, proposal) - } - case "vote": - if vote, ok := msg.Data.(*vote); ok { - n.sm.ReceiveVote( - peerID{ID: vote.ProposerID}, - peerID{ID: msg.Sender}, - vote, - ) - } - case "liveness_check": - if collected, ok := msg.Data.(CollectedData); ok { - n.sm.ReceiveLivenessCheck(peerID{ID: msg.Sender}, collected) - } - case "confirmation": - if confirmation, ok := msg.Data.(*consensusData); ok { - n.sm.ReceiveConfirmation(peerID{ID: msg.Sender}, confirmation) - } - } -} - -// NodeTransitionListener handles state transitions -type NodeTransitionListener struct { - node *ConsensusNode -} - -func (l *NodeTransitionListener) OnTransition( - from consensus.State, - to consensus.State, - event consensus.Event, -) { - fmt.Printf( - "state transition, node id: %s, from: %s, to: %s, event: %s\n", - l.node.nodeID, - string(from), - string(to), - string(event), - ) - - // Handle state-specific actions - switch to { - case consensus.StateVoting: - if from != consensus.StateVoting { - go l.handleEnterVoting() - } - case consensus.StateCollecting: - go l.handleEnterCollecting() - case consensus.StatePublishing: - go l.handleEnterPublishing() - } -} - -func (l *NodeTransitionListener) handleEnterVoting() { - // Wait a bit to ensure we're in voting state - time.Sleep(50 * time.Millisecond) - - // Malicious nodes exhibit Byzantine behavior - if l.node.isMalicious { - fmt.Printf( - "MALICIOUS NODE: Executing Byzantine behavior, node id: %s\n", - l.node.nodeID, - ) - - // Byzantine behavior: Send different votes to different nodes - nodes := []string{ - "prover-node-1", - "validator-node-1", - "validator-node-2", - "validator-node-3", - } - voteValues := []string{"reject", "reject", "approve", "reject"} - - for i, targetNode := range nodes { - if targetNode == l.node.nodeID { - continue - } - - // Create conflicting vote - vt := &vote{ - NodeID: l.node.nodeID, - Round: 0, // Will be updated based on proposals - VoteValue: voteValues[i], - Timestamp: time.Now(), - ProposerID: targetNode, - } - - fmt.Printf( - "MALICIOUS: Sending conflicting vote, node id: %s, target: %s, vote: %s\n", - l.node.nodeID, - targetNode, - voteValues[i], - ) - - if i == 0 && l.node.messageBus != nil { - // Make a copy to avoid sharing pointers - voteCopy := &vote{ - NodeID: vt.NodeID, - Round: vt.Round, - VoteValue: vt.VoteValue, - Timestamp: vt.Timestamp, - ProposerID: vt.ProposerID, - } - l.node.messageBus.Broadcast(Message{ - Type: "vote", - Sender: l.node.nodeID, - Data: voteCopy, - }) - } - } - - // Also try to vote multiple times with same value - time.Sleep(100 * time.Millisecond) - doubleVote := &vote{ - NodeID: l.node.nodeID, - Round: 0, - VoteValue: "approve", - Timestamp: time.Now(), - ProposerID: nodes[0], - } - - fmt.Printf( - "MALICIOUS: Attempting double vote, node id: %s\n", - l.node.nodeID, - ) - - l.node.sm.ReceiveVote( - peerID{ID: nodes[0]}, - peerID{ID: l.node.nodeID}, - doubleVote, - ) - - if l.node.messageBus != nil { - // Make a copy to avoid sharing pointers - doubleVoteCopy := &vote{ - NodeID: doubleVote.NodeID, - Round: doubleVote.Round, - VoteValue: doubleVote.VoteValue, - Timestamp: doubleVote.Timestamp, - ProposerID: doubleVote.ProposerID, - } - l.node.messageBus.Broadcast(Message{ - Type: "vote", - Sender: l.node.nodeID, - Data: doubleVoteCopy, - }) - } - - return - } - - fmt.Printf( - "entering voting state, node id: %s\n", - l.node.nodeID, - ) -} - -func (l *NodeTransitionListener) handleEnterCollecting() { - fmt.Printf( - "entered collecting state, node id: %s\n", - l.node.nodeID, - ) - - // Reset vote handler for new round - l.node.votingProvider.Reset() -} - -func (l *NodeTransitionListener) handleEnterPublishing() { - fmt.Printf( - "entered publishing state, node id: %s\n", - l.node.nodeID, - ) -} - -// MessageBus simulates network communication -type MessageBus struct { - mu sync.RWMutex - subscribers map[string]chan Message -} - -type Message struct { - Type string - Sender string - Data interface{} -} - -func NewMessageBus() *MessageBus { - return &MessageBus{ - subscribers: make(map[string]chan Message), - } -} - -func (mb *MessageBus) Subscribe(nodeID string) chan Message { - mb.mu.Lock() - defer mb.mu.Unlock() - - ch := make(chan Message, 100) - mb.subscribers[nodeID] = ch - return ch -} - -func (mb *MessageBus) Broadcast(msg Message) { - mb.mu.RLock() - defer mb.mu.RUnlock() - - for nodeID, ch := range mb.subscribers { - if nodeID != msg.Sender { - select { - case ch <- msg: - default: - } - } - } -} - -func main() { - // Create message bus - messageBus := NewMessageBus() - - // Create nodes (1 prover, 2 validators, 1 malicious validator) - // Note: We need 4 nodes total with vote target of 3 to demonstrate Byzantine - // fault tolerance - nodes := []*ConsensusNode{ - NewConsensusNode("prover-node-1", true, 3), - NewConsensusNode("validator-node-1", true, 3), - NewConsensusNode("validator-node-2", true, 3), - NewMaliciousNode("validator-node-3", false, 3), - } - - // Connect nodes to message bus - for _, node := range nodes { - node.SetMessageBus(messageBus) - } - - // Start all nodes - fmt.Println("=== Starting Consensus Network with Generic State Machine ===") - fmt.Println("Using the generic state machine from consensus package") - fmt.Println("Network includes 1 MALICIOUS node (validator-node-3) demonstrating Byzantine behavior") - - for _, node := range nodes { - if err := node.Start(); err != nil { - fmt.Printf( - "failed to start node, node id: %s, %v\n", - node.nodeID, - err, - ) - } - } - - // Run for a while - time.Sleep(30 * time.Second) - - // Print statistics - fmt.Println("=== Node Statistics ===") - for _, node := range nodes { - viz := consensus.NewStateMachineViz(node.sm) - - fmt.Printf("\nStats for %s:\n%s", - node.nodeID, - viz.GetStateStats()) - - fmt.Printf( - "final state, node id: %s, current state: %s, transition count: %s, malicious: %v\n", - node.nodeID, - string(node.sm.GetState()), - node.sm.GetTransitionCount(), - node.isMalicious, - ) - } - - // Generate visualization - if len(nodes) > 0 { - viz := consensus.NewStateMachineViz(nodes[0].sm) - fmt.Println("\nState Machine Diagram:\n" + viz.GenerateMermaidDiagram()) - } - - // Stop all nodes - fmt.Println("=== Stopping Consensus Network ===") - for _, node := range nodes { - if err := node.Stop(); err != nil { - fmt.Printf( - "failed to stop node, node id: %s, %v\n", - node.nodeID, - err, - ) - } - } - - time.Sleep(2 * time.Second) -} diff --git a/consensus/forks/forks.go b/consensus/forks/forks.go index 7b23fd7..5419e97 100644 --- a/consensus/forks/forks.go +++ b/consensus/forks/forks.go @@ -34,7 +34,7 @@ func NewForks[StateT models.Unique, VoteT models.Unique]( finalizationCallback consensus.Finalizer, notifier consensus.FollowerConsumer[StateT, VoteT], ) (*Forks[StateT, VoteT], error) { - if (trustedRoot.State.Identifier != trustedRoot.CertifyingQuorumCertificate.GetSelector()) || + if (trustedRoot.State.Identifier != trustedRoot.CertifyingQuorumCertificate.Identity()) || (trustedRoot.State.Rank != trustedRoot.CertifyingQuorumCertificate.GetRank()) { return nil, models.NewConfigurationErrorf( @@ -209,12 +209,12 @@ func (f *Forks[StateT, VoteT]) EnsureStateIsValidExtension( // For a state whose parent is _not_ below the pruning height, we expect the // parent to be known. _, isParentKnown := f.forest.GetVertex( - state.ParentQuorumCertificate.GetSelector(), + state.ParentQuorumCertificate.Identity(), ) if !isParentKnown { // missing parent return models.MissingStateError{ Rank: state.ParentQuorumCertificate.GetRank(), - Identifier: state.ParentQuorumCertificate.GetSelector(), + Identifier: state.ParentQuorumCertificate.Identity(), } } return nil @@ -338,7 +338,7 @@ func (f *Forks[StateT, VoteT]) AddValidatedState( // based on certified states. // The certified parent essentially combines the parent, with the QC contained // in state, to drive finalization. - parent, found := f.GetState(proposal.ParentQuorumCertificate.GetSelector()) + parent, found := f.GetState(proposal.ParentQuorumCertificate.Identity()) if !found { // Not finding the parent means it is already pruned; hence this state does // not change the finalization state. @@ -418,7 +418,7 @@ func (f *Forks[StateT, VoteT]) checkForConflictingQCs( it := f.forest.GetVerticesAtLevel((*qc).GetRank()) for it.HasNext() { otherState := it.NextVertex() // by construction, must have same rank as qc.Rank - if (*qc).GetSelector() != otherState.VertexID() { + if (*qc).Identity() != otherState.VertexID() { // * we have just found another state at the same rank number as qc.Rank // but with different hash // * if this state has a child c, this child will have @@ -431,7 +431,7 @@ func (f *Forks[StateT, VoteT]) checkForConflictingQCs( conflictingQC := otherChild.ParentQuorumCertificate return models.ByzantineThresholdExceededError{Evidence: fmt.Sprintf( "conflicting QCs at rank %d: %x and %x", - (*qc).GetRank(), (*qc).GetSelector(), conflictingQC.GetSelector(), + (*qc).GetRank(), (*qc).Identity(), conflictingQC.Identity(), )} } } @@ -506,12 +506,12 @@ func (f *Forks[StateT, VoteT]) checkForAdvancingFinalization( // above qcForParent := certifiedState.State.ParentQuorumCertificate parentVertex, parentStateKnown := f.forest.GetVertex( - qcForParent.GetSelector(), + qcForParent.Identity(), ) if !parentStateKnown { return models.MissingStateError{ Rank: qcForParent.GetRank(), - Identifier: qcForParent.GetSelector(), + Identifier: qcForParent.Identity(), } } parentState := parentVertex.(*StateContainer[StateT]).GetState() @@ -550,7 +550,7 @@ func (f *Forks[StateT, VoteT]) checkForAdvancingFinalization( if err != nil { return fmt.Errorf( "advancing finalization to state %x from rank %d failed: %w", - qcForParent.GetSelector(), + qcForParent.Identity(), qcForParent.GetRank(), err, ) @@ -614,12 +614,12 @@ func (f *Forks[StateT, VoteT]) collectStatesForFinalization( l := (*qc).GetRank() - lastFinalized.Rank // l is an upper limit to the number of states that can be maximally finalized statesToBeFinalized := make([]*models.State[StateT], l) for (*qc).GetRank() > lastFinalized.Rank { - b, ok := f.GetState((*qc).GetSelector()) + b, ok := f.GetState((*qc).Identity()) if !ok { return nil, fmt.Errorf( "failed to get state (rank=%d, stateID=%x) for finalization", (*qc).GetRank(), - (*qc).GetSelector(), + (*qc).Identity(), ) } l-- @@ -641,10 +641,10 @@ func (f *Forks[StateT, VoteT]) collectStatesForFinalization( )} } if (*qc).GetRank() == lastFinalized.Rank && - lastFinalized.Identifier != (*qc).GetSelector() { + lastFinalized.Identifier != (*qc).Identity() { return nil, models.ByzantineThresholdExceededError{Evidence: fmt.Sprintf( "finalizing states with rank %d at conflicting forks: %x and %x", - (*qc).GetRank(), (*qc).GetSelector(), lastFinalized.Identifier, + (*qc).GetRank(), (*qc).Identity(), lastFinalized.Identifier, )} } diff --git a/consensus/forks/forks_test.go b/consensus/forks/forks_test.go index 8380307..ac4e97a 100644 --- a/consensus/forks/forks_test.go +++ b/consensus/forks/forks_test.go @@ -857,7 +857,7 @@ func addCertifiedStatesToForks(forks *Forks[*helper.TestState, *helper.TestVote] uncertifiedStates := make(map[models.Identity]*models.State[*helper.TestState]) for _, b := range states { uncertifiedStates[b.Identifier] = b - parentID := b.ParentQuorumCertificate.GetSelector() + parentID := b.ParentQuorumCertificate.Identity() parent, found := uncertifiedStates[parentID] if !found { continue diff --git a/consensus/forks/state_container.go b/consensus/forks/state_container.go index a716edf..71cd7d3 100644 --- a/consensus/forks/state_container.go +++ b/consensus/forks/state_container.go @@ -37,7 +37,7 @@ func (b *StateContainer[StateT]) Parent() (models.Identity, uint64) { if b.ParentQuorumCertificate == nil { return "", 0 } - return b.ParentQuorumCertificate.GetSelector(), + return b.ParentQuorumCertificate.Identity(), b.ParentQuorumCertificate.GetRank() } diff --git a/consensus/helper/quorum_certificate.go b/consensus/helper/quorum_certificate.go index c14bdb3..ae0b068 100644 --- a/consensus/helper/quorum_certificate.go +++ b/consensus/helper/quorum_certificate.go @@ -20,7 +20,7 @@ func (t *TestAggregatedSignature) GetSignature() []byte { return t.Signature } -func (t *TestAggregatedSignature) GetPublicKey() []byte { +func (t *TestAggregatedSignature) GetPubKey() []byte { return t.PublicKey } @@ -33,7 +33,7 @@ type TestQuorumCertificate struct { Rank uint64 FrameNumber uint64 Selector models.Identity - Timestamp int64 + Timestamp uint64 AggregatedSignature models.AggregatedSignature } @@ -49,11 +49,11 @@ func (t *TestQuorumCertificate) GetFrameNumber() uint64 { return t.FrameNumber } -func (t *TestQuorumCertificate) GetSelector() models.Identity { +func (t *TestQuorumCertificate) Identity() models.Identity { return t.Selector } -func (t *TestQuorumCertificate) GetTimestamp() int64 { +func (t *TestQuorumCertificate) GetTimestamp() uint64 { return t.Timestamp } @@ -65,15 +65,15 @@ func (t *TestQuorumCertificate) Equals(other models.QuorumCertificate) bool { return bytes.Equal(t.Filter, other.GetFilter()) && t.Rank == other.GetRank() && t.FrameNumber == other.GetFrameNumber() && - t.Selector == other.GetSelector() && + t.Selector == other.Identity() && t.Timestamp == other.GetTimestamp() && bytes.Equal( t.AggregatedSignature.GetBitmask(), other.GetAggregatedSignature().GetBitmask(), ) && bytes.Equal( - t.AggregatedSignature.GetPublicKey(), - other.GetAggregatedSignature().GetPublicKey(), + t.AggregatedSignature.GetPubKey(), + other.GetAggregatedSignature().GetPubKey(), ) && bytes.Equal( t.AggregatedSignature.GetSignature(), @@ -88,7 +88,7 @@ func MakeQC(options ...func(*TestQuorumCertificate)) models.QuorumCertificate { Rank: rand.Uint64(), FrameNumber: rand.Uint64() + 1, Selector: string(s), - Timestamp: time.Now().UnixMilli(), + Timestamp: uint64(time.Now().UnixMilli()), AggregatedSignature: &TestAggregatedSignature{ PublicKey: make([]byte, 585), Signature: make([]byte, 74), diff --git a/consensus/helper/timeout_certificate.go b/consensus/helper/timeout_certificate.go index 3b25192..90bef9f 100644 --- a/consensus/helper/timeout_certificate.go +++ b/consensus/helper/timeout_certificate.go @@ -47,8 +47,8 @@ func (t *TestTimeoutCertificate) Equals(other models.TimeoutCertificate) bool { other.GetAggregatedSignature().GetBitmask(), ) && bytes.Equal( - t.AggregatedSignature.GetPublicKey(), - other.GetAggregatedSignature().GetPublicKey(), + t.AggregatedSignature.GetPubKey(), + other.GetAggregatedSignature().GetPubKey(), ) && bytes.Equal( t.AggregatedSignature.GetSignature(), diff --git a/consensus/integration/assertion_test.go b/consensus/integration/assertion_test.go index 384b745..767e033 100644 --- a/consensus/integration/assertion_test.go +++ b/consensus/integration/assertion_test.go @@ -22,7 +22,7 @@ func FinalizedStates(in *Instance) []*models.State[*helper.TestState] { break } finalizedState, found = - in.headers[finalizedState.ParentQuorumCertificate.GetSelector()] + in.headers[finalizedState.ParentQuorumCertificate.Identity()] if !found { break } diff --git a/consensus/integration/connect_test.go b/consensus/integration/connect_test.go index 3ed1b79..c000f89 100644 --- a/consensus/integration/connect_test.go +++ b/consensus/integration/connect_test.go @@ -28,10 +28,10 @@ func Connect(t *testing.T, instances []*Instance) { require.True(t, ok) // sender should always have the parent sender.updatingStates.RLock() - _, exists := sender.headers[proposal.State.ParentQuorumCertificate.GetSelector()] + _, exists := sender.headers[proposal.State.ParentQuorumCertificate.Identity()] sender.updatingStates.RUnlock() if !exists { - t.Fatalf("parent for proposal not found (sender: %x, parent: %x)", sender.localID, proposal.State.ParentQuorumCertificate.GetSelector()) + t.Fatalf("parent for proposal not found (sender: %x, parent: %x)", sender.localID, proposal.State.ParentQuorumCertificate.Identity()) } // store locally and loop back to engine for processing diff --git a/consensus/integration/instance_test.go b/consensus/integration/instance_test.go index a179b6a..c7b00ea 100644 --- a/consensus/integration/instance_test.go +++ b/consensus/integration/instance_test.go @@ -270,7 +270,7 @@ func NewInstance(t *testing.T, options ...Option) *Instance { Rank: votes[0].Rank, FrameNumber: votes[0].Rank, Selector: votes[0].StateID, - Timestamp: time.Now().UnixMilli(), + Timestamp: uint64(time.Now().UnixMilli()), AggregatedSignature: &helper.TestAggregatedSignature{ Signature: make([]byte, 74), Bitmask: bitmask, @@ -295,11 +295,11 @@ func NewInstance(t *testing.T, options ...Option) *Instance { // sender should always have the parent in.updatingStates.RLock() - _, exists := in.headers[proposal.State.ParentQuorumCertificate.GetSelector()] + _, exists := in.headers[proposal.State.ParentQuorumCertificate.Identity()] in.updatingStates.RUnlock() if !exists { - t.Fatalf("parent for proposal not found parent: %x", proposal.State.ParentQuorumCertificate.GetSelector()) + t.Fatalf("parent for proposal not found parent: %x", proposal.State.ParentQuorumCertificate.Identity()) } // store locally and loop back to engine for processing @@ -365,7 +365,7 @@ func NewInstance(t *testing.T, options ...Option) *Instance { Rank: rootState.Rank, FrameNumber: rootState.Rank, Selector: rootState.Identifier, - Timestamp: time.Now().UnixMilli(), + Timestamp: uint64(time.Now().UnixMilli()), AggregatedSignature: &helper.TestAggregatedSignature{ Signature: make([]byte, 74), Bitmask: []byte{0b11111111, 0b00000000}, @@ -410,10 +410,10 @@ func NewInstance(t *testing.T, options ...Option) *Instance { in.queue <- qc } - voteProcessorFactory := mocks.NewVoteProcessorFactory[*helper.TestState, *helper.TestVote](t) - voteProcessorFactory.On("Create", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return( - func(tracer consensus.TraceLogger, proposal *models.SignedProposal[*helper.TestState, *helper.TestVote], dsTag []byte, aggregator consensus.SignatureAggregator) consensus.VerifyingVoteProcessor[*helper.TestState, *helper.TestVote] { - processor, err := votecollector.NewBootstrapVoteProcessor( + voteProcessorFactory := mocks.NewVoteProcessorFactory[*helper.TestState, *helper.TestVote, *helper.TestPeer](t) + voteProcessorFactory.On("Create", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return( + func(tracer consensus.TraceLogger, proposal *models.SignedProposal[*helper.TestState, *helper.TestVote], dsTag []byte, aggregator consensus.SignatureAggregator, votingProvider consensus.VotingProvider[*helper.TestState, *helper.TestVote, *helper.TestPeer]) consensus.VerifyingVoteProcessor[*helper.TestState, *helper.TestVote] { + processor, err := votecollector.NewBootstrapVoteProcessor[*helper.TestState, *helper.TestVote, *helper.TestPeer]( in.logger, in.committee, proposal.State, @@ -441,7 +441,7 @@ func NewInstance(t *testing.T, options ...Option) *Instance { ) (models.QuorumCertificate, error) { return &helper.TestQuorumCertificate{ Rank: state.Rank, - Timestamp: int64(state.Timestamp), + Timestamp: state.Timestamp, FrameNumber: state.Rank, Selector: state.Identifier, AggregatedSignature: aggregatedSignature, @@ -475,11 +475,11 @@ func NewInstance(t *testing.T, options ...Option) *Instance { }, nil }).Maybe() sigAgg.On("VerifySignatureRaw", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(true, nil).Maybe() - createCollectorFactoryMethod := votecollector.NewStateMachineFactory(in.logger, voteAggregationDistributor, voteProcessorFactory.Create, []byte{}, sigAgg) - voteCollectors := voteaggregator.NewVoteCollectors(in.logger, livenessData.CurrentRank, workerpool.New(2), createCollectorFactoryMethod) + createCollectorFactoryMethod := votecollector.NewStateMachineFactory(in.logger, voteAggregationDistributor, voteProcessorFactory.Create, []byte{}, sigAgg, in.voting) + voteCollectors := voteaggregator.NewVoteCollectors[*helper.TestState, *helper.TestVote](in.logger, livenessData.CurrentRank, workerpool.New(2), createCollectorFactoryMethod) // initialize the vote aggregator - in.voteAggregator, err = voteaggregator.NewVoteAggregator( + in.voteAggregator, err = voteaggregator.NewVoteAggregator[*helper.TestState, *helper.TestVote]( in.logger, voteAggregationDistributor, livenessData.CurrentRank, @@ -543,7 +543,7 @@ func NewInstance(t *testing.T, options ...Option) *Instance { nil, ).Maybe() - p, err := timeoutcollector.NewTimeoutProcessor( + p, err := timeoutcollector.NewTimeoutProcessor[*helper.TestState, *helper.TestVote, *helper.TestPeer]( in.logger, in.committee, in.validator, @@ -692,7 +692,7 @@ func (in *Instance) Run(t *testing.T) error { func (in *Instance) ProcessState(proposal *models.SignedProposal[*helper.TestState, *helper.TestVote]) { in.updatingStates.Lock() defer in.updatingStates.Unlock() - _, parentExists := in.headers[proposal.State.ParentQuorumCertificate.GetSelector()] + _, parentExists := in.headers[proposal.State.ParentQuorumCertificate.Identity()] if parentExists { next := proposal @@ -701,11 +701,11 @@ func (in *Instance) ProcessState(proposal *models.SignedProposal[*helper.TestSta in.queue <- next // keep processing the pending states - next = in.pendings[next.State.ParentQuorumCertificate.GetSelector()] + next = in.pendings[next.State.ParentQuorumCertificate.Identity()] } } else { // cache it in pendings by ParentID - in.pendings[proposal.State.ParentQuorumCertificate.GetSelector()] = proposal + in.pendings[proposal.State.ParentQuorumCertificate.Identity()] = proposal } } diff --git a/consensus/mocks/vote_processor_factory.go b/consensus/mocks/vote_processor_factory.go index 72b24cd..d1b0a95 100644 --- a/consensus/mocks/vote_processor_factory.go +++ b/consensus/mocks/vote_processor_factory.go @@ -10,13 +10,13 @@ import ( ) // VoteProcessorFactory is an autogenerated mock type for the VoteProcessorFactory type -type VoteProcessorFactory[StateT models.Unique, VoteT models.Unique] struct { +type VoteProcessorFactory[StateT models.Unique, VoteT models.Unique, PeerIDT models.Unique] struct { mock.Mock } // Create provides a mock function with given fields: tracer, proposal, dsTag, aggregator -func (_m *VoteProcessorFactory[StateT, VoteT]) Create(tracer consensus.TraceLogger, proposal *models.SignedProposal[StateT, VoteT], dsTag []byte, aggregator consensus.SignatureAggregator) (consensus.VerifyingVoteProcessor[StateT, VoteT], error) { - ret := _m.Called(tracer, proposal, dsTag, aggregator) +func (_m *VoteProcessorFactory[StateT, VoteT, PeerIDT]) Create(tracer consensus.TraceLogger, proposal *models.SignedProposal[StateT, VoteT], dsTag []byte, aggregator consensus.SignatureAggregator, voter consensus.VotingProvider[StateT, VoteT, PeerIDT]) (consensus.VerifyingVoteProcessor[StateT, VoteT], error) { + ret := _m.Called(tracer, proposal, dsTag, aggregator, voter) if len(ret) == 0 { panic("no return value specified for Create") @@ -24,19 +24,19 @@ func (_m *VoteProcessorFactory[StateT, VoteT]) Create(tracer consensus.TraceLogg var r0 consensus.VerifyingVoteProcessor[StateT, VoteT] var r1 error - if rf, ok := ret.Get(0).(func(consensus.TraceLogger, *models.SignedProposal[StateT, VoteT], []byte, consensus.SignatureAggregator) (consensus.VerifyingVoteProcessor[StateT, VoteT], error)); ok { - return rf(tracer, proposal, dsTag, aggregator) + if rf, ok := ret.Get(0).(func(consensus.TraceLogger, *models.SignedProposal[StateT, VoteT], []byte, consensus.SignatureAggregator, consensus.VotingProvider[StateT, VoteT, PeerIDT]) (consensus.VerifyingVoteProcessor[StateT, VoteT], error)); ok { + return rf(tracer, proposal, dsTag, aggregator, voter) } - if rf, ok := ret.Get(0).(func(consensus.TraceLogger, *models.SignedProposal[StateT, VoteT], []byte, consensus.SignatureAggregator) consensus.VerifyingVoteProcessor[StateT, VoteT]); ok { - r0 = rf(tracer, proposal, dsTag, aggregator) + if rf, ok := ret.Get(0).(func(consensus.TraceLogger, *models.SignedProposal[StateT, VoteT], []byte, consensus.SignatureAggregator, consensus.VotingProvider[StateT, VoteT, PeerIDT]) consensus.VerifyingVoteProcessor[StateT, VoteT]); ok { + r0 = rf(tracer, proposal, dsTag, aggregator, voter) } else { if ret.Get(0) != nil { r0 = ret.Get(0).(consensus.VerifyingVoteProcessor[StateT, VoteT]) } } - if rf, ok := ret.Get(1).(func(consensus.TraceLogger, *models.SignedProposal[StateT, VoteT], []byte, consensus.SignatureAggregator) error); ok { - r1 = rf(tracer, proposal, dsTag, aggregator) + if rf, ok := ret.Get(1).(func(consensus.TraceLogger, *models.SignedProposal[StateT, VoteT], []byte, consensus.SignatureAggregator, consensus.VotingProvider[StateT, VoteT, PeerIDT]) error); ok { + r1 = rf(tracer, proposal, dsTag, aggregator, voter) } else { r1 = ret.Error(1) } @@ -46,11 +46,11 @@ func (_m *VoteProcessorFactory[StateT, VoteT]) Create(tracer consensus.TraceLogg // NewVoteProcessorFactory creates a new instance of VoteProcessorFactory. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. // The first argument is typically a *testing.T value. -func NewVoteProcessorFactory[StateT models.Unique, VoteT models.Unique](t interface { +func NewVoteProcessorFactory[StateT models.Unique, VoteT models.Unique, PeerIDT models.Unique](t interface { mock.TestingT Cleanup(func()) -}) *VoteProcessorFactory[StateT, VoteT] { - mock := &VoteProcessorFactory[StateT, VoteT]{} +}) *VoteProcessorFactory[StateT, VoteT, PeerIDT] { + mock := &VoteProcessorFactory[StateT, VoteT, PeerIDT]{} mock.Mock.Test(t) t.Cleanup(func() { mock.AssertExpectations(t) }) diff --git a/consensus/models/aggregated_signature.go b/consensus/models/aggregated_signature.go index 738d70a..63d8ee9 100644 --- a/consensus/models/aggregated_signature.go +++ b/consensus/models/aggregated_signature.go @@ -5,8 +5,8 @@ package models type AggregatedSignature interface { // GetSignature returns the aggregated signature in raw canonical bytes GetSignature() []byte - // GetPublicKey returns the public key in raw canonical bytes - GetPublicKey() []byte + // GetPubKey returns the public key in raw canonical bytes + GetPubKey() []byte // GetBitmask returns the bitmask of the signers in the signature, in matching // order to the clique's prover set (in ascending ring order). GetBitmask() []byte diff --git a/consensus/models/quorum_certificate.go b/consensus/models/quorum_certificate.go index 59b50ba..bee4d96 100644 --- a/consensus/models/quorum_certificate.go +++ b/consensus/models/quorum_certificate.go @@ -9,10 +9,10 @@ type QuorumCertificate interface { GetRank() uint64 // GetFrameNumber returns the frame number applied to the round. GetFrameNumber() uint64 - // GetSelector returns the selector of the frame. - GetSelector() Identity + // Identity returns the selector of the frame. + Identity() Identity // GetTimestamp returns the timestamp of the certificate. - GetTimestamp() int64 + GetTimestamp() uint64 // GetAggregatedSignature returns the set of signers who voted on the round. GetAggregatedSignature() AggregatedSignature // Equals compares inner equality with another quorum certificate. diff --git a/consensus/models/state.go b/consensus/models/state.go index 59170f6..0b12a98 100644 --- a/consensus/models/state.go +++ b/consensus/models/state.go @@ -74,12 +74,12 @@ func NewCertifiedState[StateT Unique]( quorumCertificate.GetRank(), ) } - if state.Identifier != quorumCertificate.GetSelector() { + if state.Identifier != quorumCertificate.Identity() { return &CertifiedState[StateT]{}, fmt.Errorf( "state's ID (%x) should equal the state referenced by the qc (%x)", state.Identifier, - quorumCertificate.GetSelector(), + quorumCertificate.Identity(), ) } return &CertifiedState[StateT]{ @@ -92,7 +92,7 @@ func NewCertifiedState[StateT Unique]( // produce a state vote). To avoid repeated computation, we use value from the // QuorumCertificate. func (b *CertifiedState[StateT]) Identifier() Identity { - return b.CertifyingQuorumCertificate.GetSelector() + return b.CertifyingQuorumCertificate.Identity() } // Rank returns rank where the state was proposed. diff --git a/consensus/notifications/log_consumer.go b/consensus/notifications/log_consumer.go index 778eaa7..e84c255 100644 --- a/consensus/notifications/log_consumer.go +++ b/consensus/notifications/log_consumer.go @@ -68,7 +68,7 @@ func (lc *LogConsumer[StateT, VoteT]) OnInvalidStateDetected( ), consensus.IdentityParam( "qc_state_id", - invalidState.ParentQuorumCertificate.GetSelector(), + invalidState.ParentQuorumCertificate.Identity(), ), ).Error("invalid state detected", err) } @@ -103,7 +103,7 @@ func (lc *LogConsumer[StateT, VoteT]) OnReceiveProposal( ), consensus.IdentityParam( "last_rank_tc_newest_qc_state_id", - lastRankTC.GetLatestQuorumCert().GetSelector(), + lastRankTC.GetLatestQuorumCert().Identity(), ), ) } @@ -118,7 +118,7 @@ func (lc *LogConsumer[StateT, VoteT]) OnReceiveQuorumCertificate( lc.log.With( consensus.Uint64Param("cur_rank", currentRank), consensus.Uint64Param("qc_rank", qc.GetRank()), - consensus.IdentityParam("qc_state_id", qc.GetSelector()), + consensus.IdentityParam("qc_state_id", qc.Identity()), ).Trace("processing QC") } @@ -132,7 +132,7 @@ func (lc *LogConsumer[StateT, VoteT]) OnReceiveTimeoutCertificate( consensus.Uint64Param("newest_qc_rank", tc.GetLatestQuorumCert().GetRank()), consensus.IdentityParam( "newest_qc_state_id", - tc.GetLatestQuorumCert().GetSelector(), + tc.GetLatestQuorumCert().Identity(), ), ).Trace("processing TC") } @@ -150,7 +150,7 @@ func (lc *LogConsumer[StateT, VoteT]) OnPartialTimeoutCertificate( ), consensus.IdentityParam( "qc_state_id", - partialTc.NewestQuorumCertificate.GetSelector(), + partialTc.NewestQuorumCertificate.Identity(), ), ) lastRankTC := partialTc.PriorRankTimeoutCertificate @@ -163,7 +163,7 @@ func (lc *LogConsumer[StateT, VoteT]) OnPartialTimeoutCertificate( ), consensus.IdentityParam( "last_rank_tc_newest_qc_state_id", - lastRankTC.GetLatestQuorumCert().GetSelector(), + lastRankTC.GetLatestQuorumCert().Identity(), ), ) } @@ -191,7 +191,7 @@ func (lc *LogConsumer[StateT, VoteT]) OnQuorumCertificateTriggeredRankChange( ) { lc.log.With( consensus.Uint64Param("qc_rank", qc.GetRank()), - consensus.IdentityParam("qc_state_id", qc.GetSelector()), + consensus.IdentityParam("qc_state_id", qc.Identity()), consensus.Uint64Param("old_rank", oldRank), consensus.Uint64Param("new_rank", newRank), ).Trace("QC triggered rank change") @@ -359,7 +359,7 @@ func (lc *LogConsumer[StateT, VoteT]) logBasicStateData( consensus.Uint64Param("qc_rank", state.ParentQuorumCertificate.GetRank()), consensus.IdentityParam( "qc_state_id", - state.ParentQuorumCertificate.GetSelector(), + state.ParentQuorumCertificate.Identity(), ), ) } @@ -374,7 +374,7 @@ func ( consensus.Uint64Param("newest_qc_rank", tc.GetLatestQuorumCert().GetRank()), consensus.IdentityParam( "newest_qc_state_id", - tc.GetLatestQuorumCert().GetSelector(), + tc.GetLatestQuorumCert().Identity(), ), ).Trace("TC constructed") } @@ -391,7 +391,7 @@ func (lc *LogConsumer[StateT, VoteT]) OnPartialTimeoutCertificateCreated( lc.log.With( consensus.Uint64Param("rank", rank), consensus.Uint64Param("newest_qc_rank", newestQC.GetRank()), - consensus.IdentityParam("newest_qc_state_id", newestQC.GetSelector()), + consensus.IdentityParam("newest_qc_state_id", newestQC.Identity()), consensus.StringParam("has_last_rank_tc", has), ).Trace("partial TC constructed") } @@ -401,7 +401,7 @@ func (lc *LogConsumer[StateT, VoteT]) OnNewQuorumCertificateDiscovered( ) { lc.log.With( consensus.Uint64Param("qc_rank", qc.GetRank()), - consensus.IdentityParam("qc_state_id", qc.GetSelector()), + consensus.IdentityParam("qc_state_id", qc.Identity()), ).Trace("new QC discovered") } @@ -413,7 +413,7 @@ func (lc *LogConsumer[StateT, VoteT]) OnNewTimeoutCertificateDiscovered( consensus.Uint64Param("newest_qc_rank", tc.GetLatestQuorumCert().GetRank()), consensus.IdentityParam( "newest_qc_state_id", - tc.GetLatestQuorumCert().GetSelector(), + tc.GetLatestQuorumCert().Identity(), ), ).Trace("new TC discovered") } @@ -466,7 +466,7 @@ func (lc *LogConsumer[StateT, VoteT]) OnOwnProposal( consensus.IdentityParam("state_id", header.State.Identifier), consensus.IdentityParam( "parent_qc_id", - header.State.ParentQuorumCertificate.GetSelector(), + header.State.ParentQuorumCertificate.Identity(), ), consensus.TimeParam( "timestamp", @@ -481,6 +481,6 @@ func (lc *LogConsumer[StateT, VoteT]) OnQuorumCertificateConstructedFromVotes( ) { lc.log.With( consensus.Uint64Param("rank", qc.GetRank()), - consensus.IdentityParam("state_id", qc.GetSelector()), + consensus.IdentityParam("state_id", qc.Identity()), ).Trace("QC constructed from votes") } diff --git a/consensus/participant/participant.go b/consensus/participant/participant.go new file mode 100644 index 0000000..289937f --- /dev/null +++ b/consensus/participant/participant.go @@ -0,0 +1,240 @@ +package participant + +import ( + "fmt" + "time" + + "github.com/gammazero/workerpool" + + "source.quilibrium.com/quilibrium/monorepo/consensus" + "source.quilibrium.com/quilibrium/monorepo/consensus/eventhandler" + "source.quilibrium.com/quilibrium/monorepo/consensus/eventloop" + "source.quilibrium.com/quilibrium/monorepo/consensus/forks" + "source.quilibrium.com/quilibrium/monorepo/consensus/models" + "source.quilibrium.com/quilibrium/monorepo/consensus/notifications/pubsub" + "source.quilibrium.com/quilibrium/monorepo/consensus/pacemaker" + "source.quilibrium.com/quilibrium/monorepo/consensus/pacemaker/timeout" + "source.quilibrium.com/quilibrium/monorepo/consensus/safetyrules" + "source.quilibrium.com/quilibrium/monorepo/consensus/stateproducer" + "source.quilibrium.com/quilibrium/monorepo/consensus/timeoutaggregator" + "source.quilibrium.com/quilibrium/monorepo/consensus/timeoutcollector" + "source.quilibrium.com/quilibrium/monorepo/consensus/validator" + "source.quilibrium.com/quilibrium/monorepo/consensus/verification" + "source.quilibrium.com/quilibrium/monorepo/consensus/voteaggregator" + "source.quilibrium.com/quilibrium/monorepo/consensus/votecollector" +) + +// NewParticipant initializes the EventLoop instance with needed dependencies +func NewParticipant[ + StateT models.Unique, + VoteT models.Unique, + PeerIDT models.Unique, + CollectedT models.Unique, +]( + logger consensus.TraceLogger, + committee consensus.DynamicCommittee, + prover consensus.LeaderProvider[StateT, PeerIDT, CollectedT], + voter consensus.VotingProvider[StateT, VoteT, PeerIDT], + voteProcessorFactory consensus.VoteProcessorFactory[StateT, VoteT, PeerIDT], + consensusStore consensus.ConsensusStore[VoteT], + signatureAggregator consensus.SignatureAggregator, + consensusVerifier consensus.Verifier[VoteT], + voteNotifier pubsub.VoteAggregationDistributor[StateT, VoteT], + timeoutNotifier *pubsub.TimeoutCollectorDistributor[VoteT], + consumer consensus.Consumer[StateT, VoteT], + finalizer consensus.Finalizer, + filter []byte, + trustedRoot *models.CertifiedState[StateT], + proposalDomain []byte, + timeoutDomain []byte, +) (*eventloop.EventLoop[StateT, VoteT], error) { + cfg, err := timeout.NewConfig( + 1*time.Second, + 3*time.Second, + 1.2, + 6, + 10*time.Second, + ) + if err != nil { + return nil, err + } + + livenessState, err := consensusStore.GetLivenessState() + if err != nil { + livenessState = &models.LivenessState{ + Filter: filter, + CurrentRank: 0, + LatestQuorumCertificate: trustedRoot.CertifyingQuorumCertificate, + PriorRankTimeoutCertificate: nil, + } + err = consensusStore.PutLivenessState(livenessState) + if err != nil { + return nil, err + } + } + + voteAggregationDistributor := pubsub.NewVoteAggregationDistributor[ + StateT, + VoteT, + ]() + createCollectorFactoryMethod := votecollector.NewStateMachineFactory( + logger, + voteAggregationDistributor, + votecollector.VerifyingVoteProcessorFactory[StateT, VoteT, PeerIDT]( + voteProcessorFactory.Create, + ), + proposalDomain, + signatureAggregator, + voter, + ) + voteCollectors := voteaggregator.NewVoteCollectors( + logger, + livenessState.CurrentRank, + workerpool.New(2), + createCollectorFactoryMethod, + ) + + // initialize the vote aggregator + voteAggregator, err := voteaggregator.NewVoteAggregator( + logger, + voteAggregationDistributor, + livenessState.CurrentRank, + voteCollectors, + ) + + // initialize the Validator + validator := validator.NewValidator[StateT, VoteT](committee, consensusVerifier) + + // initialize factories for timeout collector and timeout processor + timeoutAggregationDistributor := pubsub.NewTimeoutAggregationDistributor[VoteT]() + timeoutProcessorFactory := timeoutcollector.NewTimeoutProcessorFactory[StateT, VoteT, PeerIDT]( + logger, + signatureAggregator, + timeoutNotifier, + committee, + validator, + timeoutDomain, + ) + + timeoutCollectorFactory := timeoutcollector.NewTimeoutCollectorFactory( + logger, + timeoutAggregationDistributor, + timeoutProcessorFactory, + ) + timeoutCollectors := timeoutaggregator.NewTimeoutCollectors( + logger, + livenessState.CurrentRank, + timeoutCollectorFactory, + ) + + // initialize the timeout aggregator + timeoutAggregator, err := timeoutaggregator.NewTimeoutAggregator( + logger, + livenessState.CurrentRank, + timeoutCollectors, + ) + + consensusState, err := consensusStore.GetConsensusState() + if err != nil { + consensusState = &models.ConsensusState[VoteT]{ + FinalizedRank: trustedRoot.Rank(), + LatestAcknowledgedRank: trustedRoot.Rank(), + } + err = consensusStore.PutConsensusState(consensusState) + if err != nil { + return nil, err + } + } + + // prune vote aggregator to initial rank + voteAggregator.PruneUpToRank(trustedRoot.Rank()) + timeoutAggregator.PruneUpToRank(trustedRoot.Rank()) + + // initialize dynamically updatable timeout config + timeoutConfig, err := timeout.NewConfig( + time.Duration(cfg.MinReplicaTimeout), + time.Duration(cfg.MaxReplicaTimeout), + cfg.TimeoutAdjustmentFactor, + cfg.HappyPathMaxRoundFailures, + time.Duration(cfg.MaxTimeoutStateRebroadcastInterval), + ) + if err != nil { + return nil, fmt.Errorf("could not initialize timeout config: %w", err) + } + + // initialize the pacemaker + controller := timeout.NewController(timeoutConfig) + pacemaker, err := pacemaker.NewPacemaker( + controller, + pacemaker.NoProposalDelay(), + consumer, + consensusStore, + logger, + ) + if err != nil { + return nil, fmt.Errorf("could not initialize flow pacemaker: %w", err) + } + + signer := verification.NewSigner[StateT, VoteT, PeerIDT](voter) + // initialize the safetyRules + safetyRules, err := safetyrules.NewSafetyRules[StateT, VoteT]( + signer, + consensusStore, + committee, + ) + if err != nil { + return nil, fmt.Errorf("could not initialize safety rules: %w", err) + } + + // initialize state producer + producer, err := stateproducer.NewStateProducer[ + StateT, + VoteT, + PeerIDT, + CollectedT, + ](safetyRules, committee, prover) + if err != nil { + return nil, fmt.Errorf("could not initialize state producer: %w", err) + } + + forks, err := forks.NewForks[StateT, VoteT](trustedRoot, finalizer, consumer) + if err != nil { + return nil, fmt.Errorf("could not initialize forks: %w", err) + } + + // initialize the event handler + eventHandler, err := eventhandler.NewEventHandler[ + StateT, + VoteT, + PeerIDT, + CollectedT, + ]( + pacemaker, + producer, + forks, + consensusStore, + committee, + safetyRules, + consumer, + logger, + ) + if err != nil { + return nil, fmt.Errorf("could not initialize event handler: %w", err) + } + + // initialize and return the event loop + loop, err := eventloop.NewEventLoop( + logger, + eventHandler, + time.Now().Add(10*time.Second), + ) + if err != nil { + return nil, fmt.Errorf("could not initialize event loop: %w", err) + } + + // add observer, event loop needs to receive events from distributor + voteNotifier.AddVoteCollectorConsumer(loop) + timeoutNotifier.AddTimeoutCollectorConsumer(loop) + + return loop, nil +} diff --git a/consensus/signature/state_signer_decoder.go b/consensus/signature/state_signer_decoder.go index 8229969..e04962d 100644 --- a/consensus/signature/state_signer_decoder.go +++ b/consensus/signature/state_signer_decoder.go @@ -51,14 +51,14 @@ func (b *StateSignerDecoder[StateT]) DecodeSignerIDs( // possibly, we request rank which is far behind in the past, in this // case we won't have it in cache. try asking by parent ID byStateMembers, err := b.IdentitiesByState( - state.ParentQuorumCertificate.GetSelector(), + state.ParentQuorumCertificate.Identity(), ) if err != nil { return nil, fmt.Errorf( "could not retrieve identities for state %x with QC rank %d for parent %x: %w", state.Identifier, state.ParentQuorumCertificate.GetRank(), - state.ParentQuorumCertificate.GetSelector(), + state.ParentQuorumCertificate.Identity(), err, ) // state.ErrUnknownSnapshotReference or exception } diff --git a/consensus/state_machine.go b/consensus/state_machine.go deleted file mode 100644 index 83a4af4..0000000 --- a/consensus/state_machine.go +++ /dev/null @@ -1,1640 +0,0 @@ -package consensus - -// import ( -// "context" -// "fmt" -// "sync" -// "sync/atomic" -// "time" - -// "github.com/pkg/errors" -// "source.quilibrium.com/quilibrium/monorepo/consensus/models" -// ) - -// // // TransitionGuard is a function that determines if a transition should occur -// // type TransitionGuard[ -// // StateT Unique, -// // VoteT Unique, -// // PeerIDT Unique, -// // CollectedT Unique, -// // ] func(sm *StateMachine[StateT, VoteT, PeerIDT, CollectedT]) bool - -// // // Transition defines a state transition -// // type Transition[ -// // StateT Unique, -// // VoteT Unique, -// // PeerIDT Unique, -// // CollectedT Unique, -// // ] struct { -// // From State -// // Event Event -// // To State -// // Guard TransitionGuard[StateT, VoteT, PeerIDT, CollectedT] -// // } - -// // // TransitionListener is notified of state transitions -// // type TransitionListener[StateT Unique] interface { -// // OnTransition( -// // from State, -// // to State, -// // event Event, -// // ) -// // } - -// // type eventWrapper struct { -// // event Event -// // response chan error -// // } - -// type proposal[StateT Unique] struct { -// proposal StateT -// time time.Time -// } - -// // StateMachine manages consensus engine state transitions with generic state -// // tracking. T represents the raw state bearing type, the implementation details -// // are left to callers, who may augment their transitions to utilize the data -// // if needed. If no method of fork choice is utilized external to this machine, -// // this state machine provides BFT consensus (e.g. < 1/3 byzantine behaviors) -// // provided assumptions outlined in interface types are fulfilled. The state -// // transition patterns strictly assume a round-based state transition using -// // cryptographic proofs. -// // -// // This implementation requires implementations of specific patterns: -// // - A need to synchronize state from peers (SyncProvider) -// // - A need to record voting from the upstream consumer to decide on consensus -// // changes during the voting period (VotingProvider) -// // - A need to decide on the next leader and prove (LeaderProvider) -// // - A need to announce liveness ahead of long-running proof operations -// // (LivenessProvider) -// type StateMachine[ -// StateT Unique, -// VoteT Unique, -// PeerIDT Unique, -// CollectedT Unique, -// ] struct { -// mu sync.RWMutex -// // transitions map[State]map[Event]*Transition[ -// // StateT, VoteT, PeerIDT, CollectedT, -// // ] -// // stateConfigs map[State]*StateConfig[ -// // StateT, VoteT, PeerIDT, CollectedT, -// // ] -// eventChan chan eventWrapper -// ctx context.Context -// cancel context.CancelFunc -// timeoutTimer *time.Timer -// behaviorCancel context.CancelFunc - -// // Internal state -// machineState State -// activeState *StateT -// nextState *StateT -// collected *CollectedT -// id PeerIDT -// nextProvers []PeerIDT -// // liveness map[uint64]map[Identity]CollectedT -// // votes map[uint64]map[Identity]*VoteT -// // proposals map[uint64]map[Identity]*StateT -// // confirmations map[uint64]map[Identity]*StateT -// chosenProposer *PeerIDT -// stateStartTime time.Time -// transitionCount uint64 -// // listeners []TransitionListener[StateT] -// shouldEmitReceiveEventsOnSends bool -// minimumProvers func() uint64 -// proposals chan proposal[StateT] -// latestTimeoutCertificate *atomic.Value -// latestQuorumCertificate *atomic.Value -// latestPartialTimeoutCertificate *atomic.Value -// timeoutCertificateCh chan models.TimeoutCertificate -// quorumCertificateCh chan models.QuorumCertificate -// partialTimeoutCertificateCh chan models.TimeoutCertificate -// startTime time.Time - -// // Dependencies -// syncProvider SyncProvider[StateT] -// votingProvider VotingProvider[StateT, VoteT, PeerIDT] -// leaderProvider LeaderProvider[StateT, PeerIDT, CollectedT] -// livenessProvider LivenessProvider[StateT, PeerIDT, CollectedT] -// pacemakerProvider PacemakerProvider -// traceLogger TraceLogger -// } - -// // StateConfig defines configuration for a state with generic behaviors -// // type StateConfig[ -// // StateT Unique, -// // VoteT Unique, -// // PeerIDT Unique, -// // CollectedT Unique, -// // ] struct { -// // // Callbacks for state entry/exit -// // OnEnter StateCallback[StateT, VoteT, PeerIDT, CollectedT] -// // OnExit StateCallback[StateT, VoteT, PeerIDT, CollectedT] - -// // // State behavior - runs continuously while in state -// // Behavior StateBehavior[StateT, VoteT, PeerIDT, CollectedT] - -// // // Timeout configuration -// // Timeout time.Duration -// // OnTimeout Event -// // } - -// // // StateCallback is called when entering or exiting a state -// // type StateCallback[ -// // StateT Unique, -// // VoteT Unique, -// // PeerIDT Unique, -// // CollectedT Unique, -// // ] func( -// // sm *StateMachine[StateT, VoteT, PeerIDT, CollectedT], -// // data *StateT, -// // event Event, -// // ) - -// // // StateBehavior defines the behavior while in a state -// // type StateBehavior[ -// // StateT Unique, -// // VoteT Unique, -// // PeerIDT Unique, -// // CollectedT Unique, -// // ] func( -// // sm *StateMachine[StateT, VoteT, PeerIDT, CollectedT], -// // data *StateT, -// // ctx context.Context, -// // ) - -// // NewStateMachine creates a new generic state machine for consensus. -// // `initialState` should be provided if available, this does not set the -// // position of the state machine however, consumers will need to manually force -// // a state machine's internal state if desired. Assumes some variety of pubsub- -// // based semantics are used in send/receive based operations, if the pubsub -// // implementation chosen does not receive messages published by itself, set -// // shouldEmitReceiveEventsOnSends to true. -// func NewStateMachine[ -// StateT Unique, -// VoteT Unique, -// PeerIDT Unique, -// CollectedT Unique, -// ]( -// id PeerIDT, -// shouldEmitReceiveEventsOnSends bool, -// minimumProvers func() uint64, -// syncProvider SyncProvider[StateT], -// votingProvider VotingProvider[StateT, VoteT, PeerIDT], -// leaderProvider LeaderProvider[StateT, PeerIDT, CollectedT], -// livenessProvider LivenessProvider[StateT, PeerIDT, CollectedT], -// pacemakerProvider PacemakerProvider, -// traceLogger TraceLogger, -// ) *StateMachine[StateT, VoteT, PeerIDT, CollectedT] { -// ctx, cancel := context.WithCancel(context.Background()) -// if traceLogger == nil { -// traceLogger = nilTracer{} -// } -// sm := &StateMachine[StateT, VoteT, PeerIDT, CollectedT]{ -// // transitions: make( -// // map[State]map[Event]*Transition[StateT, VoteT, PeerIDT, CollectedT], -// // ), -// // stateConfigs: make( -// // map[State]*StateConfig[StateT, VoteT, PeerIDT, CollectedT], -// // ), -// ctx: ctx, -// cancel: cancel, -// id: id, -// // votes: make(map[uint64]map[Identity]*VoteT), -// // proposals: make(map[uint64]map[Identity]*StateT), -// // liveness: make(map[uint64]map[Identity]CollectedT), -// // confirmations: make(map[uint64]map[Identity]*StateT), -// // listeners: make([]TransitionListener[StateT], 0), -// proposals: make(chan proposal[StateT], 1000), -// shouldEmitReceiveEventsOnSends: shouldEmitReceiveEventsOnSends, -// minimumProvers: minimumProvers, -// syncProvider: syncProvider, -// votingProvider: votingProvider, -// leaderProvider: leaderProvider, -// livenessProvider: livenessProvider, -// pacemakerProvider: pacemakerProvider, -// latestTimeoutCertificate: &atomic.Value{}, -// latestQuorumCertificate: &atomic.Value{}, -// latestPartialTimeoutCertificate: &atomic.Value{}, -// timeoutCertificateCh: make(chan models.TimeoutCertificate), -// quorumCertificateCh: make(chan models.QuorumCertificate), -// partialTimeoutCertificateCh: make(chan models.TimeoutCertificate), -// traceLogger: traceLogger, -// } - -// // // Define state configurations -// // sm.defineStateConfigs() - -// // // Define transitions -// // sm.defineTransitions() - -// // // Start event processor -// // go sm.processEvents() - -// return sm -// } - -// // Start begins the state machine -// func (sm *StateMachine[ -// StateT, -// VoteT, -// PeerIDT, -// CollectedT, -// ]) Start() error { -// sm.traceLogger.Trace("enter start") -// defer sm.traceLogger.Trace("exit start") -// select { -// case <-sm.ctx.Done(): -// return nil -// case <-time.After(time.Until(sm.startTime)): -// sm.traceLogger.Trace("starting state machine") -// err := sm.runLoop(sm.ctx) -// if err != nil { -// sm.traceLogger.Error("error in run loop", err) -// return err -// } -// } -// return nil -// } - -// func (sm *StateMachine[ -// StateT, -// VoteT, -// PeerIDT, -// CollectedT, -// ]) runLoop(ctx context.Context) error { -// err := sm.pacemakerProvider.Start(ctx) -// if err != nil { -// return fmt.Errorf("could not start event handler: %w", err) -// } - -// for { -// timeoutChannel := sm.pacemakerProvider.TimeoutCh() - -// // the first select makes sure we process timeouts with priority -// select { - -// // if we receive the shutdown signal, exit the loop -// case <-ctx.Done(): -// return nil - -// // processing timeout or partial TC event are top priority since -// // they allow node to contribute to TC aggregation when replicas can't -// // make progress on happy path -// case <-timeoutChannel: -// processStart := time.Now() -// curRank := e.paceMaker.CurRank() -// e.log.Debug().Uint64("cur_rank", curRank).Msg("timeout received from event loop") -// e.notifier.OnLocalTimeout(curRank) -// defer e.notifier.OnEventProcessed() - -// err := e.broadcastTimeoutStateIfAuthorized() -// if err != nil { -// return fmt.Errorf("unexpected exception while processing timeout in rank %d: %w", curRank, err) -// } - -// // At this point, we have received and processed an event from the timeout channel. -// // A timeout also means that we have made progress. A new timeout will have -// // been started and el.eventHandler.TimeoutChannel() will be a NEW channel (for the just-started timeout). -// // Very important to start the for loop from the beginning, to continue the with the new timeout channel! -// continue - -// case <-partialTCs: - -// processStart := time.Now() -// err = el.eventHandler.OnPartialTimeoutCertificateCreated(el.newestSubmittedPartialTimeoutCertificate.NewestPartialTimeoutCertificate()) -// if err != nil { -// return fmt.Errorf("could no process partial created TC event: %w", err) -// } - -// // At this point, we have received and processed partial TC event, it could have resulted in several scenarios: -// // 1. a rank change with potential voting or proposal creation -// // 2. a created and broadcast timeout state -// // 3. QC and TC didn't result in rank change and no timeout was created since we have already timed out or -// // the partial TC was created for rank different from current one. -// continue - -// default: -// // fall through to non-priority events -// } - -// idleStart := time.Now() - -// // select for state headers/QCs here -// select { - -// // same as before -// case <-shutdownSignaled: -// return nil - -// // same as before -// case <-timeoutChannel: -// err = el.eventHandler.OnLocalTimeout() -// if err != nil { -// return fmt.Errorf("could not process timeout: %w", err) -// } - -// // if we have a new proposal, process it -// case queuedItem := <-el.proposals: -// processStart := time.Now() -// proposal := queuedItem.proposal -// err = el.eventHandler.OnReceiveProposal(proposal) -// if err != nil { -// return fmt.Errorf("could not process proposal %v: %w", proposal.State.Identifier, err) -// } - -// el.log.Info(). -// Dur("dur_ms", time.Since(processStart)). -// Uint64("rank", proposal.State.Rank). -// Hex("state_id", proposal.State.Identifier[:]). -// Msg("state proposal has been processed successfully") - -// // if we have a new QC, process it -// case <-quorumCertificates: -// processStart := time.Now() -// err = el.eventHandler.OnReceiveQuorumCertificate(el.newestSubmittedQc.NewestQC()) -// if err != nil { -// return fmt.Errorf("could not process QC: %w", err) -// } - -// // if we have a new TC, process it -// case <-timeoutCertificates: -// // measure how long the event loop was idle waiting for an -// // incoming event -// el.metrics.HotStuffIdleDuration(time.Since(idleStart)) - -// processStart := time.Now() -// err = el.eventHandler.OnReceiveTimeoutCertificate(el.newestSubmittedTimeoutCertificate.NewestTC()) -// if err != nil { -// return fmt.Errorf("could not process TC: %w", err) -// } - -// case <-partialTCs: -// // measure how long the event loop was idle waiting for an -// // incoming event -// el.metrics.HotStuffIdleDuration(time.Since(idleStart)) - -// processStart := time.Now() -// err = el.eventHandler.OnPartialTimeoutCertificateCreated(el.newestSubmittedPartialTimeoutCertificate.NewestPartialTimeoutCertificate()) -// if err != nil { -// return fmt.Errorf("could no process partial created TC event: %w", err) -// } -// } -// } -// } - -// // Stop halts the state machine -// func (sm *StateMachine[ -// StateT, -// VoteT, -// PeerIDT, -// CollectedT, -// ]) Stop() error { -// sm.traceLogger.Trace("enter stop") -// defer sm.traceLogger.Trace("exit stop") -// sm.cancel() -// return nil -// } - -// // ReceiveLivenessCheck receives a liveness announcement and captures -// // collected mutation operations reported by the peer if relevant. -// func (sm *StateMachine[ -// StateT, -// VoteT, -// PeerIDT, -// CollectedT, -// ]) ReceiveLivenessCheck(peer PeerIDT, collected CollectedT) error { -// sm.traceLogger.Trace( -// fmt.Sprintf( -// "enter receivelivenesscheck, peer: %s, rank: %d", -// peer.Identity(), -// collected.GetRank(), -// ), -// ) -// defer sm.traceLogger.Trace("exit receivelivenesscheck") -// sm.mu.Lock() -// if _, ok := sm.liveness[collected.GetRank()]; !ok { -// sm.liveness[collected.GetRank()] = make(map[Identity]CollectedT) -// } -// if _, ok := sm.liveness[collected.GetRank()][peer.Identity()]; !ok { -// sm.liveness[collected.GetRank()][peer.Identity()] = collected -// } -// sm.mu.Unlock() - -// sm.SendEvent(EventLivenessCheckReceived) -// return nil -// } - -// // ReceiveProposal receives a proposed new state. -// func (sm *StateMachine[ -// StateT, -// VoteT, -// PeerIDT, -// CollectedT, -// ]) ReceiveProposal(currentRank uint64, peer PeerIDT, proposal *StateT) error { -// sm.traceLogger.Trace("enter receiveproposal") -// defer sm.traceLogger.Trace("exit receiveproposal") -// sm.mu.Lock() -// if _, ok := sm.proposals[(*proposal).GetRank()]; !ok { -// sm.proposals[(*proposal).GetRank()] = make(map[Identity]*StateT) -// } -// if _, ok := sm.proposals[(*proposal).GetRank()][peer.Identity()]; !ok { -// sm.proposals[(*proposal).GetRank()][peer.Identity()] = proposal -// } -// sm.mu.Unlock() - -// sm.SendEvent(EventProposalReceived) -// return nil -// } - -// // ReceiveVote captures a vote. Presumes structural and protocol validity of a -// // vote has already been evaluated. -// func (sm *StateMachine[ -// StateT, -// VoteT, -// PeerIDT, -// CollectedT, -// ]) ReceiveVote(proposer PeerIDT, voter PeerIDT, vote *VoteT) error { -// sm.traceLogger.Trace("enter receivevote") -// defer sm.traceLogger.Trace("exit receivevote") -// sm.mu.Lock() - -// if _, ok := sm.votes[(*vote).GetRank()]; !ok { -// sm.votes[(*vote).GetRank()] = make(map[Identity]*VoteT) -// } -// if _, ok := sm.votes[(*vote).GetRank()][voter.Identity()]; !ok { -// sm.votes[(*vote).GetRank()][voter.Identity()] = vote -// } else if (*sm.votes[(*vote).GetRank()][voter.Identity()]).Identity() != -// (*vote).Identity() { -// sm.mu.Unlock() -// return errors.Wrap(errors.New("received conflicting vote"), "receive vote") -// } -// sm.mu.Unlock() - -// sm.SendEvent(EventVoteReceived) -// return nil -// } - -// // ReceiveConfirmation captures a confirmation. Presumes structural and protocol -// // validity of the state has already been evaluated. -// func (sm *StateMachine[ -// StateT, -// VoteT, -// PeerIDT, -// CollectedT, -// ]) ReceiveConfirmation( -// peer PeerIDT, -// confirmation *StateT, -// ) error { -// sm.traceLogger.Trace("enter receiveconfirmation") -// defer sm.traceLogger.Trace("exit receiveconfirmation") -// sm.mu.Lock() -// if _, ok := sm.confirmations[(*confirmation).GetRank()]; !ok { -// sm.confirmations[(*confirmation).GetRank()] = make(map[Identity]*StateT) -// } -// if _, ok := sm.confirmations[(*confirmation).GetRank()][peer.Identity()]; !ok { -// sm.confirmations[(*confirmation).GetRank()][peer.Identity()] = confirmation -// } -// sm.mu.Unlock() - -// sm.SendEvent(EventConfirmationReceived) -// return nil -// } - -// func (sm *StateMachine[ -// StateT, -// VoteT, -// PeerIDT, -// CollectedT, -// ]) ReceiveInvalidProposal(peer PeerIDT, proposal *StateT) { -// } - -// func (sm *StateMachine[ -// StateT, -// VoteT, -// PeerIDT, -// CollectedT, -// ]) ReceiveEquivocatingProposals( -// peer PeerIDT, -// proposal1 *StateT, -// proposal2 *StateT, -// ) { -// } - -// func (sm *StateMachine[ -// StateT, -// VoteT, -// PeerIDT, -// CollectedT, -// ]) ReceiveInvalidVote(peer PeerIDT, vote *VoteT) { -// } - -// func (sm *StateMachine[ -// StateT, -// VoteT, -// PeerIDT, -// CollectedT, -// ]) ReceiveEquivocatingVotes(peer PeerIDT, vote1 *VoteT, vote2 *VoteT) { -// } - -// func (sm *StateMachine[ -// StateT, -// VoteT, -// PeerIDT, -// CollectedT, -// ]) ReceiveVoteForInvalidProposal(peer PeerIDT, proposal *StateT, vote *VoteT) { -// } - -// func (sm *StateMachine[ -// StateT, -// VoteT, -// PeerIDT, -// CollectedT, -// ]) ReceiveInvalidTimeout(peer PeerIDT, timeout *models.TimeoutState) { -// } - -// func (sm *StateMachine[ -// StateT, -// VoteT, -// PeerIDT, -// CollectedT, -// ]) ReceiveEquivocatingTimeout( -// peer PeerIDT, -// timeout1 *models.TimeoutState, -// timeout2 *models.TimeoutState, -// ) { -// } - -// func (sm *StateMachine[ -// StateT, -// VoteT, -// PeerIDT, -// CollectedT, -// ]) ReceiveState(peer PeerIDT, state *StateT) { -// } - -// func (sm *StateMachine[ -// StateT, -// VoteT, -// PeerIDT, -// CollectedT, -// ]) ReceiveFinalizedState(peer PeerIDT, finalized *StateT) { -// } - -// func (sm *StateMachine[ -// StateT, -// VoteT, -// PeerIDT, -// CollectedT, -// ]) EventProcessed() { -// } - -// func (sm *StateMachine[ -// StateT, -// VoteT, -// PeerIDT, -// CollectedT, -// ]) Started(currentRank uint64) { -// } - -// func (sm *StateMachine[ -// StateT, -// VoteT, -// PeerIDT, -// CollectedT, -// ]) ReceiveQuorumCertificate( -// currentRank uint64, -// peer PeerIDT, -// cert models.QuorumCertificate, -// ) error { -// return nil -// } - -// func (sm *StateMachine[ -// StateT, -// VoteT, -// PeerIDT, -// CollectedT, -// ]) ReceiveTimeoutCertificate( -// currentRank uint64, -// peer PeerIDT, -// cert models.TimeoutCertificate, -// ) error { -// return nil -// } - -// func (sm *StateMachine[ -// StateT, -// VoteT, -// PeerIDT, -// CollectedT, -// ]) ReceiveLocalTimeout(currentRank uint64) { -// } - -// func (sm *StateMachine[ -// StateT, -// VoteT, -// PeerIDT, -// CollectedT, -// ]) ReceiveNewRank(oldRank uint64, newRank uint64) { -// } - -// func (sm *StateMachine[ -// StateT, -// VoteT, -// PeerIDT, -// CollectedT, -// ]) ReceiveQuorumCertificateWithNewRank( -// oldRank uint64, -// newRank uint64, -// cert models.QuorumCertificate, -// ) { -// } - -// func (sm *StateMachine[ -// StateT, -// VoteT, -// PeerIDT, -// CollectedT, -// ]) ReceiveTimeoutCertificateWithNewRank( -// oldRank uint64, -// newRank uint64, -// cert models.TimeoutCertificate, -// ) { -// } - -// func (sm *StateMachine[ -// StateT, -// VoteT, -// PeerIDT, -// CollectedT, -// ]) ReceiveNewTimeout(start time.Time, end time.Time) { -// } - -// func (sm *StateMachine[ -// StateT, -// VoteT, -// PeerIDT, -// CollectedT, -// ]) ReceiveAggregatedQuorumCertificate( -// peer PeerIDT, -// cert models.QuorumCertificate, -// ) { -// } - -// func (sm *StateMachine[ -// StateT, -// VoteT, -// PeerIDT, -// CollectedT, -// ]) VoteProcessed(peer PeerIDT, vote *VoteT) { -// } - -// func (sm *StateMachine[ -// StateT, -// VoteT, -// PeerIDT, -// CollectedT, -// ]) ReceiveAggregatedTimeoutCertificate( -// peer PeerIDT, -// cert models.TimeoutCertificate, -// ) { -// } - -// func (sm *StateMachine[ -// StateT, -// VoteT, -// PeerIDT, -// CollectedT, -// ]) ReceiveIncompleteTimeoutCertificate( -// rank uint64, -// peer PeerIDT, -// latestQuorumCert models.QuorumCertificate, -// previousRankTimeoutCert models.TimeoutCertificate, -// ) { -// } - -// func (sm *StateMachine[ -// StateT, -// VoteT, -// PeerIDT, -// CollectedT, -// ]) ReceiveNewQuorumCertificateFromTimeout(cert models.QuorumCertificate) { -// } - -// func (sm *StateMachine[ -// StateT, -// VoteT, -// PeerIDT, -// CollectedT, -// ]) ReceiveNewTimeoutCertificateFromTimeout(cert models.TimeoutCertificate) { -// } - -// func (sm *StateMachine[ -// StateT, -// VoteT, -// PeerIDT, -// CollectedT, -// ]) TimeoutProcessed(timeout *models.TimeoutState) { -// } - -// func (sm *StateMachine[ -// StateT, -// VoteT, -// PeerIDT, -// CollectedT, -// ]) SendingVote(vote *VoteT) { -// } - -// func (sm *StateMachine[ -// StateT, -// VoteT, -// PeerIDT, -// CollectedT, -// ]) SendingTimeout(timeout *models.TimeoutState) { -// } - -// func (sm *StateMachine[ -// StateT, -// VoteT, -// PeerIDT, -// CollectedT, -// ]) SendingProposal(proposal *StateT, target time.Time) { -// } - -// // // SendEvent sends an event to the state machine -// // func (sm *StateMachine[ -// // StateT, -// // VoteT, -// // PeerIDT, -// // CollectedT, -// // ]) SendEvent(event Event) { -// // sm.traceLogger.Trace(fmt.Sprintf("enter sendEvent: %s", event)) -// // defer sm.traceLogger.Trace(fmt.Sprintf("exit sendEvent: %s", event)) -// // response := make(chan error, 1) -// // go func() { -// // select { -// // case sm.eventChan <- eventWrapper{event: event, response: response}: -// // <-response -// // case <-sm.ctx.Done(): -// // return -// // } -// // }() -// // } - -// // // processEvents handles events and transitions -// // func (sm *StateMachine[ -// // StateT, -// // VoteT, -// // PeerIDT, -// // CollectedT, -// // ]) processEvents() { -// // defer func() { -// // if r := recover(); r != nil { -// // sm.traceLogger.Error( -// // "fatal error encountered", -// // errors.New(fmt.Sprintf("%+v", r)), -// // ) -// // sm.Close() -// // } -// // }() - -// // sm.traceLogger.Trace("enter processEvents") -// // defer sm.traceLogger.Trace("exit processEvents") -// // for { -// // select { -// // case <-sm.ctx.Done(): -// // return -// // case wrapper := <-sm.eventChan: -// // err := sm.handleEvent(wrapper.event) -// // wrapper.response <- err -// // } -// // } -// // } - -// // // handleEvent processes a single event -// // func (sm *StateMachine[ -// // StateT, -// // VoteT, -// // PeerIDT, -// // CollectedT, -// // ]) handleEvent(event Event) error { -// // sm.traceLogger.Trace(fmt.Sprintf("enter handleEvent: %s", event)) -// // defer sm.traceLogger.Trace(fmt.Sprintf("exit handleEvent: %s", event)) -// // sm.mu.Lock() - -// // currentState := sm.machineState -// // transitions, exists := sm.transitions[currentState] -// // if !exists { -// // sm.mu.Unlock() - -// // return errors.Wrap( -// // fmt.Errorf("no transitions defined for state %s", currentState), -// // "handle event", -// // ) -// // } - -// // transition, exists := transitions[event] -// // if !exists { -// // sm.mu.Unlock() - -// // return errors.Wrap( -// // fmt.Errorf( -// // "no transition for event %s in state %s", -// // event, -// // currentState, -// // ), -// // "handle event", -// // ) -// // } - -// // // Check guard condition with the actual state -// // if transition.Guard != nil && !transition.Guard(sm) { -// // sm.mu.Unlock() - -// // return errors.Wrap( -// // fmt.Errorf( -// // "transition guard failed for %s -> %s on %s", -// // currentState, -// // transition.To, -// // event, -// // ), -// // "handle event", -// // ) -// // } - -// // sm.mu.Unlock() - -// // // Execute transition -// // sm.executeTransition(currentState, transition.To, event) -// // return nil -// // } - -// // // executeTransition performs the state transition -// // func (sm *StateMachine[ -// // StateT, -// // VoteT, -// // PeerIDT, -// // CollectedT, -// // ]) executeTransition( -// // from State, -// // to State, -// // event Event, -// // ) { -// // sm.traceLogger.Trace( -// // fmt.Sprintf("enter executeTransition: %s -> %s [%s]", from, to, event), -// // ) -// // defer sm.traceLogger.Trace( -// // fmt.Sprintf("exit executeTransition: %s -> %s [%s]", from, to, event), -// // ) -// // sm.mu.Lock() - -// // // Cancel any existing timeout and behavior -// // if sm.timeoutTimer != nil { -// // sm.timeoutTimer.Stop() -// // sm.timeoutTimer = nil -// // } - -// // // Cancel existing behavior if any -// // if sm.behaviorCancel != nil { -// // sm.behaviorCancel() -// // sm.behaviorCancel = nil -// // } - -// // // Call exit callback for current state -// // if config, exists := sm.stateConfigs[from]; exists && config.OnExit != nil { -// // sm.mu.Unlock() -// // config.OnExit(sm, sm.activeState, event) -// // sm.mu.Lock() -// // } - -// // // Update state -// // sm.machineState = to -// // sm.stateStartTime = time.Now() -// // sm.transitionCount++ - -// // // Notify listeners -// // for _, listener := range sm.listeners { -// // listener.OnTransition(from, to, event) -// // } - -// // // Call enter callback for new state -// // if config, exists := sm.stateConfigs[to]; exists { -// // if config.OnEnter != nil { -// // sm.mu.Unlock() -// // config.OnEnter(sm, sm.activeState, event) -// // sm.mu.Lock() -// // } - -// // // Start state behavior if defined -// // if config.Behavior != nil { -// // behaviorCtx, cancel := context.WithCancel(sm.ctx) -// // sm.behaviorCancel = cancel -// // sm.mu.Unlock() -// // config.Behavior(sm, sm.activeState, behaviorCtx) -// // sm.mu.Lock() -// // } - -// // // Set up timeout for new state -// // if config.Timeout > 0 && config.OnTimeout != "" { -// // sm.timeoutTimer = time.AfterFunc(config.Timeout, func() { -// // sm.SendEvent(config.OnTimeout) -// // }) -// // } -// // } -// // sm.mu.Unlock() -// // } - -// // // GetState returns the current state -// // func (sm *StateMachine[ -// // StateT, -// // VoteT, -// // PeerIDT, -// // CollectedT, -// // ]) GetState() State { -// // sm.traceLogger.Trace("enter getstate") -// // defer sm.traceLogger.Trace("exit getstate") -// // sm.mu.Lock() -// // defer sm.mu.Unlock() -// // return sm.machineState -// // } - -// // // Additional methods for compatibility -// // func (sm *StateMachine[ -// // StateT, -// // VoteT, -// // PeerIDT, -// // CollectedT, -// // ]) GetStateTime() time.Duration { -// // sm.traceLogger.Trace("enter getstatetime") -// // defer sm.traceLogger.Trace("exit getstatetime") -// // return time.Since(sm.stateStartTime) -// // } - -// // func (sm *StateMachine[ -// // StateT, -// // VoteT, -// // PeerIDT, -// // CollectedT, -// // ]) GetTransitionCount() uint64 { -// // sm.traceLogger.Trace("enter transitioncount") -// // defer sm.traceLogger.Trace("exit transitioncount") -// // return sm.transitionCount -// // } - -// // func (sm *StateMachine[ -// // StateT, -// // VoteT, -// // PeerIDT, -// // CollectedT, -// // ]) AddListener(listener TransitionListener[StateT]) { -// // sm.traceLogger.Trace("enter addlistener") -// // defer sm.traceLogger.Trace("exit addlistener") -// // sm.mu.Lock() -// // defer sm.mu.Unlock() -// // sm.listeners = append(sm.listeners, listener) -// // } - -// // func (sm *StateMachine[ -// // StateT, -// // VoteT, -// // PeerIDT, -// // CollectedT, -// // ]) Close() { -// // sm.traceLogger.Trace("enter close") -// // defer sm.traceLogger.Trace("exit close") -// // sm.mu.Lock() -// // defer sm.mu.Unlock() -// // sm.cancel() -// // if sm.timeoutTimer != nil { -// // sm.timeoutTimer.Stop() -// // } -// // if sm.behaviorCancel != nil { -// // sm.behaviorCancel() -// // } -// // sm.machineState = StateStopped -// // } - -// // Type used to satisfy generic arguments in compiler time type assertion check -// type nilUnique struct{} - -// // GetTimestamp implements models.Unique. -// func (n *nilUnique) GetTimestamp() uint64 { -// panic("unimplemented") -// } - -// // Source implements models.Unique. -// func (n *nilUnique) Source() models.Identity { -// panic("unimplemented") -// } - -// // Clone implements models.Unique. -// func (n *nilUnique) Clone() models.Unique { -// panic("unimplemented") -// } - -// // GetRank implements models.Unique. -// func (n *nilUnique) GetRank() uint64 { -// panic("unimplemented") -// } - -// // Identity implements models.Unique. -// func (n *nilUnique) Identity() models.Identity { -// panic("unimplemented") -// } - -// var _ models.Unique = (*nilUnique)(nil) - -// /* -// // defineStateConfigs sets up state configurations with behaviors -// func (sm *StateMachine[ -// StateT, -// VoteT, -// PeerIDT, -// CollectedT, -// ]) defineStateConfigs() { -// sm.traceLogger.Trace("enter defineStateConfigs") -// defer sm.traceLogger.Trace("exit defineStateConfigs") -// // Starting state - just timeout to complete initialization -// sm.stateConfigs[StateStarting] = &StateConfig[ -// StateT, -// VoteT, -// PeerIDT, -// CollectedT, -// ]{ -// Timeout: 1 * time.Second, -// OnTimeout: EventInitComplete, -// } - -// type Config = StateConfig[ -// StateT, -// VoteT, -// PeerIDT, -// CollectedT, -// ] - -// type SMT = StateMachine[StateT, VoteT, PeerIDT, CollectedT] - -// // Loading state - synchronize with network -// sm.stateConfigs[StateLoading] = &Config{ -// Behavior: func(sm *SMT, data *StateT, ctx context.Context) { -// sm.traceLogger.Trace("enter Loading behavior") -// defer sm.traceLogger.Trace("exit Loading behavior") -// if sm.syncProvider != nil { -// newStateCh, errCh := sm.syncProvider.Synchronize(ctx, sm.activeState) -// select { -// case newState := <-newStateCh: -// sm.mu.Lock() -// sm.activeState = newState -// sm.mu.Unlock() -// nextLeaders, err := sm.leaderProvider.GetNextLeaders(ctx, newState) -// if err != nil { -// sm.traceLogger.Error( -// fmt.Sprintf("error encountered in %s", sm.machineState), -// err, -// ) -// time.Sleep(10 * time.Second) -// sm.SendEvent(EventSyncTimeout) -// return -// } -// found := false -// for _, leader := range nextLeaders { -// if leader.Identity() == sm.id.Identity() { -// found = true -// break -// } -// } -// if found { -// sm.SendEvent(EventSyncComplete) -// } else { -// time.Sleep(10 * time.Second) -// sm.SendEvent(EventSyncTimeout) -// } -// case <-errCh: -// time.Sleep(10 * time.Second) -// sm.SendEvent(EventSyncTimeout) -// case <-ctx.Done(): -// return -// } -// } -// }, -// Timeout: 10 * time.Hour, -// OnTimeout: EventSyncTimeout, -// } - -// // Collecting state - wait for frame or timeout -// sm.stateConfigs[StateCollecting] = &Config{ -// Behavior: func(sm *SMT, data *StateT, ctx context.Context) { -// sm.traceLogger.Trace("enter Collecting behavior") -// defer sm.traceLogger.Trace("exit Collecting behavior") -// collected, err := sm.livenessProvider.Collect(ctx) -// if err != nil { -// sm.traceLogger.Error( -// fmt.Sprintf("error encountered in %s", sm.machineState), -// err, -// ) -// sm.SendEvent(EventInduceSync) -// return -// } - -// sm.mu.Lock() -// sm.nextProvers = []PeerIDT{} -// sm.chosenProposer = nil -// sm.collected = &collected -// sm.mu.Unlock() - -// nextProvers, err := sm.leaderProvider.GetNextLeaders(ctx, data) -// if err != nil { -// sm.traceLogger.Error( -// fmt.Sprintf("error encountered in %s", sm.machineState), -// err, -// ) -// sm.SendEvent(EventInduceSync) -// return -// } - -// sm.mu.Lock() -// sm.nextProvers = nextProvers -// sm.mu.Unlock() - -// err = sm.livenessProvider.SendLiveness(ctx, data, collected) -// if err != nil { -// sm.traceLogger.Error( -// fmt.Sprintf("error encountered in %s", sm.machineState), -// err, -// ) -// sm.SendEvent(EventInduceSync) -// return -// } - -// sm.mu.Lock() -// if sm.shouldEmitReceiveEventsOnSends { -// if _, ok := sm.liveness[collected.GetRank()]; !ok { -// sm.liveness[collected.GetRank()] = make(map[Identity]CollectedT) -// } -// sm.liveness[collected.GetRank()][sm.id.Identity()] = *sm.collected -// } -// sm.mu.Unlock() - -// if sm.shouldEmitReceiveEventsOnSends { -// sm.SendEvent(EventLivenessCheckReceived) -// } - -// sm.SendEvent(EventCollectionDone) -// }, -// Timeout: 10 * time.Second, -// OnTimeout: EventInduceSync, -// } - -// // Liveness check state -// sm.stateConfigs[StateLivenessCheck] = &Config{ -// Behavior: func(sm *SMT, data *StateT, ctx context.Context) { -// sm.traceLogger.Trace("enter Liveness behavior") -// defer sm.traceLogger.Trace("exit Liveness behavior") -// sm.mu.Lock() -// nextProversLen := len(sm.nextProvers) -// sm.mu.Unlock() - -// // If we're not meeting the minimum prover count, we should loop. -// if nextProversLen < int(sm.minimumProvers()) { -// sm.traceLogger.Trace("insufficient provers, re-fetching leaders") -// var err error -// nextProvers, err := sm.leaderProvider.GetNextLeaders(ctx, data) -// if err != nil { -// sm.traceLogger.Error( -// fmt.Sprintf("error encountered in %s", sm.machineState), -// err, -// ) -// sm.SendEvent(EventInduceSync) -// return -// } -// sm.mu.Lock() -// sm.nextProvers = nextProvers -// sm.mu.Unlock() -// } - -// sm.mu.Lock() -// collected := *sm.collected -// sm.mu.Unlock() - -// sm.mu.Lock() -// livenessLen := len(sm.liveness[(*sm.activeState).GetRank()+1]) -// sm.mu.Unlock() - -// // We have enough checks for consensus: -// if livenessLen >= int(sm.minimumProvers()) { -// sm.traceLogger.Trace( -// "sufficient liveness checks, sending prover signal", -// ) -// sm.SendEvent(EventProverSignal) -// return -// } - -// sm.traceLogger.Trace( -// fmt.Sprintf( -// "insufficient liveness checks: need %d, have %d", -// sm.minimumProvers(), -// livenessLen, -// ), -// ) - -// select { -// case <-time.After(1 * time.Second): -// err := sm.livenessProvider.SendLiveness(ctx, data, collected) -// if err != nil { -// sm.traceLogger.Error( -// fmt.Sprintf("error encountered in %s", sm.machineState), -// err, -// ) -// sm.SendEvent(EventInduceSync) -// return -// } -// case <-ctx.Done(): -// } -// }, -// Timeout: 2 * time.Second, -// OnTimeout: EventLivenessTimeout, -// } - -// // Proving state - generate proof -// sm.stateConfigs[StateProving] = &Config{ -// Behavior: func(sm *SMT, data *StateT, ctx context.Context) { -// sm.traceLogger.Trace("enter Proving behavior") -// defer sm.traceLogger.Trace("exit Proving behavior") -// sm.mu.Lock() -// collected := sm.collected -// sm.collected = nil -// sm.mu.Unlock() - -// if collected == nil { -// sm.SendEvent(EventInduceSync) -// return -// } - -// proposal, err := sm.leaderProvider.ProveNextState( -// ctx, -// data, -// *collected, -// ) -// if err != nil { -// sm.traceLogger.Error( -// fmt.Sprintf("error encountered in %s", sm.machineState), -// err, -// ) - -// sm.SendEvent(EventInduceSync) -// return -// } - -// sm.mu.Lock() -// sm.traceLogger.Trace( -// fmt.Sprintf("adding proposal with rank %d", (*proposal).GetRank()), -// ) -// if _, ok := sm.proposals[(*proposal).GetRank()]; !ok { -// sm.proposals[(*proposal).GetRank()] = make(map[Identity]*StateT) -// } -// sm.proposals[(*proposal).GetRank()][sm.id.Identity()] = proposal -// sm.mu.Unlock() - -// sm.SendEvent(EventProofComplete) -// }, -// Timeout: 120 * time.Second, -// OnTimeout: EventPublishTimeout, -// } - -// // Publishing state - publish frame -// sm.stateConfigs[StatePublishing] = &Config{ -// Behavior: func(sm *SMT, data *StateT, ctx context.Context) { -// sm.traceLogger.Trace("enter Publishing behavior") -// defer sm.traceLogger.Trace("exit Publishing behavior") -// sm.mu.Lock() -// if _, ok := sm.proposals[(*data).GetRank()+1][sm.id.Identity()]; ok { -// proposal := sm.proposals[(*data).GetRank()+1][sm.id.Identity()] -// sm.mu.Unlock() - -// err := sm.votingProvider.SendProposal( -// ctx, -// proposal, -// ) -// if err != nil { -// sm.traceLogger.Error( -// fmt.Sprintf("error encountered in %s", sm.machineState), -// err, -// ) -// sm.SendEvent(EventInduceSync) -// return -// } -// sm.SendEvent(EventPublishComplete) -// } else { -// sm.mu.Unlock() -// } -// }, -// Timeout: 1 * time.Second, -// OnTimeout: EventPublishTimeout, -// } - -// // Voting state - monitor for quorum -// sm.stateConfigs[StateVoting] = &Config{ -// Behavior: func(sm *SMT, data *StateT, ctx context.Context) { -// sm.traceLogger.Trace("enter Voting behavior") -// defer sm.traceLogger.Trace("exit Voting behavior") - -// sm.mu.Lock() - -// if sm.chosenProposer == nil { -// // We haven't voted yet -// sm.traceLogger.Trace("proposer not yet chosen") -// perfect := map[int]PeerIDT{} // all provers -// live := map[int]PeerIDT{} // the provers who told us they're alive -// for i, p := range sm.nextProvers { -// perfect[i] = p -// if _, ok := sm.liveness[(*sm.activeState).GetRank()+1][p.Identity()]; ok { -// live[i] = p -// } -// } - -// if len(sm.proposals[(*sm.activeState).GetRank()+1]) < int(sm.minimumProvers()) { -// sm.traceLogger.Trace( -// fmt.Sprintf( -// "insufficient proposal count: %d, need %d", -// len(sm.proposals[(*sm.activeState).GetRank()+1]), -// int(sm.minimumProvers()), -// ), -// ) -// sm.mu.Unlock() -// return -// } - -// if ctx == nil { -// sm.traceLogger.Trace("context null") -// sm.mu.Unlock() -// return -// } - -// select { -// case <-ctx.Done(): -// sm.traceLogger.Trace("context canceled") -// sm.mu.Unlock() -// return -// default: -// sm.traceLogger.Trace("choosing proposal") -// proposals := map[Identity]*StateT{} -// for k, v := range sm.proposals[(*sm.activeState).GetRank()+1] { -// state := (*v).Clone().(StateT) -// proposals[k] = &state -// } - -// sm.mu.Unlock() -// selectedPeer, vote, err := sm.votingProvider.DecideAndSendVote( -// ctx, -// proposals, -// ) -// if err != nil { -// sm.traceLogger.Error( -// fmt.Sprintf("error encountered in %s", sm.machineState), -// err, -// ) -// sm.SendEvent(EventInduceSync) -// break -// } -// sm.mu.Lock() -// sm.chosenProposer = &selectedPeer - -// if sm.shouldEmitReceiveEventsOnSends { -// if _, ok := sm.votes[(*sm.activeState).GetRank()+1]; !ok { -// sm.votes[(*sm.activeState).GetRank()+1] = make(map[Identity]*VoteT) -// } -// sm.votes[(*sm.activeState).GetRank()+1][sm.id.Identity()] = vote -// sm.mu.Unlock() -// sm.SendEvent(EventVoteReceived) -// return -// } -// sm.mu.Unlock() -// } -// } else { -// sm.traceLogger.Trace("proposal chosen, checking for quorum") -// proposalVotes := map[Identity]*VoteT{} -// for p, vp := range sm.votes[(*sm.activeState).GetRank()+1] { -// vclone := (*vp).Clone().(VoteT) -// proposalVotes[p] = &vclone -// } -// haveEnoughProposals := len(sm.proposals[(*sm.activeState).GetRank()+1]) >= -// int(sm.minimumProvers()) -// sm.mu.Unlock() -// isQuorum, err := sm.votingProvider.IsQuorum(ctx, proposalVotes) -// if err != nil { -// sm.traceLogger.Error( -// fmt.Sprintf("error encountered in %s", sm.machineState), -// err, -// ) -// sm.SendEvent(EventInduceSync) -// return -// } - -// if isQuorum && haveEnoughProposals { -// sm.traceLogger.Trace("quorum reached") -// sm.SendEvent(EventQuorumReached) -// } else { -// sm.traceLogger.Trace( -// fmt.Sprintf( -// "quorum not reached: proposals: %d, needed: %d", -// len(sm.proposals[(*sm.activeState).GetRank()+1]), -// sm.minimumProvers(), -// ), -// ) -// } -// } -// }, -// Timeout: 1 * time.Second, -// OnTimeout: EventVotingTimeout, -// } - -// // Finalizing state -// sm.stateConfigs[StateFinalizing] = &Config{ -// Behavior: func(sm *SMT, data *StateT, ctx context.Context) { -// sm.mu.Lock() -// proposals := map[Identity]*StateT{} -// for k, v := range sm.proposals[(*sm.activeState).GetRank()+1] { -// state := (*v).Clone().(StateT) -// proposals[k] = &state -// } -// proposalVotes := map[Identity]*VoteT{} -// for p, vp := range sm.votes[(*sm.activeState).GetRank()+1] { -// vclone := (*vp).Clone().(VoteT) -// proposalVotes[p] = &vclone -// } -// sm.mu.Unlock() -// finalized, _, err := sm.votingProvider.FinalizeVotes( -// ctx, -// proposals, -// proposalVotes, -// ) -// if err != nil { -// sm.traceLogger.Error( -// fmt.Sprintf("error encountered in %s", sm.machineState), -// err, -// ) -// sm.SendEvent(EventInduceSync) -// return -// } -// next := (*finalized).Clone().(StateT) -// sm.mu.Lock() -// sm.nextState = &next -// sm.mu.Unlock() -// sm.SendEvent(EventAggregationDone) -// }, -// Timeout: 1 * time.Second, -// OnTimeout: EventAggregationTimeout, -// } - -// // Verifying state -// sm.stateConfigs[StateVerifying] = &Config{ -// Behavior: func(sm *SMT, data *StateT, ctx context.Context) { -// sm.traceLogger.Trace("enter Verifying behavior") -// defer sm.traceLogger.Trace("exit Verifying behavior") -// sm.mu.Lock() -// if _, ok := sm.confirmations[(*sm.activeState).GetRank()+1][sm.id.Identity()]; !ok && -// sm.nextState != nil { -// nextState := sm.nextState -// sm.mu.Unlock() -// err := sm.votingProvider.SendConfirmation(ctx, nextState) -// if err != nil { -// sm.traceLogger.Error( -// fmt.Sprintf("error encountered in %s", sm.machineState), -// err, -// ) -// sm.SendEvent(EventInduceSync) -// return -// } -// sm.mu.Lock() -// } - -// progressed := false -// if sm.nextState != nil { -// sm.activeState = sm.nextState -// progressed = true -// } -// if progressed { -// sm.nextState = nil -// sm.collected = nil -// delete(sm.liveness, (*sm.activeState).GetRank()) -// delete(sm.proposals, (*sm.activeState).GetRank()) -// delete(sm.votes, (*sm.activeState).GetRank()) -// delete(sm.confirmations, (*sm.activeState).GetRank()) -// sm.mu.Unlock() -// sm.SendEvent(EventVerificationDone) -// } else { -// sm.mu.Unlock() -// } -// }, -// Timeout: 1 * time.Second, -// OnTimeout: EventVerificationTimeout, -// } - -// // Stopping state -// sm.stateConfigs[StateStopping] = &Config{ -// Behavior: func(sm *SMT, data *StateT, ctx context.Context) { -// sm.SendEvent(EventCleanupComplete) -// }, -// Timeout: 30 * time.Second, -// OnTimeout: EventCleanupComplete, -// } -// } - -// // defineTransitions sets up all possible state transitions -// func (sm *StateMachine[ -// StateT, -// VoteT, -// PeerIDT, -// CollectedT, -// ]) defineTransitions() { -// sm.traceLogger.Trace("enter defineTransitions") -// defer sm.traceLogger.Trace("exit defineTransitions") - -// // Helper to add transition -// addTransition := func( -// from State, -// event Event, -// to State, -// guard TransitionGuard[StateT, VoteT, PeerIDT, CollectedT], -// ) { -// if sm.transitions[from] == nil { -// sm.transitions[from] = make(map[Event]*Transition[ -// StateT, -// VoteT, -// PeerIDT, -// CollectedT, -// ]) -// } -// sm.transitions[from][event] = &Transition[ -// StateT, -// VoteT, -// PeerIDT, -// CollectedT, -// ]{ -// From: from, -// Event: event, -// To: to, -// Guard: guard, -// } -// } - -// // Basic flow transitions -// addTransition(StateStopped, EventStart, StateStarting, nil) -// addTransition(StateStarting, EventInitComplete, StateLoading, nil) -// addTransition(StateLoading, EventSyncTimeout, StateLoading, nil) -// addTransition(StateLoading, EventSyncComplete, StateCollecting, nil) -// addTransition(StateCollecting, EventCollectionDone, StateLivenessCheck, nil) -// addTransition(StateLivenessCheck, EventProverSignal, StateProving, nil) - -// // Loop indefinitely if nobody can be found -// addTransition( -// StateLivenessCheck, -// EventLivenessTimeout, -// StateLivenessCheck, -// nil, -// ) -// // // Loop until we get enough of these -// // addTransition( -// // StateLivenessCheck, -// // EventLivenessCheckReceived, -// // StateLivenessCheck, -// // nil, -// // ) - -// // Prover flow -// addTransition(StateProving, EventProofComplete, StatePublishing, nil) -// addTransition(StateProving, EventPublishTimeout, StateVoting, nil) -// addTransition(StatePublishing, EventPublishComplete, StateVoting, nil) -// addTransition(StatePublishing, EventPublishTimeout, StateVoting, nil) - -// // Common voting flow -// addTransition(StateVoting, EventProposalReceived, StateVoting, nil) -// // addTransition(StateVoting, EventVoteReceived, StateVoting, nil) -// addTransition(StateVoting, EventQuorumReached, StateFinalizing, nil) -// addTransition(StateVoting, EventVotingTimeout, StateVoting, nil) -// addTransition(StateFinalizing, EventAggregationDone, StateVerifying, nil) -// addTransition(StateFinalizing, EventAggregationTimeout, StateFinalizing, nil) -// addTransition(StateVerifying, EventVerificationDone, StateCollecting, nil) -// addTransition(StateVerifying, EventVerificationTimeout, StateVerifying, nil) - -// // Stop or induce Sync transitions from any state -// for _, state := range []State{ -// StateStarting, -// StateLoading, -// StateCollecting, -// StateLivenessCheck, -// StateProving, -// StatePublishing, -// StateVoting, -// StateFinalizing, -// StateVerifying, -// } { -// addTransition(state, EventStop, StateStopping, nil) -// addTransition(state, EventInduceSync, StateLoading, nil) -// } - -// addTransition(StateStopping, EventCleanupComplete, StateStopped, nil) -// } -// */ diff --git a/consensus/state_machine_test.go b/consensus/state_machine_test.go deleted file mode 100644 index 2f90ff2..0000000 --- a/consensus/state_machine_test.go +++ /dev/null @@ -1,1055 +0,0 @@ -package consensus - -// import ( -// "context" -// "fmt" -// "slices" -// "sync" -// "testing" -// "time" - -// "github.com/pkg/errors" -// ) - -// // Test types for the generic state machine -// type TestState struct { -// Round uint64 -// Hash string -// Timestamp time.Time -// ProposalID string -// } - -// func (t TestState) Identity() string { -// return t.Hash -// } - -// func (t TestState) GetRank() uint64 { -// return t.Round -// } - -// func (t TestState) Clone() Unique { -// return TestState{ -// Round: t.Round, -// Hash: t.Hash, -// Timestamp: t.Timestamp, -// ProposalID: t.ProposalID, -// } -// } - -// type TestVote struct { -// Round uint64 -// VoterID string -// ProposalID string -// Signature string -// } - -// func (t TestVote) Identity() string { -// return t.VoterID -// } - -// func (t TestVote) GetRank() uint64 { -// return t.Round -// } - -// func (t TestVote) Clone() Unique { -// return TestVote{ -// Round: t.Round, -// VoterID: t.VoterID, -// ProposalID: t.ProposalID, -// Signature: t.Signature, -// } -// } - -// type TestPeerID string - -// func (t TestPeerID) Identity() string { -// return string(t) -// } - -// func (t TestPeerID) Clone() Unique { -// return t -// } - -// func (t TestPeerID) GetRank() uint64 { -// return 0 -// } - -// type TestCollected struct { -// Round uint64 -// Data []byte -// Timestamp time.Time -// } - -// func (t TestCollected) Identity() string { -// return string(t.Data) -// } - -// func (t TestCollected) GetRank() uint64 { -// return t.Round -// } - -// func (t TestCollected) Clone() Unique { -// return TestCollected{ -// Round: t.Round, -// Data: slices.Clone(t.Data), -// Timestamp: t.Timestamp, -// } -// } - -// // Mock implementations -// type mockSyncProvider struct { -// syncDelay time.Duration -// newState *TestState -// } - -// func (m *mockSyncProvider) Synchronize( -// ctx context.Context, -// existing *TestState, -// ) (<-chan *TestState, <-chan error) { -// stateCh := make(chan *TestState, 1) -// errCh := make(chan error, 1) - -// go func() { -// select { -// case <-time.After(m.syncDelay): -// if m.newState != nil { -// stateCh <- m.newState -// } else if existing != nil { -// // Just return existing state -// stateCh <- existing -// } else { -// // Create initial state -// stateCh <- &TestState{ -// Round: 0, -// Hash: "genesis", -// Timestamp: time.Now(), -// } -// } -// close(stateCh) -// close(errCh) -// case <-ctx.Done(): -// close(stateCh) -// close(errCh) -// } -// }() - -// return stateCh, errCh -// } - -// type mockVotingProvider struct { -// mu sync.Mutex -// quorumSize int -// sentProposals []*TestState -// sentVotes []*TestVote -// confirmations []*TestState -// } - -// func (m *mockVotingProvider) SendProposal(ctx context.Context, proposal *TestState) error { -// m.mu.Lock() -// defer m.mu.Unlock() -// m.sentProposals = append(m.sentProposals, proposal) -// return nil -// } - -// func (m *mockVotingProvider) DecideAndSendVote( -// ctx context.Context, -// proposals map[Identity]*TestState, -// ) (TestPeerID, *TestVote, error) { -// m.mu.Lock() -// defer m.mu.Unlock() - -// // Pick first proposal -// for peerID, proposal := range proposals { -// if proposal == nil { -// continue -// } -// vote := &TestVote{ -// VoterID: "leader1", -// ProposalID: proposal.ProposalID, -// Signature: "test-sig", -// } -// m.sentVotes = append(m.sentVotes, vote) -// return TestPeerID(peerID), vote, nil -// } - -// return "", nil, errors.New("no proposal to vote for") -// } - -// func (m *mockVotingProvider) SendVote(ctx context.Context, vote *TestVote) (TestPeerID, error) { -// return "", nil -// } - -// func (m *mockVotingProvider) IsQuorum(ctx context.Context, proposalVotes map[Identity]*TestVote) (bool, error) { -// totalVotes := 0 -// voteCount := map[string]int{} -// for _, votes := range proposalVotes { -// count, ok := voteCount[votes.ProposalID] -// if !ok { -// voteCount[votes.ProposalID] = 1 -// } else { -// voteCount[votes.ProposalID] = count + 1 -// } -// totalVotes += 1 - -// if count >= m.quorumSize { -// return true, nil -// } -// } -// if totalVotes >= m.quorumSize { -// return false, errors.New("split quorum") -// } -// return false, nil -// } - -// func (m *mockVotingProvider) FinalizeVotes( -// ctx context.Context, -// proposals map[Identity]*TestState, -// proposalVotes map[Identity]*TestVote, -// ) (*TestState, TestPeerID, error) { -// // Pick the proposal with the most votes -// winnerCount := 0 -// var winnerProposal *TestState = nil -// var winnerProposer TestPeerID -// voteCount := map[string]int{} -// for _, votes := range proposalVotes { -// count, ok := voteCount[votes.ProposalID] -// if !ok { -// voteCount[votes.ProposalID] = 1 -// } else { -// voteCount[votes.ProposalID] = count + 1 -// } -// } -// for peerID, proposal := range proposals { -// if proposal == nil { -// continue -// } -// if _, ok := voteCount[proposal.ProposalID]; !ok { -// continue -// } -// if voteCount[proposal.ProposalID] > winnerCount { -// winnerCount = voteCount[proposal.ProposalID] -// winnerProposal = proposal -// winnerProposer = TestPeerID(peerID) -// } -// } - -// if winnerProposal != nil { -// // Create new state with incremented round -// newState := &TestState{ -// Round: winnerProposal.Round + 1, -// Hash: "hash-" + fmt.Sprintf("%d", winnerProposal.Round+1), -// Timestamp: time.Now(), -// ProposalID: "finalized", -// } -// return newState, winnerProposer, nil -// } - -// // Default to first proposal -// for peerID, proposal := range proposals { -// if proposal == nil { -// continue -// } -// newState := &TestState{ -// Round: proposal.Round + 1, -// Hash: "hash-" + fmt.Sprintf("%d", proposal.Round+1), -// Timestamp: time.Now(), -// ProposalID: "finalized", -// } -// return newState, TestPeerID(peerID), nil -// } - -// return nil, "", nil -// } - -// func (m *mockVotingProvider) SendConfirmation(ctx context.Context, finalized *TestState) error { -// m.mu.Lock() -// defer m.mu.Unlock() -// m.confirmations = append(m.confirmations, finalized) -// return nil -// } - -// type mockLeaderProvider struct { -// isLeader bool -// leaders []TestPeerID -// proveDelay time.Duration -// shouldFail bool -// } - -// func (m *mockLeaderProvider) GetNextLeaders(ctx context.Context, prior *TestState) ([]TestPeerID, error) { -// if len(m.leaders) > 0 { -// return m.leaders, nil -// } -// return []TestPeerID{"leader1", "leader2", "leader3"}, nil -// } - -// func (m *mockLeaderProvider) ProveNextState( -// ctx context.Context, -// prior *TestState, -// collected TestCollected, -// ) (*TestState, error) { -// if m.shouldFail || !m.isLeader { -// return nil, context.Canceled -// } - -// select { -// case <-time.After(m.proveDelay): -// round := uint64(0) -// if prior != nil { -// round = prior.Round -// } -// return &TestState{ -// Round: round + 1, -// Hash: "proved-hash", -// Timestamp: time.Now(), -// ProposalID: "proposal-" + fmt.Sprintf("%d", round+1), -// }, nil -// case <-ctx.Done(): -// return nil, ctx.Err() -// } -// } - -// type mockLivenessProvider struct { -// collectDelay time.Duration -// sentLiveness int -// mu sync.Mutex -// } - -// func (m *mockLivenessProvider) Collect(ctx context.Context) (TestCollected, error) { -// select { -// case <-time.After(m.collectDelay): -// return TestCollected{ -// Round: 1, -// Data: []byte("collected-data"), -// Timestamp: time.Now(), -// }, nil -// case <-ctx.Done(): -// return TestCollected{}, ctx.Err() -// } -// } - -// func (m *mockLivenessProvider) SendLiveness(ctx context.Context, prior *TestState, collected TestCollected) error { -// m.mu.Lock() -// defer m.mu.Unlock() -// m.sentLiveness++ -// return nil -// } - -// // MockTransitionListener for tracking state transitions -// type MockTransitionListener struct { -// mu sync.Mutex -// transitions []TransitionRecord -// } - -// type TransitionRecord struct { -// From State -// To State -// Event Event -// Time time.Time -// } - -// func (m *MockTransitionListener) OnTransition(from State, to State, event Event) { -// m.mu.Lock() -// defer m.mu.Unlock() -// m.transitions = append(m.transitions, TransitionRecord{ -// From: from, -// To: to, -// Event: event, -// Time: time.Now(), -// }) -// } - -// func (m *MockTransitionListener) GetTransitions() []TransitionRecord { -// m.mu.Lock() -// defer m.mu.Unlock() -// result := make([]TransitionRecord, len(m.transitions)) -// copy(result, m.transitions) -// return result -// } - -// // Helper to create test state machine -// func createTestStateMachine( -// id TestPeerID, -// isLeader bool, -// ) *StateMachine[TestState, TestVote, TestPeerID, TestCollected] { -// leaders := []TestPeerID{"leader1", "leader2", "leader3"} -// if isLeader { -// leaders[0] = id -// } - -// // For leader-only tests, set minimumProvers to 1 -// minimumProvers := func() uint64 { return uint64(2) } -// if isLeader { -// minimumProvers = func() uint64 { return uint64(1) } -// } - -// return NewStateMachine( -// id, -// &TestState{Round: 0, Hash: "genesis", Timestamp: time.Now()}, -// true, // shouldEmitReceiveEventsOnSends -// minimumProvers, -// &mockSyncProvider{syncDelay: 10 * time.Millisecond}, -// &mockVotingProvider{quorumSize: int(minimumProvers())}, -// &mockLeaderProvider{ -// isLeader: isLeader, -// leaders: leaders, -// proveDelay: 50 * time.Millisecond, -// }, -// &mockLivenessProvider{collectDelay: 10 * time.Millisecond}, -// nil, -// ) -// } - -// // Helper to wait for a specific state in transition history -// func waitForTransition(listener *MockTransitionListener, targetState State, timeout time.Duration) bool { -// deadline := time.Now().Add(timeout) -// for time.Now().Before(deadline) { -// transitions := listener.GetTransitions() -// for _, tr := range transitions { -// if tr.To == targetState { -// return true -// } -// } -// time.Sleep(10 * time.Millisecond) -// } -// return false -// } - -// // Helper to check if a state was reached in transition history -// func hasReachedState(listener *MockTransitionListener, targetState State) bool { -// transitions := listener.GetTransitions() -// for _, tr := range transitions { -// if tr.To == targetState { -// return true -// } -// } -// return false -// } - -// func TestStateMachineBasicTransitions(t *testing.T) { -// sm := createTestStateMachine("test-node", true) -// defer sm.Close() - -// // Initial state should be stopped -// if sm.GetState() != StateStopped { -// t.Errorf("Expected initial state to be %s, got %s", StateStopped, sm.GetState()) -// } - -// listener := &MockTransitionListener{} -// sm.AddListener(listener) - -// // Start the state machine -// err := sm.Start() -// if err != nil { -// t.Fatalf("Failed to start state machine: %v", err) -// } - -// time.Sleep(10 * time.Millisecond) - -// // Should transition to starting immediately -// if sm.GetState() != StateStarting { -// t.Errorf("Expected state to be %s after start, got %s", StateStarting, sm.GetState()) -// } - -// // Wait for automatic transitions -// if !waitForTransition(listener, StateLoading, 2*time.Second) { -// t.Fatalf("Failed to reach loading state") -// } - -// if !waitForTransition(listener, StateCollecting, 3*time.Second) { -// t.Fatalf("Failed to reach collecting state") -// } - -// // Verify the expected transition sequence -// transitions := listener.GetTransitions() -// expectedSequence := []State{StateStarting, StateLoading, StateCollecting} - -// for i, expected := range expectedSequence { -// if i >= len(transitions) { -// t.Errorf("Missing transition to %s", expected) -// continue -// } -// if transitions[i].To != expected { -// t.Errorf("Expected transition %d to be to %s, got %s", i, expected, transitions[i].To) -// } -// } -// } - -// func TestStateMachineLeaderFlow(t *testing.T) { -// sm := createTestStateMachine("leader1", true) -// defer sm.Close() - -// listener := &MockTransitionListener{} -// sm.AddListener(listener) - -// // Start the machine -// err := sm.Start() -// if err != nil { -// t.Fatalf("Failed to start: %v", err) -// } - -// // Wait for the leader to progress through states -// if !waitForTransition(listener, StateCollecting, 3*time.Second) { -// t.Fatalf("Failed to reach collecting state") -// } - -// // Leader should reach proving state -// if !waitForTransition(listener, StateProving, 5*time.Second) { -// // Debug output if test fails -// transitions := listener.GetTransitions() -// t.Logf("Current state: %s", sm.GetState()) -// t.Logf("Total transitions: %d", len(transitions)) -// for _, tr := range transitions { -// t.Logf("Transition: %s -> %s [%s]", tr.From, tr.To, tr.Event) -// } -// t.Fatalf("Leader should have entered proving state") -// } - -// // Verify expected states were reached -// if !hasReachedState(listener, StateCollecting) { -// t.Error("Leader should have gone through collecting state") -// } -// if !hasReachedState(listener, StateLivenessCheck) { -// t.Error("Leader should have gone through liveness check state") -// } -// if !hasReachedState(listener, StateProving) { -// t.Error("Leader should have entered proving state") -// } -// } - -// func TestStateMachineExternalEvents(t *testing.T) { -// sm := createTestStateMachine("leader1", true) -// defer sm.Close() - -// listener := &MockTransitionListener{} -// sm.AddListener(listener) - -// sm.Start() - -// // Wait for collecting state -// if !waitForTransition(listener, StateCollecting, 3*time.Second) { -// t.Fatalf("Failed to reach collecting state") -// } - -// // Send liveness check -// sm.ReceiveLivenessCheck("leader2", TestCollected{Round: 1, Data: []byte("foo"), Timestamp: time.Now()}) - -// // Receive a proposal while collecting -// err := sm.ReceiveProposal(1, "external-leader", &TestState{ -// Round: 1, -// Hash: "external-hash", -// Timestamp: time.Now(), -// ProposalID: "external-proposal", -// }) -// if err != nil { -// t.Fatalf("Failed to receive proposal: %v", err) -// } - -// // Should transition to voting -// if !waitForTransition(listener, StateVoting, 4*time.Second) { -// t.Errorf("Expected to transition to voting after proposal") -// } - -// // Verify the transition happened -// if !hasReachedState(listener, StateVoting) { -// transitions := listener.GetTransitions() -// t.Logf("Total transitions: %d", len(transitions)) -// for _, tr := range transitions { -// t.Logf("Transition: %s -> %s [%s]", tr.From, tr.To, tr.Event) -// } -// t.Error("Should have transitioned to voting state") -// } -// } - -// func TestStateMachineVoting(t *testing.T) { -// sm := createTestStateMachine("leader1", true) -// defer sm.Close() - -// listener := &MockTransitionListener{} -// sm.AddListener(listener) - -// sm.Start() - -// // Wait for collecting state -// if !waitForTransition(listener, StateCollecting, 3*time.Second) { -// t.Fatalf("Failed to reach collecting state") -// } - -// // Send liveness check -// sm.ReceiveLivenessCheck("leader2", TestCollected{Round: 1, Data: []byte("foo"), Timestamp: time.Now()}) - -// // Send proposal to trigger voting -// sm.ReceiveProposal(1, "leader2", &TestState{ -// Round: 1, -// Hash: "test-hash", -// Timestamp: time.Now(), -// ProposalID: "test-proposal", -// }) - -// // Wait for voting state -// if !waitForTransition(listener, StateVoting, 2*time.Second) { -// t.Fatalf("Failed to reach voting state") -// } - -// // Add another vote to reach quorum -// err := sm.ReceiveVote("leader1", "leader2", &TestVote{ -// Round: 1, -// VoterID: "leader2", -// ProposalID: "test-proposal", -// Signature: "sig2", -// }) -// if err != nil { -// t.Fatalf("Failed to receive vote: %v", err) -// } - -// // Should eventually progress past voting (to finalizing, verifying, or back to collecting) -// time.Sleep(2 * time.Second) - -// // Check if we progressed past voting -// progressedPastVoting := hasReachedState(listener, StateFinalizing) || -// hasReachedState(listener, StateVerifying) || -// (hasReachedState(listener, StateCollecting) && len(listener.GetTransitions()) > 5) - -// if !progressedPastVoting { -// // If still stuck, try manual trigger -// sm.SendEvent(EventQuorumReached) -// time.Sleep(500 * time.Millisecond) - -// progressedPastVoting = hasReachedState(listener, StateFinalizing) || -// hasReachedState(listener, StateVerifying) || -// (hasReachedState(listener, StateCollecting) && len(listener.GetTransitions()) > 5) -// } - -// if !progressedPastVoting { -// transitions := listener.GetTransitions() -// t.Logf("Total transitions: %d", len(transitions)) -// for _, tr := range transitions { -// t.Logf("Transition: %s -> %s [%s]", tr.From, tr.To, tr.Event) -// } -// t.Errorf("Expected to progress past voting with quorum") -// } -// } - -// func TestStateMachineStop(t *testing.T) { -// sm := createTestStateMachine("leader1", true) -// defer sm.Close() - -// listener := &MockTransitionListener{} -// sm.AddListener(listener) - -// sm.Start() - -// // Wait for any state beyond starting -// if !waitForTransition(listener, StateLoading, 2*time.Second) { -// t.Fatalf("State machine did not progress from starting") -// } - -// // Stop from any state -// err := sm.Stop() -// if err != nil { -// t.Fatalf("Failed to stop: %v", err) -// } - -// // Should transition to stopping -// if !waitForTransition(listener, StateStopping, 1*time.Second) { -// t.Errorf("Expected to transition to stopping state") -// } - -// // Should eventually reach stopped -// if !waitForTransition(listener, StateStopped, 3*time.Second) { -// // Try manual cleanup complete -// sm.SendEvent(EventCleanupComplete) -// time.Sleep(100 * time.Millisecond) -// } - -// // Verify we reached stopped state -// if !hasReachedState(listener, StateStopped) { -// transitions := listener.GetTransitions() -// t.Logf("Total transitions: %d", len(transitions)) -// for _, tr := range transitions { -// t.Logf("Transition: %s -> %s [%s]", tr.From, tr.To, tr.Event) -// } -// t.Errorf("Expected to reach stopped state") -// } -// } - -// func TestStateMachineLiveness(t *testing.T) { -// sm := createTestStateMachine("leader1", true) -// defer sm.Close() - -// listener := &MockTransitionListener{} -// sm.AddListener(listener) - -// sm.Start() - -// // Wait for collecting state -// if !waitForTransition(listener, StateCollecting, 3*time.Second) { -// t.Fatalf("Failed to reach collecting state") -// } - -// // Wait for liveness check state -// if !waitForTransition(listener, StateLivenessCheck, 3*time.Second) { -// transitions := listener.GetTransitions() -// t.Logf("Total transitions: %d", len(transitions)) -// for _, tr := range transitions { -// t.Logf("Transition: %s -> %s [%s]", tr.From, tr.To, tr.Event) -// } -// t.Fatalf("Failed to reach liveness check state") -// } - -// // Receive liveness checks -// sm.ReceiveLivenessCheck("peer1", TestCollected{ -// Data: []byte("peer1-data"), -// Timestamp: time.Now(), -// }) - -// sm.ReceiveLivenessCheck("peer2", TestCollected{ -// Data: []byte("peer2-data"), -// Timestamp: time.Now(), -// }) - -// // Give it a moment to process -// time.Sleep(100 * time.Millisecond) - -// // Check that liveness data was stored -// sm.mu.RLock() -// livenessCount := len(sm.liveness) -// sm.mu.RUnlock() - -// // Should have at least 2 entries (or 3 if self-emit is counted) -// if livenessCount < 2 { -// t.Errorf("Expected at least 2 liveness entries, got %d", livenessCount) -// } -// } - -// func TestStateMachineMetrics(t *testing.T) { -// sm := createTestStateMachine("leader1", true) -// defer sm.Close() - -// // Initial metrics -// if sm.GetTransitionCount() != 0 { -// t.Error("Expected initial transition count to be 0") -// } - -// listener := &MockTransitionListener{} -// sm.AddListener(listener) - -// // Make transitions -// sm.Start() - -// // Wait for a few transitions -// if !waitForTransition(listener, StateCollecting, 3*time.Second) { -// t.Fatalf("Failed to reach collecting state") -// } - -// if sm.GetTransitionCount() == 0 { -// t.Error("Expected transition count to be greater than 0") -// } - -// // Check state time -// stateTime := sm.GetStateTime() -// if stateTime < 0 { -// t.Errorf("Invalid state time: %v", stateTime) -// } -// } - -// func TestStateMachineConfirmations(t *testing.T) { -// sm := createTestStateMachine("leader1", true) -// sm.id = "leader1" -// defer sm.Close() - -// listener := &MockTransitionListener{} -// sm.AddListener(listener) - -// sm.Start() - -// // Progress to voting state via proposal -// if !waitForTransition(listener, StateCollecting, 3*time.Second) { -// t.Fatalf("Failed to reach collecting state") -// } - -// // Send liveness check -// sm.ReceiveLivenessCheck("leader2", TestCollected{Round: 1, Data: []byte("foo"), Timestamp: time.Now()}) - -// // Send proposal to get to voting -// sm.ReceiveProposal(1, "leader2", &TestState{ -// Round: 1, -// Hash: "test-hash", -// Timestamp: time.Now(), -// ProposalID: "test-proposal", -// }) - -// // Wait for voting -// if !waitForTransition(listener, StateVoting, 2*time.Second) { -// t.Fatalf("Failed to reach voting state") -// } - -// // Wait a bit for auto-progression or trigger manually -// time.Sleep(1 * time.Second) - -// // Try to progress to finalizing -// sm.SendEvent(EventVotingTimeout) -// time.Sleep(500 * time.Millisecond) - -// // Check if we reached a state that accepts confirmations -// currentState := sm.GetState() -// canAcceptConfirmation := currentState == StateFinalizing || currentState == StateVerifying - -// if !canAcceptConfirmation { -// // Check transition history -// if hasReachedState(listener, StateFinalizing) || hasReachedState(listener, StateVerifying) { -// // We passed through the state already, that's ok -// canAcceptConfirmation = true -// } else { -// transitions := listener.GetTransitions() -// t.Logf("Current state: %s", currentState) -// t.Logf("Total transitions: %d", len(transitions)) -// for _, tr := range transitions { -// t.Logf("Transition: %s -> %s [%s]", tr.From, tr.To, tr.Event) -// } -// // Don't fail - just skip the confirmation test -// t.Skip("Could not reach a state that accepts confirmations") -// } -// } - -// // Send confirmation (should only be accepted in finalizing or verifying) -// sm.ReceiveConfirmation("leader2", &TestState{ -// Round: 1, -// Hash: "confirmed-hash", -// Timestamp: time.Now(), -// ProposalID: "confirmed", -// }) - -// // Check that confirmation was stored -// sm.mu.RLock() -// confirmCount := len(sm.confirmations) -// sm.mu.RUnlock() - -// if confirmCount != 1 { -// t.Errorf("Expected 1 confirmation, got %d", confirmCount) -// } -// } - -// func TestStateMachineConcurrency(t *testing.T) { -// sm := createTestStateMachine("leader1", true) -// defer sm.Close() - -// sm.Start() -// time.Sleep(500 * time.Millisecond) - -// // Concurrent operations -// var wg sync.WaitGroup -// errChan := make(chan error, 5) - -// // Send multiple events concurrently -// for i := 0; i < 5; i++ { -// wg.Add(1) -// go func() { -// defer wg.Done() -// sm.SendEvent(EventSyncComplete) -// }() -// } - -// // Receive data concurrently -// for i := 0; i < 5; i++ { -// wg.Add(1) -// go func(id int) { -// defer wg.Done() -// peerID := TestPeerID(fmt.Sprintf("peer%d", id)) -// if err := sm.ReceiveLivenessCheck(peerID, TestCollected{ -// Data: []byte("data"), -// }); err != nil { -// errChan <- err -// } -// }(i) -// } - -// wg.Wait() -// close(errChan) - -// // Some errors are expected due to invalid state transitions -// errorCount := 0 -// for err := range errChan { -// if err != nil { -// errorCount++ -// } -// } - -// // As long as we didn't panic, concurrency is handled -// t.Logf("Concurrent operations completed with %d errors (expected)", errorCount) -// } - -// type mockPanickingVotingProvider struct { -// mu sync.Mutex -// quorumSize int -// sentProposals []*TestState -// sentVotes []*TestVote -// confirmations []*TestState -// } - -// func (m *mockPanickingVotingProvider) SendProposal(ctx context.Context, proposal *TestState) error { -// m.mu.Lock() -// defer m.mu.Unlock() -// m.sentProposals = append(m.sentProposals, proposal) -// return nil -// } - -// func (m *mockPanickingVotingProvider) DecideAndSendVote( -// ctx context.Context, -// proposals map[Identity]*TestState, -// ) (TestPeerID, *TestVote, error) { -// m.mu.Lock() -// defer m.mu.Unlock() - -// // Pick first proposal -// for peerID, proposal := range proposals { -// if proposal == nil { -// continue -// } -// vote := &TestVote{ -// VoterID: "leader1", -// ProposalID: proposal.ProposalID, -// Signature: "test-sig", -// } -// m.sentVotes = append(m.sentVotes, vote) -// return TestPeerID(peerID), vote, nil -// } - -// return "", nil, errors.New("no proposal to vote for") -// } - -// func (m *mockPanickingVotingProvider) IsQuorum(ctx context.Context, proposalVotes map[Identity]*TestVote) (bool, error) { -// totalVotes := 0 -// voteCount := map[string]int{} -// for _, votes := range proposalVotes { -// count, ok := voteCount[votes.ProposalID] -// if !ok { -// voteCount[votes.ProposalID] = 1 -// count = 1 -// } else { -// voteCount[votes.ProposalID] = count + 1 -// count = count + 1 -// } -// totalVotes += 1 - -// if count >= m.quorumSize { -// return true, nil -// } -// } -// if totalVotes >= m.quorumSize { -// return false, errors.New("split quorum") -// } -// return false, nil -// } - -// func (m *mockPanickingVotingProvider) FinalizeVotes( -// ctx context.Context, -// proposals map[Identity]*TestState, -// proposalVotes map[Identity]*TestVote, -// ) (*TestState, TestPeerID, error) { -// // Pick the proposal with the most votes -// winnerCount := 0 -// var winnerProposal *TestState = nil -// var winnerProposer TestPeerID -// voteCount := map[string]int{} -// for _, votes := range proposalVotes { -// count, ok := voteCount[votes.ProposalID] -// if !ok { -// voteCount[votes.ProposalID] = 1 -// count = 1 -// } else { -// voteCount[votes.ProposalID] = count + 1 -// count += 1 -// } -// } -// for peerID, proposal := range proposals { -// if proposal == nil { -// continue -// } -// if _, ok := voteCount[proposal.ProposalID]; !ok { -// continue -// } -// if voteCount[proposal.ProposalID] > winnerCount { -// winnerCount = voteCount[proposal.ProposalID] -// winnerProposal = proposal -// winnerProposer = TestPeerID(peerID) -// } -// } - -// if winnerProposal != nil { -// // Create new state with incremented round -// newState := &TestState{ -// Round: winnerProposal.Round + 1, -// Hash: "hash-" + fmt.Sprintf("%d", winnerProposal.Round+1), -// Timestamp: time.Now(), -// ProposalID: "finalized", -// } -// return newState, winnerProposer, nil -// } - -// // Default to first proposal -// for peerID, proposal := range proposals { -// if proposal == nil { -// continue -// } -// newState := &TestState{ -// Round: proposal.Round + 1, -// Hash: "hash-" + fmt.Sprintf("%d", proposal.Round+1), -// Timestamp: time.Now(), -// ProposalID: "finalized", -// } -// return newState, TestPeerID(peerID), nil -// } - -// return nil, "", nil -// } - -// func (m *mockPanickingVotingProvider) SendVote(ctx context.Context, vote *TestVote) (TestPeerID, error) { -// return "", nil -// } - -// func (m *mockPanickingVotingProvider) SendConfirmation(ctx context.Context, finalized *TestState) error { -// panic("PANIC HERE") -// } - -// type printtracer struct{} - -// // Error implements TraceLogger. -// func (p *printtracer) Error(message string, err error) { -// fmt.Println("[error]", message, err) -// } - -// // Trace implements TraceLogger. -// func (p *printtracer) Trace(message string) { -// fmt.Println("[trace]", message) -// } - -// func TestStateMachinePanicRecovery(t *testing.T) { -// minimumProvers := func() uint64 { return uint64(1) } - -// sm := NewStateMachine( -// "leader1", -// &TestState{Round: 0, Hash: "genesis", Timestamp: time.Now()}, -// true, // shouldEmitReceiveEventsOnSends -// minimumProvers, -// &mockSyncProvider{syncDelay: 10 * time.Millisecond}, -// &mockPanickingVotingProvider{quorumSize: 1}, -// &mockLeaderProvider{ -// isLeader: true, -// leaders: []TestPeerID{"leader1"}, -// proveDelay: 50 * time.Millisecond, -// }, -// &mockLivenessProvider{collectDelay: 10 * time.Millisecond}, -// &printtracer{}, -// ) -// defer sm.Close() - -// sm.Start() -// time.Sleep(10 * time.Second) -// sm.mu.Lock() -// if sm.machineState != StateStopped { -// sm.mu.Unlock() -// t.FailNow() -// } -// sm.mu.Unlock() - -// } diff --git a/consensus/state_machine_viz.go b/consensus/state_machine_viz.go deleted file mode 100644 index 9285150..0000000 --- a/consensus/state_machine_viz.go +++ /dev/null @@ -1,360 +0,0 @@ -package consensus - -// import ( -// "fmt" -// "strings" -// "time" -// ) - -// // StateMachineViz provides visualization utilities for the generic state machine -// type StateMachineViz[ -// StateT Unique, -// VoteT Unique, -// PeerIDT Unique, -// CollectedT Unique, -// ] struct { -// sm *StateMachine[StateT, VoteT, PeerIDT, CollectedT] -// } - -// // NewStateMachineViz creates a new visualizer for the generic state machine -// func NewStateMachineViz[ -// StateT Unique, -// VoteT Unique, -// PeerIDT Unique, -// CollectedT Unique, -// ]( -// sm *StateMachine[StateT, VoteT, PeerIDT, CollectedT], -// ) *StateMachineViz[StateT, VoteT, PeerIDT, CollectedT] { -// return &StateMachineViz[StateT, VoteT, PeerIDT, CollectedT]{sm: sm} -// } - -// // GenerateMermaidDiagram generates a Mermaid diagram of the state machine -// func ( -// v *StateMachineViz[StateT, VoteT, PeerIDT, CollectedT], -// ) GenerateMermaidDiagram() string { -// var sb strings.Builder - -// sb.WriteString("```mermaid\n") -// sb.WriteString("stateDiagram-v2\n") -// sb.WriteString(" [*] --> Stopped\n") - -// // Define states with descriptions -// // Use CamelCase for state IDs to avoid underscore issues -// stateMap := map[State]string{ -// StateStopped: "Stopped", -// StateStarting: "Starting", -// StateLoading: "Loading", -// StateCollecting: "Collecting", -// StateLivenessCheck: "LivenessCheck", -// StateProving: "Proving", -// StatePublishing: "Publishing", -// StateVoting: "Voting", -// StateFinalizing: "Finalizing", -// StateVerifying: "Verifying", -// StateStopping: "Stopping", -// } - -// stateDescriptions := map[State]string{ -// StateStopped: "Engine not running", -// StateStarting: "Initializing components", -// StateLoading: "Syncing with network", -// StateCollecting: "Gathering consensus data", -// StateLivenessCheck: "Checking prover availability", -// StateProving: "Generating cryptographic proof", -// StatePublishing: "Broadcasting proposal", -// StateVoting: "Participating in consensus", -// StateFinalizing: "Aggregating votes", -// StateVerifying: "Publishing confirmation", -// StateStopping: "Cleaning up resources", -// } - -// // Add state descriptions -// for state, id := range stateMap { -// desc := stateDescriptions[state] -// sb.WriteString(fmt.Sprintf(" %s : %s\n", id, desc)) -// } - -// sb.WriteString("\n") - -// // Add transitions using mapped state names -// transitions := v.getTransitionList() -// for _, t := range transitions { -// fromID := stateMap[t.From] -// toID := stateMap[t.To] -// if t.Guard != nil { -// sb.WriteString(fmt.Sprintf( -// " %s --> %s : %s [guarded]\n", -// fromID, toID, t.Event)) -// } else { -// sb.WriteString(fmt.Sprintf( -// " %s --> %s : %s\n", -// fromID, toID, t.Event)) -// } -// } - -// // Add special annotations using mapped names -// sb.WriteString("\n") -// sb.WriteString(" note right of Proving : Leader only\n") -// sb.WriteString( -// " note right of LivenessCheck : Divergence point\\nfor leader/non-leader\n", -// ) -// sb.WriteString(" note right of Voting : Convergence point\n") - -// sb.WriteString("```\n") - -// return sb.String() -// } - -// // GenerateDotDiagram generates a Graphviz DOT diagram -// func ( -// v *StateMachineViz[StateT, VoteT, PeerIDT, CollectedT], -// ) GenerateDotDiagram() string { -// var sb strings.Builder - -// sb.WriteString("digraph ConsensusStateMachine {\n") -// sb.WriteString(" rankdir=TB;\n") -// sb.WriteString(" node [shape=box, style=rounded];\n") -// sb.WriteString(" edge [fontsize=10];\n\n") - -// // Define node styles -// sb.WriteString(" // State styles\n") -// sb.WriteString( -// " Stopped [style=\"rounded,filled\", fillcolor=lightgray];\n", -// ) -// sb.WriteString( -// " Starting [style=\"rounded,filled\", fillcolor=lightyellow];\n", -// ) -// sb.WriteString( -// " Loading [style=\"rounded,filled\", fillcolor=lightyellow];\n", -// ) -// sb.WriteString( -// " Collecting [style=\"rounded,filled\", fillcolor=lightblue];\n", -// ) -// sb.WriteString( -// " LivenessCheck [style=\"rounded,filled\", fillcolor=orange];\n", -// ) -// sb.WriteString( -// " Proving [style=\"rounded,filled\", fillcolor=lightgreen];\n", -// ) -// sb.WriteString( -// " Publishing [style=\"rounded,filled\", fillcolor=lightgreen];\n", -// ) -// sb.WriteString( -// " Voting [style=\"rounded,filled\", fillcolor=lightblue];\n", -// ) -// sb.WriteString( -// " Finalizing [style=\"rounded,filled\", fillcolor=lightblue];\n", -// ) -// sb.WriteString( -// " Verifying [style=\"rounded,filled\", fillcolor=lightblue];\n", -// ) -// sb.WriteString( -// " Stopping [style=\"rounded,filled\", fillcolor=lightcoral];\n\n", -// ) - -// // Add transitions -// sb.WriteString(" // Transitions\n") -// transitions := v.getTransitionList() -// for _, t := range transitions { -// label := string(t.Event) -// if t.Guard != nil { -// label += " [G]" -// } -// sb.WriteString(fmt.Sprintf( -// " %s -> %s [label=\"%s\"];\n", -// t.From, t.To, label)) -// } - -// // Add legend -// sb.WriteString("\n // Legend\n") -// sb.WriteString(" subgraph cluster_legend {\n") -// sb.WriteString(" label=\"Legend\";\n") -// sb.WriteString(" style=dotted;\n") -// sb.WriteString(" \"[G] = Guarded transition\" [shape=none];\n") -// sb.WriteString(" \"Yellow = Initialization\" [shape=none];\n") -// sb.WriteString(" \"Blue = Consensus flow\" [shape=none];\n") -// sb.WriteString(" \"Green = Leader specific\" [shape=none];\n") -// sb.WriteString(" \"Orange = Decision point\" [shape=none];\n") -// sb.WriteString(" }\n") - -// sb.WriteString("}\n") - -// return sb.String() -// } - -// // GenerateTransitionTable generates a markdown table of all transitions -// func ( -// v *StateMachineViz[StateT, VoteT, PeerIDT, CollectedT], -// ) GenerateTransitionTable() string { -// var sb strings.Builder - -// sb.WriteString("| From State | Event | To State | Condition |\n") -// sb.WriteString("|------------|-------|----------|----------|\n") - -// transitions := v.getTransitionList() -// for _, t := range transitions { -// condition := "None" -// if t.Guard != nil { -// condition = "Has guard" -// } -// sb.WriteString(fmt.Sprintf( -// "| %s | %s | %s | %s |\n", -// t.From, t.Event, t.To, condition)) -// } - -// return sb.String() -// } - -// // getTransitionList extracts all transitions from the state machine -// func ( -// v *StateMachineViz[StateT, VoteT, PeerIDT, CollectedT], -// ) getTransitionList() []*Transition[StateT, VoteT, PeerIDT, CollectedT] { -// var transitions []*Transition[StateT, VoteT, PeerIDT, CollectedT] - -// v.sm.mu.RLock() -// defer v.sm.mu.RUnlock() - -// for _, eventMap := range v.sm.transitions { -// for _, transition := range eventMap { -// transitions = append(transitions, transition) -// } -// } - -// return transitions -// } - -// // GetStateStats returns statistics about the state machine -// func ( -// v *StateMachineViz[StateT, VoteT, PeerIDT, CollectedT], -// ) GetStateStats() string { -// var sb strings.Builder - -// sb.WriteString("State Machine Statistics:\n") -// sb.WriteString("========================\n\n") - -// v.sm.mu.RLock() -// defer v.sm.mu.RUnlock() - -// // Count states and transitions -// stateCount := 0 -// transitionCount := 0 -// eventCount := make(map[Event]int) - -// for _, eventMap := range v.sm.transitions { -// // Only count if we have transitions for this state -// if len(eventMap) > 0 { -// stateCount++ -// } -// for event := range eventMap { -// transitionCount++ -// eventCount[event]++ -// } -// } - -// sb.WriteString(fmt.Sprintf("Total States: %d\n", stateCount)) -// sb.WriteString(fmt.Sprintf("Total Transitions: %d\n", transitionCount)) -// sb.WriteString(fmt.Sprintf("Current State: %s\n", v.sm.machineState)) -// sb.WriteString(fmt.Sprintf("Transitions Made: %d\n", v.sm.transitionCount)) -// sb.WriteString( -// fmt.Sprintf("Time in Current State: %v\n", v.sm.GetStateTime()), -// ) - -// // Display current leader info if available -// if len(v.sm.nextProvers) > 0 { -// sb.WriteString("\nNext Leaders:\n") -// for i, leader := range v.sm.nextProvers { -// sb.WriteString(fmt.Sprintf(" %d. %v\n", i+1, leader)) -// } -// } - -// // Display active state info -// if v.sm.activeState != nil { -// sb.WriteString(fmt.Sprintf("\nActive State: %+v\n", v.sm.activeState)) -// } - -// // Display liveness info -// sb.WriteString(fmt.Sprintf("\nLiveness Checks: %d\n", len(v.sm.liveness))) - -// // Display voting info -// sb.WriteString(fmt.Sprintf("Proposals: %d\n", len(v.sm.proposals))) -// sb.WriteString(fmt.Sprintf("Votes: %d\n", len(v.sm.votes))) -// sb.WriteString(fmt.Sprintf("Confirmations: %d\n", len(v.sm.confirmations))) - -// sb.WriteString("\nEvent Usage:\n") -// for event, count := range eventCount { -// sb.WriteString(fmt.Sprintf(" %s: %d transitions\n", event, count)) -// } - -// return sb.String() -// } - -// // GetCurrentStateInfo returns detailed information about the current state -// func ( -// v *StateMachineViz[StateT, VoteT, PeerIDT, CollectedT]) GetCurrentStateInfo() string { -// v.sm.mu.RLock() -// defer v.sm.mu.RUnlock() - -// var sb strings.Builder - -// sb.WriteString("Current State Information:\n") -// sb.WriteString("=========================\n\n") -// sb.WriteString(fmt.Sprintf("State: %s\n", v.sm.machineState)) -// sb.WriteString( -// fmt.Sprintf("Time in State: %v\n", time.Since(v.sm.stateStartTime)), -// ) -// sb.WriteString(fmt.Sprintf("Total Transitions: %d\n", v.sm.transitionCount)) - -// // State configuration info -// if config, exists := v.sm.stateConfigs[v.sm.machineState]; exists { -// sb.WriteString("\nState Configuration:\n") -// if config.Timeout > 0 { -// sb.WriteString(fmt.Sprintf(" Timeout: %v\n", config.Timeout)) -// sb.WriteString(fmt.Sprintf(" Timeout Event: %s\n", config.OnTimeout)) -// } -// if config.Behavior != nil { -// sb.WriteString(" Has Behavior: Yes\n") -// } -// if config.OnEnter != nil { -// sb.WriteString(" Has OnEnter Callback: Yes\n") -// } -// if config.OnExit != nil { -// sb.WriteString(" Has OnExit Callback: Yes\n") -// } -// } - -// // Available transitions from current state -// sb.WriteString("\nAvailable Transitions:\n") -// if transitions, exists := v.sm.transitions[v.sm.machineState]; exists { -// for event, transition := range transitions { -// guardStr := "" -// if transition.Guard != nil { -// guardStr = " [guarded]" -// } -// sb.WriteString( -// fmt.Sprintf(" %s -> %s%s\n", event, transition.To, guardStr), -// ) -// } -// } - -// return sb.String() -// } - -// // GenerateEventFlow generates a flow of events that occurred -// func ( -// v *StateMachineViz[StateT, VoteT, PeerIDT, CollectedT], -// ) GenerateEventFlow() string { -// var sb strings.Builder - -// sb.WriteString("Event Flow:\n") -// sb.WriteString("===========\n\n") - -// transitions := v.getTransitionList() -// for i, tr := range transitions { -// sb.WriteString(fmt.Sprintf( -// "%d. %s -> %s [%s]\n", -// i+1, tr.From, tr.To, tr.Event, -// )) -// } - -// return sb.String() -// } diff --git a/consensus/stateproducer/state_producer.go b/consensus/stateproducer/state_producer.go index 8eefb8c..941be4e 100644 --- a/consensus/stateproducer/state_producer.go +++ b/consensus/stateproducer/state_producer.go @@ -65,19 +65,19 @@ func (bp *StateProducer[StateT, VoteT, PeerIDT, CollectedT]) MakeStateProposal( context.TODO(), rank, qc.GetFilter(), - qc.GetSelector(), + qc.Identity(), ) if err != nil { if models.IsNoVoteError(err) { return nil, fmt.Errorf( "unsafe to vote for own proposal on top of %x: %w", - qc.GetSelector(), + qc.Identity(), err, ) } return nil, fmt.Errorf( "could not build state proposal on top of %x: %w", - qc.GetSelector(), + qc.Identity(), err, ) } @@ -92,7 +92,7 @@ func (bp *StateProducer[StateT, VoteT, PeerIDT, CollectedT]) MakeStateProposal( if err != nil { return nil, fmt.Errorf( "could not vote on state proposal on top of %x: %w", - qc.GetSelector(), + qc.Identity(), err, ) } diff --git a/consensus/timeoutcollector/timeout_processor_test.go b/consensus/timeoutcollector/timeout_processor_test.go index 6c90576..1b51b5c 100644 --- a/consensus/timeoutcollector/timeout_processor_test.go +++ b/consensus/timeoutcollector/timeout_processor_test.go @@ -507,7 +507,7 @@ func TestTimeoutProcessor_BuildVerifyTC(t *testing.T) { StateID: state.Identifier, } v.On("SignVote", mock.Anything, mock.Anything).Return(&vote, nil).Once() - signers[s.Identity()] = verification.NewSigner(v) + signers[s.Identity()] = verification.NewSigner[*helper.TestState, *helper.TestVote, *helper.TestPeer](v) } // utility function which generates a valid timeout for every signer @@ -660,7 +660,7 @@ func createRealQC( Rank: state.Rank, FrameNumber: state.Rank, Selector: state.Identifier, - Timestamp: time.Now().UnixMilli(), + Timestamp: uint64(time.Now().UnixMilli()), AggregatedSignature: &helper.TestAggregatedSignature{PublicKey: make([]byte, 585), Signature: make([]byte, 74), Bitmask: []byte{0b11111111, 0b00000111}}, }, nil) voteProcessor, err := voteProcessorFactory.Create(helper.Logger(), proposal, []byte{}, sigagg, votingProvider) diff --git a/consensus/validator/validator.go b/consensus/validator/validator.go index 56bd343..2cff81e 100644 --- a/consensus/validator/validator.go +++ b/consensus/validator/validator.go @@ -289,7 +289,7 @@ func (v *Validator[StateT, VoteT]) ValidateQuorumCertificate( default: return fmt.Errorf( "cannot verify qc's aggregated signature (qc.Identifier: %x): %w", - qc.GetSelector(), + qc.Identity(), err, ) } @@ -508,7 +508,7 @@ func newInvalidQuorumCertificateError( err error, ) error { return models.InvalidQuorumCertificateError{ - Identifier: qc.GetSelector(), + Identifier: qc.Identity(), Rank: qc.GetRank(), Err: err, } diff --git a/consensus/verification/common.go b/consensus/verification/common.go index cbdc58a..25d5422 100644 --- a/consensus/verification/common.go +++ b/consensus/verification/common.go @@ -49,7 +49,7 @@ func verifyAggregatedSignatureOneMessage( msg []byte, // message to verify against ) error { valid := validator.VerifySignatureRaw( - aggregatedSig.GetPublicKey(), + aggregatedSig.GetPubKey(), aggregatedSig.GetSignature(), msg, dsTag, diff --git a/consensus/votecollector/factory_test.go b/consensus/votecollector/factory_test.go index 396d9fd..d9eb008 100644 --- a/consensus/votecollector/factory_test.go +++ b/consensus/votecollector/factory_test.go @@ -16,18 +16,18 @@ import ( // TestVoteProcessorFactory_CreateWithValidProposal checks if // VoteProcessorFactory checks the proposer vote based on submitted proposal func TestVoteProcessorFactory_CreateWithValidProposal(t *testing.T) { - mockedFactory := mocks.VoteProcessorFactory[*helper.TestState, *helper.TestVote]{} + mockedFactory := mocks.VoteProcessorFactory[*helper.TestState, *helper.TestVote, *helper.TestPeer]{} proposal := helper.MakeSignedProposal[*helper.TestState, *helper.TestVote]() mockedProcessor := &mocks.VerifyingVoteProcessor[*helper.TestState, *helper.TestVote]{} vote, err := proposal.ProposerVote() require.NoError(t, err) mockedProcessor.On("Process", vote).Return(nil).Once() - mockedFactory.On("Create", helper.Logger(), proposal, mock.Anything, mock.Anything).Return(mockedProcessor, nil).Once() + mockedFactory.On("Create", helper.Logger(), proposal, mock.Anything, mock.Anything, mock.Anything).Return(mockedProcessor, nil).Once() voteProcessorFactory := &VoteProcessorFactory[*helper.TestState, *helper.TestVote, *helper.TestPeer]{ baseFactory: func(log consensus.TraceLogger, state *models.State[*helper.TestState], dsTag []byte, aggregator consensus.SignatureAggregator, votingProvider consensus.VotingProvider[*helper.TestState, *helper.TestVote, *helper.TestPeer]) (consensus.VerifyingVoteProcessor[*helper.TestState, *helper.TestVote], error) { - return mockedFactory.Create(log, proposal, dsTag, aggregator) + return mockedFactory.Create(log, proposal, dsTag, aggregator, votingProvider) }, } @@ -42,7 +42,7 @@ func TestVoteProcessorFactory_CreateWithValidProposal(t *testing.T) { // TestVoteProcessorFactory_CreateWithInvalidVote tests that processing proposal with invalid vote doesn't return // vote processor and returns correct error(sentinel or exception). func TestVoteProcessorFactory_CreateWithInvalidVote(t *testing.T) { - mockedFactory := mocks.VoteProcessorFactory[*helper.TestState, *helper.TestVote]{} + mockedFactory := mocks.VoteProcessorFactory[*helper.TestState, *helper.TestVote, *helper.TestPeer]{} t.Run("invalid-vote", func(t *testing.T) { proposal := helper.MakeSignedProposal[*helper.TestState, *helper.TestVote]() @@ -50,11 +50,11 @@ func TestVoteProcessorFactory_CreateWithInvalidVote(t *testing.T) { vote, err := proposal.ProposerVote() require.NoError(t, err) mockedProcessor.On("Process", vote).Return(models.NewInvalidVoteErrorf(vote, "")).Once() - mockedFactory.On("Create", helper.Logger(), proposal, mock.Anything, mock.Anything).Return(mockedProcessor, nil).Once() + mockedFactory.On("Create", helper.Logger(), proposal, mock.Anything, mock.Anything, mock.Anything).Return(mockedProcessor, nil).Once() voteProcessorFactory := &VoteProcessorFactory[*helper.TestState, *helper.TestVote, *helper.TestPeer]{ baseFactory: func(log consensus.TraceLogger, state *models.State[*helper.TestState], dsTag []byte, aggregator consensus.SignatureAggregator, votingProvider consensus.VotingProvider[*helper.TestState, *helper.TestVote, *helper.TestPeer]) (consensus.VerifyingVoteProcessor[*helper.TestState, *helper.TestVote], error) { - return mockedFactory.Create(log, proposal, dsTag, aggregator) + return mockedFactory.Create(log, proposal, dsTag, aggregator, votingProvider) }, } @@ -73,11 +73,11 @@ func TestVoteProcessorFactory_CreateWithInvalidVote(t *testing.T) { require.NoError(t, err) mockedProcessor.On("Process", vote).Return(exception).Once() - mockedFactory.On("Create", helper.Logger(), proposal, mock.Anything, mock.Anything).Return(mockedProcessor, nil).Once() + mockedFactory.On("Create", helper.Logger(), proposal, mock.Anything, mock.Anything, mock.Anything).Return(mockedProcessor, nil).Once() voteProcessorFactory := &VoteProcessorFactory[*helper.TestState, *helper.TestVote, *helper.TestPeer]{ baseFactory: func(log consensus.TraceLogger, state *models.State[*helper.TestState], dsTag []byte, aggregator consensus.SignatureAggregator, votingProvider consensus.VotingProvider[*helper.TestState, *helper.TestVote, *helper.TestPeer]) (consensus.VerifyingVoteProcessor[*helper.TestState, *helper.TestVote], error) { - return mockedFactory.Create(log, proposal, dsTag, aggregator) + return mockedFactory.Create(log, proposal, dsTag, aggregator, votingProvider) }, } @@ -96,15 +96,15 @@ func TestVoteProcessorFactory_CreateWithInvalidVote(t *testing.T) { // TestVoteProcessorFactory_CreateProcessException tests that VoteProcessorFactory correctly handles exception // while creating processor for requested proposal. func TestVoteProcessorFactory_CreateProcessException(t *testing.T) { - mockedFactory := mocks.VoteProcessorFactory[*helper.TestState, *helper.TestVote]{} + mockedFactory := mocks.VoteProcessorFactory[*helper.TestState, *helper.TestVote, *helper.TestPeer]{} proposal := helper.MakeSignedProposal[*helper.TestState, *helper.TestVote]() exception := errors.New("create-exception") - mockedFactory.On("Create", helper.Logger(), proposal, mock.Anything, mock.Anything).Return(nil, exception).Once() + mockedFactory.On("Create", helper.Logger(), proposal, mock.Anything, mock.Anything, mock.Anything).Return(nil, exception).Once() voteProcessorFactory := &VoteProcessorFactory[*helper.TestState, *helper.TestVote, *helper.TestPeer]{ baseFactory: func(log consensus.TraceLogger, state *models.State[*helper.TestState], dsTag []byte, aggregator consensus.SignatureAggregator, votingProvider consensus.VotingProvider[*helper.TestState, *helper.TestVote, *helper.TestPeer]) (consensus.VerifyingVoteProcessor[*helper.TestState, *helper.TestVote], error) { - return mockedFactory.Create(log, proposal, dsTag, aggregator) + return mockedFactory.Create(log, proposal, dsTag, aggregator, votingProvider) }, } diff --git a/consensus/votecollector/statemachine.go b/consensus/votecollector/statemachine.go index 60c2a29..b40f42d 100644 --- a/consensus/votecollector/statemachine.go +++ b/consensus/votecollector/statemachine.go @@ -21,32 +21,39 @@ var ( type VerifyingVoteProcessorFactory[ StateT models.Unique, VoteT models.Unique, + PeerIDT models.Unique, ] = func( tracer consensus.TraceLogger, proposal *models.SignedProposal[StateT, VoteT], dsTag []byte, aggregator consensus.SignatureAggregator, + votingProvider consensus.VotingProvider[StateT, VoteT, PeerIDT], ) (consensus.VerifyingVoteProcessor[StateT, VoteT], error) // VoteCollector implements a state machine for transition between different // states of vote collector -type VoteCollector[StateT models.Unique, VoteT models.Unique] struct { +type VoteCollector[ + StateT models.Unique, + VoteT models.Unique, + PeerIDT models.Unique, +] struct { sync.Mutex tracer consensus.TraceLogger workers consensus.Workers notifier consensus.VoteAggregationConsumer[StateT, VoteT] - createVerifyingProcessor VerifyingVoteProcessorFactory[StateT, VoteT] + createVerifyingProcessor VerifyingVoteProcessorFactory[StateT, VoteT, PeerIDT] dsTag []byte aggregator consensus.SignatureAggregator + voter consensus.VotingProvider[StateT, VoteT, PeerIDT] votesCache VotesCache[VoteT] votesProcessor atomic.Value } -var _ consensus.VoteCollector[*nilUnique, *nilUnique] = (*VoteCollector[*nilUnique, *nilUnique])(nil) +var _ consensus.VoteCollector[*nilUnique, *nilUnique] = (*VoteCollector[*nilUnique, *nilUnique, *nilUnique])(nil) func ( - m *VoteCollector[StateT, VoteT], + m *VoteCollector[StateT, VoteT, PeerIDT], ) atomicLoadProcessor() consensus.VoteProcessor[VoteT] { return m.votesProcessor.Load().(*atomicValueWrapper[VoteT]).processor } @@ -59,12 +66,21 @@ type atomicValueWrapper[VoteT models.Unique] struct { processor consensus.VoteProcessor[VoteT] } -func NewStateMachineFactory[StateT models.Unique, VoteT models.Unique]( +func NewStateMachineFactory[ + StateT models.Unique, + VoteT models.Unique, + PeerIDT models.Unique, +]( tracer consensus.TraceLogger, notifier consensus.VoteAggregationConsumer[StateT, VoteT], - verifyingVoteProcessorFactory VerifyingVoteProcessorFactory[StateT, VoteT], + verifyingVoteProcessorFactory VerifyingVoteProcessorFactory[ + StateT, + VoteT, + PeerIDT, + ], dsTag []byte, aggregator consensus.SignatureAggregator, + voter consensus.VotingProvider[StateT, VoteT, PeerIDT], ) voteaggregator.NewCollectorFactoryMethod[StateT, VoteT] { return func(rank uint64, workers consensus.Workers) ( consensus.VoteCollector[StateT, VoteT], @@ -78,20 +94,30 @@ func NewStateMachineFactory[StateT models.Unique, VoteT models.Unique]( verifyingVoteProcessorFactory, dsTag, aggregator, + voter, ), nil } } -func NewStateMachine[StateT models.Unique, VoteT models.Unique]( +func NewStateMachine[ + StateT models.Unique, + VoteT models.Unique, + PeerIDT models.Unique, +]( rank uint64, tracer consensus.TraceLogger, workers consensus.Workers, notifier consensus.VoteAggregationConsumer[StateT, VoteT], - verifyingVoteProcessorFactory VerifyingVoteProcessorFactory[StateT, VoteT], + verifyingVoteProcessorFactory VerifyingVoteProcessorFactory[ + StateT, + VoteT, + PeerIDT, + ], dsTag []byte, aggregator consensus.SignatureAggregator, -) *VoteCollector[StateT, VoteT] { - sm := &VoteCollector[StateT, VoteT]{ + voter consensus.VotingProvider[StateT, VoteT, PeerIDT], +) *VoteCollector[StateT, VoteT, PeerIDT] { + sm := &VoteCollector[StateT, VoteT, PeerIDT]{ tracer: tracer, workers: workers, notifier: notifier, @@ -99,6 +125,7 @@ func NewStateMachine[StateT models.Unique, VoteT models.Unique]( votesCache: *NewVotesCache[VoteT](rank), dsTag: dsTag, aggregator: aggregator, + voter: voter, } // without a state, we don't process votes (only cache them) @@ -111,7 +138,7 @@ func NewStateMachine[StateT models.Unique, VoteT models.Unique]( // AddVote adds a vote to current vote collector // All expected errors are handled via callbacks to notifier. // Under normal execution only exceptions are propagated to caller. -func (m *VoteCollector[StateT, VoteT]) AddVote(vote *VoteT) error { +func (m *VoteCollector[StateT, VoteT, PeerIDT]) AddVote(vote *VoteT) error { // Cache vote err := m.votesCache.AddVote(vote) if err != nil { @@ -166,7 +193,7 @@ func (m *VoteCollector[StateT, VoteT]) AddVote(vote *VoteT) error { // processVote uses compare-and-repeat pattern to process vote with underlying // vote processor -func (m *VoteCollector[StateT, VoteT]) processVote(vote *VoteT) error { +func (m *VoteCollector[StateT, VoteT, PeerIDT]) processVote(vote *VoteT) error { for { processor := m.atomicLoadProcessor() currentState := processor.Status() @@ -197,12 +224,12 @@ func (m *VoteCollector[StateT, VoteT]) processVote(vote *VoteT) error { } // Status returns the status of underlying vote processor -func (m *VoteCollector[StateT, VoteT]) Status() consensus.VoteCollectorStatus { +func (m *VoteCollector[StateT, VoteT, PeerIDT]) Status() consensus.VoteCollectorStatus { return m.atomicLoadProcessor().Status() } // Rank returns rank associated with this collector -func (m *VoteCollector[StateT, VoteT]) Rank() uint64 { +func (m *VoteCollector[StateT, VoteT, PeerIDT]) Rank() uint64 { return m.votesCache.Rank() } @@ -220,7 +247,7 @@ func (m *VoteCollector[StateT, VoteT]) Rank() uint64 { // CachingVotes -> VerifyingVotes // CachingVotes -> Invalid // VerifyingVotes -> Invalid -func (m *VoteCollector[StateT, VoteT]) ProcessState( +func (m *VoteCollector[StateT, VoteT, PeerIDT]) ProcessState( proposal *models.SignedProposal[StateT, VoteT], ) error { @@ -299,7 +326,7 @@ func (m *VoteCollector[StateT, VoteT]) ProcessState( // CAUTION, VoteConsumer implementations must be // - NON-BLOCKING and consume the votes without noteworthy delay, and // - CONCURRENCY SAFE -func (m *VoteCollector[StateT, VoteT]) RegisterVoteConsumer( +func (m *VoteCollector[StateT, VoteT, PeerIDT]) RegisterVoteConsumer( consumer consensus.VoteConsumer[VoteT], ) { m.votesCache.RegisterVoteConsumer(consumer) @@ -313,7 +340,7 @@ func (m *VoteCollector[StateT, VoteT]) RegisterVoteConsumer( // `CachingVotes` // - all other errors are unexpected and potential symptoms of internal bugs // or state corruption (fatal) -func (m *VoteCollector[StateT, VoteT]) caching2Verifying( +func (m *VoteCollector[StateT, VoteT, PeerIDT]) caching2Verifying( proposal *models.SignedProposal[StateT, VoteT], ) error { stateID := proposal.State.Identifier @@ -322,6 +349,7 @@ func (m *VoteCollector[StateT, VoteT]) caching2Verifying( proposal, m.dsTag, m.aggregator, + m.voter, ) if err != nil { return fmt.Errorf( @@ -346,7 +374,7 @@ func (m *VoteCollector[StateT, VoteT]) caching2Verifying( return nil } -func (m *VoteCollector[StateT, VoteT]) terminateVoteProcessing() { +func (m *VoteCollector[StateT, VoteT, PeerIDT]) terminateVoteProcessing() { if m.Status() == consensus.VoteCollectorStatusInvalid { return } @@ -360,7 +388,7 @@ func (m *VoteCollector[StateT, VoteT]) terminateVoteProcessing() { } // processCachedVotes feeds all cached votes into the VoteProcessor -func (m *VoteCollector[StateT, VoteT]) processCachedVotes( +func (m *VoteCollector[StateT, VoteT, PeerIDT]) processCachedVotes( state *models.State[StateT], ) { cachedVotes := m.votesCache.All() diff --git a/consensus/votecollector/statemachine_test.go b/consensus/votecollector/statemachine_test.go index 54d33a4..8423ae4 100644 --- a/consensus/votecollector/statemachine_test.go +++ b/consensus/votecollector/statemachine_test.go @@ -31,9 +31,9 @@ type StateMachineTestSuite struct { rank uint64 notifier *mocks.VoteAggregationConsumer[*helper.TestState, *helper.TestVote] workerPool *workerpool.WorkerPool - factoryMethod VerifyingVoteProcessorFactory[*helper.TestState, *helper.TestVote] + factoryMethod VerifyingVoteProcessorFactory[*helper.TestState, *helper.TestVote, *helper.TestPeer] mockedProcessors map[models.Identity]*mocks.VerifyingVoteProcessor[*helper.TestState, *helper.TestVote] - collector *VoteCollector[*helper.TestState, *helper.TestVote] + collector *VoteCollector[*helper.TestState, *helper.TestVote, *helper.TestPeer] } func (s *StateMachineTestSuite) TearDownTest() { @@ -48,7 +48,7 @@ func (s *StateMachineTestSuite) SetupTest() { s.mockedProcessors = make(map[models.Identity]*mocks.VerifyingVoteProcessor[*helper.TestState, *helper.TestVote]) s.notifier = mocks.NewVoteAggregationConsumer[*helper.TestState, *helper.TestVote](s.T()) - s.factoryMethod = func(log consensus.TraceLogger, state *models.SignedProposal[*helper.TestState, *helper.TestVote], dsTag []byte, aggregator consensus.SignatureAggregator) (consensus.VerifyingVoteProcessor[*helper.TestState, *helper.TestVote], error) { + s.factoryMethod = func(log consensus.TraceLogger, state *models.SignedProposal[*helper.TestState, *helper.TestVote], dsTag []byte, aggregator consensus.SignatureAggregator, voter consensus.VotingProvider[*helper.TestState, *helper.TestVote, *helper.TestPeer]) (consensus.VerifyingVoteProcessor[*helper.TestState, *helper.TestVote], error) { if processor, found := s.mockedProcessors[state.State.Identifier]; found { return processor, nil } @@ -56,7 +56,7 @@ func (s *StateMachineTestSuite) SetupTest() { } s.workerPool = workerpool.New(4) - s.collector = NewStateMachine(s.rank, helper.Logger(), s.workerPool, s.notifier, s.factoryMethod, []byte{}, consensus.SignatureAggregator(mocks.NewSignatureAggregator(s.T()))) + s.collector = NewStateMachine(s.rank, helper.Logger(), s.workerPool, s.notifier, s.factoryMethod, []byte{}, consensus.SignatureAggregator(mocks.NewSignatureAggregator(s.T())), mocks.NewVotingProvider[*helper.TestState, *helper.TestVote, *helper.TestPeer](s.T())) } // prepareMockedProcessor prepares a mocked processor and stores it in map, later it will be used @@ -96,7 +96,7 @@ func (s *StateMachineTestSuite) TestStatus_StateTransitions() { // factory are handed through (potentially wrapped), but are not replaced. func (s *StateMachineTestSuite) Test_FactoryErrorPropagation() { factoryError := errors.New("factory error") - factory := func(log consensus.TraceLogger, state *models.SignedProposal[*helper.TestState, *helper.TestVote], dsTag []byte, aggregator consensus.SignatureAggregator) (consensus.VerifyingVoteProcessor[*helper.TestState, *helper.TestVote], error) { + factory := func(log consensus.TraceLogger, state *models.SignedProposal[*helper.TestState, *helper.TestVote], dsTag []byte, aggregator consensus.SignatureAggregator, voter consensus.VotingProvider[*helper.TestState, *helper.TestVote, *helper.TestPeer]) (consensus.VerifyingVoteProcessor[*helper.TestState, *helper.TestVote], error) { return nil, factoryError } s.collector.createVerifyingProcessor = factory diff --git a/consensus/votecollector/vote_processor_test.go b/consensus/votecollector/vote_processor_test.go index 8ba9fe7..9c4e924 100644 --- a/consensus/votecollector/vote_processor_test.go +++ b/consensus/votecollector/vote_processor_test.go @@ -242,7 +242,7 @@ func (s *VoteProcessorTestSuite) TestProcess_ConcurrentCreatingQC() { Rank: s.proposal.State.Rank, Selector: s.proposal.State.Identifier, FrameNumber: s.proposal.State.Rank, - Timestamp: int64(s.proposal.State.Timestamp), + Timestamp: uint64(s.proposal.State.Timestamp), AggregatedSignature: expectedSig, }, nil) var startupWg, shutdownWg sync.WaitGroup diff --git a/protobufs/canonical_types.go b/protobufs/canonical_types.go index 1463f89..051da51 100644 --- a/protobufs/canonical_types.go +++ b/protobufs/canonical_types.go @@ -60,6 +60,7 @@ const ( PathType uint32 = 0x0314 TraversalSubProofType uint32 = 0x0315 TraversalProofType uint32 = 0x0316 + TimeoutStateType uint32 = 0x031C TimeoutCertificateType uint32 = 0x031D // Hypergraph types (0x0400 - 0x04FF) diff --git a/protobufs/global.go b/protobufs/global.go index 4884b83..d724184 100644 --- a/protobufs/global.go +++ b/protobufs/global.go @@ -6,37 +6,177 @@ import ( "slices" "time" + "github.com/iden3/go-iden3-crypto/poseidon" "github.com/multiformats/go-multiaddr" "github.com/pkg/errors" "google.golang.org/protobuf/proto" - "source.quilibrium.com/quilibrium/monorepo/consensus" "source.quilibrium.com/quilibrium/monorepo/consensus/models" ) +// Source implements models.QuorumCertificate. +func (g *QuorumCertificate) Equals(other models.QuorumCertificate) bool { + return bytes.Equal(g.Filter, other.GetFilter()) && + g.Rank == other.GetRank() && + g.FrameNumber == other.GetFrameNumber() && + g.Identity() == other.Identity() +} + +func ( + g *QuorumCertificate, +) GetAggregatedSignature() models.AggregatedSignature { + return g.AggregateSignature +} + +// Source implements models.Unique. func (g *QuorumCertificate) Clone() models.Unique { return proto.Clone(g).(*QuorumCertificate) } -func (g *QuorumCertificate) Identity() consensus.Identity { - return consensus.Identity(g.Selector) +// GetSignature implements models.Unique. +func (g *QuorumCertificate) GetSignature() []byte { + return g.AggregateSignature.Signature } +// Source implements models.Unique. +func (g *QuorumCertificate) Source() models.Identity { + return g.AggregateSignature.Identity() +} + +// Source implements models.Unique. +func (g *QuorumCertificate) Identity() models.Identity { + return models.Identity(g.Selector) +} + +// Source implements models.TimeoutCertificate. +func (g *TimeoutCertificate) Equals(other models.TimeoutCertificate) bool { + return bytes.Equal(g.Filter, other.GetFilter()) && + g.Rank == other.GetRank() && + slices.Equal(g.LatestRanks, other.GetLatestRanks()) && + g.LatestQuorumCertificate.Equals(other.GetLatestQuorumCert()) +} + +func ( + g *TimeoutCertificate, +) GetAggregatedSignature() models.AggregatedSignature { + return g.AggregateSignature +} + +func ( + g *TimeoutCertificate, +) GetLatestQuorumCert() models.QuorumCertificate { + return g.LatestQuorumCertificate +} + +// Source implements models.Unique. func (g *TimeoutCertificate) Clone() models.Unique { return proto.Clone(g).(*TimeoutCertificate) } -func (g *TimeoutCertificate) Identity() consensus.Identity { - return consensus.Identity( +// GetSignature implements models.Unique. +func (g *TimeoutCertificate) GetSignature() []byte { + return g.AggregateSignature.Signature +} + +// Source implements models.Unique. +func (g *TimeoutCertificate) Source() models.Identity { + return models.Identity( binary.BigEndian.AppendUint64(slices.Clone(g.Filter), g.Rank), ) } +// Source implements models.Unique. +func (g *TimeoutCertificate) Identity() models.Identity { + return models.Identity( + binary.BigEndian.AppendUint64(slices.Clone(g.Filter), g.Rank), + ) +} + +// GetSignature implements models.Unique. func (f *ProposalVote) Clone() models.Unique { return proto.Clone(f).(*ProposalVote) } -func (f *ProposalVote) Identity() consensus.Identity { - return consensus.Identity(f.PublicKeySignatureBls48581.Signature) +// GetSignature implements models.Unique. +func (f *ProposalVote) GetSignature() []byte { + return f.PublicKeySignatureBls48581.Signature +} + +// Source implements models.Unique. +func (f *ProposalVote) Source() models.Identity { + return models.Identity(f.Selector) +} + +// GetSignature implements models.Unique. +func (f *ProposalVote) Identity() models.Identity { + return models.Identity(f.PublicKeySignatureBls48581.Address) +} + +func (g *GlobalFrame) Clone() models.Unique { + return proto.Clone(g).(*GlobalFrame) +} + +// GetRank implements models.Unique. +func (g *GlobalFrame) GetRank() uint64 { + return g.Header.Rank +} + +// GetSignature implements models.Unique. +func (g *GlobalFrame) GetSignature() []byte { + return g.Header.PublicKeySignatureBls48581.Signature +} + +// GetTimestamp implements models.Unique. +func (g *GlobalFrame) GetTimestamp() uint64 { + return uint64(g.Header.Timestamp) +} + +// Identity implements models.Unique. +func (g *GlobalFrame) Identity() models.Identity { + selectorBI, err := poseidon.HashBytes(g.Header.Output) + if err != nil { + return "" + } + + return models.Identity(selectorBI.FillBytes(make([]byte, 32))) +} + +// Source implements models.Unique. +func (g *GlobalFrame) Source() models.Identity { + return g.Header.PublicKeySignatureBls48581.Identity() +} + +func (a *AppShardFrame) Clone() models.Unique { + return proto.Clone(a).(*AppShardFrame) +} + +// GetRank implements models.Unique. +func (a *AppShardFrame) GetRank() uint64 { + return a.Header.Rank +} + +// GetSignature implements models.Unique. +func (a *AppShardFrame) GetSignature() []byte { + return a.Header.PublicKeySignatureBls48581.Signature +} + +// GetTimestamp implements models.Unique. +func (a *AppShardFrame) GetTimestamp() uint64 { + return uint64(a.Header.Timestamp) +} + +// Identity implements models.Unique. +func (a *AppShardFrame) Identity() models.Identity { + selectorBI, err := poseidon.HashBytes(a.Header.Output) + if err != nil { + return "" + } + + return models.Identity(selectorBI.FillBytes(make([]byte, 32))) +} + +// Source implements models.Unique. +func (a *AppShardFrame) Source() models.Identity { + return a.Header.PublicKeySignatureBls48581.Identity() } func (s *SeniorityMerge) ToCanonicalBytes() ([]byte, error) { @@ -1477,6 +1617,11 @@ func (g *GlobalFrameHeader) ToCanonicalBytes() ([]byte, error) { return nil, errors.Wrap(err, "to canonical bytes") } + // Write rank + if err := binary.Write(buf, binary.BigEndian, g.Rank); err != nil { + return nil, errors.Wrap(err, "to canonical bytes") + } + // Write timestamp if err := binary.Write(buf, binary.BigEndian, g.Timestamp); err != nil { return nil, errors.Wrap(err, "to canonical bytes") @@ -1589,6 +1734,11 @@ func (g *GlobalFrameHeader) FromCanonicalBytes(data []byte) error { return errors.Wrap(err, "from canonical bytes") } + // Read rank + if err := binary.Read(buf, binary.BigEndian, &g.Rank); err != nil { + return errors.Wrap(err, "from canonical bytes") + } + // Read timestamp if err := binary.Read(buf, binary.BigEndian, &g.Timestamp); err != nil { return errors.Wrap(err, "from canonical bytes") @@ -2219,6 +2369,175 @@ func (f *ProposalVote) FromCanonicalBytes(data []byte) error { return nil } +func (f *TimeoutState) ToCanonicalBytes() ([]byte, error) { + buf := new(bytes.Buffer) + + // Write type prefix + if err := binary.Write(buf, binary.BigEndian, TimeoutStateType); err != nil { + return nil, errors.Wrap(err, "to canonical bytes") + } + + // Write latest_quorum_certificate + latestQCBytes, err := f.LatestQuorumCertificate.ToCanonicalBytes() + if err != nil { + return nil, errors.Wrap(err, "to canonical bytes") + } + if err := binary.Write( + buf, + binary.BigEndian, + uint32(len(latestQCBytes)), + ); err != nil { + return nil, errors.Wrap(err, "to canonical bytes") + } + if _, err := buf.Write(latestQCBytes); err != nil { + return nil, errors.Wrap(err, "to canonical bytes") + } + + // Write prior_rank_timeout_certificate + if f.PriorRankTimeoutCertificate != nil { + priorTCBytes, err := f.PriorRankTimeoutCertificate.ToCanonicalBytes() + if err != nil { + return nil, errors.Wrap(err, "to canonical bytes") + } + if err := binary.Write( + buf, + binary.BigEndian, + uint32(len(priorTCBytes)), + ); err != nil { + return nil, errors.Wrap(err, "to canonical bytes") + } + if _, err := buf.Write(priorTCBytes); err != nil { + return nil, errors.Wrap(err, "to canonical bytes") + } + } else { + if err := binary.Write(buf, binary.BigEndian, uint32(0)); err != nil { + return nil, errors.Wrap(err, "to canonical bytes") + } + } + + // Write vote + if f.Vote != nil { + voteBytes, err := f.Vote.ToCanonicalBytes() + if err != nil { + return nil, errors.Wrap(err, "to canonical bytes") + } + if err := binary.Write( + buf, + binary.BigEndian, + uint32(len(voteBytes)), + ); err != nil { + return nil, errors.Wrap(err, "to canonical bytes") + } + if _, err := buf.Write(voteBytes); err != nil { + return nil, errors.Wrap(err, "to canonical bytes") + } + } else { + if err := binary.Write(buf, binary.BigEndian, uint32(0)); err != nil { + return nil, errors.Wrap(err, "to canonical bytes") + } + } + + // Write timeout_tick + if err := binary.Write(buf, binary.BigEndian, f.TimeoutTick); err != nil { + return nil, errors.Wrap(err, "to canonical bytes") + } + + // Write timestamp + if err := binary.Write(buf, binary.BigEndian, f.Timestamp); err != nil { + return nil, errors.Wrap(err, "to canonical bytes") + } + + return buf.Bytes(), nil +} + +func (f *TimeoutState) FromCanonicalBytes(data []byte) error { + buf := bytes.NewBuffer(data) + + // Read and verify type prefix + var typePrefix uint32 + if err := binary.Read(buf, binary.BigEndian, &typePrefix); err != nil { + return errors.Wrap(err, "from canonical bytes") + } + if typePrefix != TimeoutStateType { + return errors.Wrap( + errors.New("invalid type prefix"), + "from canonical bytes", + ) + } + + // Read latest_quorum_certificate + var latestQuorumCertLen uint32 + if err := binary.Read( + buf, + binary.BigEndian, + &latestQuorumCertLen, + ); err != nil { + return errors.Wrap(err, "from canonical bytes") + } + if latestQuorumCertLen > 0 { + latestQuorumCertBytes := make([]byte, latestQuorumCertLen) + if _, err := buf.Read(latestQuorumCertBytes); err != nil { + return errors.Wrap(err, "from canonical bytes") + } + f.LatestQuorumCertificate = &QuorumCertificate{} + if err := f.LatestQuorumCertificate.FromCanonicalBytes( + latestQuorumCertBytes, + ); err != nil { + return errors.Wrap(err, "from canonical bytes") + } + } + + // Read prior_rank_timeout_certificate + var priorRankTimeoutCertLen uint32 + if err := binary.Read( + buf, + binary.BigEndian, + &priorRankTimeoutCertLen, + ); err != nil { + return errors.Wrap(err, "from canonical bytes") + } + if priorRankTimeoutCertLen > 0 { + priorRankTimeoutBytes := make([]byte, priorRankTimeoutCertLen) + if _, err := buf.Read(priorRankTimeoutBytes); err != nil { + return errors.Wrap(err, "from canonical bytes") + } + f.PriorRankTimeoutCertificate = &TimeoutCertificate{} + if err := f.PriorRankTimeoutCertificate.FromCanonicalBytes( + priorRankTimeoutBytes, + ); err != nil { + return errors.Wrap(err, "from canonical bytes") + } + } + + // Read vote + var voteLen uint32 + if err := binary.Read(buf, binary.BigEndian, &voteLen); err != nil { + return errors.Wrap(err, "from canonical bytes") + } + if voteLen > 0 { + voteBytes := make([]byte, voteLen) + if _, err := buf.Read(voteBytes); err != nil { + return errors.Wrap(err, "from canonical bytes") + } + f.Vote = &ProposalVote{} + if err := f.Vote.FromCanonicalBytes(voteBytes); err != nil { + return errors.Wrap(err, "from canonical bytes") + } + } + + // Read timeout_tick + if err := binary.Read(buf, binary.BigEndian, &f.TimeoutTick); err != nil { + return errors.Wrap(err, "from canonical bytes") + } + + // Read timestamp + if err := binary.Read(buf, binary.BigEndian, &f.Timestamp); err != nil { + return errors.Wrap(err, "from canonical bytes") + } + + return nil +} + func (f *QuorumCertificate) ToCanonicalBytes() ([]byte, error) { buf := new(bytes.Buffer) @@ -2363,6 +2682,187 @@ func (f *QuorumCertificate) FromCanonicalBytes(data []byte) error { return nil } +func (t *TimeoutCertificate) ToCanonicalBytes() ([]byte, error) { + buf := new(bytes.Buffer) + + // Write type prefix + if err := binary.Write( + buf, + binary.BigEndian, + TimeoutCertificateType, + ); err != nil { + return nil, errors.Wrap(err, "to canonical bytes") + } + + // Write filter + if err := binary.Write( + buf, + binary.BigEndian, + uint32(len(t.Filter)), + ); err != nil { + return nil, errors.Wrap(err, "to canonical bytes") + } + if _, err := buf.Write(t.Filter); err != nil { + return nil, errors.Wrap(err, "to canonical bytes") + } + + // Write rank + if err := binary.Write(buf, binary.BigEndian, t.Rank); err != nil { + return nil, errors.Wrap(err, "to canonical bytes") + } + + // Write latest_ranks + if err := binary.Write( + buf, + binary.BigEndian, + uint32(len(t.LatestRanks)), + ); err != nil { + return nil, errors.Wrap(err, "to canonical bytes") + } + for _, r := range t.LatestRanks { + if err := binary.Write(buf, binary.BigEndian, r); err != nil { + return nil, errors.Wrap(err, "to canonical bytes") + } + } + + // Write latest_quorum_certificate + if t.LatestQuorumCertificate != nil { + latestQCBytes, err := t.LatestQuorumCertificate.ToCanonicalBytes() + if err != nil { + return nil, errors.Wrap(err, "to canonical bytes") + } + if err := binary.Write( + buf, + binary.BigEndian, + uint32(len(latestQCBytes)), + ); err != nil { + return nil, errors.Wrap(err, "to canonical bytes") + } + if _, err := buf.Write(latestQCBytes); err != nil { + return nil, errors.Wrap(err, "to canonical bytes") + } + } else { + if err := binary.Write(buf, binary.BigEndian, uint32(0)); err != nil { + return nil, errors.Wrap(err, "to canonical bytes") + } + } + + // Write timestamp + if err := binary.Write(buf, binary.BigEndian, t.Timestamp); err != nil { + return nil, errors.Wrap(err, "to canonical bytes") + } + + // Write aggregate_signature + if t.AggregateSignature != nil { + sigBytes, err := t.AggregateSignature.ToCanonicalBytes() + if err != nil { + return nil, errors.Wrap(err, "to canonical bytes") + } + if err := binary.Write( + buf, + binary.BigEndian, + uint32(len(sigBytes)), + ); err != nil { + return nil, errors.Wrap(err, "to canonical bytes") + } + if _, err := buf.Write(sigBytes); err != nil { + return nil, errors.Wrap(err, "to canonical bytes") + } + } else { + if err := binary.Write(buf, binary.BigEndian, uint32(0)); err != nil { + return nil, errors.Wrap(err, "to canonical bytes") + } + } + + return buf.Bytes(), nil +} + +func (t *TimeoutCertificate) FromCanonicalBytes(data []byte) error { + buf := bytes.NewBuffer(data) + + // Read and verify type prefix + var typePrefix uint32 + if err := binary.Read(buf, binary.BigEndian, &typePrefix); err != nil { + return errors.Wrap(err, "from canonical bytes") + } + if typePrefix != TimeoutCertificateType { + return errors.Wrap( + errors.New("invalid type prefix"), + "from canonical bytes", + ) + } + + // Read filter + var filterLen uint32 + if err := binary.Read(buf, binary.BigEndian, &filterLen); err != nil { + return errors.Wrap(err, "from canonical bytes") + } + t.Filter = make([]byte, filterLen) + if _, err := buf.Read(t.Filter); err != nil { + return errors.Wrap(err, "from canonical bytes") + } + + // Read rank + if err := binary.Read(buf, binary.BigEndian, &t.Rank); err != nil { + return errors.Wrap(err, "from canonical bytes") + } + + // Read latest_ranks + var latestRanksCount uint32 + if err := binary.Read(buf, binary.BigEndian, &latestRanksCount); err != nil { + return errors.Wrap(err, "from canonical bytes") + } + t.LatestRanks = make([]uint64, latestRanksCount) + if err := binary.Read(buf, binary.BigEndian, &t.LatestRanks); err != nil { + return errors.Wrap(err, "from canonical bytes") + } + + // Read latest_quorum_certificate + var latestQuorumCertLen uint32 + if err := binary.Read( + buf, + binary.BigEndian, + &latestQuorumCertLen, + ); err != nil { + return errors.Wrap(err, "from canonical bytes") + } + if latestQuorumCertLen > 0 { + latestQuorumCertBytes := make([]byte, latestQuorumCertLen) + if _, err := buf.Read(latestQuorumCertBytes); err != nil { + return errors.Wrap(err, "from canonical bytes") + } + t.LatestQuorumCertificate = &QuorumCertificate{} + if err := t.LatestQuorumCertificate.FromCanonicalBytes( + latestQuorumCertBytes, + ); err != nil { + return errors.Wrap(err, "from canonical bytes") + } + } + + // Read timestamp + if err := binary.Read(buf, binary.BigEndian, &t.Timestamp); err != nil { + return errors.Wrap(err, "from canonical bytes") + } + + // Read aggregate_signature + var sigLen uint32 + if err := binary.Read(buf, binary.BigEndian, &sigLen); err != nil { + return errors.Wrap(err, "from canonical bytes") + } + if sigLen > 0 { + sigBytes := make([]byte, sigLen) + if _, err := buf.Read(sigBytes); err != nil { + return errors.Wrap(err, "from canonical bytes") + } + t.AggregateSignature = &BLS48581AggregateSignature{} + if err := t.AggregateSignature.FromCanonicalBytes(sigBytes); err != nil { + return errors.Wrap(err, "from canonical bytes") + } + } + + return nil +} + func (g *GlobalFrame) ToCanonicalBytes() ([]byte, error) { buf := new(bytes.Buffer) diff --git a/protobufs/global.pb.go b/protobufs/global.pb.go index a75e2fe..72b5a30 100644 --- a/protobufs/global.pb.go +++ b/protobufs/global.pb.go @@ -1158,6 +1158,10 @@ type GlobalFrameHeader struct { // A strictly monotonically-increasing frame number. Used for culling old // frames past a configurable cutoff point. FrameNumber uint64 `protobuf:"varint,1,opt,name=frame_number,json=frameNumber,proto3" json:"frame_number,omitempty"` + // A strictly monotonically-increasing rank number. Disambiguates timeouts + // and allows for consistent determination of leader, without having to rely + // on parsing internal state. + Rank uint64 `protobuf:"varint,2,opt,name=rank,proto3" json:"rank,omitempty"` // The self-reported timestamp from the proof publisher, encoded as an int64 // of the Unix epoch in milliseconds. Should be good until // 292278994-08-17 07:12:55.807, at which point, this is someone else's @@ -1167,27 +1171,27 @@ type GlobalFrameHeader struct { // is discarded in preference to the runner up electees, unless there is // simply no alternative available (for example, if a network outage occurred // from an upgrade or bug). - Timestamp int64 `protobuf:"varint,2,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + Timestamp int64 `protobuf:"varint,3,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // The difficulty level used for the frame. Difficulty is calculated based on // the previous 60 timestamps correlated with difficulties, such that the // interval smooths out to align to the type-defined rate. This is expected to // increase subtly with clock speed and future hardware implementations, but // due to incentive alignment associated with global proofs, not fastest clock // in the west, should be gradual. - Difficulty uint32 `protobuf:"varint,3,opt,name=difficulty,proto3" json:"difficulty,omitempty"` + Difficulty uint32 `protobuf:"varint,4,opt,name=difficulty,proto3" json:"difficulty,omitempty"` // The output data from the VDF, serialized as bytes. For Wesolowski, this is // an encoding of the 258 byte Y value concatenated with the 258 byte proof // value. - Output []byte `protobuf:"bytes,4,opt,name=output,proto3" json:"output,omitempty"` + Output []byte `protobuf:"bytes,5,opt,name=output,proto3" json:"output,omitempty"` // The selector value of the previous frame's output, produced as a Poseidon // hash of the output. - ParentSelector []byte `protobuf:"bytes,5,opt,name=parent_selector,json=parentSelector,proto3" json:"parent_selector,omitempty"` + ParentSelector []byte `protobuf:"bytes,6,opt,name=parent_selector,json=parentSelector,proto3" json:"parent_selector,omitempty"` // The 256 global commitment values - GlobalCommitments [][]byte `protobuf:"bytes,6,rep,name=global_commitments,json=globalCommitments,proto3" json:"global_commitments,omitempty"` + GlobalCommitments [][]byte `protobuf:"bytes,7,rep,name=global_commitments,json=globalCommitments,proto3" json:"global_commitments,omitempty"` // The prover tree root commitment - ProverTreeCommitment []byte `protobuf:"bytes,7,opt,name=prover_tree_commitment,json=proverTreeCommitment,proto3" json:"prover_tree_commitment,omitempty"` + ProverTreeCommitment []byte `protobuf:"bytes,8,opt,name=prover_tree_commitment,json=proverTreeCommitment,proto3" json:"prover_tree_commitment,omitempty"` // The confirmation signatures of the frame - PublicKeySignatureBls48581 *BLS48581AggregateSignature `protobuf:"bytes,8,opt,name=public_key_signature_bls48581,json=publicKeySignatureBls48581,proto3" json:"public_key_signature_bls48581,omitempty"` + PublicKeySignatureBls48581 *BLS48581AggregateSignature `protobuf:"bytes,9,opt,name=public_key_signature_bls48581,json=publicKeySignatureBls48581,proto3" json:"public_key_signature_bls48581,omitempty"` } func (x *GlobalFrameHeader) Reset() { @@ -1229,6 +1233,13 @@ func (x *GlobalFrameHeader) GetFrameNumber() uint64 { return 0 } +func (x *GlobalFrameHeader) GetRank() uint64 { + if x != nil { + return x.Rank + } + return 0 +} + func (x *GlobalFrameHeader) GetTimestamp() int64 { if x != nil { return x.Timestamp @@ -1288,6 +1299,10 @@ type FrameHeader struct { // A strictly monotonically-increasing frame number. Used for culling old // frames past a configurable cutoff point. FrameNumber uint64 `protobuf:"varint,2,opt,name=frame_number,json=frameNumber,proto3" json:"frame_number,omitempty"` + // A strictly monotonically-increasing rank number. Disambiguates timeouts + // and allows for consistent determination of leader, without having to rely + // on parsing internal state. + Rank uint64 `protobuf:"varint,3,opt,name=rank,proto3" json:"rank,omitempty"` // The self-reported timestamp from the proof publisher, encoded as an int64 // of the Unix epoch in milliseconds. Should be good until // 292278994-08-17 07:12:55.807, at which point, this is someone else's @@ -1297,32 +1312,32 @@ type FrameHeader struct { // is discarded in preference to the runner up electees, unless there is // simply no alternative available (for example, if a network outage occurred // from an upgrade or bug). - Timestamp int64 `protobuf:"varint,3,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + Timestamp int64 `protobuf:"varint,4,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // The difficulty level used for the frame. Difficulty is calculated based on // the previous 60 timestamps correlated with difficulties, such that the // interval smooths out to align to the type-defined rate. This is expected to // increase subtly with clock speed and future hardware implementations, but // due to incentive alignment associated with global proofs, not fastest clock // in the west, should be gradual. - Difficulty uint32 `protobuf:"varint,4,opt,name=difficulty,proto3" json:"difficulty,omitempty"` + Difficulty uint32 `protobuf:"varint,5,opt,name=difficulty,proto3" json:"difficulty,omitempty"` // The output data from the VDF, serialized as bytes. For Wesolowski, this is // an encoding of the 258 byte Y value concatenated with the 258 byte proof // value. - Output []byte `protobuf:"bytes,5,opt,name=output,proto3" json:"output,omitempty"` + Output []byte `protobuf:"bytes,6,opt,name=output,proto3" json:"output,omitempty"` // The selector value of the previous frame's output, produced as a Poseidon // hash of the output. - ParentSelector []byte `protobuf:"bytes,6,opt,name=parent_selector,json=parentSelector,proto3" json:"parent_selector,omitempty"` + ParentSelector []byte `protobuf:"bytes,7,opt,name=parent_selector,json=parentSelector,proto3" json:"parent_selector,omitempty"` // The root commitment to the set of requests for the frame. - RequestsRoot []byte `protobuf:"bytes,7,opt,name=requests_root,json=requestsRoot,proto3" json:"requests_root,omitempty"` + RequestsRoot []byte `protobuf:"bytes,8,opt,name=requests_root,json=requestsRoot,proto3" json:"requests_root,omitempty"` // The root commitments to to the hypergraph state at the address. - StateRoots [][]byte `protobuf:"bytes,8,rep,name=state_roots,json=stateRoots,proto3" json:"state_roots,omitempty"` + StateRoots [][]byte `protobuf:"bytes,9,rep,name=state_roots,json=stateRoots,proto3" json:"state_roots,omitempty"` // The prover of the frame, incorporated into the input to the VDF. - Prover []byte `protobuf:"bytes,9,opt,name=prover,proto3" json:"prover,omitempty"` + Prover []byte `protobuf:"bytes,10,opt,name=prover,proto3" json:"prover,omitempty"` // The prover's proposed fee multiplier, incorporated into sliding window // averaging. - FeeMultiplierVote uint64 `protobuf:"varint,10,opt,name=fee_multiplier_vote,json=feeMultiplierVote,proto3" json:"fee_multiplier_vote,omitempty"` + FeeMultiplierVote uint64 `protobuf:"varint,11,opt,name=fee_multiplier_vote,json=feeMultiplierVote,proto3" json:"fee_multiplier_vote,omitempty"` // The confirmation signatures of the frame - PublicKeySignatureBls48581 *BLS48581AggregateSignature `protobuf:"bytes,11,opt,name=public_key_signature_bls48581,json=publicKeySignatureBls48581,proto3" json:"public_key_signature_bls48581,omitempty"` + PublicKeySignatureBls48581 *BLS48581AggregateSignature `protobuf:"bytes,12,opt,name=public_key_signature_bls48581,json=publicKeySignatureBls48581,proto3" json:"public_key_signature_bls48581,omitempty"` } func (x *FrameHeader) Reset() { @@ -1371,6 +1386,13 @@ func (x *FrameHeader) GetFrameNumber() uint64 { return 0 } +func (x *FrameHeader) GetRank() uint64 { + if x != nil { + return x.Rank + } + return 0 +} + func (x *FrameHeader) GetTimestamp() int64 { if x != nil { return x.Timestamp @@ -1541,7 +1563,7 @@ type ProposalVote struct { // The selector being voted for Selector []byte `protobuf:"bytes,4,opt,name=selector,proto3" json:"selector,omitempty"` // The timestamp when the vote was created - Timestamp int64 `protobuf:"varint,5,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + Timestamp uint64 `protobuf:"varint,5,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // The BLS signature with the voter's address PublicKeySignatureBls48581 *BLS48581AddressedSignature `protobuf:"bytes,6,opt,name=public_key_signature_bls48581,json=publicKeySignatureBls48581,proto3" json:"public_key_signature_bls48581,omitempty"` } @@ -1606,7 +1628,7 @@ func (x *ProposalVote) GetSelector() []byte { return nil } -func (x *ProposalVote) GetTimestamp() int64 { +func (x *ProposalVote) GetTimestamp() uint64 { if x != nil { return x.Timestamp } @@ -1620,6 +1642,98 @@ func (x *ProposalVote) GetPublicKeySignatureBls48581() *BLS48581AddressedSignatu return nil } +type TimeoutState struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The latest quorum certificate seen by the pacemaker. + LatestQuorumCertificate *QuorumCertificate `protobuf:"bytes,1,opt,name=latest_quorum_certificate,json=latestQuorumCertificate,proto3" json:"latest_quorum_certificate,omitempty"` + // The previous rank's timeout certificate, if applicable. + PriorRankTimeoutCertificate *TimeoutCertificate `protobuf:"bytes,2,opt,name=prior_rank_timeout_certificate,json=priorRankTimeoutCertificate,proto3" json:"prior_rank_timeout_certificate,omitempty"` + // The signed payload which will become part of the new timeout certificate. + Vote *ProposalVote `protobuf:"bytes,3,opt,name=vote,proto3" json:"vote,omitempty"` + // TimeoutTick is the number of times the `timeout.Controller` has + // (re-)emitted the timeout for this rank. When the timer for the rank's + // original duration expires, a `TimeoutState` with `TimeoutTick = 0` is + // broadcast. Subsequently, `timeout.Controller` re-broadcasts the + // `TimeoutState` periodically based on some internal heuristic. Each time + // we attempt a re-broadcast, the `TimeoutTick` is incremented. Incrementing + // the field prevents de-duplicated within the network layer, which in turn + // guarantees quick delivery of the `TimeoutState` after GST and facilitates + // recovery. + TimeoutTick uint64 `protobuf:"varint,4,opt,name=timeout_tick,json=timeoutTick,proto3" json:"timeout_tick,omitempty"` + // The timestamp of the message (not the timeout state) + Timestamp uint64 `protobuf:"varint,5,opt,name=timestamp,proto3" json:"timestamp,omitempty"` +} + +func (x *TimeoutState) Reset() { + *x = TimeoutState{} + if protoimpl.UnsafeEnabled { + mi := &file_global_proto_msgTypes[16] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TimeoutState) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TimeoutState) ProtoMessage() {} + +func (x *TimeoutState) ProtoReflect() protoreflect.Message { + mi := &file_global_proto_msgTypes[16] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use TimeoutState.ProtoReflect.Descriptor instead. +func (*TimeoutState) Descriptor() ([]byte, []int) { + return file_global_proto_rawDescGZIP(), []int{16} +} + +func (x *TimeoutState) GetLatestQuorumCertificate() *QuorumCertificate { + if x != nil { + return x.LatestQuorumCertificate + } + return nil +} + +func (x *TimeoutState) GetPriorRankTimeoutCertificate() *TimeoutCertificate { + if x != nil { + return x.PriorRankTimeoutCertificate + } + return nil +} + +func (x *TimeoutState) GetVote() *ProposalVote { + if x != nil { + return x.Vote + } + return nil +} + +func (x *TimeoutState) GetTimeoutTick() uint64 { + if x != nil { + return x.TimeoutTick + } + return 0 +} + +func (x *TimeoutState) GetTimestamp() uint64 { + if x != nil { + return x.Timestamp + } + return 0 +} + type QuorumCertificate struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1633,8 +1747,8 @@ type QuorumCertificate struct { FrameNumber uint64 `protobuf:"varint,3,opt,name=frame_number,json=frameNumber,proto3" json:"frame_number,omitempty"` // The selector (hash) of the confirmed frame Selector []byte `protobuf:"bytes,4,opt,name=selector,proto3" json:"selector,omitempty"` - // The timestamp when the vote was created - Timestamp int64 `protobuf:"varint,5,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + // The timestamp of the message (not the certificate) + Timestamp uint64 `protobuf:"varint,5,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // The aggregated BLS signature from all voters AggregateSignature *BLS48581AggregateSignature `protobuf:"bytes,6,opt,name=aggregate_signature,json=aggregateSignature,proto3" json:"aggregate_signature,omitempty"` } @@ -1642,7 +1756,7 @@ type QuorumCertificate struct { func (x *QuorumCertificate) Reset() { *x = QuorumCertificate{} if protoimpl.UnsafeEnabled { - mi := &file_global_proto_msgTypes[16] + mi := &file_global_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1655,7 +1769,7 @@ func (x *QuorumCertificate) String() string { func (*QuorumCertificate) ProtoMessage() {} func (x *QuorumCertificate) ProtoReflect() protoreflect.Message { - mi := &file_global_proto_msgTypes[16] + mi := &file_global_proto_msgTypes[17] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1668,7 +1782,7 @@ func (x *QuorumCertificate) ProtoReflect() protoreflect.Message { // Deprecated: Use QuorumCertificate.ProtoReflect.Descriptor instead. func (*QuorumCertificate) Descriptor() ([]byte, []int) { - return file_global_proto_rawDescGZIP(), []int{16} + return file_global_proto_rawDescGZIP(), []int{17} } func (x *QuorumCertificate) GetFilter() []byte { @@ -1699,7 +1813,7 @@ func (x *QuorumCertificate) GetSelector() []byte { return nil } -func (x *QuorumCertificate) GetTimestamp() int64 { +func (x *QuorumCertificate) GetTimestamp() uint64 { if x != nil { return x.Timestamp } @@ -1726,14 +1840,16 @@ type TimeoutCertificate struct { LatestRanks []uint64 `protobuf:"varint,3,rep,packed,name=latest_ranks,json=latestRanks,proto3" json:"latest_ranks,omitempty"` // The latest quorum certificate from all timeouts LatestQuorumCertificate *QuorumCertificate `protobuf:"bytes,4,opt,name=latest_quorum_certificate,json=latestQuorumCertificate,proto3" json:"latest_quorum_certificate,omitempty"` + // The timestamp of the message (not the certificate) + Timestamp uint64 `protobuf:"varint,5,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // The aggregated BLS signature from all voters - AggregateSignature *BLS48581AggregateSignature `protobuf:"bytes,5,opt,name=aggregate_signature,json=aggregateSignature,proto3" json:"aggregate_signature,omitempty"` + AggregateSignature *BLS48581AggregateSignature `protobuf:"bytes,6,opt,name=aggregate_signature,json=aggregateSignature,proto3" json:"aggregate_signature,omitempty"` } func (x *TimeoutCertificate) Reset() { *x = TimeoutCertificate{} if protoimpl.UnsafeEnabled { - mi := &file_global_proto_msgTypes[17] + mi := &file_global_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1746,7 +1862,7 @@ func (x *TimeoutCertificate) String() string { func (*TimeoutCertificate) ProtoMessage() {} func (x *TimeoutCertificate) ProtoReflect() protoreflect.Message { - mi := &file_global_proto_msgTypes[17] + mi := &file_global_proto_msgTypes[18] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1759,7 +1875,7 @@ func (x *TimeoutCertificate) ProtoReflect() protoreflect.Message { // Deprecated: Use TimeoutCertificate.ProtoReflect.Descriptor instead. func (*TimeoutCertificate) Descriptor() ([]byte, []int) { - return file_global_proto_rawDescGZIP(), []int{17} + return file_global_proto_rawDescGZIP(), []int{18} } func (x *TimeoutCertificate) GetFilter() []byte { @@ -1790,6 +1906,13 @@ func (x *TimeoutCertificate) GetLatestQuorumCertificate() *QuorumCertificate { return nil } +func (x *TimeoutCertificate) GetTimestamp() uint64 { + if x != nil { + return x.Timestamp + } + return 0 +} + func (x *TimeoutCertificate) GetAggregateSignature() *BLS48581AggregateSignature { if x != nil { return x.AggregateSignature @@ -1809,7 +1932,7 @@ type GlobalFrame struct { func (x *GlobalFrame) Reset() { *x = GlobalFrame{} if protoimpl.UnsafeEnabled { - mi := &file_global_proto_msgTypes[18] + mi := &file_global_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1822,7 +1945,7 @@ func (x *GlobalFrame) String() string { func (*GlobalFrame) ProtoMessage() {} func (x *GlobalFrame) ProtoReflect() protoreflect.Message { - mi := &file_global_proto_msgTypes[18] + mi := &file_global_proto_msgTypes[19] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1835,7 +1958,7 @@ func (x *GlobalFrame) ProtoReflect() protoreflect.Message { // Deprecated: Use GlobalFrame.ProtoReflect.Descriptor instead. func (*GlobalFrame) Descriptor() ([]byte, []int) { - return file_global_proto_rawDescGZIP(), []int{18} + return file_global_proto_rawDescGZIP(), []int{19} } func (x *GlobalFrame) GetHeader() *GlobalFrameHeader { @@ -1864,7 +1987,7 @@ type AppShardFrame struct { func (x *AppShardFrame) Reset() { *x = AppShardFrame{} if protoimpl.UnsafeEnabled { - mi := &file_global_proto_msgTypes[19] + mi := &file_global_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1877,7 +2000,7 @@ func (x *AppShardFrame) String() string { func (*AppShardFrame) ProtoMessage() {} func (x *AppShardFrame) ProtoReflect() protoreflect.Message { - mi := &file_global_proto_msgTypes[19] + mi := &file_global_proto_msgTypes[20] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1890,7 +2013,7 @@ func (x *AppShardFrame) ProtoReflect() protoreflect.Message { // Deprecated: Use AppShardFrame.ProtoReflect.Descriptor instead. func (*AppShardFrame) Descriptor() ([]byte, []int) { - return file_global_proto_rawDescGZIP(), []int{19} + return file_global_proto_rawDescGZIP(), []int{20} } func (x *AppShardFrame) GetHeader() *FrameHeader { @@ -1919,7 +2042,7 @@ type GlobalAlert struct { func (x *GlobalAlert) Reset() { *x = GlobalAlert{} if protoimpl.UnsafeEnabled { - mi := &file_global_proto_msgTypes[20] + mi := &file_global_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1932,7 +2055,7 @@ func (x *GlobalAlert) String() string { func (*GlobalAlert) ProtoMessage() {} func (x *GlobalAlert) ProtoReflect() protoreflect.Message { - mi := &file_global_proto_msgTypes[20] + mi := &file_global_proto_msgTypes[21] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1945,7 +2068,7 @@ func (x *GlobalAlert) ProtoReflect() protoreflect.Message { // Deprecated: Use GlobalAlert.ProtoReflect.Descriptor instead. func (*GlobalAlert) Descriptor() ([]byte, []int) { - return file_global_proto_rawDescGZIP(), []int{20} + return file_global_proto_rawDescGZIP(), []int{21} } func (x *GlobalAlert) GetMessage() string { @@ -1973,7 +2096,7 @@ type GetGlobalFrameRequest struct { func (x *GetGlobalFrameRequest) Reset() { *x = GetGlobalFrameRequest{} if protoimpl.UnsafeEnabled { - mi := &file_global_proto_msgTypes[21] + mi := &file_global_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1986,7 +2109,7 @@ func (x *GetGlobalFrameRequest) String() string { func (*GetGlobalFrameRequest) ProtoMessage() {} func (x *GetGlobalFrameRequest) ProtoReflect() protoreflect.Message { - mi := &file_global_proto_msgTypes[21] + mi := &file_global_proto_msgTypes[22] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1999,7 +2122,7 @@ func (x *GetGlobalFrameRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetGlobalFrameRequest.ProtoReflect.Descriptor instead. func (*GetGlobalFrameRequest) Descriptor() ([]byte, []int) { - return file_global_proto_rawDescGZIP(), []int{21} + return file_global_proto_rawDescGZIP(), []int{22} } func (x *GetGlobalFrameRequest) GetFrameNumber() uint64 { @@ -2021,7 +2144,7 @@ type GlobalFrameResponse struct { func (x *GlobalFrameResponse) Reset() { *x = GlobalFrameResponse{} if protoimpl.UnsafeEnabled { - mi := &file_global_proto_msgTypes[22] + mi := &file_global_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2034,7 +2157,7 @@ func (x *GlobalFrameResponse) String() string { func (*GlobalFrameResponse) ProtoMessage() {} func (x *GlobalFrameResponse) ProtoReflect() protoreflect.Message { - mi := &file_global_proto_msgTypes[22] + mi := &file_global_proto_msgTypes[23] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2047,7 +2170,7 @@ func (x *GlobalFrameResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GlobalFrameResponse.ProtoReflect.Descriptor instead. func (*GlobalFrameResponse) Descriptor() ([]byte, []int) { - return file_global_proto_rawDescGZIP(), []int{22} + return file_global_proto_rawDescGZIP(), []int{23} } func (x *GlobalFrameResponse) GetFrame() *GlobalFrame { @@ -2076,7 +2199,7 @@ type GetAppShardFrameRequest struct { func (x *GetAppShardFrameRequest) Reset() { *x = GetAppShardFrameRequest{} if protoimpl.UnsafeEnabled { - mi := &file_global_proto_msgTypes[23] + mi := &file_global_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2089,7 +2212,7 @@ func (x *GetAppShardFrameRequest) String() string { func (*GetAppShardFrameRequest) ProtoMessage() {} func (x *GetAppShardFrameRequest) ProtoReflect() protoreflect.Message { - mi := &file_global_proto_msgTypes[23] + mi := &file_global_proto_msgTypes[24] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2102,7 +2225,7 @@ func (x *GetAppShardFrameRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetAppShardFrameRequest.ProtoReflect.Descriptor instead. func (*GetAppShardFrameRequest) Descriptor() ([]byte, []int) { - return file_global_proto_rawDescGZIP(), []int{23} + return file_global_proto_rawDescGZIP(), []int{24} } func (x *GetAppShardFrameRequest) GetFilter() []byte { @@ -2131,7 +2254,7 @@ type AppShardFrameResponse struct { func (x *AppShardFrameResponse) Reset() { *x = AppShardFrameResponse{} if protoimpl.UnsafeEnabled { - mi := &file_global_proto_msgTypes[24] + mi := &file_global_proto_msgTypes[25] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2144,7 +2267,7 @@ func (x *AppShardFrameResponse) String() string { func (*AppShardFrameResponse) ProtoMessage() {} func (x *AppShardFrameResponse) ProtoReflect() protoreflect.Message { - mi := &file_global_proto_msgTypes[24] + mi := &file_global_proto_msgTypes[25] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2157,7 +2280,7 @@ func (x *AppShardFrameResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use AppShardFrameResponse.ProtoReflect.Descriptor instead. func (*AppShardFrameResponse) Descriptor() ([]byte, []int) { - return file_global_proto_rawDescGZIP(), []int{24} + return file_global_proto_rawDescGZIP(), []int{25} } func (x *AppShardFrameResponse) GetFrame() *AppShardFrame { @@ -2186,7 +2309,7 @@ type GetAppShardsRequest struct { func (x *GetAppShardsRequest) Reset() { *x = GetAppShardsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_global_proto_msgTypes[25] + mi := &file_global_proto_msgTypes[26] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2199,7 +2322,7 @@ func (x *GetAppShardsRequest) String() string { func (*GetAppShardsRequest) ProtoMessage() {} func (x *GetAppShardsRequest) ProtoReflect() protoreflect.Message { - mi := &file_global_proto_msgTypes[25] + mi := &file_global_proto_msgTypes[26] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2212,7 +2335,7 @@ func (x *GetAppShardsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetAppShardsRequest.ProtoReflect.Descriptor instead. func (*GetAppShardsRequest) Descriptor() ([]byte, []int) { - return file_global_proto_rawDescGZIP(), []int{25} + return file_global_proto_rawDescGZIP(), []int{26} } func (x *GetAppShardsRequest) GetShardKey() []byte { @@ -2244,7 +2367,7 @@ type AppShardInfo struct { func (x *AppShardInfo) Reset() { *x = AppShardInfo{} if protoimpl.UnsafeEnabled { - mi := &file_global_proto_msgTypes[26] + mi := &file_global_proto_msgTypes[27] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2257,7 +2380,7 @@ func (x *AppShardInfo) String() string { func (*AppShardInfo) ProtoMessage() {} func (x *AppShardInfo) ProtoReflect() protoreflect.Message { - mi := &file_global_proto_msgTypes[26] + mi := &file_global_proto_msgTypes[27] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2270,7 +2393,7 @@ func (x *AppShardInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use AppShardInfo.ProtoReflect.Descriptor instead. func (*AppShardInfo) Descriptor() ([]byte, []int) { - return file_global_proto_rawDescGZIP(), []int{26} + return file_global_proto_rawDescGZIP(), []int{27} } func (x *AppShardInfo) GetPrefix() []uint32 { @@ -2319,7 +2442,7 @@ type GetAppShardsResponse struct { func (x *GetAppShardsResponse) Reset() { *x = GetAppShardsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_global_proto_msgTypes[27] + mi := &file_global_proto_msgTypes[28] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2332,7 +2455,7 @@ func (x *GetAppShardsResponse) String() string { func (*GetAppShardsResponse) ProtoMessage() {} func (x *GetAppShardsResponse) ProtoReflect() protoreflect.Message { - mi := &file_global_proto_msgTypes[27] + mi := &file_global_proto_msgTypes[28] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2345,7 +2468,7 @@ func (x *GetAppShardsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetAppShardsResponse.ProtoReflect.Descriptor instead. func (*GetAppShardsResponse) Descriptor() ([]byte, []int) { - return file_global_proto_rawDescGZIP(), []int{27} + return file_global_proto_rawDescGZIP(), []int{28} } func (x *GetAppShardsResponse) GetInfo() []*AppShardInfo { @@ -2367,7 +2490,7 @@ type GetGlobalShardsRequest struct { func (x *GetGlobalShardsRequest) Reset() { *x = GetGlobalShardsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_global_proto_msgTypes[28] + mi := &file_global_proto_msgTypes[29] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2380,7 +2503,7 @@ func (x *GetGlobalShardsRequest) String() string { func (*GetGlobalShardsRequest) ProtoMessage() {} func (x *GetGlobalShardsRequest) ProtoReflect() protoreflect.Message { - mi := &file_global_proto_msgTypes[28] + mi := &file_global_proto_msgTypes[29] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2393,7 +2516,7 @@ func (x *GetGlobalShardsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetGlobalShardsRequest.ProtoReflect.Descriptor instead. func (*GetGlobalShardsRequest) Descriptor() ([]byte, []int) { - return file_global_proto_rawDescGZIP(), []int{28} + return file_global_proto_rawDescGZIP(), []int{29} } func (x *GetGlobalShardsRequest) GetL1() []byte { @@ -2422,7 +2545,7 @@ type GetGlobalShardsResponse struct { func (x *GetGlobalShardsResponse) Reset() { *x = GetGlobalShardsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_global_proto_msgTypes[29] + mi := &file_global_proto_msgTypes[30] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2435,7 +2558,7 @@ func (x *GetGlobalShardsResponse) String() string { func (*GetGlobalShardsResponse) ProtoMessage() {} func (x *GetGlobalShardsResponse) ProtoReflect() protoreflect.Message { - mi := &file_global_proto_msgTypes[29] + mi := &file_global_proto_msgTypes[30] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2448,7 +2571,7 @@ func (x *GetGlobalShardsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetGlobalShardsResponse.ProtoReflect.Descriptor instead. func (*GetGlobalShardsResponse) Descriptor() ([]byte, []int) { - return file_global_proto_rawDescGZIP(), []int{29} + return file_global_proto_rawDescGZIP(), []int{30} } func (x *GetGlobalShardsResponse) GetSize() []byte { @@ -2480,7 +2603,7 @@ type GetLockedAddressesRequest struct { func (x *GetLockedAddressesRequest) Reset() { *x = GetLockedAddressesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_global_proto_msgTypes[30] + mi := &file_global_proto_msgTypes[31] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2493,7 +2616,7 @@ func (x *GetLockedAddressesRequest) String() string { func (*GetLockedAddressesRequest) ProtoMessage() {} func (x *GetLockedAddressesRequest) ProtoReflect() protoreflect.Message { - mi := &file_global_proto_msgTypes[30] + mi := &file_global_proto_msgTypes[31] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2506,7 +2629,7 @@ func (x *GetLockedAddressesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetLockedAddressesRequest.ProtoReflect.Descriptor instead. func (*GetLockedAddressesRequest) Descriptor() ([]byte, []int) { - return file_global_proto_rawDescGZIP(), []int{30} + return file_global_proto_rawDescGZIP(), []int{31} } func (x *GetLockedAddressesRequest) GetShardAddress() []byte { @@ -2541,7 +2664,7 @@ type LockedTransaction struct { func (x *LockedTransaction) Reset() { *x = LockedTransaction{} if protoimpl.UnsafeEnabled { - mi := &file_global_proto_msgTypes[31] + mi := &file_global_proto_msgTypes[32] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2554,7 +2677,7 @@ func (x *LockedTransaction) String() string { func (*LockedTransaction) ProtoMessage() {} func (x *LockedTransaction) ProtoReflect() protoreflect.Message { - mi := &file_global_proto_msgTypes[31] + mi := &file_global_proto_msgTypes[32] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2567,7 +2690,7 @@ func (x *LockedTransaction) ProtoReflect() protoreflect.Message { // Deprecated: Use LockedTransaction.ProtoReflect.Descriptor instead. func (*LockedTransaction) Descriptor() ([]byte, []int) { - return file_global_proto_rawDescGZIP(), []int{31} + return file_global_proto_rawDescGZIP(), []int{32} } func (x *LockedTransaction) GetTransactionHash() []byte { @@ -2609,7 +2732,7 @@ type GetLockedAddressesResponse struct { func (x *GetLockedAddressesResponse) Reset() { *x = GetLockedAddressesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_global_proto_msgTypes[32] + mi := &file_global_proto_msgTypes[33] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2622,7 +2745,7 @@ func (x *GetLockedAddressesResponse) String() string { func (*GetLockedAddressesResponse) ProtoMessage() {} func (x *GetLockedAddressesResponse) ProtoReflect() protoreflect.Message { - mi := &file_global_proto_msgTypes[32] + mi := &file_global_proto_msgTypes[33] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2635,7 +2758,7 @@ func (x *GetLockedAddressesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetLockedAddressesResponse.ProtoReflect.Descriptor instead. func (*GetLockedAddressesResponse) Descriptor() ([]byte, []int) { - return file_global_proto_rawDescGZIP(), []int{32} + return file_global_proto_rawDescGZIP(), []int{33} } func (x *GetLockedAddressesResponse) GetTransactions() []*LockedTransaction { @@ -2654,7 +2777,7 @@ type GlobalGetWorkerInfoRequest struct { func (x *GlobalGetWorkerInfoRequest) Reset() { *x = GlobalGetWorkerInfoRequest{} if protoimpl.UnsafeEnabled { - mi := &file_global_proto_msgTypes[33] + mi := &file_global_proto_msgTypes[34] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2667,7 +2790,7 @@ func (x *GlobalGetWorkerInfoRequest) String() string { func (*GlobalGetWorkerInfoRequest) ProtoMessage() {} func (x *GlobalGetWorkerInfoRequest) ProtoReflect() protoreflect.Message { - mi := &file_global_proto_msgTypes[33] + mi := &file_global_proto_msgTypes[34] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2680,7 +2803,7 @@ func (x *GlobalGetWorkerInfoRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GlobalGetWorkerInfoRequest.ProtoReflect.Descriptor instead. func (*GlobalGetWorkerInfoRequest) Descriptor() ([]byte, []int) { - return file_global_proto_rawDescGZIP(), []int{33} + return file_global_proto_rawDescGZIP(), []int{34} } type GlobalGetWorkerInfoResponseItem struct { @@ -2699,7 +2822,7 @@ type GlobalGetWorkerInfoResponseItem struct { func (x *GlobalGetWorkerInfoResponseItem) Reset() { *x = GlobalGetWorkerInfoResponseItem{} if protoimpl.UnsafeEnabled { - mi := &file_global_proto_msgTypes[34] + mi := &file_global_proto_msgTypes[35] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2712,7 +2835,7 @@ func (x *GlobalGetWorkerInfoResponseItem) String() string { func (*GlobalGetWorkerInfoResponseItem) ProtoMessage() {} func (x *GlobalGetWorkerInfoResponseItem) ProtoReflect() protoreflect.Message { - mi := &file_global_proto_msgTypes[34] + mi := &file_global_proto_msgTypes[35] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2725,7 +2848,7 @@ func (x *GlobalGetWorkerInfoResponseItem) ProtoReflect() protoreflect.Message { // Deprecated: Use GlobalGetWorkerInfoResponseItem.ProtoReflect.Descriptor instead. func (*GlobalGetWorkerInfoResponseItem) Descriptor() ([]byte, []int) { - return file_global_proto_rawDescGZIP(), []int{34} + return file_global_proto_rawDescGZIP(), []int{35} } func (x *GlobalGetWorkerInfoResponseItem) GetCoreId() uint32 { @@ -2781,7 +2904,7 @@ type GlobalGetWorkerInfoResponse struct { func (x *GlobalGetWorkerInfoResponse) Reset() { *x = GlobalGetWorkerInfoResponse{} if protoimpl.UnsafeEnabled { - mi := &file_global_proto_msgTypes[35] + mi := &file_global_proto_msgTypes[36] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2794,7 +2917,7 @@ func (x *GlobalGetWorkerInfoResponse) String() string { func (*GlobalGetWorkerInfoResponse) ProtoMessage() {} func (x *GlobalGetWorkerInfoResponse) ProtoReflect() protoreflect.Message { - mi := &file_global_proto_msgTypes[35] + mi := &file_global_proto_msgTypes[36] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2807,7 +2930,7 @@ func (x *GlobalGetWorkerInfoResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GlobalGetWorkerInfoResponse.ProtoReflect.Descriptor instead. func (*GlobalGetWorkerInfoResponse) Descriptor() ([]byte, []int) { - return file_global_proto_rawDescGZIP(), []int{35} + return file_global_proto_rawDescGZIP(), []int{36} } func (x *GlobalGetWorkerInfoResponse) GetWorkers() []*GlobalGetWorkerInfoResponseItem { @@ -2830,7 +2953,7 @@ type SendMessage struct { func (x *SendMessage) Reset() { *x = SendMessage{} if protoimpl.UnsafeEnabled { - mi := &file_global_proto_msgTypes[36] + mi := &file_global_proto_msgTypes[37] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2843,7 +2966,7 @@ func (x *SendMessage) String() string { func (*SendMessage) ProtoMessage() {} func (x *SendMessage) ProtoReflect() protoreflect.Message { - mi := &file_global_proto_msgTypes[36] + mi := &file_global_proto_msgTypes[37] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2856,7 +2979,7 @@ func (x *SendMessage) ProtoReflect() protoreflect.Message { // Deprecated: Use SendMessage.ProtoReflect.Descriptor instead. func (*SendMessage) Descriptor() ([]byte, []int) { - return file_global_proto_rawDescGZIP(), []int{36} + return file_global_proto_rawDescGZIP(), []int{37} } func (x *SendMessage) GetPeerId() []byte { @@ -2893,7 +3016,7 @@ type ReceiveMessage struct { func (x *ReceiveMessage) Reset() { *x = ReceiveMessage{} if protoimpl.UnsafeEnabled { - mi := &file_global_proto_msgTypes[37] + mi := &file_global_proto_msgTypes[38] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2906,7 +3029,7 @@ func (x *ReceiveMessage) String() string { func (*ReceiveMessage) ProtoMessage() {} func (x *ReceiveMessage) ProtoReflect() protoreflect.Message { - mi := &file_global_proto_msgTypes[37] + mi := &file_global_proto_msgTypes[38] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2919,7 +3042,7 @@ func (x *ReceiveMessage) ProtoReflect() protoreflect.Message { // Deprecated: Use ReceiveMessage.ProtoReflect.Descriptor instead. func (*ReceiveMessage) Descriptor() ([]byte, []int) { - return file_global_proto_rawDescGZIP(), []int{37} + return file_global_proto_rawDescGZIP(), []int{38} } func (x *ReceiveMessage) GetSourcePeerId() []byte { @@ -2954,7 +3077,7 @@ type GetKeyRegistryRequest struct { func (x *GetKeyRegistryRequest) Reset() { *x = GetKeyRegistryRequest{} if protoimpl.UnsafeEnabled { - mi := &file_global_proto_msgTypes[38] + mi := &file_global_proto_msgTypes[39] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2967,7 +3090,7 @@ func (x *GetKeyRegistryRequest) String() string { func (*GetKeyRegistryRequest) ProtoMessage() {} func (x *GetKeyRegistryRequest) ProtoReflect() protoreflect.Message { - mi := &file_global_proto_msgTypes[38] + mi := &file_global_proto_msgTypes[39] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2980,7 +3103,7 @@ func (x *GetKeyRegistryRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetKeyRegistryRequest.ProtoReflect.Descriptor instead. func (*GetKeyRegistryRequest) Descriptor() ([]byte, []int) { - return file_global_proto_rawDescGZIP(), []int{38} + return file_global_proto_rawDescGZIP(), []int{39} } func (x *GetKeyRegistryRequest) GetIdentityKeyAddress() []byte { @@ -3002,7 +3125,7 @@ type GetKeyRegistryResponse struct { func (x *GetKeyRegistryResponse) Reset() { *x = GetKeyRegistryResponse{} if protoimpl.UnsafeEnabled { - mi := &file_global_proto_msgTypes[39] + mi := &file_global_proto_msgTypes[40] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3015,7 +3138,7 @@ func (x *GetKeyRegistryResponse) String() string { func (*GetKeyRegistryResponse) ProtoMessage() {} func (x *GetKeyRegistryResponse) ProtoReflect() protoreflect.Message { - mi := &file_global_proto_msgTypes[39] + mi := &file_global_proto_msgTypes[40] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3028,7 +3151,7 @@ func (x *GetKeyRegistryResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetKeyRegistryResponse.ProtoReflect.Descriptor instead. func (*GetKeyRegistryResponse) Descriptor() ([]byte, []int) { - return file_global_proto_rawDescGZIP(), []int{39} + return file_global_proto_rawDescGZIP(), []int{40} } func (x *GetKeyRegistryResponse) GetRegistry() *KeyRegistry { @@ -3056,7 +3179,7 @@ type GetKeyRegistryByProverRequest struct { func (x *GetKeyRegistryByProverRequest) Reset() { *x = GetKeyRegistryByProverRequest{} if protoimpl.UnsafeEnabled { - mi := &file_global_proto_msgTypes[40] + mi := &file_global_proto_msgTypes[41] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3069,7 +3192,7 @@ func (x *GetKeyRegistryByProverRequest) String() string { func (*GetKeyRegistryByProverRequest) ProtoMessage() {} func (x *GetKeyRegistryByProverRequest) ProtoReflect() protoreflect.Message { - mi := &file_global_proto_msgTypes[40] + mi := &file_global_proto_msgTypes[41] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3082,7 +3205,7 @@ func (x *GetKeyRegistryByProverRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetKeyRegistryByProverRequest.ProtoReflect.Descriptor instead. func (*GetKeyRegistryByProverRequest) Descriptor() ([]byte, []int) { - return file_global_proto_rawDescGZIP(), []int{40} + return file_global_proto_rawDescGZIP(), []int{41} } func (x *GetKeyRegistryByProverRequest) GetProverKeyAddress() []byte { @@ -3104,7 +3227,7 @@ type GetKeyRegistryByProverResponse struct { func (x *GetKeyRegistryByProverResponse) Reset() { *x = GetKeyRegistryByProverResponse{} if protoimpl.UnsafeEnabled { - mi := &file_global_proto_msgTypes[41] + mi := &file_global_proto_msgTypes[42] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3117,7 +3240,7 @@ func (x *GetKeyRegistryByProverResponse) String() string { func (*GetKeyRegistryByProverResponse) ProtoMessage() {} func (x *GetKeyRegistryByProverResponse) ProtoReflect() protoreflect.Message { - mi := &file_global_proto_msgTypes[41] + mi := &file_global_proto_msgTypes[42] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3130,7 +3253,7 @@ func (x *GetKeyRegistryByProverResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetKeyRegistryByProverResponse.ProtoReflect.Descriptor instead. func (*GetKeyRegistryByProverResponse) Descriptor() ([]byte, []int) { - return file_global_proto_rawDescGZIP(), []int{41} + return file_global_proto_rawDescGZIP(), []int{42} } func (x *GetKeyRegistryByProverResponse) GetRegistry() *KeyRegistry { @@ -3159,7 +3282,7 @@ type PutIdentityKeyRequest struct { func (x *PutIdentityKeyRequest) Reset() { *x = PutIdentityKeyRequest{} if protoimpl.UnsafeEnabled { - mi := &file_global_proto_msgTypes[42] + mi := &file_global_proto_msgTypes[43] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3172,7 +3295,7 @@ func (x *PutIdentityKeyRequest) String() string { func (*PutIdentityKeyRequest) ProtoMessage() {} func (x *PutIdentityKeyRequest) ProtoReflect() protoreflect.Message { - mi := &file_global_proto_msgTypes[42] + mi := &file_global_proto_msgTypes[43] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3185,7 +3308,7 @@ func (x *PutIdentityKeyRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use PutIdentityKeyRequest.ProtoReflect.Descriptor instead. func (*PutIdentityKeyRequest) Descriptor() ([]byte, []int) { - return file_global_proto_rawDescGZIP(), []int{42} + return file_global_proto_rawDescGZIP(), []int{43} } func (x *PutIdentityKeyRequest) GetAddress() []byte { @@ -3213,7 +3336,7 @@ type PutIdentityKeyResponse struct { func (x *PutIdentityKeyResponse) Reset() { *x = PutIdentityKeyResponse{} if protoimpl.UnsafeEnabled { - mi := &file_global_proto_msgTypes[43] + mi := &file_global_proto_msgTypes[44] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3226,7 +3349,7 @@ func (x *PutIdentityKeyResponse) String() string { func (*PutIdentityKeyResponse) ProtoMessage() {} func (x *PutIdentityKeyResponse) ProtoReflect() protoreflect.Message { - mi := &file_global_proto_msgTypes[43] + mi := &file_global_proto_msgTypes[44] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3239,7 +3362,7 @@ func (x *PutIdentityKeyResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use PutIdentityKeyResponse.ProtoReflect.Descriptor instead. func (*PutIdentityKeyResponse) Descriptor() ([]byte, []int) { - return file_global_proto_rawDescGZIP(), []int{43} + return file_global_proto_rawDescGZIP(), []int{44} } func (x *PutIdentityKeyResponse) GetError() string { @@ -3260,7 +3383,7 @@ type PutProvingKeyRequest struct { func (x *PutProvingKeyRequest) Reset() { *x = PutProvingKeyRequest{} if protoimpl.UnsafeEnabled { - mi := &file_global_proto_msgTypes[44] + mi := &file_global_proto_msgTypes[45] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3273,7 +3396,7 @@ func (x *PutProvingKeyRequest) String() string { func (*PutProvingKeyRequest) ProtoMessage() {} func (x *PutProvingKeyRequest) ProtoReflect() protoreflect.Message { - mi := &file_global_proto_msgTypes[44] + mi := &file_global_proto_msgTypes[45] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3286,7 +3409,7 @@ func (x *PutProvingKeyRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use PutProvingKeyRequest.ProtoReflect.Descriptor instead. func (*PutProvingKeyRequest) Descriptor() ([]byte, []int) { - return file_global_proto_rawDescGZIP(), []int{44} + return file_global_proto_rawDescGZIP(), []int{45} } func (x *PutProvingKeyRequest) GetProvingKey() *BLS48581SignatureWithProofOfPossession { @@ -3307,7 +3430,7 @@ type PutProvingKeyResponse struct { func (x *PutProvingKeyResponse) Reset() { *x = PutProvingKeyResponse{} if protoimpl.UnsafeEnabled { - mi := &file_global_proto_msgTypes[45] + mi := &file_global_proto_msgTypes[46] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3320,7 +3443,7 @@ func (x *PutProvingKeyResponse) String() string { func (*PutProvingKeyResponse) ProtoMessage() {} func (x *PutProvingKeyResponse) ProtoReflect() protoreflect.Message { - mi := &file_global_proto_msgTypes[45] + mi := &file_global_proto_msgTypes[46] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3333,7 +3456,7 @@ func (x *PutProvingKeyResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use PutProvingKeyResponse.ProtoReflect.Descriptor instead. func (*PutProvingKeyResponse) Descriptor() ([]byte, []int) { - return file_global_proto_rawDescGZIP(), []int{45} + return file_global_proto_rawDescGZIP(), []int{46} } func (x *PutProvingKeyResponse) GetError() string { @@ -3357,7 +3480,7 @@ type PutCrossSignatureRequest struct { func (x *PutCrossSignatureRequest) Reset() { *x = PutCrossSignatureRequest{} if protoimpl.UnsafeEnabled { - mi := &file_global_proto_msgTypes[46] + mi := &file_global_proto_msgTypes[47] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3370,7 +3493,7 @@ func (x *PutCrossSignatureRequest) String() string { func (*PutCrossSignatureRequest) ProtoMessage() {} func (x *PutCrossSignatureRequest) ProtoReflect() protoreflect.Message { - mi := &file_global_proto_msgTypes[46] + mi := &file_global_proto_msgTypes[47] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3383,7 +3506,7 @@ func (x *PutCrossSignatureRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use PutCrossSignatureRequest.ProtoReflect.Descriptor instead. func (*PutCrossSignatureRequest) Descriptor() ([]byte, []int) { - return file_global_proto_rawDescGZIP(), []int{46} + return file_global_proto_rawDescGZIP(), []int{47} } func (x *PutCrossSignatureRequest) GetIdentityKeyAddress() []byte { @@ -3425,7 +3548,7 @@ type PutCrossSignatureResponse struct { func (x *PutCrossSignatureResponse) Reset() { *x = PutCrossSignatureResponse{} if protoimpl.UnsafeEnabled { - mi := &file_global_proto_msgTypes[47] + mi := &file_global_proto_msgTypes[48] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3438,7 +3561,7 @@ func (x *PutCrossSignatureResponse) String() string { func (*PutCrossSignatureResponse) ProtoMessage() {} func (x *PutCrossSignatureResponse) ProtoReflect() protoreflect.Message { - mi := &file_global_proto_msgTypes[47] + mi := &file_global_proto_msgTypes[48] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3451,7 +3574,7 @@ func (x *PutCrossSignatureResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use PutCrossSignatureResponse.ProtoReflect.Descriptor instead. func (*PutCrossSignatureResponse) Descriptor() ([]byte, []int) { - return file_global_proto_rawDescGZIP(), []int{47} + return file_global_proto_rawDescGZIP(), []int{48} } func (x *PutCrossSignatureResponse) GetError() string { @@ -3473,7 +3596,7 @@ type PutSignedKeyRequest struct { func (x *PutSignedKeyRequest) Reset() { *x = PutSignedKeyRequest{} if protoimpl.UnsafeEnabled { - mi := &file_global_proto_msgTypes[48] + mi := &file_global_proto_msgTypes[49] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3486,7 +3609,7 @@ func (x *PutSignedKeyRequest) String() string { func (*PutSignedKeyRequest) ProtoMessage() {} func (x *PutSignedKeyRequest) ProtoReflect() protoreflect.Message { - mi := &file_global_proto_msgTypes[48] + mi := &file_global_proto_msgTypes[49] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3499,7 +3622,7 @@ func (x *PutSignedKeyRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use PutSignedKeyRequest.ProtoReflect.Descriptor instead. func (*PutSignedKeyRequest) Descriptor() ([]byte, []int) { - return file_global_proto_rawDescGZIP(), []int{48} + return file_global_proto_rawDescGZIP(), []int{49} } func (x *PutSignedKeyRequest) GetAddress() []byte { @@ -3527,7 +3650,7 @@ type PutSignedKeyResponse struct { func (x *PutSignedKeyResponse) Reset() { *x = PutSignedKeyResponse{} if protoimpl.UnsafeEnabled { - mi := &file_global_proto_msgTypes[49] + mi := &file_global_proto_msgTypes[50] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3540,7 +3663,7 @@ func (x *PutSignedKeyResponse) String() string { func (*PutSignedKeyResponse) ProtoMessage() {} func (x *PutSignedKeyResponse) ProtoReflect() protoreflect.Message { - mi := &file_global_proto_msgTypes[49] + mi := &file_global_proto_msgTypes[50] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3553,7 +3676,7 @@ func (x *PutSignedKeyResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use PutSignedKeyResponse.ProtoReflect.Descriptor instead. func (*PutSignedKeyResponse) Descriptor() ([]byte, []int) { - return file_global_proto_rawDescGZIP(), []int{49} + return file_global_proto_rawDescGZIP(), []int{50} } func (x *PutSignedKeyResponse) GetError() string { @@ -3574,7 +3697,7 @@ type GetIdentityKeyRequest struct { func (x *GetIdentityKeyRequest) Reset() { *x = GetIdentityKeyRequest{} if protoimpl.UnsafeEnabled { - mi := &file_global_proto_msgTypes[50] + mi := &file_global_proto_msgTypes[51] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3587,7 +3710,7 @@ func (x *GetIdentityKeyRequest) String() string { func (*GetIdentityKeyRequest) ProtoMessage() {} func (x *GetIdentityKeyRequest) ProtoReflect() protoreflect.Message { - mi := &file_global_proto_msgTypes[50] + mi := &file_global_proto_msgTypes[51] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3600,7 +3723,7 @@ func (x *GetIdentityKeyRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetIdentityKeyRequest.ProtoReflect.Descriptor instead. func (*GetIdentityKeyRequest) Descriptor() ([]byte, []int) { - return file_global_proto_rawDescGZIP(), []int{50} + return file_global_proto_rawDescGZIP(), []int{51} } func (x *GetIdentityKeyRequest) GetAddress() []byte { @@ -3622,7 +3745,7 @@ type GetIdentityKeyResponse struct { func (x *GetIdentityKeyResponse) Reset() { *x = GetIdentityKeyResponse{} if protoimpl.UnsafeEnabled { - mi := &file_global_proto_msgTypes[51] + mi := &file_global_proto_msgTypes[52] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3635,7 +3758,7 @@ func (x *GetIdentityKeyResponse) String() string { func (*GetIdentityKeyResponse) ProtoMessage() {} func (x *GetIdentityKeyResponse) ProtoReflect() protoreflect.Message { - mi := &file_global_proto_msgTypes[51] + mi := &file_global_proto_msgTypes[52] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3648,7 +3771,7 @@ func (x *GetIdentityKeyResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetIdentityKeyResponse.ProtoReflect.Descriptor instead. func (*GetIdentityKeyResponse) Descriptor() ([]byte, []int) { - return file_global_proto_rawDescGZIP(), []int{51} + return file_global_proto_rawDescGZIP(), []int{52} } func (x *GetIdentityKeyResponse) GetKey() *Ed448PublicKey { @@ -3676,7 +3799,7 @@ type GetProvingKeyRequest struct { func (x *GetProvingKeyRequest) Reset() { *x = GetProvingKeyRequest{} if protoimpl.UnsafeEnabled { - mi := &file_global_proto_msgTypes[52] + mi := &file_global_proto_msgTypes[53] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3689,7 +3812,7 @@ func (x *GetProvingKeyRequest) String() string { func (*GetProvingKeyRequest) ProtoMessage() {} func (x *GetProvingKeyRequest) ProtoReflect() protoreflect.Message { - mi := &file_global_proto_msgTypes[52] + mi := &file_global_proto_msgTypes[53] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3702,7 +3825,7 @@ func (x *GetProvingKeyRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetProvingKeyRequest.ProtoReflect.Descriptor instead. func (*GetProvingKeyRequest) Descriptor() ([]byte, []int) { - return file_global_proto_rawDescGZIP(), []int{52} + return file_global_proto_rawDescGZIP(), []int{53} } func (x *GetProvingKeyRequest) GetAddress() []byte { @@ -3724,7 +3847,7 @@ type GetProvingKeyResponse struct { func (x *GetProvingKeyResponse) Reset() { *x = GetProvingKeyResponse{} if protoimpl.UnsafeEnabled { - mi := &file_global_proto_msgTypes[53] + mi := &file_global_proto_msgTypes[54] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3737,7 +3860,7 @@ func (x *GetProvingKeyResponse) String() string { func (*GetProvingKeyResponse) ProtoMessage() {} func (x *GetProvingKeyResponse) ProtoReflect() protoreflect.Message { - mi := &file_global_proto_msgTypes[53] + mi := &file_global_proto_msgTypes[54] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3750,7 +3873,7 @@ func (x *GetProvingKeyResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetProvingKeyResponse.ProtoReflect.Descriptor instead. func (*GetProvingKeyResponse) Descriptor() ([]byte, []int) { - return file_global_proto_rawDescGZIP(), []int{53} + return file_global_proto_rawDescGZIP(), []int{54} } func (x *GetProvingKeyResponse) GetKey() *BLS48581SignatureWithProofOfPossession { @@ -3778,7 +3901,7 @@ type GetSignedKeyRequest struct { func (x *GetSignedKeyRequest) Reset() { *x = GetSignedKeyRequest{} if protoimpl.UnsafeEnabled { - mi := &file_global_proto_msgTypes[54] + mi := &file_global_proto_msgTypes[55] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3791,7 +3914,7 @@ func (x *GetSignedKeyRequest) String() string { func (*GetSignedKeyRequest) ProtoMessage() {} func (x *GetSignedKeyRequest) ProtoReflect() protoreflect.Message { - mi := &file_global_proto_msgTypes[54] + mi := &file_global_proto_msgTypes[55] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3804,7 +3927,7 @@ func (x *GetSignedKeyRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetSignedKeyRequest.ProtoReflect.Descriptor instead. func (*GetSignedKeyRequest) Descriptor() ([]byte, []int) { - return file_global_proto_rawDescGZIP(), []int{54} + return file_global_proto_rawDescGZIP(), []int{55} } func (x *GetSignedKeyRequest) GetAddress() []byte { @@ -3826,7 +3949,7 @@ type GetSignedKeyResponse struct { func (x *GetSignedKeyResponse) Reset() { *x = GetSignedKeyResponse{} if protoimpl.UnsafeEnabled { - mi := &file_global_proto_msgTypes[55] + mi := &file_global_proto_msgTypes[56] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3839,7 +3962,7 @@ func (x *GetSignedKeyResponse) String() string { func (*GetSignedKeyResponse) ProtoMessage() {} func (x *GetSignedKeyResponse) ProtoReflect() protoreflect.Message { - mi := &file_global_proto_msgTypes[55] + mi := &file_global_proto_msgTypes[56] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3852,7 +3975,7 @@ func (x *GetSignedKeyResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetSignedKeyResponse.ProtoReflect.Descriptor instead. func (*GetSignedKeyResponse) Descriptor() ([]byte, []int) { - return file_global_proto_rawDescGZIP(), []int{55} + return file_global_proto_rawDescGZIP(), []int{56} } func (x *GetSignedKeyResponse) GetKey() *SignedX448Key { @@ -3881,7 +4004,7 @@ type GetSignedKeysByParentRequest struct { func (x *GetSignedKeysByParentRequest) Reset() { *x = GetSignedKeysByParentRequest{} if protoimpl.UnsafeEnabled { - mi := &file_global_proto_msgTypes[56] + mi := &file_global_proto_msgTypes[57] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3894,7 +4017,7 @@ func (x *GetSignedKeysByParentRequest) String() string { func (*GetSignedKeysByParentRequest) ProtoMessage() {} func (x *GetSignedKeysByParentRequest) ProtoReflect() protoreflect.Message { - mi := &file_global_proto_msgTypes[56] + mi := &file_global_proto_msgTypes[57] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3907,7 +4030,7 @@ func (x *GetSignedKeysByParentRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetSignedKeysByParentRequest.ProtoReflect.Descriptor instead. func (*GetSignedKeysByParentRequest) Descriptor() ([]byte, []int) { - return file_global_proto_rawDescGZIP(), []int{56} + return file_global_proto_rawDescGZIP(), []int{57} } func (x *GetSignedKeysByParentRequest) GetParentKeyAddress() []byte { @@ -3936,7 +4059,7 @@ type GetSignedKeysByParentResponse struct { func (x *GetSignedKeysByParentResponse) Reset() { *x = GetSignedKeysByParentResponse{} if protoimpl.UnsafeEnabled { - mi := &file_global_proto_msgTypes[57] + mi := &file_global_proto_msgTypes[58] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3949,7 +4072,7 @@ func (x *GetSignedKeysByParentResponse) String() string { func (*GetSignedKeysByParentResponse) ProtoMessage() {} func (x *GetSignedKeysByParentResponse) ProtoReflect() protoreflect.Message { - mi := &file_global_proto_msgTypes[57] + mi := &file_global_proto_msgTypes[58] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3962,7 +4085,7 @@ func (x *GetSignedKeysByParentResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetSignedKeysByParentResponse.ProtoReflect.Descriptor instead. func (*GetSignedKeysByParentResponse) Descriptor() ([]byte, []int) { - return file_global_proto_rawDescGZIP(), []int{57} + return file_global_proto_rawDescGZIP(), []int{58} } func (x *GetSignedKeysByParentResponse) GetKeys() []*SignedX448Key { @@ -3988,7 +4111,7 @@ type RangeProvingKeysRequest struct { func (x *RangeProvingKeysRequest) Reset() { *x = RangeProvingKeysRequest{} if protoimpl.UnsafeEnabled { - mi := &file_global_proto_msgTypes[58] + mi := &file_global_proto_msgTypes[59] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4001,7 +4124,7 @@ func (x *RangeProvingKeysRequest) String() string { func (*RangeProvingKeysRequest) ProtoMessage() {} func (x *RangeProvingKeysRequest) ProtoReflect() protoreflect.Message { - mi := &file_global_proto_msgTypes[58] + mi := &file_global_proto_msgTypes[59] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4014,7 +4137,7 @@ func (x *RangeProvingKeysRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RangeProvingKeysRequest.ProtoReflect.Descriptor instead. func (*RangeProvingKeysRequest) Descriptor() ([]byte, []int) { - return file_global_proto_rawDescGZIP(), []int{58} + return file_global_proto_rawDescGZIP(), []int{59} } type RangeProvingKeysResponse struct { @@ -4029,7 +4152,7 @@ type RangeProvingKeysResponse struct { func (x *RangeProvingKeysResponse) Reset() { *x = RangeProvingKeysResponse{} if protoimpl.UnsafeEnabled { - mi := &file_global_proto_msgTypes[59] + mi := &file_global_proto_msgTypes[60] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4042,7 +4165,7 @@ func (x *RangeProvingKeysResponse) String() string { func (*RangeProvingKeysResponse) ProtoMessage() {} func (x *RangeProvingKeysResponse) ProtoReflect() protoreflect.Message { - mi := &file_global_proto_msgTypes[59] + mi := &file_global_proto_msgTypes[60] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4055,7 +4178,7 @@ func (x *RangeProvingKeysResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use RangeProvingKeysResponse.ProtoReflect.Descriptor instead. func (*RangeProvingKeysResponse) Descriptor() ([]byte, []int) { - return file_global_proto_rawDescGZIP(), []int{59} + return file_global_proto_rawDescGZIP(), []int{60} } func (x *RangeProvingKeysResponse) GetKey() *BLS48581SignatureWithProofOfPossession { @@ -4081,7 +4204,7 @@ type RangeIdentityKeysRequest struct { func (x *RangeIdentityKeysRequest) Reset() { *x = RangeIdentityKeysRequest{} if protoimpl.UnsafeEnabled { - mi := &file_global_proto_msgTypes[60] + mi := &file_global_proto_msgTypes[61] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4094,7 +4217,7 @@ func (x *RangeIdentityKeysRequest) String() string { func (*RangeIdentityKeysRequest) ProtoMessage() {} func (x *RangeIdentityKeysRequest) ProtoReflect() protoreflect.Message { - mi := &file_global_proto_msgTypes[60] + mi := &file_global_proto_msgTypes[61] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4107,7 +4230,7 @@ func (x *RangeIdentityKeysRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RangeIdentityKeysRequest.ProtoReflect.Descriptor instead. func (*RangeIdentityKeysRequest) Descriptor() ([]byte, []int) { - return file_global_proto_rawDescGZIP(), []int{60} + return file_global_proto_rawDescGZIP(), []int{61} } type RangeIdentityKeysResponse struct { @@ -4122,7 +4245,7 @@ type RangeIdentityKeysResponse struct { func (x *RangeIdentityKeysResponse) Reset() { *x = RangeIdentityKeysResponse{} if protoimpl.UnsafeEnabled { - mi := &file_global_proto_msgTypes[61] + mi := &file_global_proto_msgTypes[62] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4135,7 +4258,7 @@ func (x *RangeIdentityKeysResponse) String() string { func (*RangeIdentityKeysResponse) ProtoMessage() {} func (x *RangeIdentityKeysResponse) ProtoReflect() protoreflect.Message { - mi := &file_global_proto_msgTypes[61] + mi := &file_global_proto_msgTypes[62] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4148,7 +4271,7 @@ func (x *RangeIdentityKeysResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use RangeIdentityKeysResponse.ProtoReflect.Descriptor instead. func (*RangeIdentityKeysResponse) Descriptor() ([]byte, []int) { - return file_global_proto_rawDescGZIP(), []int{61} + return file_global_proto_rawDescGZIP(), []int{62} } func (x *RangeIdentityKeysResponse) GetKey() *Ed448PublicKey { @@ -4177,7 +4300,7 @@ type RangeSignedKeysRequest struct { func (x *RangeSignedKeysRequest) Reset() { *x = RangeSignedKeysRequest{} if protoimpl.UnsafeEnabled { - mi := &file_global_proto_msgTypes[62] + mi := &file_global_proto_msgTypes[63] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4190,7 +4313,7 @@ func (x *RangeSignedKeysRequest) String() string { func (*RangeSignedKeysRequest) ProtoMessage() {} func (x *RangeSignedKeysRequest) ProtoReflect() protoreflect.Message { - mi := &file_global_proto_msgTypes[62] + mi := &file_global_proto_msgTypes[63] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4203,7 +4326,7 @@ func (x *RangeSignedKeysRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RangeSignedKeysRequest.ProtoReflect.Descriptor instead. func (*RangeSignedKeysRequest) Descriptor() ([]byte, []int) { - return file_global_proto_rawDescGZIP(), []int{62} + return file_global_proto_rawDescGZIP(), []int{63} } func (x *RangeSignedKeysRequest) GetParentKeyAddress() []byte { @@ -4232,7 +4355,7 @@ type RangeSignedKeysResponse struct { func (x *RangeSignedKeysResponse) Reset() { *x = RangeSignedKeysResponse{} if protoimpl.UnsafeEnabled { - mi := &file_global_proto_msgTypes[63] + mi := &file_global_proto_msgTypes[64] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4245,7 +4368,7 @@ func (x *RangeSignedKeysResponse) String() string { func (*RangeSignedKeysResponse) ProtoMessage() {} func (x *RangeSignedKeysResponse) ProtoReflect() protoreflect.Message { - mi := &file_global_proto_msgTypes[63] + mi := &file_global_proto_msgTypes[64] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4258,7 +4381,7 @@ func (x *RangeSignedKeysResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use RangeSignedKeysResponse.ProtoReflect.Descriptor instead. func (*RangeSignedKeysResponse) Descriptor() ([]byte, []int) { - return file_global_proto_rawDescGZIP(), []int{63} + return file_global_proto_rawDescGZIP(), []int{64} } func (x *RangeSignedKeysResponse) GetKey() *SignedX448Key { @@ -4287,7 +4410,7 @@ type MessageKeyShard struct { func (x *MessageKeyShard) Reset() { *x = MessageKeyShard{} if protoimpl.UnsafeEnabled { - mi := &file_global_proto_msgTypes[64] + mi := &file_global_proto_msgTypes[65] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4300,7 +4423,7 @@ func (x *MessageKeyShard) String() string { func (*MessageKeyShard) ProtoMessage() {} func (x *MessageKeyShard) ProtoReflect() protoreflect.Message { - mi := &file_global_proto_msgTypes[64] + mi := &file_global_proto_msgTypes[65] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4313,7 +4436,7 @@ func (x *MessageKeyShard) ProtoReflect() protoreflect.Message { // Deprecated: Use MessageKeyShard.ProtoReflect.Descriptor instead. func (*MessageKeyShard) Descriptor() ([]byte, []int) { - return file_global_proto_rawDescGZIP(), []int{64} + return file_global_proto_rawDescGZIP(), []int{65} } func (x *MessageKeyShard) GetPartyIdentifier() uint32 { @@ -4348,7 +4471,7 @@ type PutMessageRequest struct { func (x *PutMessageRequest) Reset() { *x = PutMessageRequest{} if protoimpl.UnsafeEnabled { - mi := &file_global_proto_msgTypes[65] + mi := &file_global_proto_msgTypes[66] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4361,7 +4484,7 @@ func (x *PutMessageRequest) String() string { func (*PutMessageRequest) ProtoMessage() {} func (x *PutMessageRequest) ProtoReflect() protoreflect.Message { - mi := &file_global_proto_msgTypes[65] + mi := &file_global_proto_msgTypes[66] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4374,7 +4497,7 @@ func (x *PutMessageRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use PutMessageRequest.ProtoReflect.Descriptor instead. func (*PutMessageRequest) Descriptor() ([]byte, []int) { - return file_global_proto_rawDescGZIP(), []int{65} + return file_global_proto_rawDescGZIP(), []int{66} } func (x *PutMessageRequest) GetMessageShards() []*MessageKeyShard { @@ -4407,7 +4530,7 @@ type PutMessageResponse struct { func (x *PutMessageResponse) Reset() { *x = PutMessageResponse{} if protoimpl.UnsafeEnabled { - mi := &file_global_proto_msgTypes[66] + mi := &file_global_proto_msgTypes[67] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4420,7 +4543,7 @@ func (x *PutMessageResponse) String() string { func (*PutMessageResponse) ProtoMessage() {} func (x *PutMessageResponse) ProtoReflect() protoreflect.Message { - mi := &file_global_proto_msgTypes[66] + mi := &file_global_proto_msgTypes[67] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4433,7 +4556,7 @@ func (x *PutMessageResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use PutMessageResponse.ProtoReflect.Descriptor instead. func (*PutMessageResponse) Descriptor() ([]byte, []int) { - return file_global_proto_rawDescGZIP(), []int{66} + return file_global_proto_rawDescGZIP(), []int{67} } var File_global_proto protoreflect.FileDescriptor @@ -4712,646 +4835,673 @@ var file_global_proto_rawDesc = []byte{ 0x2e, 0x70, 0x62, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x08, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x92, 0x03, 0x0a, 0x11, 0x47, + 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0xa6, 0x03, 0x0a, 0x11, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x21, 0x0a, 0x0c, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x4e, 0x75, 0x6d, - 0x62, 0x65, 0x72, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x69, 0x66, 0x66, 0x69, 0x63, 0x75, 0x6c, 0x74, 0x79, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x64, 0x69, 0x66, 0x66, 0x69, 0x63, 0x75, 0x6c, 0x74, - 0x79, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x0c, 0x52, 0x06, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x70, 0x61, 0x72, - 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x0c, 0x52, 0x0e, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, - 0x6f, 0x72, 0x12, 0x2d, 0x0a, 0x12, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x63, 0x6f, 0x6d, - 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x11, - 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x12, 0x34, 0x0a, 0x16, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x72, 0x5f, 0x74, 0x72, 0x65, 0x65, - 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, - 0x0c, 0x52, 0x14, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x72, 0x54, 0x72, 0x65, 0x65, 0x43, 0x6f, 0x6d, - 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x76, 0x0a, 0x1d, 0x70, 0x75, 0x62, 0x6c, 0x69, + 0x62, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x61, 0x6e, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x04, 0x72, 0x61, 0x6e, 0x6b, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, + 0x74, 0x61, 0x6d, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x69, 0x66, 0x66, 0x69, 0x63, 0x75, + 0x6c, 0x74, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x64, 0x69, 0x66, 0x66, 0x69, + 0x63, 0x75, 0x6c, 0x74, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x27, 0x0a, + 0x0f, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0e, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x65, + 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x2d, 0x0a, 0x12, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, + 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x07, 0x20, 0x03, + 0x28, 0x0c, 0x52, 0x11, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x34, 0x0a, 0x16, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x72, 0x5f, + 0x74, 0x72, 0x65, 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x18, + 0x08, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x14, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x72, 0x54, 0x72, 0x65, + 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x76, 0x0a, 0x1d, 0x70, + 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, + 0x75, 0x72, 0x65, 0x5f, 0x62, 0x6c, 0x73, 0x34, 0x38, 0x35, 0x38, 0x31, 0x18, 0x09, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, + 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x70, 0x62, 0x2e, 0x42, 0x4c, 0x53, + 0x34, 0x38, 0x35, 0x38, 0x31, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x53, 0x69, + 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x52, 0x1a, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, + 0x65, 0x79, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x42, 0x6c, 0x73, 0x34, 0x38, + 0x35, 0x38, 0x31, 0x22, 0xe3, 0x03, 0x0a, 0x0b, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x48, 0x65, 0x61, + 0x64, 0x65, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x21, 0x0a, + 0x0c, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x0b, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, + 0x12, 0x12, 0x0a, 0x04, 0x72, 0x61, 0x6e, 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, + 0x72, 0x61, 0x6e, 0x6b, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x69, 0x66, 0x66, 0x69, 0x63, 0x75, 0x6c, 0x74, 0x79, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x64, 0x69, 0x66, 0x66, 0x69, 0x63, 0x75, 0x6c, + 0x74, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x06, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x70, 0x61, + 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x07, 0x20, + 0x01, 0x28, 0x0c, 0x52, 0x0e, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, + 0x74, 0x6f, 0x72, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x5f, + 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x72, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x73, 0x52, 0x6f, 0x6f, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x74, 0x61, 0x74, + 0x65, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x0a, 0x73, + 0x74, 0x61, 0x74, 0x65, 0x52, 0x6f, 0x6f, 0x74, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x72, 0x6f, + 0x76, 0x65, 0x72, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x70, 0x72, 0x6f, 0x76, 0x65, + 0x72, 0x12, 0x2e, 0x0a, 0x13, 0x66, 0x65, 0x65, 0x5f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, + 0x69, 0x65, 0x72, 0x5f, 0x76, 0x6f, 0x74, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x04, 0x52, 0x11, + 0x66, 0x65, 0x65, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x56, 0x6f, 0x74, + 0x65, 0x12, 0x76, 0x0a, 0x1d, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x6b, 0x65, 0x79, 0x5f, + 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x62, 0x6c, 0x73, 0x34, 0x38, 0x35, + 0x38, 0x31, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, + 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x6b, 0x65, 0x79, 0x73, 0x2e, + 0x70, 0x62, 0x2e, 0x42, 0x4c, 0x53, 0x34, 0x38, 0x35, 0x38, 0x31, 0x41, 0x67, 0x67, 0x72, 0x65, + 0x67, 0x61, 0x74, 0x65, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x52, 0x1a, 0x70, + 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, + 0x65, 0x42, 0x6c, 0x73, 0x34, 0x38, 0x35, 0x38, 0x31, 0x22, 0xa3, 0x02, 0x0a, 0x13, 0x50, 0x72, + 0x6f, 0x76, 0x65, 0x72, 0x4c, 0x69, 0x76, 0x65, 0x6e, 0x65, 0x73, 0x73, 0x43, 0x68, 0x65, 0x63, + 0x6b, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x61, 0x6e, + 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x72, 0x61, 0x6e, 0x6b, 0x12, 0x21, 0x0a, + 0x0c, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x0b, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, + 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x27, + 0x0a, 0x0f, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x68, 0x61, 0x73, + 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0e, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, + 0x65, 0x6e, 0x74, 0x48, 0x61, 0x73, 0x68, 0x12, 0x76, 0x0a, 0x1d, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x5f, - 0x62, 0x6c, 0x73, 0x34, 0x38, 0x35, 0x38, 0x31, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, + 0x62, 0x6c, 0x73, 0x34, 0x38, 0x35, 0x38, 0x31, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, + 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, 0x6f, 0x64, 0x65, + 0x2e, 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x70, 0x62, 0x2e, 0x42, 0x4c, 0x53, 0x34, 0x38, 0x35, 0x38, + 0x31, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, + 0x75, 0x72, 0x65, 0x52, 0x1a, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x53, 0x69, + 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x42, 0x6c, 0x73, 0x34, 0x38, 0x35, 0x38, 0x31, 0x22, + 0x8f, 0x02, 0x0a, 0x0c, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x56, 0x6f, 0x74, 0x65, + 0x12, 0x16, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x61, 0x6e, 0x6b, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x72, 0x61, 0x6e, 0x6b, 0x12, 0x21, 0x0a, 0x0c, + 0x66, 0x72, 0x61, 0x6d, 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x0b, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, + 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x08, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x1c, 0x0a, 0x09, 0x74, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, + 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x76, 0x0a, 0x1d, 0x70, 0x75, 0x62, + 0x6c, 0x69, 0x63, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, + 0x65, 0x5f, 0x62, 0x6c, 0x73, 0x34, 0x38, 0x35, 0x38, 0x31, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x33, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, 0x6f, + 0x64, 0x65, 0x2e, 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x70, 0x62, 0x2e, 0x42, 0x4c, 0x53, 0x34, 0x38, + 0x35, 0x38, 0x31, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x53, 0x69, 0x67, 0x6e, + 0x61, 0x74, 0x75, 0x72, 0x65, 0x52, 0x1a, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, + 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x42, 0x6c, 0x73, 0x34, 0x38, 0x35, 0x38, + 0x31, 0x22, 0xea, 0x02, 0x0a, 0x0c, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x53, 0x74, 0x61, + 0x74, 0x65, 0x12, 0x68, 0x0a, 0x19, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x71, 0x75, 0x6f, + 0x72, 0x75, 0x6d, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 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, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x70, + 0x62, 0x2e, 0x51, 0x75, 0x6f, 0x72, 0x75, 0x6d, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, + 0x61, 0x74, 0x65, 0x52, 0x17, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x51, 0x75, 0x6f, 0x72, 0x75, + 0x6d, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x12, 0x72, 0x0a, 0x1e, + 0x70, 0x72, 0x69, 0x6f, 0x72, 0x5f, 0x72, 0x61, 0x6e, 0x6b, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, + 0x75, 0x74, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, + 0x6d, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x70, 0x62, + 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, + 0x61, 0x74, 0x65, 0x52, 0x1b, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x52, 0x61, 0x6e, 0x6b, 0x54, 0x69, + 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, + 0x12, 0x3b, 0x0a, 0x04, 0x76, 0x6f, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, + 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, 0x6f, 0x64, 0x65, + 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x6f, + 0x73, 0x61, 0x6c, 0x56, 0x6f, 0x74, 0x65, 0x52, 0x04, 0x76, 0x6f, 0x74, 0x65, 0x12, 0x21, 0x0a, + 0x0c, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x5f, 0x74, 0x69, 0x63, 0x6b, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x0b, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x54, 0x69, 0x63, 0x6b, + 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x82, + 0x02, 0x0a, 0x11, 0x51, 0x75, 0x6f, 0x72, 0x75, 0x6d, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, + 0x63, 0x61, 0x74, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, + 0x72, 0x61, 0x6e, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x72, 0x61, 0x6e, 0x6b, + 0x12, 0x21, 0x0a, 0x0c, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x4e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, + 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x64, 0x0a, + 0x13, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x5f, 0x73, 0x69, 0x67, 0x6e, 0x61, + 0x74, 0x75, 0x72, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x71, 0x75, 0x69, + 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x6b, 0x65, 0x79, + 0x73, 0x2e, 0x70, 0x62, 0x2e, 0x42, 0x4c, 0x53, 0x34, 0x38, 0x35, 0x38, 0x31, 0x41, 0x67, 0x67, + 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x52, + 0x12, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, + 0x75, 0x72, 0x65, 0x22, 0xd1, 0x02, 0x0a, 0x12, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x43, + 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x69, + 0x6c, 0x74, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, + 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x61, 0x6e, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x04, 0x72, 0x61, 0x6e, 0x6b, 0x12, 0x21, 0x0a, 0x0c, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x74, + 0x5f, 0x72, 0x61, 0x6e, 0x6b, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x04, 0x52, 0x0b, 0x6c, 0x61, + 0x74, 0x65, 0x73, 0x74, 0x52, 0x61, 0x6e, 0x6b, 0x73, 0x12, 0x68, 0x0a, 0x19, 0x6c, 0x61, 0x74, + 0x65, 0x73, 0x74, 0x5f, 0x71, 0x75, 0x6f, 0x72, 0x75, 0x6d, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x69, + 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x71, + 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x67, + 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x51, 0x75, 0x6f, 0x72, 0x75, 0x6d, 0x43, + 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x52, 0x17, 0x6c, 0x61, 0x74, 0x65, + 0x73, 0x74, 0x51, 0x75, 0x6f, 0x72, 0x75, 0x6d, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, + 0x61, 0x74, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x12, 0x64, 0x0a, 0x13, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x5f, 0x73, + 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x70, 0x62, 0x2e, 0x42, 0x4c, 0x53, 0x34, 0x38, 0x35, 0x38, 0x31, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, - 0x75, 0x72, 0x65, 0x52, 0x1a, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x53, 0x69, - 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x42, 0x6c, 0x73, 0x34, 0x38, 0x35, 0x38, 0x31, 0x22, - 0xcf, 0x03, 0x0a, 0x0b, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, - 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, - 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x66, 0x72, 0x61, - 0x6d, 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, - 0x0b, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x1c, 0x0a, 0x09, - 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x69, - 0x66, 0x66, 0x69, 0x63, 0x75, 0x6c, 0x74, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, - 0x64, 0x69, 0x66, 0x66, 0x69, 0x63, 0x75, 0x6c, 0x74, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x75, - 0x74, 0x70, 0x75, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x6f, 0x75, 0x74, 0x70, - 0x75, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x65, 0x6c, - 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0e, 0x70, 0x61, 0x72, - 0x65, 0x6e, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x23, 0x0a, 0x0d, 0x72, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x0c, 0x52, 0x0c, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x52, 0x6f, 0x6f, 0x74, - 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x73, 0x18, - 0x08, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x0a, 0x73, 0x74, 0x61, 0x74, 0x65, 0x52, 0x6f, 0x6f, 0x74, - 0x73, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, - 0x0c, 0x52, 0x06, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x72, 0x12, 0x2e, 0x0a, 0x13, 0x66, 0x65, 0x65, - 0x5f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x5f, 0x76, 0x6f, 0x74, 0x65, - 0x18, 0x0a, 0x20, 0x01, 0x28, 0x04, 0x52, 0x11, 0x66, 0x65, 0x65, 0x4d, 0x75, 0x6c, 0x74, 0x69, - 0x70, 0x6c, 0x69, 0x65, 0x72, 0x56, 0x6f, 0x74, 0x65, 0x12, 0x76, 0x0a, 0x1d, 0x70, 0x75, 0x62, - 0x6c, 0x69, 0x63, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, - 0x65, 0x5f, 0x62, 0x6c, 0x73, 0x34, 0x38, 0x35, 0x38, 0x31, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x33, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, 0x6f, - 0x64, 0x65, 0x2e, 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x70, 0x62, 0x2e, 0x42, 0x4c, 0x53, 0x34, 0x38, - 0x35, 0x38, 0x31, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x53, 0x69, 0x67, 0x6e, - 0x61, 0x74, 0x75, 0x72, 0x65, 0x52, 0x1a, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, - 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x42, 0x6c, 0x73, 0x34, 0x38, 0x35, 0x38, - 0x31, 0x22, 0xa3, 0x02, 0x0a, 0x13, 0x50, 0x72, 0x6f, 0x76, 0x65, 0x72, 0x4c, 0x69, 0x76, 0x65, - 0x6e, 0x65, 0x73, 0x73, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x69, 0x6c, - 0x74, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, - 0x72, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x61, 0x6e, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, - 0x04, 0x72, 0x61, 0x6e, 0x6b, 0x12, 0x21, 0x0a, 0x0c, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x5f, 0x6e, - 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x66, 0x72, 0x61, - 0x6d, 0x65, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, - 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x27, 0x0a, 0x0f, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, - 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, - 0x0e, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x48, 0x61, 0x73, 0x68, 0x12, - 0x76, 0x0a, 0x1d, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x73, 0x69, - 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x62, 0x6c, 0x73, 0x34, 0x38, 0x35, 0x38, 0x31, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, - 0x69, 0x75, 0x6d, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x70, 0x62, - 0x2e, 0x42, 0x4c, 0x53, 0x34, 0x38, 0x35, 0x38, 0x31, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, - 0x65, 0x64, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x52, 0x1a, 0x70, 0x75, 0x62, - 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x42, - 0x6c, 0x73, 0x34, 0x38, 0x35, 0x38, 0x31, 0x22, 0x8f, 0x02, 0x0a, 0x0c, 0x50, 0x72, 0x6f, 0x70, - 0x6f, 0x73, 0x61, 0x6c, 0x56, 0x6f, 0x74, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, - 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, - 0x12, 0x12, 0x0a, 0x04, 0x72, 0x61, 0x6e, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, - 0x72, 0x61, 0x6e, 0x6b, 0x12, 0x21, 0x0a, 0x0c, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x5f, 0x6e, 0x75, - 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x66, 0x72, 0x61, 0x6d, - 0x65, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x6c, 0x65, 0x63, - 0x74, 0x6f, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x73, 0x65, 0x6c, 0x65, 0x63, - 0x74, 0x6f, 0x72, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x12, 0x76, 0x0a, 0x1d, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x6b, 0x65, 0x79, 0x5f, - 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x62, 0x6c, 0x73, 0x34, 0x38, 0x35, - 0x38, 0x31, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, - 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x6b, 0x65, 0x79, 0x73, 0x2e, - 0x70, 0x62, 0x2e, 0x42, 0x4c, 0x53, 0x34, 0x38, 0x35, 0x38, 0x31, 0x41, 0x64, 0x64, 0x72, 0x65, - 0x73, 0x73, 0x65, 0x64, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x52, 0x1a, 0x70, - 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, - 0x65, 0x42, 0x6c, 0x73, 0x34, 0x38, 0x35, 0x38, 0x31, 0x22, 0x82, 0x02, 0x0a, 0x11, 0x51, 0x75, - 0x6f, 0x72, 0x75, 0x6d, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x12, - 0x16, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, - 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x61, 0x6e, 0x6b, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x72, 0x61, 0x6e, 0x6b, 0x12, 0x21, 0x0a, 0x0c, 0x66, - 0x72, 0x61, 0x6d, 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x04, 0x52, 0x0b, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x1a, - 0x0a, 0x08, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, - 0x52, 0x08, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, - 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x64, 0x0a, 0x13, 0x61, 0x67, 0x67, 0x72, - 0x65, 0x67, 0x61, 0x74, 0x65, 0x5f, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, - 0x75, 0x6d, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x70, 0x62, 0x2e, - 0x42, 0x4c, 0x53, 0x34, 0x38, 0x35, 0x38, 0x31, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, - 0x65, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x52, 0x12, 0x61, 0x67, 0x67, 0x72, - 0x65, 0x67, 0x61, 0x74, 0x65, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x22, 0xb3, - 0x02, 0x0a, 0x12, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, - 0x69, 0x63, 0x61, 0x74, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x12, 0x0a, - 0x04, 0x72, 0x61, 0x6e, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x72, 0x61, 0x6e, - 0x6b, 0x12, 0x21, 0x0a, 0x0c, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x72, 0x61, 0x6e, 0x6b, - 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x04, 0x52, 0x0b, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x52, - 0x61, 0x6e, 0x6b, 0x73, 0x12, 0x68, 0x0a, 0x19, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x71, - 0x75, 0x6f, 0x72, 0x75, 0x6d, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, - 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, + 0x75, 0x72, 0x65, 0x52, 0x12, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x53, 0x69, + 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x22, 0x99, 0x01, 0x0a, 0x0b, 0x47, 0x6c, 0x6f, 0x62, + 0x61, 0x6c, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x12, 0x44, 0x0a, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, + 0x72, 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, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, - 0x2e, 0x70, 0x62, 0x2e, 0x51, 0x75, 0x6f, 0x72, 0x75, 0x6d, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, - 0x69, 0x63, 0x61, 0x74, 0x65, 0x52, 0x17, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x51, 0x75, 0x6f, - 0x72, 0x75, 0x6d, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x12, 0x64, - 0x0a, 0x13, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x5f, 0x73, 0x69, 0x67, 0x6e, - 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x71, 0x75, - 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x6b, 0x65, - 0x79, 0x73, 0x2e, 0x70, 0x62, 0x2e, 0x42, 0x4c, 0x53, 0x34, 0x38, 0x35, 0x38, 0x31, 0x41, 0x67, - 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, - 0x52, 0x12, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x53, 0x69, 0x67, 0x6e, 0x61, - 0x74, 0x75, 0x72, 0x65, 0x22, 0x99, 0x01, 0x0a, 0x0b, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x46, - 0x72, 0x61, 0x6d, 0x65, 0x12, 0x44, 0x0a, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 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, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x70, 0x62, - 0x2e, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x48, 0x65, 0x61, 0x64, - 0x65, 0x72, 0x52, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x44, 0x0a, 0x08, 0x72, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x71, - 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x67, - 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, - 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x52, 0x08, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, - 0x22, 0x95, 0x01, 0x0a, 0x0d, 0x41, 0x70, 0x70, 0x53, 0x68, 0x61, 0x72, 0x64, 0x46, 0x72, 0x61, - 0x6d, 0x65, 0x12, 0x3e, 0x0a, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, - 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x46, - 0x72, 0x61, 0x6d, 0x65, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x06, 0x68, 0x65, 0x61, 0x64, - 0x65, 0x72, 0x12, 0x44, 0x0a, 0x08, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x18, 0x02, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, - 0x6d, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x70, 0x62, - 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x52, 0x08, - 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x22, 0x45, 0x0a, 0x0b, 0x47, 0x6c, 0x6f, 0x62, - 0x61, 0x6c, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x22, - 0x3a, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x46, 0x72, 0x61, 0x6d, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x66, 0x72, 0x61, 0x6d, - 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, - 0x66, 0x72, 0x61, 0x6d, 0x65, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x69, 0x0a, 0x13, 0x47, - 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x3c, 0x0a, 0x05, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x26, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, - 0x6f, 0x64, 0x65, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x6c, - 0x6f, 0x62, 0x61, 0x6c, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x52, 0x05, 0x66, 0x72, 0x61, 0x6d, 0x65, - 0x12, 0x14, 0x0a, 0x05, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, - 0x05, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x22, 0x54, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x41, 0x70, 0x70, - 0x53, 0x68, 0x61, 0x72, 0x64, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0c, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x21, 0x0a, 0x0c, 0x66, 0x72, 0x61, - 0x6d, 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, - 0x0b, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x6d, 0x0a, 0x15, - 0x41, 0x70, 0x70, 0x53, 0x68, 0x61, 0x72, 0x64, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3e, 0x0a, 0x05, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, - 0x6d, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x70, 0x62, - 0x2e, 0x41, 0x70, 0x70, 0x53, 0x68, 0x61, 0x72, 0x64, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x52, 0x05, - 0x66, 0x72, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x22, 0x4a, 0x0a, 0x13, 0x47, - 0x65, 0x74, 0x41, 0x70, 0x70, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x73, 0x68, 0x61, 0x72, 0x64, 0x5f, 0x6b, 0x65, 0x79, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x73, 0x68, 0x61, 0x72, 0x64, 0x4b, 0x65, 0x79, 0x12, - 0x16, 0x0a, 0x06, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0d, 0x52, - 0x06, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x22, 0x98, 0x01, 0x0a, 0x0c, 0x41, 0x70, 0x70, 0x53, - 0x68, 0x61, 0x72, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x72, 0x65, 0x66, - 0x69, 0x78, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x06, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, - 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, - 0x73, 0x69, 0x7a, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x73, 0x68, 0x61, - 0x72, 0x64, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x64, 0x61, 0x74, 0x61, 0x53, - 0x68, 0x61, 0x72, 0x64, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, - 0x65, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x0a, 0x63, 0x6f, 0x6d, 0x6d, 0x69, - 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x73, 0x68, 0x61, 0x72, 0x64, 0x5f, 0x6b, - 0x65, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x73, 0x68, 0x61, 0x72, 0x64, 0x4b, - 0x65, 0x79, 0x22, 0x53, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x41, 0x70, 0x70, 0x53, 0x68, 0x61, 0x72, - 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3b, 0x0a, 0x04, 0x69, 0x6e, - 0x66, 0x6f, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, - 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, - 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x41, 0x70, 0x70, 0x53, 0x68, 0x61, 0x72, 0x64, 0x49, 0x6e, 0x66, - 0x6f, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x38, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x47, 0x6c, - 0x6f, 0x62, 0x61, 0x6c, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x6c, 0x31, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x02, 0x6c, - 0x31, 0x12, 0x0e, 0x0a, 0x02, 0x6c, 0x32, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x02, 0x6c, - 0x32, 0x22, 0x4d, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x53, 0x68, - 0x61, 0x72, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, - 0x73, 0x69, 0x7a, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, - 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x02, - 0x20, 0x03, 0x28, 0x0c, 0x52, 0x0a, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, - 0x22, 0x63, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x4c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x41, 0x64, 0x64, - 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x23, 0x0a, - 0x0d, 0x73, 0x68, 0x61, 0x72, 0x64, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x73, 0x68, 0x61, 0x72, 0x64, 0x41, 0x64, 0x64, 0x72, 0x65, - 0x73, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x62, - 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x4e, - 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x9d, 0x01, 0x0a, 0x11, 0x4c, 0x6f, 0x63, 0x6b, 0x65, 0x64, - 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x29, 0x0a, 0x10, 0x74, - 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x48, 0x61, 0x73, 0x68, 0x12, 0x27, 0x0a, 0x0f, 0x73, 0x68, 0x61, 0x72, 0x64, 0x5f, - 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0c, 0x52, - 0x0e, 0x73, 0x68, 0x61, 0x72, 0x64, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x12, - 0x1c, 0x0a, 0x09, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x09, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x12, 0x16, 0x0a, - 0x06, 0x66, 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x66, - 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x22, 0x6e, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x4c, 0x6f, 0x63, 0x6b, - 0x65, 0x64, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x50, 0x0a, 0x0c, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x71, 0x75, 0x69, 0x6c, - 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x67, 0x6c, 0x6f, 0x62, - 0x61, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x54, 0x72, 0x61, 0x6e, - 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x1c, 0x0a, 0x1a, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x47, - 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x22, 0xf8, 0x01, 0x0a, 0x1f, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x47, 0x65, - 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x49, 0x74, 0x65, 0x6d, 0x12, 0x17, 0x0a, 0x07, 0x63, 0x6f, 0x72, 0x65, 0x5f, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x63, 0x6f, 0x72, 0x65, 0x49, 0x64, - 0x12, 0x29, 0x0a, 0x10, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x5f, 0x6d, 0x75, 0x6c, 0x74, 0x69, - 0x61, 0x64, 0x64, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x6c, 0x69, 0x73, 0x74, - 0x65, 0x6e, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x61, 0x64, 0x64, 0x72, 0x12, 0x36, 0x0a, 0x17, 0x73, - 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x5f, 0x6d, 0x75, 0x6c, - 0x74, 0x69, 0x61, 0x64, 0x64, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x73, 0x74, - 0x72, 0x65, 0x61, 0x6d, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x61, - 0x64, 0x64, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x0c, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x23, 0x0a, 0x0d, 0x74, - 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x0c, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, - 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x64, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x09, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x64, 0x22, 0x73, - 0x0a, 0x1b, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x65, - 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x54, 0x0a, - 0x07, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, - 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, 0x6f, 0x64, 0x65, - 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x6c, 0x6f, 0x62, 0x61, - 0x6c, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x07, 0x77, 0x6f, 0x72, 0x6b, - 0x65, 0x72, 0x73, 0x22, 0x53, 0x0a, 0x0b, 0x53, 0x65, 0x6e, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 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, 0x17, 0x0a, 0x07, 0x63, - 0x69, 0x72, 0x63, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x63, 0x69, - 0x72, 0x63, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x65, 0x6c, 0x6c, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x0c, 0x52, 0x04, 0x63, 0x65, 0x6c, 0x6c, 0x22, 0x63, 0x0a, 0x0e, 0x52, 0x65, 0x63, 0x65, - 0x69, 0x76, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x24, 0x0a, 0x0e, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x5f, 0x70, 0x65, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0c, 0x52, 0x0c, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x50, 0x65, 0x65, 0x72, 0x49, 0x64, - 0x12, 0x17, 0x0a, 0x07, 0x63, 0x69, 0x72, 0x63, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x06, 0x63, 0x69, 0x72, 0x63, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x65, 0x6c, - 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x63, 0x65, 0x6c, 0x6c, 0x22, 0x49, 0x0a, - 0x15, 0x47, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x30, 0x0a, 0x14, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, - 0x74, 0x79, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0c, 0x52, 0x12, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x4b, 0x65, - 0x79, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, 0x70, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x4b, - 0x65, 0x79, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x40, 0x0a, 0x08, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, - 0x6d, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x70, 0x62, 0x2e, 0x4b, - 0x65, 0x79, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x52, 0x08, 0x72, 0x65, 0x67, 0x69, - 0x73, 0x74, 0x72, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x4d, 0x0a, 0x1d, 0x47, 0x65, - 0x74, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x42, 0x79, 0x50, 0x72, - 0x6f, 0x76, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2c, 0x0a, 0x12, 0x70, - 0x72, 0x6f, 0x76, 0x65, 0x72, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, - 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x10, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x72, 0x4b, - 0x65, 0x79, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, 0x78, 0x0a, 0x1e, 0x47, 0x65, 0x74, - 0x4b, 0x65, 0x79, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x42, 0x79, 0x50, 0x72, 0x6f, - 0x76, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x40, 0x0a, 0x08, 0x72, - 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, - 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, - 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x70, 0x62, 0x2e, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x67, 0x69, 0x73, - 0x74, 0x72, 0x79, 0x52, 0x08, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x12, 0x14, 0x0a, - 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, - 0x72, 0x6f, 0x72, 0x22, 0x7d, 0x0a, 0x15, 0x50, 0x75, 0x74, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, - 0x74, 0x79, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, - 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x61, - 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x4a, 0x0a, 0x0c, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, - 0x74, 0x79, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x71, - 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x6b, - 0x65, 0x79, 0x73, 0x2e, 0x70, 0x62, 0x2e, 0x45, 0x64, 0x34, 0x34, 0x38, 0x50, 0x75, 0x62, 0x6c, - 0x69, 0x63, 0x4b, 0x65, 0x79, 0x52, 0x0b, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x4b, - 0x65, 0x79, 0x22, 0x2e, 0x0a, 0x16, 0x50, 0x75, 0x74, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, - 0x79, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, - 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, - 0x6f, 0x72, 0x22, 0x78, 0x0a, 0x14, 0x50, 0x75, 0x74, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x6e, 0x67, - 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x60, 0x0a, 0x0b, 0x70, 0x72, - 0x6f, 0x76, 0x69, 0x6e, 0x67, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x3f, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, 0x6f, 0x64, - 0x65, 0x2e, 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x70, 0x62, 0x2e, 0x42, 0x4c, 0x53, 0x34, 0x38, 0x35, - 0x38, 0x31, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x57, 0x69, 0x74, 0x68, 0x50, - 0x72, 0x6f, 0x6f, 0x66, 0x4f, 0x66, 0x50, 0x6f, 0x73, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, - 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x6e, 0x67, 0x4b, 0x65, 0x79, 0x22, 0x2d, 0x0a, 0x15, - 0x50, 0x75, 0x74, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x6e, 0x67, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x9e, 0x02, 0x0a, 0x18, - 0x50, 0x75, 0x74, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x30, 0x0a, 0x14, 0x69, 0x64, 0x65, 0x6e, - 0x74, 0x69, 0x74, 0x79, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x12, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, - 0x4b, 0x65, 0x79, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x2e, 0x0a, 0x13, 0x70, 0x72, - 0x6f, 0x76, 0x69, 0x6e, 0x67, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, - 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x11, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x6e, 0x67, - 0x4b, 0x65, 0x79, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x4f, 0x0a, 0x25, 0x69, 0x64, - 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x73, 0x69, 0x67, 0x6e, 0x61, - 0x74, 0x75, 0x72, 0x65, 0x5f, 0x6f, 0x66, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x6e, 0x67, 0x5f, - 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, - 0x69, 0x74, 0x79, 0x4b, 0x65, 0x79, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x4f, - 0x66, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x6e, 0x67, 0x4b, 0x65, 0x79, 0x12, 0x4f, 0x0a, 0x25, 0x70, - 0x72, 0x6f, 0x76, 0x69, 0x6e, 0x67, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x73, 0x69, 0x67, 0x6e, 0x61, - 0x74, 0x75, 0x72, 0x65, 0x5f, 0x6f, 0x66, 0x5f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, - 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x20, 0x70, 0x72, 0x6f, 0x76, - 0x69, 0x6e, 0x67, 0x4b, 0x65, 0x79, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x4f, - 0x66, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x4b, 0x65, 0x79, 0x22, 0x31, 0x0a, 0x19, - 0x50, 0x75, 0x74, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, - 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, - 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, - 0x69, 0x0a, 0x13, 0x50, 0x75, 0x74, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x4b, 0x65, 0x79, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, - 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, - 0x12, 0x38, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, - 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, - 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x70, 0x62, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x58, 0x34, - 0x34, 0x38, 0x4b, 0x65, 0x79, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x22, 0x2c, 0x0a, 0x14, 0x50, 0x75, - 0x74, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x31, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x49, - 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0c, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, 0x69, 0x0a, 0x16, 0x47, - 0x65, 0x74, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x39, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, - 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x70, 0x62, 0x2e, 0x45, 0x64, 0x34, - 0x34, 0x38, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x52, 0x03, 0x6b, 0x65, 0x79, - 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x30, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, - 0x76, 0x69, 0x6e, 0x67, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, - 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, - 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, 0x80, 0x01, 0x0a, 0x15, 0x47, 0x65, 0x74, - 0x50, 0x72, 0x6f, 0x76, 0x69, 0x6e, 0x67, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x51, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x3f, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, 0x6f, 0x64, - 0x65, 0x2e, 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x70, 0x62, 0x2e, 0x42, 0x4c, 0x53, 0x34, 0x38, 0x35, - 0x38, 0x31, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x57, 0x69, 0x74, 0x68, 0x50, - 0x72, 0x6f, 0x6f, 0x66, 0x4f, 0x66, 0x50, 0x6f, 0x73, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, - 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x2f, 0x0a, 0x13, 0x47, - 0x65, 0x74, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0c, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, 0x66, 0x0a, 0x14, - 0x47, 0x65, 0x74, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x38, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x26, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, - 0x6f, 0x64, 0x65, 0x2e, 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x70, 0x62, 0x2e, 0x53, 0x69, 0x67, 0x6e, - 0x65, 0x64, 0x58, 0x34, 0x34, 0x38, 0x4b, 0x65, 0x79, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, - 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, - 0x72, 0x72, 0x6f, 0x72, 0x22, 0x6d, 0x0a, 0x1c, 0x47, 0x65, 0x74, 0x53, 0x69, 0x67, 0x6e, 0x65, - 0x64, 0x4b, 0x65, 0x79, 0x73, 0x42, 0x79, 0x50, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x2c, 0x0a, 0x12, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x6b, - 0x65, 0x79, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, - 0x52, 0x10, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x4b, 0x65, 0x79, 0x41, 0x64, 0x64, 0x72, 0x65, - 0x73, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x6b, 0x65, 0x79, 0x5f, 0x70, 0x75, 0x72, 0x70, 0x6f, 0x73, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6b, 0x65, 0x79, 0x50, 0x75, 0x72, 0x70, - 0x6f, 0x73, 0x65, 0x22, 0x71, 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, - 0x4b, 0x65, 0x79, 0x73, 0x42, 0x79, 0x50, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3a, 0x0a, 0x04, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, - 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x70, 0x62, 0x2e, 0x53, 0x69, 0x67, - 0x6e, 0x65, 0x64, 0x58, 0x34, 0x34, 0x38, 0x4b, 0x65, 0x79, 0x52, 0x04, 0x6b, 0x65, 0x79, 0x73, - 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x19, 0x0a, 0x17, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x50, - 0x72, 0x6f, 0x76, 0x69, 0x6e, 0x67, 0x4b, 0x65, 0x79, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x22, 0x83, 0x01, 0x0a, 0x18, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, - 0x6e, 0x67, 0x4b, 0x65, 0x79, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x51, - 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3f, 0x2e, 0x71, 0x75, - 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x6b, 0x65, - 0x79, 0x73, 0x2e, 0x70, 0x62, 0x2e, 0x42, 0x4c, 0x53, 0x34, 0x38, 0x35, 0x38, 0x31, 0x53, 0x69, - 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x57, 0x69, 0x74, 0x68, 0x50, 0x72, 0x6f, 0x6f, 0x66, - 0x4f, 0x66, 0x50, 0x6f, 0x73, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x03, 0x6b, 0x65, - 0x79, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x1a, 0x0a, 0x18, 0x52, 0x61, 0x6e, 0x67, 0x65, - 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x4b, 0x65, 0x79, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x22, 0x6c, 0x0a, 0x19, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x49, 0x64, 0x65, 0x6e, - 0x74, 0x69, 0x74, 0x79, 0x4b, 0x65, 0x79, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x39, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, - 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, - 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x70, 0x62, 0x2e, 0x45, 0x64, 0x34, 0x34, 0x38, 0x50, 0x75, 0x62, - 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x65, - 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, - 0x72, 0x22, 0x67, 0x0a, 0x16, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, - 0x4b, 0x65, 0x79, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2c, 0x0a, 0x12, 0x70, - 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, - 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x10, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x4b, - 0x65, 0x79, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x6b, 0x65, 0x79, - 0x5f, 0x70, 0x75, 0x72, 0x70, 0x6f, 0x73, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, - 0x6b, 0x65, 0x79, 0x50, 0x75, 0x72, 0x70, 0x6f, 0x73, 0x65, 0x22, 0x69, 0x0a, 0x17, 0x52, 0x61, - 0x6e, 0x67, 0x65, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x4b, 0x65, 0x79, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x38, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, - 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x70, 0x62, 0x2e, 0x53, 0x69, 0x67, - 0x6e, 0x65, 0x64, 0x58, 0x34, 0x34, 0x38, 0x4b, 0x65, 0x79, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, - 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x61, 0x0a, 0x0f, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, - 0x4b, 0x65, 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 0x12, 0x29, 0x0a, 0x10, 0x70, 0x61, 0x72, 0x74, - 0x79, 0x5f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x0f, 0x70, 0x61, 0x72, 0x74, 0x79, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, - 0x69, 0x65, 0x72, 0x12, 0x23, 0x0a, 0x0d, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x65, 0x64, - 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x65, 0x6e, 0x63, 0x72, - 0x79, 0x70, 0x74, 0x65, 0x64, 0x4b, 0x65, 0x79, 0x22, 0xb2, 0x01, 0x0a, 0x11, 0x50, 0x75, 0x74, - 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x51, - 0x0a, 0x0e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, - 0x69, 0x75, 0x6d, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, - 0x70, 0x62, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x4b, 0x65, 0x79, 0x53, 0x68, 0x61, - 0x72, 0x64, 0x52, 0x0d, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, - 0x73, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0c, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x30, 0x0a, 0x14, 0x65, - 0x70, 0x68, 0x65, 0x6d, 0x65, 0x72, 0x61, 0x6c, 0x5f, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, - 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x12, 0x65, 0x70, 0x68, 0x65, 0x6d, - 0x65, 0x72, 0x61, 0x6c, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x22, 0x14, 0x0a, - 0x12, 0x50, 0x75, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x32, 0xf2, 0x04, 0x0a, 0x0d, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x53, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x72, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, - 0x61, 0x6c, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x12, 0x30, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, - 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, - 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x46, 0x72, 0x61, - 0x6d, 0x65, 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, 0x67, 0x6c, 0x6f, 0x62, - 0x61, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x46, 0x72, 0x61, 0x6d, - 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6f, 0x0a, 0x0c, 0x47, 0x65, 0x74, - 0x41, 0x70, 0x70, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x12, 0x2e, 0x2e, 0x71, 0x75, 0x69, 0x6c, - 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x67, 0x6c, 0x6f, 0x62, - 0x61, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x70, 0x70, 0x53, 0x68, 0x61, 0x72, - 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x71, 0x75, 0x69, 0x6c, - 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x67, 0x6c, 0x6f, 0x62, - 0x61, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x70, 0x70, 0x53, 0x68, 0x61, 0x72, - 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x78, 0x0a, 0x0f, 0x47, 0x65, - 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x12, 0x31, 0x2e, - 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, - 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x47, 0x6c, 0x6f, - 0x62, 0x61, 0x6c, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x32, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, 0x6f, - 0x64, 0x65, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, - 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x81, 0x01, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x4c, 0x6f, 0x63, 0x6b, - 0x65, 0x64, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x12, 0x34, 0x2e, 0x71, 0x75, - 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x67, 0x6c, - 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x4c, 0x6f, 0x63, 0x6b, 0x65, - 0x64, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x35, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, - 0x6f, 0x64, 0x65, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x65, - 0x74, 0x4c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x7e, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x57, - 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x35, 0x2e, 0x71, 0x75, 0x69, 0x6c, - 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x67, 0x6c, 0x6f, 0x62, - 0x61, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x47, 0x65, 0x74, 0x57, - 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x36, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, 0x6f, - 0x64, 0x65, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x6c, 0x6f, - 0x62, 0x61, 0x6c, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32, 0x8b, 0x01, 0x0a, 0x0f, 0x41, 0x70, 0x70, - 0x53, 0x68, 0x61, 0x72, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x78, 0x0a, 0x10, - 0x47, 0x65, 0x74, 0x41, 0x70, 0x70, 0x53, 0x68, 0x61, 0x72, 0x64, 0x46, 0x72, 0x61, 0x6d, 0x65, - 0x12, 0x32, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, 0x6f, - 0x64, 0x65, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, - 0x41, 0x70, 0x70, 0x53, 0x68, 0x61, 0x72, 0x64, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, - 0x6d, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x70, 0x62, - 0x2e, 0x41, 0x70, 0x70, 0x53, 0x68, 0x61, 0x72, 0x64, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32, 0x70, 0x0a, 0x0c, 0x4f, 0x6e, 0x69, 0x6f, 0x6e, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x60, 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, - 0x74, 0x12, 0x26, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, - 0x6f, 0x64, 0x65, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x53, 0x65, - 0x6e, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x1a, 0x29, 0x2e, 0x71, 0x75, 0x69, 0x6c, - 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x67, 0x6c, 0x6f, 0x62, - 0x61, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x4d, 0x65, 0x73, - 0x73, 0x61, 0x67, 0x65, 0x28, 0x01, 0x30, 0x01, 0x32, 0xdf, 0x01, 0x0a, 0x0d, 0x4d, 0x69, 0x78, - 0x6e, 0x65, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x69, 0x0a, 0x0a, 0x50, 0x75, - 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x2c, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, - 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, - 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x50, 0x75, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, - 0x69, 0x75, 0x6d, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, - 0x70, 0x62, 0x2e, 0x50, 0x75, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x63, 0x0a, 0x0b, 0x52, 0x6f, 0x75, 0x6e, 0x64, 0x53, 0x74, - 0x72, 0x65, 0x61, 0x6d, 0x12, 0x27, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, - 0x6d, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x2e, 0x70, 0x62, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x1a, 0x27, 0x2e, - 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, - 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x62, 0x2e, 0x4d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x28, 0x01, 0x30, 0x01, 0x32, 0xd7, 0x0c, 0x0a, 0x12, 0x4b, - 0x65, 0x79, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x12, 0x75, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x67, 0x69, 0x73, - 0x74, 0x72, 0x79, 0x12, 0x30, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, - 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x70, 0x62, 0x2e, - 0x47, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x31, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, + 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x48, + 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x44, 0x0a, + 0x08, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x28, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, 0x6f, 0x64, + 0x65, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x4d, 0x65, 0x73, 0x73, + 0x61, 0x67, 0x65, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x52, 0x08, 0x72, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x73, 0x22, 0x95, 0x01, 0x0a, 0x0d, 0x41, 0x70, 0x70, 0x53, 0x68, 0x61, 0x72, 0x64, + 0x46, 0x72, 0x61, 0x6d, 0x65, 0x12, 0x3e, 0x0a, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x70, - 0x62, 0x2e, 0x47, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x8d, 0x01, 0x0a, 0x16, 0x47, 0x65, 0x74, - 0x4b, 0x65, 0x79, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x42, 0x79, 0x50, 0x72, 0x6f, - 0x76, 0x65, 0x72, 0x12, 0x38, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, - 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x70, 0x62, 0x2e, - 0x47, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x42, 0x79, - 0x50, 0x72, 0x6f, 0x76, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x39, 0x2e, - 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, - 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x4b, 0x65, 0x79, - 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x42, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x65, 0x72, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x75, 0x0a, 0x0e, 0x50, 0x75, 0x74, 0x49, - 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x4b, 0x65, 0x79, 0x12, 0x30, 0x2e, 0x71, 0x75, 0x69, - 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x67, 0x6c, 0x6f, - 0x62, 0x61, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x50, 0x75, 0x74, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, - 0x74, 0x79, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x31, 0x2e, 0x71, + 0x62, 0x2e, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x06, 0x68, + 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x44, 0x0a, 0x08, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, + 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, + 0x2e, 0x70, 0x62, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x42, 0x75, 0x6e, 0x64, 0x6c, + 0x65, 0x52, 0x08, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x22, 0x45, 0x0a, 0x0b, 0x47, + 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, + 0x72, 0x65, 0x22, 0x3a, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x46, + 0x72, 0x61, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x66, + 0x72, 0x61, 0x6d, 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x0b, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x69, + 0x0a, 0x13, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3c, 0x0a, 0x05, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, + 0x6d, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x70, 0x62, + 0x2e, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x52, 0x05, 0x66, 0x72, + 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x05, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x22, 0x54, 0x0a, 0x17, 0x47, 0x65, 0x74, + 0x41, 0x70, 0x70, 0x53, 0x68, 0x61, 0x72, 0x64, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x21, 0x0a, 0x0c, + 0x66, 0x72, 0x61, 0x6d, 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x0b, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, + 0x6d, 0x0a, 0x15, 0x41, 0x70, 0x70, 0x53, 0x68, 0x61, 0x72, 0x64, 0x46, 0x72, 0x61, 0x6d, 0x65, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3e, 0x0a, 0x05, 0x66, 0x72, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, + 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, + 0x2e, 0x70, 0x62, 0x2e, 0x41, 0x70, 0x70, 0x53, 0x68, 0x61, 0x72, 0x64, 0x46, 0x72, 0x61, 0x6d, + 0x65, 0x52, 0x05, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x72, 0x6f, 0x6f, + 0x66, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x22, 0x4a, + 0x0a, 0x13, 0x47, 0x65, 0x74, 0x41, 0x70, 0x70, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x73, 0x68, 0x61, 0x72, 0x64, 0x5f, 0x6b, + 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x73, 0x68, 0x61, 0x72, 0x64, 0x4b, + 0x65, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x0d, 0x52, 0x06, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x22, 0x98, 0x01, 0x0a, 0x0c, 0x41, + 0x70, 0x70, 0x53, 0x68, 0x61, 0x72, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x16, 0x0a, 0x06, 0x70, + 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x06, 0x70, 0x72, 0x65, + 0x66, 0x69, 0x78, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x64, 0x61, 0x74, 0x61, 0x5f, + 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x64, 0x61, + 0x74, 0x61, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6d, 0x6d, + 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x0a, 0x63, 0x6f, + 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x73, 0x68, 0x61, 0x72, + 0x64, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x73, 0x68, 0x61, + 0x72, 0x64, 0x4b, 0x65, 0x79, 0x22, 0x53, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x41, 0x70, 0x70, 0x53, + 0x68, 0x61, 0x72, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3b, 0x0a, + 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x71, 0x75, + 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x67, 0x6c, + 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x41, 0x70, 0x70, 0x53, 0x68, 0x61, 0x72, 0x64, + 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x38, 0x0a, 0x16, 0x47, 0x65, + 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x6c, 0x31, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x02, 0x6c, 0x31, 0x12, 0x0e, 0x0a, 0x02, 0x6c, 0x32, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x02, 0x6c, 0x32, 0x22, 0x4d, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, + 0x6c, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x73, + 0x69, 0x7a, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, + 0x74, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x0a, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, + 0x65, 0x6e, 0x74, 0x22, 0x63, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x4c, 0x6f, 0x63, 0x6b, 0x65, 0x64, + 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x68, 0x61, 0x72, 0x64, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, + 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x73, 0x68, 0x61, 0x72, 0x64, 0x41, 0x64, + 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x5f, 0x6e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x66, 0x72, 0x61, + 0x6d, 0x65, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x9d, 0x01, 0x0a, 0x11, 0x4c, 0x6f, 0x63, + 0x6b, 0x65, 0x64, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x29, + 0x0a, 0x10, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x68, 0x61, + 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x61, 0x73, 0x68, 0x12, 0x27, 0x0a, 0x0f, 0x73, 0x68, 0x61, + 0x72, 0x64, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x0c, 0x52, 0x0e, 0x73, 0x68, 0x61, 0x72, 0x64, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, + 0x65, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, + 0x12, 0x16, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x06, 0x66, 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x22, 0x6e, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x4c, + 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x50, 0x0a, 0x0c, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x67, - 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x50, 0x75, 0x74, 0x49, 0x64, 0x65, 0x6e, + 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x54, + 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x74, 0x72, 0x61, 0x6e, + 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x1c, 0x0a, 0x1a, 0x47, 0x6c, 0x6f, 0x62, + 0x61, 0x6c, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xf8, 0x01, 0x0a, 0x1f, 0x47, 0x6c, 0x6f, 0x62, 0x61, + 0x6c, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x49, 0x74, 0x65, 0x6d, 0x12, 0x17, 0x0a, 0x07, 0x63, 0x6f, + 0x72, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x63, 0x6f, 0x72, + 0x65, 0x49, 0x64, 0x12, 0x29, 0x0a, 0x10, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x5f, 0x6d, 0x75, + 0x6c, 0x74, 0x69, 0x61, 0x64, 0x64, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x6c, + 0x69, 0x73, 0x74, 0x65, 0x6e, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x61, 0x64, 0x64, 0x72, 0x12, 0x36, + 0x0a, 0x17, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x5f, + 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x61, 0x64, 0x64, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x15, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x4d, 0x75, 0x6c, + 0x74, 0x69, 0x61, 0x64, 0x64, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x23, + 0x0a, 0x0d, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x53, 0x74, 0x6f, 0x72, + 0x61, 0x67, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x64, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x65, + 0x64, 0x22, 0x73, 0x0a, 0x1b, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x47, 0x65, 0x74, 0x57, 0x6f, + 0x72, 0x6b, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x54, 0x0a, 0x07, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x3a, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, + 0x6f, 0x64, 0x65, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x6c, + 0x6f, 0x62, 0x61, 0x6c, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x49, 0x6e, 0x66, + 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x07, 0x77, + 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x73, 0x22, 0x53, 0x0a, 0x0b, 0x53, 0x65, 0x6e, 0x64, 0x4d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 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, 0x17, + 0x0a, 0x07, 0x63, 0x69, 0x72, 0x63, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x06, 0x63, 0x69, 0x72, 0x63, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x65, 0x6c, 0x6c, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x63, 0x65, 0x6c, 0x6c, 0x22, 0x63, 0x0a, 0x0e, 0x52, + 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x24, 0x0a, + 0x0e, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x70, 0x65, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x50, 0x65, 0x65, + 0x72, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x63, 0x69, 0x72, 0x63, 0x5f, 0x69, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x63, 0x69, 0x72, 0x63, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, + 0x63, 0x65, 0x6c, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x63, 0x65, 0x6c, 0x6c, + 0x22, 0x49, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, + 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x30, 0x0a, 0x14, 0x69, 0x64, 0x65, + 0x6e, 0x74, 0x69, 0x74, 0x79, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, + 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x12, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, + 0x79, 0x4b, 0x65, 0x79, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, 0x70, 0x0a, 0x16, 0x47, + 0x65, 0x74, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x40, 0x0a, 0x08, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, + 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x70, + 0x62, 0x2e, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x52, 0x08, 0x72, + 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x4d, 0x0a, + 0x1d, 0x47, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x42, + 0x79, 0x50, 0x72, 0x6f, 0x76, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2c, + 0x0a, 0x12, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x72, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x61, 0x64, 0x64, + 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x10, 0x70, 0x72, 0x6f, 0x76, + 0x65, 0x72, 0x4b, 0x65, 0x79, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, 0x78, 0x0a, 0x1e, + 0x47, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x42, 0x79, + 0x50, 0x72, 0x6f, 0x76, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x40, + 0x0a, 0x08, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x24, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, 0x6f, + 0x64, 0x65, 0x2e, 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x70, 0x62, 0x2e, 0x4b, 0x65, 0x79, 0x52, 0x65, + 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x52, 0x08, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, + 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x7d, 0x0a, 0x15, 0x50, 0x75, 0x74, 0x49, 0x64, 0x65, + 0x6e, 0x74, 0x69, 0x74, 0x79, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x4a, 0x0a, 0x0c, 0x69, 0x64, 0x65, + 0x6e, 0x74, 0x69, 0x74, 0x79, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x27, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, 0x6f, 0x64, + 0x65, 0x2e, 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x70, 0x62, 0x2e, 0x45, 0x64, 0x34, 0x34, 0x38, 0x50, + 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x52, 0x0b, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, + 0x74, 0x79, 0x4b, 0x65, 0x79, 0x22, 0x2e, 0x0a, 0x16, 0x50, 0x75, 0x74, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x72, 0x0a, 0x0d, 0x50, 0x75, 0x74, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x6e, 0x67, 0x4b, 0x65, 0x79, - 0x12, 0x2f, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, 0x6f, - 0x64, 0x65, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x50, 0x75, 0x74, + 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x78, 0x0a, 0x14, 0x50, 0x75, 0x74, 0x50, 0x72, 0x6f, 0x76, + 0x69, 0x6e, 0x67, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x60, 0x0a, + 0x0b, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x6e, 0x67, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x3f, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, + 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x70, 0x62, 0x2e, 0x42, 0x4c, 0x53, + 0x34, 0x38, 0x35, 0x38, 0x31, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x57, 0x69, + 0x74, 0x68, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x4f, 0x66, 0x50, 0x6f, 0x73, 0x73, 0x65, 0x73, 0x73, + 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x6e, 0x67, 0x4b, 0x65, 0x79, 0x22, + 0x2d, 0x0a, 0x15, 0x50, 0x75, 0x74, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x6e, 0x67, 0x4b, 0x65, 0x79, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, + 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x9e, + 0x02, 0x0a, 0x18, 0x50, 0x75, 0x74, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x53, 0x69, 0x67, 0x6e, 0x61, + 0x74, 0x75, 0x72, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x30, 0x0a, 0x14, 0x69, + 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x61, 0x64, 0x64, 0x72, + 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x12, 0x69, 0x64, 0x65, 0x6e, 0x74, + 0x69, 0x74, 0x79, 0x4b, 0x65, 0x79, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x2e, 0x0a, + 0x13, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x6e, 0x67, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x61, 0x64, 0x64, + 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x11, 0x70, 0x72, 0x6f, 0x76, + 0x69, 0x6e, 0x67, 0x4b, 0x65, 0x79, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x4f, 0x0a, + 0x25, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x73, 0x69, + 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x6f, 0x66, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, + 0x6e, 0x67, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x20, 0x69, 0x64, + 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x4b, 0x65, 0x79, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, + 0x72, 0x65, 0x4f, 0x66, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x6e, 0x67, 0x4b, 0x65, 0x79, 0x12, 0x4f, + 0x0a, 0x25, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x6e, 0x67, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x73, 0x69, + 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x6f, 0x66, 0x5f, 0x69, 0x64, 0x65, 0x6e, 0x74, + 0x69, 0x74, 0x79, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x20, 0x70, + 0x72, 0x6f, 0x76, 0x69, 0x6e, 0x67, 0x4b, 0x65, 0x79, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, + 0x72, 0x65, 0x4f, 0x66, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x4b, 0x65, 0x79, 0x22, + 0x31, 0x0a, 0x19, 0x50, 0x75, 0x74, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x53, 0x69, 0x67, 0x6e, 0x61, + 0x74, 0x75, 0x72, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, + 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, + 0x6f, 0x72, 0x22, 0x69, 0x0a, 0x13, 0x50, 0x75, 0x74, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x4b, + 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, + 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, + 0x65, 0x73, 0x73, 0x12, 0x38, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x26, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, 0x6f, + 0x64, 0x65, 0x2e, 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x70, 0x62, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x65, + 0x64, 0x58, 0x34, 0x34, 0x38, 0x4b, 0x65, 0x79, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x22, 0x2c, 0x0a, + 0x14, 0x50, 0x75, 0x74, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x31, 0x0a, 0x15, 0x47, + 0x65, 0x74, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, 0x69, + 0x0a, 0x16, 0x47, 0x65, 0x74, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x4b, 0x65, 0x79, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x39, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, + 0x75, 0x6d, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x70, 0x62, 0x2e, + 0x45, 0x64, 0x34, 0x34, 0x38, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x52, 0x03, + 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x30, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x6e, 0x67, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x30, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, - 0x6f, 0x64, 0x65, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x50, 0x75, - 0x74, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x6e, 0x67, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x7e, 0x0a, 0x11, 0x50, 0x75, 0x74, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x53, - 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, 0x33, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, - 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, - 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x50, 0x75, 0x74, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x53, 0x69, 0x67, - 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x34, 0x2e, - 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, - 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x50, 0x75, 0x74, 0x43, 0x72, 0x6f, - 0x73, 0x73, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x6f, 0x0a, 0x0c, 0x50, 0x75, 0x74, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, - 0x4b, 0x65, 0x79, 0x12, 0x2e, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, + 0x74, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, 0x80, 0x01, 0x0a, 0x15, + 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x6e, 0x67, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x51, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x3f, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, + 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x70, 0x62, 0x2e, 0x42, 0x4c, 0x53, + 0x34, 0x38, 0x35, 0x38, 0x31, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x57, 0x69, + 0x74, 0x68, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x4f, 0x66, 0x50, 0x6f, 0x73, 0x73, 0x65, 0x73, 0x73, + 0x69, 0x6f, 0x6e, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, + 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x2f, + 0x0a, 0x13, 0x47, 0x65, 0x74, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x4b, 0x65, 0x79, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, + 0x66, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x4b, 0x65, 0x79, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x38, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, + 0x6d, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x70, 0x62, 0x2e, 0x53, + 0x69, 0x67, 0x6e, 0x65, 0x64, 0x58, 0x34, 0x34, 0x38, 0x4b, 0x65, 0x79, 0x52, 0x03, 0x6b, 0x65, + 0x79, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x6d, 0x0a, 0x1c, 0x47, 0x65, 0x74, 0x53, 0x69, + 0x67, 0x6e, 0x65, 0x64, 0x4b, 0x65, 0x79, 0x73, 0x42, 0x79, 0x50, 0x61, 0x72, 0x65, 0x6e, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2c, 0x0a, 0x12, 0x70, 0x61, 0x72, 0x65, 0x6e, + 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0c, 0x52, 0x10, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x4b, 0x65, 0x79, 0x41, 0x64, + 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x6b, 0x65, 0x79, 0x5f, 0x70, 0x75, 0x72, + 0x70, 0x6f, 0x73, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6b, 0x65, 0x79, 0x50, + 0x75, 0x72, 0x70, 0x6f, 0x73, 0x65, 0x22, 0x71, 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x53, 0x69, 0x67, + 0x6e, 0x65, 0x64, 0x4b, 0x65, 0x79, 0x73, 0x42, 0x79, 0x50, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3a, 0x0a, 0x04, 0x6b, 0x65, 0x79, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, + 0x75, 0x6d, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x70, 0x62, 0x2e, + 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x58, 0x34, 0x34, 0x38, 0x4b, 0x65, 0x79, 0x52, 0x04, 0x6b, + 0x65, 0x79, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x19, 0x0a, 0x17, 0x52, 0x61, 0x6e, + 0x67, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x6e, 0x67, 0x4b, 0x65, 0x79, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x22, 0x83, 0x01, 0x0a, 0x18, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x72, + 0x6f, 0x76, 0x69, 0x6e, 0x67, 0x4b, 0x65, 0x79, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x51, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3f, + 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, 0x6f, 0x64, 0x65, + 0x2e, 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x70, 0x62, 0x2e, 0x42, 0x4c, 0x53, 0x34, 0x38, 0x35, 0x38, + 0x31, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x57, 0x69, 0x74, 0x68, 0x50, 0x72, + 0x6f, 0x6f, 0x66, 0x4f, 0x66, 0x50, 0x6f, 0x73, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, + 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x1a, 0x0a, 0x18, 0x52, 0x61, + 0x6e, 0x67, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x4b, 0x65, 0x79, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x6c, 0x0a, 0x19, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x49, + 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x4b, 0x65, 0x79, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x39, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x27, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, 0x6f, + 0x64, 0x65, 0x2e, 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x70, 0x62, 0x2e, 0x45, 0x64, 0x34, 0x34, 0x38, + 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, + 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, + 0x72, 0x72, 0x6f, 0x72, 0x22, 0x67, 0x0a, 0x16, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x53, 0x69, 0x67, + 0x6e, 0x65, 0x64, 0x4b, 0x65, 0x79, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2c, + 0x0a, 0x12, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x61, 0x64, 0x64, + 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x10, 0x70, 0x61, 0x72, 0x65, + 0x6e, 0x74, 0x4b, 0x65, 0x79, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x1f, 0x0a, 0x0b, + 0x6b, 0x65, 0x79, 0x5f, 0x70, 0x75, 0x72, 0x70, 0x6f, 0x73, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0a, 0x6b, 0x65, 0x79, 0x50, 0x75, 0x72, 0x70, 0x6f, 0x73, 0x65, 0x22, 0x69, 0x0a, + 0x17, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x4b, 0x65, 0x79, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x38, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, + 0x75, 0x6d, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x70, 0x62, 0x2e, + 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x58, 0x34, 0x34, 0x38, 0x4b, 0x65, 0x79, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x61, 0x0a, 0x0f, 0x4d, 0x65, 0x73, 0x73, + 0x61, 0x67, 0x65, 0x4b, 0x65, 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 0x12, 0x29, 0x0a, 0x10, 0x70, + 0x61, 0x72, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0f, 0x70, 0x61, 0x72, 0x74, 0x79, 0x49, 0x64, 0x65, 0x6e, + 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x12, 0x23, 0x0a, 0x0d, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, + 0x74, 0x65, 0x64, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x65, + 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x65, 0x64, 0x4b, 0x65, 0x79, 0x22, 0xb2, 0x01, 0x0a, 0x11, + 0x50, 0x75, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x51, 0x0a, 0x0e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x68, 0x61, + 0x72, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x71, 0x75, 0x69, 0x6c, + 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x67, 0x6c, 0x6f, 0x62, + 0x61, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x4b, 0x65, 0x79, + 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x0d, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x53, 0x68, + 0x61, 0x72, 0x64, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x30, + 0x0a, 0x14, 0x65, 0x70, 0x68, 0x65, 0x6d, 0x65, 0x72, 0x61, 0x6c, 0x5f, 0x70, 0x75, 0x62, 0x6c, + 0x69, 0x63, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x12, 0x65, 0x70, + 0x68, 0x65, 0x6d, 0x65, 0x72, 0x61, 0x6c, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, + 0x22, 0x14, 0x0a, 0x12, 0x50, 0x75, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32, 0xf2, 0x04, 0x0a, 0x0d, 0x47, 0x6c, 0x6f, 0x62, 0x61, + 0x6c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x72, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x47, + 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x12, 0x30, 0x2e, 0x71, 0x75, 0x69, + 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x67, 0x6c, 0x6f, + 0x62, 0x61, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, + 0x46, 0x72, 0x61, 0x6d, 0x65, 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, 0x67, + 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x46, + 0x72, 0x61, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6f, 0x0a, 0x0c, + 0x47, 0x65, 0x74, 0x41, 0x70, 0x70, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x12, 0x2e, 0x2e, 0x71, + 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x67, + 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x70, 0x70, 0x53, + 0x68, 0x61, 0x72, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x71, + 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x67, + 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x70, 0x70, 0x53, + 0x68, 0x61, 0x72, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x78, 0x0a, + 0x0f, 0x47, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, + 0x12, 0x31, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, 0x6f, + 0x64, 0x65, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, + 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x32, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x70, 0x62, 0x2e, - 0x50, 0x75, 0x74, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, + 0x47, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x81, 0x01, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x4c, + 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x12, 0x34, + 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, 0x6f, 0x64, 0x65, + 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x4c, 0x6f, + 0x63, 0x6b, 0x65, 0x64, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x35, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, + 0x6d, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x70, 0x62, + 0x2e, 0x47, 0x65, 0x74, 0x4c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, + 0x73, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x7e, 0x0a, 0x0d, 0x47, + 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x35, 0x2e, 0x71, + 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x67, + 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x47, + 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x36, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x70, 0x62, 0x2e, - 0x50, 0x75, 0x74, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x75, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x49, 0x64, 0x65, 0x6e, 0x74, - 0x69, 0x74, 0x79, 0x4b, 0x65, 0x79, 0x12, 0x30, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, + 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x49, + 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32, 0x8b, 0x01, 0x0a, 0x0f, + 0x41, 0x70, 0x70, 0x53, 0x68, 0x61, 0x72, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, + 0x78, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x41, 0x70, 0x70, 0x53, 0x68, 0x61, 0x72, 0x64, 0x46, 0x72, + 0x61, 0x6d, 0x65, 0x12, 0x32, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, + 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x70, 0x62, 0x2e, + 0x47, 0x65, 0x74, 0x41, 0x70, 0x70, 0x53, 0x68, 0x61, 0x72, 0x64, 0x46, 0x72, 0x61, 0x6d, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, + 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, + 0x2e, 0x70, 0x62, 0x2e, 0x41, 0x70, 0x70, 0x53, 0x68, 0x61, 0x72, 0x64, 0x46, 0x72, 0x61, 0x6d, + 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32, 0x70, 0x0a, 0x0c, 0x4f, 0x6e, 0x69, + 0x6f, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x60, 0x0a, 0x07, 0x43, 0x6f, 0x6e, + 0x6e, 0x65, 0x63, 0x74, 0x12, 0x26, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, + 0x6d, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x70, 0x62, + 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x1a, 0x29, 0x2e, 0x71, + 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x67, + 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, + 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x28, 0x01, 0x30, 0x01, 0x32, 0xdf, 0x01, 0x0a, 0x0d, + 0x4d, 0x69, 0x78, 0x6e, 0x65, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x69, 0x0a, + 0x0a, 0x50, 0x75, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x2c, 0x2e, 0x71, 0x75, + 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x67, 0x6c, + 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x50, 0x75, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x71, 0x75, 0x69, 0x6c, + 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x67, 0x6c, 0x6f, 0x62, + 0x61, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x50, 0x75, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x63, 0x0a, 0x0b, 0x52, 0x6f, 0x75, 0x6e, + 0x64, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, 0x27, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, + 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x62, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, + 0x1a, 0x27, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, 0x6f, + 0x64, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, + 0x62, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x28, 0x01, 0x30, 0x01, 0x32, 0xd7, 0x0c, + 0x0a, 0x12, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x12, 0x75, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x52, 0x65, + 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x12, 0x30, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, - 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x4b, 0x65, + 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x31, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, - 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, - 0x4b, 0x65, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x72, 0x0a, 0x0d, 0x47, - 0x65, 0x74, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x6e, 0x67, 0x4b, 0x65, 0x79, 0x12, 0x2f, 0x2e, 0x71, - 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x67, - 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x76, - 0x69, 0x6e, 0x67, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, + 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x67, 0x69, 0x73, + 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x8d, 0x01, 0x0a, 0x16, + 0x47, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x42, 0x79, + 0x50, 0x72, 0x6f, 0x76, 0x65, 0x72, 0x12, 0x38, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, + 0x69, 0x75, 0x6d, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, + 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, + 0x79, 0x42, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x39, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, 0x6f, + 0x64, 0x65, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, + 0x4b, 0x65, 0x79, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x42, 0x79, 0x50, 0x72, 0x6f, + 0x76, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x75, 0x0a, 0x0e, 0x50, + 0x75, 0x74, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x4b, 0x65, 0x79, 0x12, 0x30, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, - 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, - 0x76, 0x69, 0x6e, 0x67, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x6f, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x4b, 0x65, 0x79, 0x12, - 0x2e, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, 0x6f, 0x64, - 0x65, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x53, - 0x69, 0x67, 0x6e, 0x65, 0x64, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x2f, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, 0x6f, 0x64, - 0x65, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x53, - 0x69, 0x67, 0x6e, 0x65, 0x64, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x8a, 0x01, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x4b, 0x65, - 0x79, 0x73, 0x42, 0x79, 0x50, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x12, 0x37, 0x2e, 0x71, 0x75, 0x69, - 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x67, 0x6c, 0x6f, - 0x62, 0x61, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, - 0x4b, 0x65, 0x79, 0x73, 0x42, 0x79, 0x50, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x38, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, + 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x50, 0x75, 0x74, 0x49, 0x64, 0x65, + 0x6e, 0x74, 0x69, 0x74, 0x79, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x31, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, 0x6f, 0x64, + 0x65, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x50, 0x75, 0x74, 0x49, + 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x72, 0x0a, 0x0d, 0x50, 0x75, 0x74, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x6e, 0x67, + 0x4b, 0x65, 0x79, 0x12, 0x2f, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x70, 0x62, 0x2e, - 0x47, 0x65, 0x74, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x4b, 0x65, 0x79, 0x73, 0x42, 0x79, 0x50, - 0x61, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x7b, 0x0a, - 0x10, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x6e, 0x67, 0x4b, 0x65, 0x79, - 0x73, 0x12, 0x32, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, - 0x6f, 0x64, 0x65, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x52, 0x61, - 0x6e, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x6e, 0x67, 0x4b, 0x65, 0x79, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x33, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, - 0x75, 0x6d, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x70, - 0x62, 0x2e, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x6e, 0x67, 0x4b, 0x65, - 0x79, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x7e, 0x0a, 0x11, 0x52, 0x61, - 0x6e, 0x67, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x4b, 0x65, 0x79, 0x73, 0x12, - 0x33, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, 0x6f, 0x64, - 0x65, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x52, 0x61, 0x6e, 0x67, - 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x4b, 0x65, 0x79, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x34, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, + 0x50, 0x75, 0x74, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x6e, 0x67, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x70, 0x62, - 0x2e, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x4b, 0x65, - 0x79, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x78, 0x0a, 0x0f, 0x52, 0x61, - 0x6e, 0x67, 0x65, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x31, 0x2e, + 0x2e, 0x50, 0x75, 0x74, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x6e, 0x67, 0x4b, 0x65, 0x79, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x7e, 0x0a, 0x11, 0x50, 0x75, 0x74, 0x43, 0x72, 0x6f, + 0x73, 0x73, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, 0x33, 0x2e, 0x71, 0x75, + 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x67, 0x6c, + 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x50, 0x75, 0x74, 0x43, 0x72, 0x6f, 0x73, 0x73, + 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x34, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, 0x6f, + 0x64, 0x65, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x50, 0x75, 0x74, + 0x43, 0x72, 0x6f, 0x73, 0x73, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6f, 0x0a, 0x0c, 0x50, 0x75, 0x74, 0x53, 0x69, 0x67, + 0x6e, 0x65, 0x64, 0x4b, 0x65, 0x79, 0x12, 0x2e, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, + 0x69, 0x75, 0x6d, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, + 0x70, 0x62, 0x2e, 0x50, 0x75, 0x74, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x4b, 0x65, 0x79, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, + 0x69, 0x75, 0x6d, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, + 0x70, 0x62, 0x2e, 0x50, 0x75, 0x74, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x4b, 0x65, 0x79, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x75, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x49, 0x64, + 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x4b, 0x65, 0x79, 0x12, 0x30, 0x2e, 0x71, 0x75, 0x69, 0x6c, + 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x67, 0x6c, 0x6f, 0x62, + 0x61, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, + 0x79, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x31, 0x2e, 0x71, 0x75, + 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x67, 0x6c, + 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x49, 0x64, 0x65, 0x6e, 0x74, + 0x69, 0x74, 0x79, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x72, + 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x6e, 0x67, 0x4b, 0x65, 0x79, 0x12, + 0x2f, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, 0x6f, 0x64, + 0x65, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x50, + 0x72, 0x6f, 0x76, 0x69, 0x6e, 0x67, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x30, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, 0x6f, + 0x64, 0x65, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, + 0x50, 0x72, 0x6f, 0x76, 0x69, 0x6e, 0x67, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x6f, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x4b, + 0x65, 0x79, 0x12, 0x2e, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, + 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x47, + 0x65, 0x74, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, + 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x47, + 0x65, 0x74, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x8a, 0x01, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x53, 0x69, 0x67, 0x6e, 0x65, + 0x64, 0x4b, 0x65, 0x79, 0x73, 0x42, 0x79, 0x50, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x12, 0x37, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, - 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x53, - 0x69, 0x67, 0x6e, 0x65, 0x64, 0x4b, 0x65, 0x79, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x32, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, 0x6f, + 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x69, 0x67, + 0x6e, 0x65, 0x64, 0x4b, 0x65, 0x79, 0x73, 0x42, 0x79, 0x50, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x38, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, + 0x69, 0x75, 0x6d, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, + 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x4b, 0x65, 0x79, 0x73, + 0x42, 0x79, 0x50, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x7b, 0x0a, 0x10, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x6e, 0x67, + 0x4b, 0x65, 0x79, 0x73, 0x12, 0x32, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, + 0x6d, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x70, 0x62, + 0x2e, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x6e, 0x67, 0x4b, 0x65, 0x79, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x33, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, + 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, + 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x6e, + 0x67, 0x4b, 0x65, 0x79, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x7e, 0x0a, + 0x11, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x4b, 0x65, + 0x79, 0x73, 0x12, 0x33, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, + 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x52, + 0x61, 0x6e, 0x67, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x4b, 0x65, 0x79, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x34, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, + 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, + 0x2e, 0x70, 0x62, 0x2e, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, + 0x79, 0x4b, 0x65, 0x79, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x78, 0x0a, + 0x0f, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x4b, 0x65, 0x79, 0x73, + 0x12, 0x31, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x52, 0x61, 0x6e, - 0x67, 0x65, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x4b, 0x65, 0x79, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x32, 0xec, 0x03, 0x0a, 0x0f, 0x44, 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, - 0x68, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x56, 0x0a, 0x0f, 0x50, 0x75, 0x74, 0x49, - 0x6e, 0x62, 0x6f, 0x78, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x2b, 0x2e, 0x71, 0x75, - 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x63, 0x68, - 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x49, 0x6e, 0x62, 0x6f, 0x78, 0x4d, 0x65, - 0x73, 0x73, 0x61, 0x67, 0x65, 0x50, 0x75, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, - 0x12, 0x75, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x62, 0x6f, 0x78, 0x4d, 0x65, 0x73, 0x73, - 0x61, 0x67, 0x65, 0x73, 0x12, 0x2f, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, - 0x6d, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x2e, 0x70, - 0x62, 0x2e, 0x49, 0x6e, 0x62, 0x6f, 0x78, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, - 0x75, 0x6d, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x2e, - 0x70, 0x62, 0x2e, 0x49, 0x6e, 0x62, 0x6f, 0x78, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x44, 0x0a, 0x06, 0x50, 0x75, 0x74, 0x48, 0x75, - 0x62, 0x12, 0x22, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, - 0x6f, 0x64, 0x65, 0x2e, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x48, - 0x75, 0x62, 0x50, 0x75, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x59, 0x0a, - 0x06, 0x47, 0x65, 0x74, 0x48, 0x75, 0x62, 0x12, 0x26, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, + 0x67, 0x65, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x4b, 0x65, 0x79, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x32, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, + 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x70, 0x62, 0x2e, + 0x52, 0x61, 0x6e, 0x67, 0x65, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x4b, 0x65, 0x79, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32, 0xec, 0x03, 0x0a, 0x0f, 0x44, 0x69, 0x73, 0x70, + 0x61, 0x74, 0x63, 0x68, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x56, 0x0a, 0x0f, 0x50, + 0x75, 0x74, 0x49, 0x6e, 0x62, 0x6f, 0x78, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x2b, + 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, 0x6f, 0x64, 0x65, + 0x2e, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x49, 0x6e, 0x62, 0x6f, + 0x78, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x50, 0x75, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, + 0x70, 0x74, 0x79, 0x12, 0x75, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x62, 0x6f, 0x78, 0x4d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x12, 0x2f, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, - 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x48, 0x75, 0x62, 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, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x48, 0x75, 0x62, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x69, 0x0a, 0x04, 0x53, 0x79, 0x6e, 0x63, - 0x12, 0x2f, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, 0x6f, - 0x64, 0x65, 0x2e, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x44, 0x69, - 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, 0x53, 0x79, 0x6e, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x30, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, - 0x6f, 0x64, 0x65, 0x2e, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x44, - 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, 0x53, 0x79, 0x6e, 0x63, 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, + 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x49, 0x6e, 0x62, 0x6f, 0x78, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, + 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x63, 0x68, 0x61, 0x6e, 0x6e, + 0x65, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x49, 0x6e, 0x62, 0x6f, 0x78, 0x4d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x44, 0x0a, 0x06, 0x50, 0x75, + 0x74, 0x48, 0x75, 0x62, 0x12, 0x22, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, + 0x6d, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x2e, 0x70, + 0x62, 0x2e, 0x48, 0x75, 0x62, 0x50, 0x75, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, + 0x12, 0x59, 0x0a, 0x06, 0x47, 0x65, 0x74, 0x48, 0x75, 0x62, 0x12, 0x26, 0x2e, 0x71, 0x75, 0x69, + 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x63, 0x68, 0x61, + 0x6e, 0x6e, 0x65, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x48, 0x75, 0x62, 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, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x2e, 0x70, 0x62, 0x2e, + 0x48, 0x75, 0x62, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x69, 0x0a, 0x04, 0x53, + 0x79, 0x6e, 0x63, 0x12, 0x2f, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, + 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x2e, 0x70, 0x62, + 0x2e, 0x44, 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, 0x53, 0x79, 0x6e, 0x63, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, + 0x6d, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x2e, 0x70, + 0x62, 0x2e, 0x44, 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, 0x53, 0x79, 0x6e, 0x63, 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 ( @@ -5366,7 +5516,7 @@ func file_global_proto_rawDescGZIP() []byte { return file_global_proto_rawDescData } -var file_global_proto_msgTypes = make([]protoimpl.MessageInfo, 67) +var file_global_proto_msgTypes = make([]protoimpl.MessageInfo, 68) var file_global_proto_goTypes = []interface{}{ (*LegacyProverRequest)(nil), // 0: quilibrium.node.global.pb.LegacyProverRequest (*SeniorityMerge)(nil), // 1: quilibrium.node.global.pb.SeniorityMerge @@ -5384,103 +5534,104 @@ var file_global_proto_goTypes = []interface{}{ (*FrameHeader)(nil), // 13: quilibrium.node.global.pb.FrameHeader (*ProverLivenessCheck)(nil), // 14: quilibrium.node.global.pb.ProverLivenessCheck (*ProposalVote)(nil), // 15: quilibrium.node.global.pb.ProposalVote - (*QuorumCertificate)(nil), // 16: quilibrium.node.global.pb.QuorumCertificate - (*TimeoutCertificate)(nil), // 17: quilibrium.node.global.pb.TimeoutCertificate - (*GlobalFrame)(nil), // 18: quilibrium.node.global.pb.GlobalFrame - (*AppShardFrame)(nil), // 19: quilibrium.node.global.pb.AppShardFrame - (*GlobalAlert)(nil), // 20: quilibrium.node.global.pb.GlobalAlert - (*GetGlobalFrameRequest)(nil), // 21: quilibrium.node.global.pb.GetGlobalFrameRequest - (*GlobalFrameResponse)(nil), // 22: quilibrium.node.global.pb.GlobalFrameResponse - (*GetAppShardFrameRequest)(nil), // 23: quilibrium.node.global.pb.GetAppShardFrameRequest - (*AppShardFrameResponse)(nil), // 24: quilibrium.node.global.pb.AppShardFrameResponse - (*GetAppShardsRequest)(nil), // 25: quilibrium.node.global.pb.GetAppShardsRequest - (*AppShardInfo)(nil), // 26: quilibrium.node.global.pb.AppShardInfo - (*GetAppShardsResponse)(nil), // 27: quilibrium.node.global.pb.GetAppShardsResponse - (*GetGlobalShardsRequest)(nil), // 28: quilibrium.node.global.pb.GetGlobalShardsRequest - (*GetGlobalShardsResponse)(nil), // 29: quilibrium.node.global.pb.GetGlobalShardsResponse - (*GetLockedAddressesRequest)(nil), // 30: quilibrium.node.global.pb.GetLockedAddressesRequest - (*LockedTransaction)(nil), // 31: quilibrium.node.global.pb.LockedTransaction - (*GetLockedAddressesResponse)(nil), // 32: quilibrium.node.global.pb.GetLockedAddressesResponse - (*GlobalGetWorkerInfoRequest)(nil), // 33: quilibrium.node.global.pb.GlobalGetWorkerInfoRequest - (*GlobalGetWorkerInfoResponseItem)(nil), // 34: quilibrium.node.global.pb.GlobalGetWorkerInfoResponseItem - (*GlobalGetWorkerInfoResponse)(nil), // 35: quilibrium.node.global.pb.GlobalGetWorkerInfoResponse - (*SendMessage)(nil), // 36: quilibrium.node.global.pb.SendMessage - (*ReceiveMessage)(nil), // 37: quilibrium.node.global.pb.ReceiveMessage - (*GetKeyRegistryRequest)(nil), // 38: quilibrium.node.global.pb.GetKeyRegistryRequest - (*GetKeyRegistryResponse)(nil), // 39: quilibrium.node.global.pb.GetKeyRegistryResponse - (*GetKeyRegistryByProverRequest)(nil), // 40: quilibrium.node.global.pb.GetKeyRegistryByProverRequest - (*GetKeyRegistryByProverResponse)(nil), // 41: quilibrium.node.global.pb.GetKeyRegistryByProverResponse - (*PutIdentityKeyRequest)(nil), // 42: quilibrium.node.global.pb.PutIdentityKeyRequest - (*PutIdentityKeyResponse)(nil), // 43: quilibrium.node.global.pb.PutIdentityKeyResponse - (*PutProvingKeyRequest)(nil), // 44: quilibrium.node.global.pb.PutProvingKeyRequest - (*PutProvingKeyResponse)(nil), // 45: quilibrium.node.global.pb.PutProvingKeyResponse - (*PutCrossSignatureRequest)(nil), // 46: quilibrium.node.global.pb.PutCrossSignatureRequest - (*PutCrossSignatureResponse)(nil), // 47: quilibrium.node.global.pb.PutCrossSignatureResponse - (*PutSignedKeyRequest)(nil), // 48: quilibrium.node.global.pb.PutSignedKeyRequest - (*PutSignedKeyResponse)(nil), // 49: quilibrium.node.global.pb.PutSignedKeyResponse - (*GetIdentityKeyRequest)(nil), // 50: quilibrium.node.global.pb.GetIdentityKeyRequest - (*GetIdentityKeyResponse)(nil), // 51: quilibrium.node.global.pb.GetIdentityKeyResponse - (*GetProvingKeyRequest)(nil), // 52: quilibrium.node.global.pb.GetProvingKeyRequest - (*GetProvingKeyResponse)(nil), // 53: quilibrium.node.global.pb.GetProvingKeyResponse - (*GetSignedKeyRequest)(nil), // 54: quilibrium.node.global.pb.GetSignedKeyRequest - (*GetSignedKeyResponse)(nil), // 55: quilibrium.node.global.pb.GetSignedKeyResponse - (*GetSignedKeysByParentRequest)(nil), // 56: quilibrium.node.global.pb.GetSignedKeysByParentRequest - (*GetSignedKeysByParentResponse)(nil), // 57: quilibrium.node.global.pb.GetSignedKeysByParentResponse - (*RangeProvingKeysRequest)(nil), // 58: quilibrium.node.global.pb.RangeProvingKeysRequest - (*RangeProvingKeysResponse)(nil), // 59: quilibrium.node.global.pb.RangeProvingKeysResponse - (*RangeIdentityKeysRequest)(nil), // 60: quilibrium.node.global.pb.RangeIdentityKeysRequest - (*RangeIdentityKeysResponse)(nil), // 61: quilibrium.node.global.pb.RangeIdentityKeysResponse - (*RangeSignedKeysRequest)(nil), // 62: quilibrium.node.global.pb.RangeSignedKeysRequest - (*RangeSignedKeysResponse)(nil), // 63: quilibrium.node.global.pb.RangeSignedKeysResponse - (*MessageKeyShard)(nil), // 64: quilibrium.node.global.pb.MessageKeyShard - (*PutMessageRequest)(nil), // 65: quilibrium.node.global.pb.PutMessageRequest - (*PutMessageResponse)(nil), // 66: quilibrium.node.global.pb.PutMessageResponse - (*Ed448Signature)(nil), // 67: quilibrium.node.keys.pb.Ed448Signature - (*BLS48581SignatureWithProofOfPossession)(nil), // 68: quilibrium.node.keys.pb.BLS48581SignatureWithProofOfPossession - (*BLS48581AddressedSignature)(nil), // 69: quilibrium.node.keys.pb.BLS48581AddressedSignature - (*TraversalProof)(nil), // 70: quilibrium.node.application.pb.TraversalProof - (*TokenDeploy)(nil), // 71: quilibrium.node.token.pb.TokenDeploy - (*TokenUpdate)(nil), // 72: quilibrium.node.token.pb.TokenUpdate - (*Transaction)(nil), // 73: quilibrium.node.token.pb.Transaction - (*PendingTransaction)(nil), // 74: quilibrium.node.token.pb.PendingTransaction - (*MintTransaction)(nil), // 75: quilibrium.node.token.pb.MintTransaction - (*HypergraphDeploy)(nil), // 76: quilibrium.node.hypergraph.pb.HypergraphDeploy - (*HypergraphUpdate)(nil), // 77: quilibrium.node.hypergraph.pb.HypergraphUpdate - (*VertexAdd)(nil), // 78: quilibrium.node.hypergraph.pb.VertexAdd - (*VertexRemove)(nil), // 79: quilibrium.node.hypergraph.pb.VertexRemove - (*HyperedgeAdd)(nil), // 80: quilibrium.node.hypergraph.pb.HyperedgeAdd - (*HyperedgeRemove)(nil), // 81: quilibrium.node.hypergraph.pb.HyperedgeRemove - (*ComputeDeploy)(nil), // 82: quilibrium.node.compute.pb.ComputeDeploy - (*ComputeUpdate)(nil), // 83: quilibrium.node.compute.pb.ComputeUpdate - (*CodeDeployment)(nil), // 84: quilibrium.node.compute.pb.CodeDeployment - (*CodeExecute)(nil), // 85: quilibrium.node.compute.pb.CodeExecute - (*CodeFinalize)(nil), // 86: quilibrium.node.compute.pb.CodeFinalize - (*BLS48581AggregateSignature)(nil), // 87: quilibrium.node.keys.pb.BLS48581AggregateSignature - (*KeyRegistry)(nil), // 88: quilibrium.node.keys.pb.KeyRegistry - (*Ed448PublicKey)(nil), // 89: quilibrium.node.keys.pb.Ed448PublicKey - (*SignedX448Key)(nil), // 90: quilibrium.node.keys.pb.SignedX448Key - (*Message)(nil), // 91: quilibrium.node.application.pb.Message - (*InboxMessagePut)(nil), // 92: quilibrium.node.channel.pb.InboxMessagePut - (*InboxMessageRequest)(nil), // 93: quilibrium.node.channel.pb.InboxMessageRequest - (*HubPut)(nil), // 94: quilibrium.node.channel.pb.HubPut - (*HubRequest)(nil), // 95: quilibrium.node.channel.pb.HubRequest - (*DispatchSyncRequest)(nil), // 96: quilibrium.node.channel.pb.DispatchSyncRequest - (*emptypb.Empty)(nil), // 97: google.protobuf.Empty - (*InboxMessageResponse)(nil), // 98: quilibrium.node.channel.pb.InboxMessageResponse - (*HubResponse)(nil), // 99: quilibrium.node.channel.pb.HubResponse - (*DispatchSyncResponse)(nil), // 100: quilibrium.node.channel.pb.DispatchSyncResponse + (*TimeoutState)(nil), // 16: quilibrium.node.global.pb.TimeoutState + (*QuorumCertificate)(nil), // 17: quilibrium.node.global.pb.QuorumCertificate + (*TimeoutCertificate)(nil), // 18: quilibrium.node.global.pb.TimeoutCertificate + (*GlobalFrame)(nil), // 19: quilibrium.node.global.pb.GlobalFrame + (*AppShardFrame)(nil), // 20: quilibrium.node.global.pb.AppShardFrame + (*GlobalAlert)(nil), // 21: quilibrium.node.global.pb.GlobalAlert + (*GetGlobalFrameRequest)(nil), // 22: quilibrium.node.global.pb.GetGlobalFrameRequest + (*GlobalFrameResponse)(nil), // 23: quilibrium.node.global.pb.GlobalFrameResponse + (*GetAppShardFrameRequest)(nil), // 24: quilibrium.node.global.pb.GetAppShardFrameRequest + (*AppShardFrameResponse)(nil), // 25: quilibrium.node.global.pb.AppShardFrameResponse + (*GetAppShardsRequest)(nil), // 26: quilibrium.node.global.pb.GetAppShardsRequest + (*AppShardInfo)(nil), // 27: quilibrium.node.global.pb.AppShardInfo + (*GetAppShardsResponse)(nil), // 28: quilibrium.node.global.pb.GetAppShardsResponse + (*GetGlobalShardsRequest)(nil), // 29: quilibrium.node.global.pb.GetGlobalShardsRequest + (*GetGlobalShardsResponse)(nil), // 30: quilibrium.node.global.pb.GetGlobalShardsResponse + (*GetLockedAddressesRequest)(nil), // 31: quilibrium.node.global.pb.GetLockedAddressesRequest + (*LockedTransaction)(nil), // 32: quilibrium.node.global.pb.LockedTransaction + (*GetLockedAddressesResponse)(nil), // 33: quilibrium.node.global.pb.GetLockedAddressesResponse + (*GlobalGetWorkerInfoRequest)(nil), // 34: quilibrium.node.global.pb.GlobalGetWorkerInfoRequest + (*GlobalGetWorkerInfoResponseItem)(nil), // 35: quilibrium.node.global.pb.GlobalGetWorkerInfoResponseItem + (*GlobalGetWorkerInfoResponse)(nil), // 36: quilibrium.node.global.pb.GlobalGetWorkerInfoResponse + (*SendMessage)(nil), // 37: quilibrium.node.global.pb.SendMessage + (*ReceiveMessage)(nil), // 38: quilibrium.node.global.pb.ReceiveMessage + (*GetKeyRegistryRequest)(nil), // 39: quilibrium.node.global.pb.GetKeyRegistryRequest + (*GetKeyRegistryResponse)(nil), // 40: quilibrium.node.global.pb.GetKeyRegistryResponse + (*GetKeyRegistryByProverRequest)(nil), // 41: quilibrium.node.global.pb.GetKeyRegistryByProverRequest + (*GetKeyRegistryByProverResponse)(nil), // 42: quilibrium.node.global.pb.GetKeyRegistryByProverResponse + (*PutIdentityKeyRequest)(nil), // 43: quilibrium.node.global.pb.PutIdentityKeyRequest + (*PutIdentityKeyResponse)(nil), // 44: quilibrium.node.global.pb.PutIdentityKeyResponse + (*PutProvingKeyRequest)(nil), // 45: quilibrium.node.global.pb.PutProvingKeyRequest + (*PutProvingKeyResponse)(nil), // 46: quilibrium.node.global.pb.PutProvingKeyResponse + (*PutCrossSignatureRequest)(nil), // 47: quilibrium.node.global.pb.PutCrossSignatureRequest + (*PutCrossSignatureResponse)(nil), // 48: quilibrium.node.global.pb.PutCrossSignatureResponse + (*PutSignedKeyRequest)(nil), // 49: quilibrium.node.global.pb.PutSignedKeyRequest + (*PutSignedKeyResponse)(nil), // 50: quilibrium.node.global.pb.PutSignedKeyResponse + (*GetIdentityKeyRequest)(nil), // 51: quilibrium.node.global.pb.GetIdentityKeyRequest + (*GetIdentityKeyResponse)(nil), // 52: quilibrium.node.global.pb.GetIdentityKeyResponse + (*GetProvingKeyRequest)(nil), // 53: quilibrium.node.global.pb.GetProvingKeyRequest + (*GetProvingKeyResponse)(nil), // 54: quilibrium.node.global.pb.GetProvingKeyResponse + (*GetSignedKeyRequest)(nil), // 55: quilibrium.node.global.pb.GetSignedKeyRequest + (*GetSignedKeyResponse)(nil), // 56: quilibrium.node.global.pb.GetSignedKeyResponse + (*GetSignedKeysByParentRequest)(nil), // 57: quilibrium.node.global.pb.GetSignedKeysByParentRequest + (*GetSignedKeysByParentResponse)(nil), // 58: quilibrium.node.global.pb.GetSignedKeysByParentResponse + (*RangeProvingKeysRequest)(nil), // 59: quilibrium.node.global.pb.RangeProvingKeysRequest + (*RangeProvingKeysResponse)(nil), // 60: quilibrium.node.global.pb.RangeProvingKeysResponse + (*RangeIdentityKeysRequest)(nil), // 61: quilibrium.node.global.pb.RangeIdentityKeysRequest + (*RangeIdentityKeysResponse)(nil), // 62: quilibrium.node.global.pb.RangeIdentityKeysResponse + (*RangeSignedKeysRequest)(nil), // 63: quilibrium.node.global.pb.RangeSignedKeysRequest + (*RangeSignedKeysResponse)(nil), // 64: quilibrium.node.global.pb.RangeSignedKeysResponse + (*MessageKeyShard)(nil), // 65: quilibrium.node.global.pb.MessageKeyShard + (*PutMessageRequest)(nil), // 66: quilibrium.node.global.pb.PutMessageRequest + (*PutMessageResponse)(nil), // 67: quilibrium.node.global.pb.PutMessageResponse + (*Ed448Signature)(nil), // 68: quilibrium.node.keys.pb.Ed448Signature + (*BLS48581SignatureWithProofOfPossession)(nil), // 69: quilibrium.node.keys.pb.BLS48581SignatureWithProofOfPossession + (*BLS48581AddressedSignature)(nil), // 70: quilibrium.node.keys.pb.BLS48581AddressedSignature + (*TraversalProof)(nil), // 71: quilibrium.node.application.pb.TraversalProof + (*TokenDeploy)(nil), // 72: quilibrium.node.token.pb.TokenDeploy + (*TokenUpdate)(nil), // 73: quilibrium.node.token.pb.TokenUpdate + (*Transaction)(nil), // 74: quilibrium.node.token.pb.Transaction + (*PendingTransaction)(nil), // 75: quilibrium.node.token.pb.PendingTransaction + (*MintTransaction)(nil), // 76: quilibrium.node.token.pb.MintTransaction + (*HypergraphDeploy)(nil), // 77: quilibrium.node.hypergraph.pb.HypergraphDeploy + (*HypergraphUpdate)(nil), // 78: quilibrium.node.hypergraph.pb.HypergraphUpdate + (*VertexAdd)(nil), // 79: quilibrium.node.hypergraph.pb.VertexAdd + (*VertexRemove)(nil), // 80: quilibrium.node.hypergraph.pb.VertexRemove + (*HyperedgeAdd)(nil), // 81: quilibrium.node.hypergraph.pb.HyperedgeAdd + (*HyperedgeRemove)(nil), // 82: quilibrium.node.hypergraph.pb.HyperedgeRemove + (*ComputeDeploy)(nil), // 83: quilibrium.node.compute.pb.ComputeDeploy + (*ComputeUpdate)(nil), // 84: quilibrium.node.compute.pb.ComputeUpdate + (*CodeDeployment)(nil), // 85: quilibrium.node.compute.pb.CodeDeployment + (*CodeExecute)(nil), // 86: quilibrium.node.compute.pb.CodeExecute + (*CodeFinalize)(nil), // 87: quilibrium.node.compute.pb.CodeFinalize + (*BLS48581AggregateSignature)(nil), // 88: quilibrium.node.keys.pb.BLS48581AggregateSignature + (*KeyRegistry)(nil), // 89: quilibrium.node.keys.pb.KeyRegistry + (*Ed448PublicKey)(nil), // 90: quilibrium.node.keys.pb.Ed448PublicKey + (*SignedX448Key)(nil), // 91: quilibrium.node.keys.pb.SignedX448Key + (*Message)(nil), // 92: quilibrium.node.application.pb.Message + (*InboxMessagePut)(nil), // 93: quilibrium.node.channel.pb.InboxMessagePut + (*InboxMessageRequest)(nil), // 94: quilibrium.node.channel.pb.InboxMessageRequest + (*HubPut)(nil), // 95: quilibrium.node.channel.pb.HubPut + (*HubRequest)(nil), // 96: quilibrium.node.channel.pb.HubRequest + (*DispatchSyncRequest)(nil), // 97: quilibrium.node.channel.pb.DispatchSyncRequest + (*emptypb.Empty)(nil), // 98: google.protobuf.Empty + (*InboxMessageResponse)(nil), // 99: quilibrium.node.channel.pb.InboxMessageResponse + (*HubResponse)(nil), // 100: quilibrium.node.channel.pb.HubResponse + (*DispatchSyncResponse)(nil), // 101: quilibrium.node.channel.pb.DispatchSyncResponse } var file_global_proto_depIdxs = []int32{ - 67, // 0: quilibrium.node.global.pb.LegacyProverRequest.public_key_signatures_ed448:type_name -> quilibrium.node.keys.pb.Ed448Signature - 68, // 1: quilibrium.node.global.pb.ProverJoin.public_key_signature_bls48581:type_name -> quilibrium.node.keys.pb.BLS48581SignatureWithProofOfPossession + 68, // 0: quilibrium.node.global.pb.LegacyProverRequest.public_key_signatures_ed448:type_name -> quilibrium.node.keys.pb.Ed448Signature + 69, // 1: quilibrium.node.global.pb.ProverJoin.public_key_signature_bls48581:type_name -> quilibrium.node.keys.pb.BLS48581SignatureWithProofOfPossession 1, // 2: quilibrium.node.global.pb.ProverJoin.merge_targets:type_name -> quilibrium.node.global.pb.SeniorityMerge - 69, // 3: quilibrium.node.global.pb.ProverLeave.public_key_signature_bls48581:type_name -> quilibrium.node.keys.pb.BLS48581AddressedSignature - 69, // 4: quilibrium.node.global.pb.ProverPause.public_key_signature_bls48581:type_name -> quilibrium.node.keys.pb.BLS48581AddressedSignature - 69, // 5: quilibrium.node.global.pb.ProverResume.public_key_signature_bls48581:type_name -> quilibrium.node.keys.pb.BLS48581AddressedSignature - 69, // 6: quilibrium.node.global.pb.ProverConfirm.public_key_signature_bls48581:type_name -> quilibrium.node.keys.pb.BLS48581AddressedSignature - 69, // 7: quilibrium.node.global.pb.ProverUpdate.public_key_signature_bls48581:type_name -> quilibrium.node.keys.pb.BLS48581AddressedSignature - 70, // 8: quilibrium.node.global.pb.ProverKick.traversal_proof:type_name -> quilibrium.node.application.pb.TraversalProof - 69, // 9: quilibrium.node.global.pb.ProverReject.public_key_signature_bls48581:type_name -> quilibrium.node.keys.pb.BLS48581AddressedSignature + 70, // 3: quilibrium.node.global.pb.ProverLeave.public_key_signature_bls48581:type_name -> quilibrium.node.keys.pb.BLS48581AddressedSignature + 70, // 4: quilibrium.node.global.pb.ProverPause.public_key_signature_bls48581:type_name -> quilibrium.node.keys.pb.BLS48581AddressedSignature + 70, // 5: quilibrium.node.global.pb.ProverResume.public_key_signature_bls48581:type_name -> quilibrium.node.keys.pb.BLS48581AddressedSignature + 70, // 6: quilibrium.node.global.pb.ProverConfirm.public_key_signature_bls48581:type_name -> quilibrium.node.keys.pb.BLS48581AddressedSignature + 70, // 7: quilibrium.node.global.pb.ProverUpdate.public_key_signature_bls48581:type_name -> quilibrium.node.keys.pb.BLS48581AddressedSignature + 71, // 8: quilibrium.node.global.pb.ProverKick.traversal_proof:type_name -> quilibrium.node.application.pb.TraversalProof + 70, // 9: quilibrium.node.global.pb.ProverReject.public_key_signature_bls48581:type_name -> quilibrium.node.keys.pb.BLS48581AddressedSignature 2, // 10: quilibrium.node.global.pb.MessageRequest.join:type_name -> quilibrium.node.global.pb.ProverJoin 3, // 11: quilibrium.node.global.pb.MessageRequest.leave:type_name -> quilibrium.node.global.pb.ProverLeave 4, // 12: quilibrium.node.global.pb.MessageRequest.pause:type_name -> quilibrium.node.global.pb.ProverPause @@ -5489,112 +5640,115 @@ var file_global_proto_depIdxs = []int32{ 9, // 15: quilibrium.node.global.pb.MessageRequest.reject:type_name -> quilibrium.node.global.pb.ProverReject 8, // 16: quilibrium.node.global.pb.MessageRequest.kick:type_name -> quilibrium.node.global.pb.ProverKick 7, // 17: quilibrium.node.global.pb.MessageRequest.update:type_name -> quilibrium.node.global.pb.ProverUpdate - 71, // 18: quilibrium.node.global.pb.MessageRequest.token_deploy:type_name -> quilibrium.node.token.pb.TokenDeploy - 72, // 19: quilibrium.node.global.pb.MessageRequest.token_update:type_name -> quilibrium.node.token.pb.TokenUpdate - 73, // 20: quilibrium.node.global.pb.MessageRequest.transaction:type_name -> quilibrium.node.token.pb.Transaction - 74, // 21: quilibrium.node.global.pb.MessageRequest.pending_transaction:type_name -> quilibrium.node.token.pb.PendingTransaction - 75, // 22: quilibrium.node.global.pb.MessageRequest.mint_transaction:type_name -> quilibrium.node.token.pb.MintTransaction - 76, // 23: quilibrium.node.global.pb.MessageRequest.hypergraph_deploy:type_name -> quilibrium.node.hypergraph.pb.HypergraphDeploy - 77, // 24: quilibrium.node.global.pb.MessageRequest.hypergraph_update:type_name -> quilibrium.node.hypergraph.pb.HypergraphUpdate - 78, // 25: quilibrium.node.global.pb.MessageRequest.vertex_add:type_name -> quilibrium.node.hypergraph.pb.VertexAdd - 79, // 26: quilibrium.node.global.pb.MessageRequest.vertex_remove:type_name -> quilibrium.node.hypergraph.pb.VertexRemove - 80, // 27: quilibrium.node.global.pb.MessageRequest.hyperedge_add:type_name -> quilibrium.node.hypergraph.pb.HyperedgeAdd - 81, // 28: quilibrium.node.global.pb.MessageRequest.hyperedge_remove:type_name -> quilibrium.node.hypergraph.pb.HyperedgeRemove - 82, // 29: quilibrium.node.global.pb.MessageRequest.compute_deploy:type_name -> quilibrium.node.compute.pb.ComputeDeploy - 83, // 30: quilibrium.node.global.pb.MessageRequest.compute_update:type_name -> quilibrium.node.compute.pb.ComputeUpdate - 84, // 31: quilibrium.node.global.pb.MessageRequest.code_deploy:type_name -> quilibrium.node.compute.pb.CodeDeployment - 85, // 32: quilibrium.node.global.pb.MessageRequest.code_execute:type_name -> quilibrium.node.compute.pb.CodeExecute - 86, // 33: quilibrium.node.global.pb.MessageRequest.code_finalize:type_name -> quilibrium.node.compute.pb.CodeFinalize + 72, // 18: quilibrium.node.global.pb.MessageRequest.token_deploy:type_name -> quilibrium.node.token.pb.TokenDeploy + 73, // 19: quilibrium.node.global.pb.MessageRequest.token_update:type_name -> quilibrium.node.token.pb.TokenUpdate + 74, // 20: quilibrium.node.global.pb.MessageRequest.transaction:type_name -> quilibrium.node.token.pb.Transaction + 75, // 21: quilibrium.node.global.pb.MessageRequest.pending_transaction:type_name -> quilibrium.node.token.pb.PendingTransaction + 76, // 22: quilibrium.node.global.pb.MessageRequest.mint_transaction:type_name -> quilibrium.node.token.pb.MintTransaction + 77, // 23: quilibrium.node.global.pb.MessageRequest.hypergraph_deploy:type_name -> quilibrium.node.hypergraph.pb.HypergraphDeploy + 78, // 24: quilibrium.node.global.pb.MessageRequest.hypergraph_update:type_name -> quilibrium.node.hypergraph.pb.HypergraphUpdate + 79, // 25: quilibrium.node.global.pb.MessageRequest.vertex_add:type_name -> quilibrium.node.hypergraph.pb.VertexAdd + 80, // 26: quilibrium.node.global.pb.MessageRequest.vertex_remove:type_name -> quilibrium.node.hypergraph.pb.VertexRemove + 81, // 27: quilibrium.node.global.pb.MessageRequest.hyperedge_add:type_name -> quilibrium.node.hypergraph.pb.HyperedgeAdd + 82, // 28: quilibrium.node.global.pb.MessageRequest.hyperedge_remove:type_name -> quilibrium.node.hypergraph.pb.HyperedgeRemove + 83, // 29: quilibrium.node.global.pb.MessageRequest.compute_deploy:type_name -> quilibrium.node.compute.pb.ComputeDeploy + 84, // 30: quilibrium.node.global.pb.MessageRequest.compute_update:type_name -> quilibrium.node.compute.pb.ComputeUpdate + 85, // 31: quilibrium.node.global.pb.MessageRequest.code_deploy:type_name -> quilibrium.node.compute.pb.CodeDeployment + 86, // 32: quilibrium.node.global.pb.MessageRequest.code_execute:type_name -> quilibrium.node.compute.pb.CodeExecute + 87, // 33: quilibrium.node.global.pb.MessageRequest.code_finalize:type_name -> quilibrium.node.compute.pb.CodeFinalize 13, // 34: quilibrium.node.global.pb.MessageRequest.shard:type_name -> quilibrium.node.global.pb.FrameHeader 10, // 35: quilibrium.node.global.pb.MessageBundle.requests:type_name -> quilibrium.node.global.pb.MessageRequest - 87, // 36: quilibrium.node.global.pb.GlobalFrameHeader.public_key_signature_bls48581:type_name -> quilibrium.node.keys.pb.BLS48581AggregateSignature - 87, // 37: quilibrium.node.global.pb.FrameHeader.public_key_signature_bls48581:type_name -> quilibrium.node.keys.pb.BLS48581AggregateSignature - 69, // 38: quilibrium.node.global.pb.ProverLivenessCheck.public_key_signature_bls48581:type_name -> quilibrium.node.keys.pb.BLS48581AddressedSignature - 69, // 39: quilibrium.node.global.pb.ProposalVote.public_key_signature_bls48581:type_name -> quilibrium.node.keys.pb.BLS48581AddressedSignature - 87, // 40: quilibrium.node.global.pb.QuorumCertificate.aggregate_signature:type_name -> quilibrium.node.keys.pb.BLS48581AggregateSignature - 16, // 41: quilibrium.node.global.pb.TimeoutCertificate.latest_quorum_certificate:type_name -> quilibrium.node.global.pb.QuorumCertificate - 87, // 42: quilibrium.node.global.pb.TimeoutCertificate.aggregate_signature:type_name -> quilibrium.node.keys.pb.BLS48581AggregateSignature - 12, // 43: quilibrium.node.global.pb.GlobalFrame.header:type_name -> quilibrium.node.global.pb.GlobalFrameHeader - 11, // 44: quilibrium.node.global.pb.GlobalFrame.requests:type_name -> quilibrium.node.global.pb.MessageBundle - 13, // 45: quilibrium.node.global.pb.AppShardFrame.header:type_name -> quilibrium.node.global.pb.FrameHeader - 11, // 46: quilibrium.node.global.pb.AppShardFrame.requests:type_name -> quilibrium.node.global.pb.MessageBundle - 18, // 47: quilibrium.node.global.pb.GlobalFrameResponse.frame:type_name -> quilibrium.node.global.pb.GlobalFrame - 19, // 48: quilibrium.node.global.pb.AppShardFrameResponse.frame:type_name -> quilibrium.node.global.pb.AppShardFrame - 26, // 49: quilibrium.node.global.pb.GetAppShardsResponse.info:type_name -> quilibrium.node.global.pb.AppShardInfo - 31, // 50: quilibrium.node.global.pb.GetLockedAddressesResponse.transactions:type_name -> quilibrium.node.global.pb.LockedTransaction - 34, // 51: quilibrium.node.global.pb.GlobalGetWorkerInfoResponse.workers:type_name -> quilibrium.node.global.pb.GlobalGetWorkerInfoResponseItem - 88, // 52: quilibrium.node.global.pb.GetKeyRegistryResponse.registry:type_name -> quilibrium.node.keys.pb.KeyRegistry - 88, // 53: quilibrium.node.global.pb.GetKeyRegistryByProverResponse.registry:type_name -> quilibrium.node.keys.pb.KeyRegistry - 89, // 54: quilibrium.node.global.pb.PutIdentityKeyRequest.identity_key:type_name -> quilibrium.node.keys.pb.Ed448PublicKey - 68, // 55: quilibrium.node.global.pb.PutProvingKeyRequest.proving_key:type_name -> quilibrium.node.keys.pb.BLS48581SignatureWithProofOfPossession - 90, // 56: quilibrium.node.global.pb.PutSignedKeyRequest.key:type_name -> quilibrium.node.keys.pb.SignedX448Key - 89, // 57: quilibrium.node.global.pb.GetIdentityKeyResponse.key:type_name -> quilibrium.node.keys.pb.Ed448PublicKey - 68, // 58: quilibrium.node.global.pb.GetProvingKeyResponse.key:type_name -> quilibrium.node.keys.pb.BLS48581SignatureWithProofOfPossession - 90, // 59: quilibrium.node.global.pb.GetSignedKeyResponse.key:type_name -> quilibrium.node.keys.pb.SignedX448Key - 90, // 60: quilibrium.node.global.pb.GetSignedKeysByParentResponse.keys:type_name -> quilibrium.node.keys.pb.SignedX448Key - 68, // 61: quilibrium.node.global.pb.RangeProvingKeysResponse.key:type_name -> quilibrium.node.keys.pb.BLS48581SignatureWithProofOfPossession - 89, // 62: quilibrium.node.global.pb.RangeIdentityKeysResponse.key:type_name -> quilibrium.node.keys.pb.Ed448PublicKey - 90, // 63: quilibrium.node.global.pb.RangeSignedKeysResponse.key:type_name -> quilibrium.node.keys.pb.SignedX448Key - 64, // 64: quilibrium.node.global.pb.PutMessageRequest.message_shards:type_name -> quilibrium.node.global.pb.MessageKeyShard - 21, // 65: quilibrium.node.global.pb.GlobalService.GetGlobalFrame:input_type -> quilibrium.node.global.pb.GetGlobalFrameRequest - 25, // 66: quilibrium.node.global.pb.GlobalService.GetAppShards:input_type -> quilibrium.node.global.pb.GetAppShardsRequest - 28, // 67: quilibrium.node.global.pb.GlobalService.GetGlobalShards:input_type -> quilibrium.node.global.pb.GetGlobalShardsRequest - 30, // 68: quilibrium.node.global.pb.GlobalService.GetLockedAddresses:input_type -> quilibrium.node.global.pb.GetLockedAddressesRequest - 33, // 69: quilibrium.node.global.pb.GlobalService.GetWorkerInfo:input_type -> quilibrium.node.global.pb.GlobalGetWorkerInfoRequest - 23, // 70: quilibrium.node.global.pb.AppShardService.GetAppShardFrame:input_type -> quilibrium.node.global.pb.GetAppShardFrameRequest - 36, // 71: quilibrium.node.global.pb.OnionService.Connect:input_type -> quilibrium.node.global.pb.SendMessage - 65, // 72: quilibrium.node.global.pb.MixnetService.PutMessage:input_type -> quilibrium.node.global.pb.PutMessageRequest - 91, // 73: quilibrium.node.global.pb.MixnetService.RoundStream:input_type -> quilibrium.node.application.pb.Message - 38, // 74: quilibrium.node.global.pb.KeyRegistryService.GetKeyRegistry:input_type -> quilibrium.node.global.pb.GetKeyRegistryRequest - 40, // 75: quilibrium.node.global.pb.KeyRegistryService.GetKeyRegistryByProver:input_type -> quilibrium.node.global.pb.GetKeyRegistryByProverRequest - 42, // 76: quilibrium.node.global.pb.KeyRegistryService.PutIdentityKey:input_type -> quilibrium.node.global.pb.PutIdentityKeyRequest - 44, // 77: quilibrium.node.global.pb.KeyRegistryService.PutProvingKey:input_type -> quilibrium.node.global.pb.PutProvingKeyRequest - 46, // 78: quilibrium.node.global.pb.KeyRegistryService.PutCrossSignature:input_type -> quilibrium.node.global.pb.PutCrossSignatureRequest - 48, // 79: quilibrium.node.global.pb.KeyRegistryService.PutSignedKey:input_type -> quilibrium.node.global.pb.PutSignedKeyRequest - 50, // 80: quilibrium.node.global.pb.KeyRegistryService.GetIdentityKey:input_type -> quilibrium.node.global.pb.GetIdentityKeyRequest - 52, // 81: quilibrium.node.global.pb.KeyRegistryService.GetProvingKey:input_type -> quilibrium.node.global.pb.GetProvingKeyRequest - 54, // 82: quilibrium.node.global.pb.KeyRegistryService.GetSignedKey:input_type -> quilibrium.node.global.pb.GetSignedKeyRequest - 56, // 83: quilibrium.node.global.pb.KeyRegistryService.GetSignedKeysByParent:input_type -> quilibrium.node.global.pb.GetSignedKeysByParentRequest - 58, // 84: quilibrium.node.global.pb.KeyRegistryService.RangeProvingKeys:input_type -> quilibrium.node.global.pb.RangeProvingKeysRequest - 60, // 85: quilibrium.node.global.pb.KeyRegistryService.RangeIdentityKeys:input_type -> quilibrium.node.global.pb.RangeIdentityKeysRequest - 62, // 86: quilibrium.node.global.pb.KeyRegistryService.RangeSignedKeys:input_type -> quilibrium.node.global.pb.RangeSignedKeysRequest - 92, // 87: quilibrium.node.global.pb.DispatchService.PutInboxMessage:input_type -> quilibrium.node.channel.pb.InboxMessagePut - 93, // 88: quilibrium.node.global.pb.DispatchService.GetInboxMessages:input_type -> quilibrium.node.channel.pb.InboxMessageRequest - 94, // 89: quilibrium.node.global.pb.DispatchService.PutHub:input_type -> quilibrium.node.channel.pb.HubPut - 95, // 90: quilibrium.node.global.pb.DispatchService.GetHub:input_type -> quilibrium.node.channel.pb.HubRequest - 96, // 91: quilibrium.node.global.pb.DispatchService.Sync:input_type -> quilibrium.node.channel.pb.DispatchSyncRequest - 22, // 92: quilibrium.node.global.pb.GlobalService.GetGlobalFrame:output_type -> quilibrium.node.global.pb.GlobalFrameResponse - 27, // 93: quilibrium.node.global.pb.GlobalService.GetAppShards:output_type -> quilibrium.node.global.pb.GetAppShardsResponse - 29, // 94: quilibrium.node.global.pb.GlobalService.GetGlobalShards:output_type -> quilibrium.node.global.pb.GetGlobalShardsResponse - 32, // 95: quilibrium.node.global.pb.GlobalService.GetLockedAddresses:output_type -> quilibrium.node.global.pb.GetLockedAddressesResponse - 35, // 96: quilibrium.node.global.pb.GlobalService.GetWorkerInfo:output_type -> quilibrium.node.global.pb.GlobalGetWorkerInfoResponse - 24, // 97: quilibrium.node.global.pb.AppShardService.GetAppShardFrame:output_type -> quilibrium.node.global.pb.AppShardFrameResponse - 37, // 98: quilibrium.node.global.pb.OnionService.Connect:output_type -> quilibrium.node.global.pb.ReceiveMessage - 66, // 99: quilibrium.node.global.pb.MixnetService.PutMessage:output_type -> quilibrium.node.global.pb.PutMessageResponse - 91, // 100: quilibrium.node.global.pb.MixnetService.RoundStream:output_type -> quilibrium.node.application.pb.Message - 39, // 101: quilibrium.node.global.pb.KeyRegistryService.GetKeyRegistry:output_type -> quilibrium.node.global.pb.GetKeyRegistryResponse - 41, // 102: quilibrium.node.global.pb.KeyRegistryService.GetKeyRegistryByProver:output_type -> quilibrium.node.global.pb.GetKeyRegistryByProverResponse - 43, // 103: quilibrium.node.global.pb.KeyRegistryService.PutIdentityKey:output_type -> quilibrium.node.global.pb.PutIdentityKeyResponse - 45, // 104: quilibrium.node.global.pb.KeyRegistryService.PutProvingKey:output_type -> quilibrium.node.global.pb.PutProvingKeyResponse - 47, // 105: quilibrium.node.global.pb.KeyRegistryService.PutCrossSignature:output_type -> quilibrium.node.global.pb.PutCrossSignatureResponse - 49, // 106: quilibrium.node.global.pb.KeyRegistryService.PutSignedKey:output_type -> quilibrium.node.global.pb.PutSignedKeyResponse - 51, // 107: quilibrium.node.global.pb.KeyRegistryService.GetIdentityKey:output_type -> quilibrium.node.global.pb.GetIdentityKeyResponse - 53, // 108: quilibrium.node.global.pb.KeyRegistryService.GetProvingKey:output_type -> quilibrium.node.global.pb.GetProvingKeyResponse - 55, // 109: quilibrium.node.global.pb.KeyRegistryService.GetSignedKey:output_type -> quilibrium.node.global.pb.GetSignedKeyResponse - 57, // 110: quilibrium.node.global.pb.KeyRegistryService.GetSignedKeysByParent:output_type -> quilibrium.node.global.pb.GetSignedKeysByParentResponse - 59, // 111: quilibrium.node.global.pb.KeyRegistryService.RangeProvingKeys:output_type -> quilibrium.node.global.pb.RangeProvingKeysResponse - 61, // 112: quilibrium.node.global.pb.KeyRegistryService.RangeIdentityKeys:output_type -> quilibrium.node.global.pb.RangeIdentityKeysResponse - 63, // 113: quilibrium.node.global.pb.KeyRegistryService.RangeSignedKeys:output_type -> quilibrium.node.global.pb.RangeSignedKeysResponse - 97, // 114: quilibrium.node.global.pb.DispatchService.PutInboxMessage:output_type -> google.protobuf.Empty - 98, // 115: quilibrium.node.global.pb.DispatchService.GetInboxMessages:output_type -> quilibrium.node.channel.pb.InboxMessageResponse - 97, // 116: quilibrium.node.global.pb.DispatchService.PutHub:output_type -> google.protobuf.Empty - 99, // 117: quilibrium.node.global.pb.DispatchService.GetHub:output_type -> quilibrium.node.channel.pb.HubResponse - 100, // 118: quilibrium.node.global.pb.DispatchService.Sync:output_type -> quilibrium.node.channel.pb.DispatchSyncResponse - 92, // [92:119] is the sub-list for method output_type - 65, // [65:92] is the sub-list for method input_type - 65, // [65:65] is the sub-list for extension type_name - 65, // [65:65] is the sub-list for extension extendee - 0, // [0:65] is the sub-list for field type_name + 88, // 36: quilibrium.node.global.pb.GlobalFrameHeader.public_key_signature_bls48581:type_name -> quilibrium.node.keys.pb.BLS48581AggregateSignature + 88, // 37: quilibrium.node.global.pb.FrameHeader.public_key_signature_bls48581:type_name -> quilibrium.node.keys.pb.BLS48581AggregateSignature + 70, // 38: quilibrium.node.global.pb.ProverLivenessCheck.public_key_signature_bls48581:type_name -> quilibrium.node.keys.pb.BLS48581AddressedSignature + 70, // 39: quilibrium.node.global.pb.ProposalVote.public_key_signature_bls48581:type_name -> quilibrium.node.keys.pb.BLS48581AddressedSignature + 17, // 40: quilibrium.node.global.pb.TimeoutState.latest_quorum_certificate:type_name -> quilibrium.node.global.pb.QuorumCertificate + 18, // 41: quilibrium.node.global.pb.TimeoutState.prior_rank_timeout_certificate:type_name -> quilibrium.node.global.pb.TimeoutCertificate + 15, // 42: quilibrium.node.global.pb.TimeoutState.vote:type_name -> quilibrium.node.global.pb.ProposalVote + 88, // 43: quilibrium.node.global.pb.QuorumCertificate.aggregate_signature:type_name -> quilibrium.node.keys.pb.BLS48581AggregateSignature + 17, // 44: quilibrium.node.global.pb.TimeoutCertificate.latest_quorum_certificate:type_name -> quilibrium.node.global.pb.QuorumCertificate + 88, // 45: quilibrium.node.global.pb.TimeoutCertificate.aggregate_signature:type_name -> quilibrium.node.keys.pb.BLS48581AggregateSignature + 12, // 46: quilibrium.node.global.pb.GlobalFrame.header:type_name -> quilibrium.node.global.pb.GlobalFrameHeader + 11, // 47: quilibrium.node.global.pb.GlobalFrame.requests:type_name -> quilibrium.node.global.pb.MessageBundle + 13, // 48: quilibrium.node.global.pb.AppShardFrame.header:type_name -> quilibrium.node.global.pb.FrameHeader + 11, // 49: quilibrium.node.global.pb.AppShardFrame.requests:type_name -> quilibrium.node.global.pb.MessageBundle + 19, // 50: quilibrium.node.global.pb.GlobalFrameResponse.frame:type_name -> quilibrium.node.global.pb.GlobalFrame + 20, // 51: quilibrium.node.global.pb.AppShardFrameResponse.frame:type_name -> quilibrium.node.global.pb.AppShardFrame + 27, // 52: quilibrium.node.global.pb.GetAppShardsResponse.info:type_name -> quilibrium.node.global.pb.AppShardInfo + 32, // 53: quilibrium.node.global.pb.GetLockedAddressesResponse.transactions:type_name -> quilibrium.node.global.pb.LockedTransaction + 35, // 54: quilibrium.node.global.pb.GlobalGetWorkerInfoResponse.workers:type_name -> quilibrium.node.global.pb.GlobalGetWorkerInfoResponseItem + 89, // 55: quilibrium.node.global.pb.GetKeyRegistryResponse.registry:type_name -> quilibrium.node.keys.pb.KeyRegistry + 89, // 56: quilibrium.node.global.pb.GetKeyRegistryByProverResponse.registry:type_name -> quilibrium.node.keys.pb.KeyRegistry + 90, // 57: quilibrium.node.global.pb.PutIdentityKeyRequest.identity_key:type_name -> quilibrium.node.keys.pb.Ed448PublicKey + 69, // 58: quilibrium.node.global.pb.PutProvingKeyRequest.proving_key:type_name -> quilibrium.node.keys.pb.BLS48581SignatureWithProofOfPossession + 91, // 59: quilibrium.node.global.pb.PutSignedKeyRequest.key:type_name -> quilibrium.node.keys.pb.SignedX448Key + 90, // 60: quilibrium.node.global.pb.GetIdentityKeyResponse.key:type_name -> quilibrium.node.keys.pb.Ed448PublicKey + 69, // 61: quilibrium.node.global.pb.GetProvingKeyResponse.key:type_name -> quilibrium.node.keys.pb.BLS48581SignatureWithProofOfPossession + 91, // 62: quilibrium.node.global.pb.GetSignedKeyResponse.key:type_name -> quilibrium.node.keys.pb.SignedX448Key + 91, // 63: quilibrium.node.global.pb.GetSignedKeysByParentResponse.keys:type_name -> quilibrium.node.keys.pb.SignedX448Key + 69, // 64: quilibrium.node.global.pb.RangeProvingKeysResponse.key:type_name -> quilibrium.node.keys.pb.BLS48581SignatureWithProofOfPossession + 90, // 65: quilibrium.node.global.pb.RangeIdentityKeysResponse.key:type_name -> quilibrium.node.keys.pb.Ed448PublicKey + 91, // 66: quilibrium.node.global.pb.RangeSignedKeysResponse.key:type_name -> quilibrium.node.keys.pb.SignedX448Key + 65, // 67: quilibrium.node.global.pb.PutMessageRequest.message_shards:type_name -> quilibrium.node.global.pb.MessageKeyShard + 22, // 68: quilibrium.node.global.pb.GlobalService.GetGlobalFrame:input_type -> quilibrium.node.global.pb.GetGlobalFrameRequest + 26, // 69: quilibrium.node.global.pb.GlobalService.GetAppShards:input_type -> quilibrium.node.global.pb.GetAppShardsRequest + 29, // 70: quilibrium.node.global.pb.GlobalService.GetGlobalShards:input_type -> quilibrium.node.global.pb.GetGlobalShardsRequest + 31, // 71: quilibrium.node.global.pb.GlobalService.GetLockedAddresses:input_type -> quilibrium.node.global.pb.GetLockedAddressesRequest + 34, // 72: quilibrium.node.global.pb.GlobalService.GetWorkerInfo:input_type -> quilibrium.node.global.pb.GlobalGetWorkerInfoRequest + 24, // 73: quilibrium.node.global.pb.AppShardService.GetAppShardFrame:input_type -> quilibrium.node.global.pb.GetAppShardFrameRequest + 37, // 74: quilibrium.node.global.pb.OnionService.Connect:input_type -> quilibrium.node.global.pb.SendMessage + 66, // 75: quilibrium.node.global.pb.MixnetService.PutMessage:input_type -> quilibrium.node.global.pb.PutMessageRequest + 92, // 76: quilibrium.node.global.pb.MixnetService.RoundStream:input_type -> quilibrium.node.application.pb.Message + 39, // 77: quilibrium.node.global.pb.KeyRegistryService.GetKeyRegistry:input_type -> quilibrium.node.global.pb.GetKeyRegistryRequest + 41, // 78: quilibrium.node.global.pb.KeyRegistryService.GetKeyRegistryByProver:input_type -> quilibrium.node.global.pb.GetKeyRegistryByProverRequest + 43, // 79: quilibrium.node.global.pb.KeyRegistryService.PutIdentityKey:input_type -> quilibrium.node.global.pb.PutIdentityKeyRequest + 45, // 80: quilibrium.node.global.pb.KeyRegistryService.PutProvingKey:input_type -> quilibrium.node.global.pb.PutProvingKeyRequest + 47, // 81: quilibrium.node.global.pb.KeyRegistryService.PutCrossSignature:input_type -> quilibrium.node.global.pb.PutCrossSignatureRequest + 49, // 82: quilibrium.node.global.pb.KeyRegistryService.PutSignedKey:input_type -> quilibrium.node.global.pb.PutSignedKeyRequest + 51, // 83: quilibrium.node.global.pb.KeyRegistryService.GetIdentityKey:input_type -> quilibrium.node.global.pb.GetIdentityKeyRequest + 53, // 84: quilibrium.node.global.pb.KeyRegistryService.GetProvingKey:input_type -> quilibrium.node.global.pb.GetProvingKeyRequest + 55, // 85: quilibrium.node.global.pb.KeyRegistryService.GetSignedKey:input_type -> quilibrium.node.global.pb.GetSignedKeyRequest + 57, // 86: quilibrium.node.global.pb.KeyRegistryService.GetSignedKeysByParent:input_type -> quilibrium.node.global.pb.GetSignedKeysByParentRequest + 59, // 87: quilibrium.node.global.pb.KeyRegistryService.RangeProvingKeys:input_type -> quilibrium.node.global.pb.RangeProvingKeysRequest + 61, // 88: quilibrium.node.global.pb.KeyRegistryService.RangeIdentityKeys:input_type -> quilibrium.node.global.pb.RangeIdentityKeysRequest + 63, // 89: quilibrium.node.global.pb.KeyRegistryService.RangeSignedKeys:input_type -> quilibrium.node.global.pb.RangeSignedKeysRequest + 93, // 90: quilibrium.node.global.pb.DispatchService.PutInboxMessage:input_type -> quilibrium.node.channel.pb.InboxMessagePut + 94, // 91: quilibrium.node.global.pb.DispatchService.GetInboxMessages:input_type -> quilibrium.node.channel.pb.InboxMessageRequest + 95, // 92: quilibrium.node.global.pb.DispatchService.PutHub:input_type -> quilibrium.node.channel.pb.HubPut + 96, // 93: quilibrium.node.global.pb.DispatchService.GetHub:input_type -> quilibrium.node.channel.pb.HubRequest + 97, // 94: quilibrium.node.global.pb.DispatchService.Sync:input_type -> quilibrium.node.channel.pb.DispatchSyncRequest + 23, // 95: quilibrium.node.global.pb.GlobalService.GetGlobalFrame:output_type -> quilibrium.node.global.pb.GlobalFrameResponse + 28, // 96: quilibrium.node.global.pb.GlobalService.GetAppShards:output_type -> quilibrium.node.global.pb.GetAppShardsResponse + 30, // 97: quilibrium.node.global.pb.GlobalService.GetGlobalShards:output_type -> quilibrium.node.global.pb.GetGlobalShardsResponse + 33, // 98: quilibrium.node.global.pb.GlobalService.GetLockedAddresses:output_type -> quilibrium.node.global.pb.GetLockedAddressesResponse + 36, // 99: quilibrium.node.global.pb.GlobalService.GetWorkerInfo:output_type -> quilibrium.node.global.pb.GlobalGetWorkerInfoResponse + 25, // 100: quilibrium.node.global.pb.AppShardService.GetAppShardFrame:output_type -> quilibrium.node.global.pb.AppShardFrameResponse + 38, // 101: quilibrium.node.global.pb.OnionService.Connect:output_type -> quilibrium.node.global.pb.ReceiveMessage + 67, // 102: quilibrium.node.global.pb.MixnetService.PutMessage:output_type -> quilibrium.node.global.pb.PutMessageResponse + 92, // 103: quilibrium.node.global.pb.MixnetService.RoundStream:output_type -> quilibrium.node.application.pb.Message + 40, // 104: quilibrium.node.global.pb.KeyRegistryService.GetKeyRegistry:output_type -> quilibrium.node.global.pb.GetKeyRegistryResponse + 42, // 105: quilibrium.node.global.pb.KeyRegistryService.GetKeyRegistryByProver:output_type -> quilibrium.node.global.pb.GetKeyRegistryByProverResponse + 44, // 106: quilibrium.node.global.pb.KeyRegistryService.PutIdentityKey:output_type -> quilibrium.node.global.pb.PutIdentityKeyResponse + 46, // 107: quilibrium.node.global.pb.KeyRegistryService.PutProvingKey:output_type -> quilibrium.node.global.pb.PutProvingKeyResponse + 48, // 108: quilibrium.node.global.pb.KeyRegistryService.PutCrossSignature:output_type -> quilibrium.node.global.pb.PutCrossSignatureResponse + 50, // 109: quilibrium.node.global.pb.KeyRegistryService.PutSignedKey:output_type -> quilibrium.node.global.pb.PutSignedKeyResponse + 52, // 110: quilibrium.node.global.pb.KeyRegistryService.GetIdentityKey:output_type -> quilibrium.node.global.pb.GetIdentityKeyResponse + 54, // 111: quilibrium.node.global.pb.KeyRegistryService.GetProvingKey:output_type -> quilibrium.node.global.pb.GetProvingKeyResponse + 56, // 112: quilibrium.node.global.pb.KeyRegistryService.GetSignedKey:output_type -> quilibrium.node.global.pb.GetSignedKeyResponse + 58, // 113: quilibrium.node.global.pb.KeyRegistryService.GetSignedKeysByParent:output_type -> quilibrium.node.global.pb.GetSignedKeysByParentResponse + 60, // 114: quilibrium.node.global.pb.KeyRegistryService.RangeProvingKeys:output_type -> quilibrium.node.global.pb.RangeProvingKeysResponse + 62, // 115: quilibrium.node.global.pb.KeyRegistryService.RangeIdentityKeys:output_type -> quilibrium.node.global.pb.RangeIdentityKeysResponse + 64, // 116: quilibrium.node.global.pb.KeyRegistryService.RangeSignedKeys:output_type -> quilibrium.node.global.pb.RangeSignedKeysResponse + 98, // 117: quilibrium.node.global.pb.DispatchService.PutInboxMessage:output_type -> google.protobuf.Empty + 99, // 118: quilibrium.node.global.pb.DispatchService.GetInboxMessages:output_type -> quilibrium.node.channel.pb.InboxMessageResponse + 98, // 119: quilibrium.node.global.pb.DispatchService.PutHub:output_type -> google.protobuf.Empty + 100, // 120: quilibrium.node.global.pb.DispatchService.GetHub:output_type -> quilibrium.node.channel.pb.HubResponse + 101, // 121: quilibrium.node.global.pb.DispatchService.Sync:output_type -> quilibrium.node.channel.pb.DispatchSyncResponse + 95, // [95:122] is the sub-list for method output_type + 68, // [68:95] is the sub-list for method input_type + 68, // [68:68] is the sub-list for extension type_name + 68, // [68:68] is the sub-list for extension extendee + 0, // [0:68] is the sub-list for field type_name } func init() { file_global_proto_init() } @@ -5802,7 +5956,7 @@ func file_global_proto_init() { } } file_global_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*QuorumCertificate); i { + switch v := v.(*TimeoutState); i { case 0: return &v.state case 1: @@ -5814,7 +5968,7 @@ func file_global_proto_init() { } } file_global_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TimeoutCertificate); i { + switch v := v.(*QuorumCertificate); i { case 0: return &v.state case 1: @@ -5826,7 +5980,7 @@ func file_global_proto_init() { } } file_global_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GlobalFrame); i { + switch v := v.(*TimeoutCertificate); i { case 0: return &v.state case 1: @@ -5838,7 +5992,7 @@ func file_global_proto_init() { } } file_global_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AppShardFrame); i { + switch v := v.(*GlobalFrame); i { case 0: return &v.state case 1: @@ -5850,7 +6004,7 @@ func file_global_proto_init() { } } file_global_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GlobalAlert); i { + switch v := v.(*AppShardFrame); i { case 0: return &v.state case 1: @@ -5862,7 +6016,7 @@ func file_global_proto_init() { } } file_global_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetGlobalFrameRequest); i { + switch v := v.(*GlobalAlert); i { case 0: return &v.state case 1: @@ -5874,7 +6028,7 @@ func file_global_proto_init() { } } file_global_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GlobalFrameResponse); i { + switch v := v.(*GetGlobalFrameRequest); i { case 0: return &v.state case 1: @@ -5886,7 +6040,7 @@ func file_global_proto_init() { } } file_global_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetAppShardFrameRequest); i { + switch v := v.(*GlobalFrameResponse); i { case 0: return &v.state case 1: @@ -5898,7 +6052,7 @@ func file_global_proto_init() { } } file_global_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AppShardFrameResponse); i { + switch v := v.(*GetAppShardFrameRequest); i { case 0: return &v.state case 1: @@ -5910,7 +6064,7 @@ func file_global_proto_init() { } } file_global_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetAppShardsRequest); i { + switch v := v.(*AppShardFrameResponse); i { case 0: return &v.state case 1: @@ -5922,7 +6076,7 @@ func file_global_proto_init() { } } file_global_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AppShardInfo); i { + switch v := v.(*GetAppShardsRequest); i { case 0: return &v.state case 1: @@ -5934,7 +6088,7 @@ func file_global_proto_init() { } } file_global_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetAppShardsResponse); i { + switch v := v.(*AppShardInfo); i { case 0: return &v.state case 1: @@ -5946,7 +6100,7 @@ func file_global_proto_init() { } } file_global_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetGlobalShardsRequest); i { + switch v := v.(*GetAppShardsResponse); i { case 0: return &v.state case 1: @@ -5958,7 +6112,7 @@ func file_global_proto_init() { } } file_global_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetGlobalShardsResponse); i { + switch v := v.(*GetGlobalShardsRequest); i { case 0: return &v.state case 1: @@ -5970,7 +6124,7 @@ func file_global_proto_init() { } } file_global_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetLockedAddressesRequest); i { + switch v := v.(*GetGlobalShardsResponse); i { case 0: return &v.state case 1: @@ -5982,7 +6136,7 @@ func file_global_proto_init() { } } file_global_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*LockedTransaction); i { + switch v := v.(*GetLockedAddressesRequest); i { case 0: return &v.state case 1: @@ -5994,7 +6148,7 @@ func file_global_proto_init() { } } file_global_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetLockedAddressesResponse); i { + switch v := v.(*LockedTransaction); i { case 0: return &v.state case 1: @@ -6006,7 +6160,7 @@ func file_global_proto_init() { } } file_global_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GlobalGetWorkerInfoRequest); i { + switch v := v.(*GetLockedAddressesResponse); i { case 0: return &v.state case 1: @@ -6018,7 +6172,7 @@ func file_global_proto_init() { } } file_global_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GlobalGetWorkerInfoResponseItem); i { + switch v := v.(*GlobalGetWorkerInfoRequest); i { case 0: return &v.state case 1: @@ -6030,7 +6184,7 @@ func file_global_proto_init() { } } file_global_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GlobalGetWorkerInfoResponse); i { + switch v := v.(*GlobalGetWorkerInfoResponseItem); i { case 0: return &v.state case 1: @@ -6042,7 +6196,7 @@ func file_global_proto_init() { } } file_global_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SendMessage); i { + switch v := v.(*GlobalGetWorkerInfoResponse); i { case 0: return &v.state case 1: @@ -6054,7 +6208,7 @@ func file_global_proto_init() { } } file_global_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ReceiveMessage); i { + switch v := v.(*SendMessage); i { case 0: return &v.state case 1: @@ -6066,7 +6220,7 @@ func file_global_proto_init() { } } file_global_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetKeyRegistryRequest); i { + switch v := v.(*ReceiveMessage); i { case 0: return &v.state case 1: @@ -6078,7 +6232,7 @@ func file_global_proto_init() { } } file_global_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetKeyRegistryResponse); i { + switch v := v.(*GetKeyRegistryRequest); i { case 0: return &v.state case 1: @@ -6090,7 +6244,7 @@ func file_global_proto_init() { } } file_global_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetKeyRegistryByProverRequest); i { + switch v := v.(*GetKeyRegistryResponse); i { case 0: return &v.state case 1: @@ -6102,7 +6256,7 @@ func file_global_proto_init() { } } file_global_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetKeyRegistryByProverResponse); i { + switch v := v.(*GetKeyRegistryByProverRequest); i { case 0: return &v.state case 1: @@ -6114,7 +6268,7 @@ func file_global_proto_init() { } } file_global_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PutIdentityKeyRequest); i { + switch v := v.(*GetKeyRegistryByProverResponse); i { case 0: return &v.state case 1: @@ -6126,7 +6280,7 @@ func file_global_proto_init() { } } file_global_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PutIdentityKeyResponse); i { + switch v := v.(*PutIdentityKeyRequest); i { case 0: return &v.state case 1: @@ -6138,7 +6292,7 @@ func file_global_proto_init() { } } file_global_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PutProvingKeyRequest); i { + switch v := v.(*PutIdentityKeyResponse); i { case 0: return &v.state case 1: @@ -6150,7 +6304,7 @@ func file_global_proto_init() { } } file_global_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PutProvingKeyResponse); i { + switch v := v.(*PutProvingKeyRequest); i { case 0: return &v.state case 1: @@ -6162,7 +6316,7 @@ func file_global_proto_init() { } } file_global_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PutCrossSignatureRequest); i { + switch v := v.(*PutProvingKeyResponse); i { case 0: return &v.state case 1: @@ -6174,7 +6328,7 @@ func file_global_proto_init() { } } file_global_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PutCrossSignatureResponse); i { + switch v := v.(*PutCrossSignatureRequest); i { case 0: return &v.state case 1: @@ -6186,7 +6340,7 @@ func file_global_proto_init() { } } file_global_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PutSignedKeyRequest); i { + switch v := v.(*PutCrossSignatureResponse); i { case 0: return &v.state case 1: @@ -6198,7 +6352,7 @@ func file_global_proto_init() { } } file_global_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PutSignedKeyResponse); i { + switch v := v.(*PutSignedKeyRequest); i { case 0: return &v.state case 1: @@ -6210,7 +6364,7 @@ func file_global_proto_init() { } } file_global_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetIdentityKeyRequest); i { + switch v := v.(*PutSignedKeyResponse); i { case 0: return &v.state case 1: @@ -6222,7 +6376,7 @@ func file_global_proto_init() { } } file_global_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetIdentityKeyResponse); i { + switch v := v.(*GetIdentityKeyRequest); i { case 0: return &v.state case 1: @@ -6234,7 +6388,7 @@ func file_global_proto_init() { } } file_global_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetProvingKeyRequest); i { + switch v := v.(*GetIdentityKeyResponse); i { case 0: return &v.state case 1: @@ -6246,7 +6400,7 @@ func file_global_proto_init() { } } file_global_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetProvingKeyResponse); i { + switch v := v.(*GetProvingKeyRequest); i { case 0: return &v.state case 1: @@ -6258,7 +6412,7 @@ func file_global_proto_init() { } } file_global_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetSignedKeyRequest); i { + switch v := v.(*GetProvingKeyResponse); i { case 0: return &v.state case 1: @@ -6270,7 +6424,7 @@ func file_global_proto_init() { } } file_global_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetSignedKeyResponse); i { + switch v := v.(*GetSignedKeyRequest); i { case 0: return &v.state case 1: @@ -6282,7 +6436,7 @@ func file_global_proto_init() { } } file_global_proto_msgTypes[56].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetSignedKeysByParentRequest); i { + switch v := v.(*GetSignedKeyResponse); i { case 0: return &v.state case 1: @@ -6294,7 +6448,7 @@ func file_global_proto_init() { } } file_global_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetSignedKeysByParentResponse); i { + switch v := v.(*GetSignedKeysByParentRequest); i { case 0: return &v.state case 1: @@ -6306,7 +6460,7 @@ func file_global_proto_init() { } } file_global_proto_msgTypes[58].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RangeProvingKeysRequest); i { + switch v := v.(*GetSignedKeysByParentResponse); i { case 0: return &v.state case 1: @@ -6318,7 +6472,7 @@ func file_global_proto_init() { } } file_global_proto_msgTypes[59].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RangeProvingKeysResponse); i { + switch v := v.(*RangeProvingKeysRequest); i { case 0: return &v.state case 1: @@ -6330,7 +6484,7 @@ func file_global_proto_init() { } } file_global_proto_msgTypes[60].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RangeIdentityKeysRequest); i { + switch v := v.(*RangeProvingKeysResponse); i { case 0: return &v.state case 1: @@ -6342,7 +6496,7 @@ func file_global_proto_init() { } } file_global_proto_msgTypes[61].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RangeIdentityKeysResponse); i { + switch v := v.(*RangeIdentityKeysRequest); i { case 0: return &v.state case 1: @@ -6354,7 +6508,7 @@ func file_global_proto_init() { } } file_global_proto_msgTypes[62].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RangeSignedKeysRequest); i { + switch v := v.(*RangeIdentityKeysResponse); i { case 0: return &v.state case 1: @@ -6366,7 +6520,7 @@ func file_global_proto_init() { } } file_global_proto_msgTypes[63].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RangeSignedKeysResponse); i { + switch v := v.(*RangeSignedKeysRequest); i { case 0: return &v.state case 1: @@ -6378,7 +6532,7 @@ func file_global_proto_init() { } } file_global_proto_msgTypes[64].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MessageKeyShard); i { + switch v := v.(*RangeSignedKeysResponse); i { case 0: return &v.state case 1: @@ -6390,7 +6544,7 @@ func file_global_proto_init() { } } file_global_proto_msgTypes[65].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PutMessageRequest); i { + switch v := v.(*MessageKeyShard); i { case 0: return &v.state case 1: @@ -6402,6 +6556,18 @@ func file_global_proto_init() { } } file_global_proto_msgTypes[66].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PutMessageRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_global_proto_msgTypes[67].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PutMessageResponse); i { case 0: return &v.state @@ -6447,7 +6613,7 @@ func file_global_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_global_proto_rawDesc, NumEnums: 0, - NumMessages: 67, + NumMessages: 68, NumExtensions: 0, NumServices: 6, }, diff --git a/protobufs/global.proto b/protobufs/global.proto index fb89721..6fedbf9 100644 --- a/protobufs/global.proto +++ b/protobufs/global.proto @@ -117,44 +117,10 @@ message GlobalFrameHeader { // A strictly monotonically-increasing frame number. Used for culling old // frames past a configurable cutoff point. uint64 frame_number = 1; - // The self-reported timestamp from the proof publisher, encoded as an int64 - // of the Unix epoch in milliseconds. Should be good until - // 292278994-08-17 07:12:55.807, at which point, this is someone else's - // problem. Timestamps are imperfect, but smoothed in a rolling window to - // ensure a network and quorum-stable difficulty adjustment. Anomalies are - // bounded such that a timestamp beyond ten times the average issuance rate - // is discarded in preference to the runner up electees, unless there is - // simply no alternative available (for example, if a network outage occurred - // from an upgrade or bug). - int64 timestamp = 2; - // The difficulty level used for the frame. Difficulty is calculated based on - // the previous 60 timestamps correlated with difficulties, such that the - // interval smooths out to align to the type-defined rate. This is expected to - // increase subtly with clock speed and future hardware implementations, but - // due to incentive alignment associated with global proofs, not fastest clock - // in the west, should be gradual. - uint32 difficulty = 3; - // The output data from the VDF, serialized as bytes. For Wesolowski, this is - // an encoding of the 258 byte Y value concatenated with the 258 byte proof - // value. - bytes output = 4; - // The selector value of the previous frame's output, produced as a Poseidon - // hash of the output. - bytes parent_selector = 5; - // The 256 global commitment values - repeated bytes global_commitments = 6; - // The prover tree root commitment - bytes prover_tree_commitment = 7; - // The confirmation signatures of the frame - quilibrium.node.keys.pb.BLS48581AggregateSignature public_key_signature_bls48581 = 8; -} - -message FrameHeader { - // The address dictates the depth of the shard, at a minimum, the app domain. - bytes address = 1; - // A strictly monotonically-increasing frame number. Used for culling old - // frames past a configurable cutoff point. - uint64 frame_number = 2; + // A strictly monotonically-increasing rank number. Disambiguates timeouts + // and allows for consistent determination of leader, without having to rely + // on parsing internal state. + uint64 rank = 2; // The self-reported timestamp from the proof publisher, encoded as an int64 // of the Unix epoch in milliseconds. Should be good until // 292278994-08-17 07:12:55.807, at which point, this is someone else's @@ -179,17 +145,59 @@ message FrameHeader { // The selector value of the previous frame's output, produced as a Poseidon // hash of the output. bytes parent_selector = 6; + // The 256 global commitment values + repeated bytes global_commitments = 7; + // The prover tree root commitment + bytes prover_tree_commitment = 8; + // The confirmation signatures of the frame + quilibrium.node.keys.pb.BLS48581AggregateSignature public_key_signature_bls48581 = 9; +} + +message FrameHeader { + // The address dictates the depth of the shard, at a minimum, the app domain. + bytes address = 1; + // A strictly monotonically-increasing frame number. Used for culling old + // frames past a configurable cutoff point. + uint64 frame_number = 2; + // A strictly monotonically-increasing rank number. Disambiguates timeouts + // and allows for consistent determination of leader, without having to rely + // on parsing internal state. + uint64 rank = 3; + // The self-reported timestamp from the proof publisher, encoded as an int64 + // of the Unix epoch in milliseconds. Should be good until + // 292278994-08-17 07:12:55.807, at which point, this is someone else's + // problem. Timestamps are imperfect, but smoothed in a rolling window to + // ensure a network and quorum-stable difficulty adjustment. Anomalies are + // bounded such that a timestamp beyond ten times the average issuance rate + // is discarded in preference to the runner up electees, unless there is + // simply no alternative available (for example, if a network outage occurred + // from an upgrade or bug). + int64 timestamp = 4; + // The difficulty level used for the frame. Difficulty is calculated based on + // the previous 60 timestamps correlated with difficulties, such that the + // interval smooths out to align to the type-defined rate. This is expected to + // increase subtly with clock speed and future hardware implementations, but + // due to incentive alignment associated with global proofs, not fastest clock + // in the west, should be gradual. + uint32 difficulty = 5; + // The output data from the VDF, serialized as bytes. For Wesolowski, this is + // an encoding of the 258 byte Y value concatenated with the 258 byte proof + // value. + bytes output = 6; + // The selector value of the previous frame's output, produced as a Poseidon + // hash of the output. + bytes parent_selector = 7; // The root commitment to the set of requests for the frame. - bytes requests_root = 7; + bytes requests_root = 8; // The root commitments to to the hypergraph state at the address. - repeated bytes state_roots = 8; + repeated bytes state_roots = 9; // The prover of the frame, incorporated into the input to the VDF. - bytes prover = 9; + bytes prover = 10; // The prover's proposed fee multiplier, incorporated into sliding window // averaging. - uint64 fee_multiplier_vote = 10; + uint64 fee_multiplier_vote = 11; // The confirmation signatures of the frame - quilibrium.node.keys.pb.BLS48581AggregateSignature public_key_signature_bls48581 = 11; + quilibrium.node.keys.pb.BLS48581AggregateSignature public_key_signature_bls48581 = 12; } message ProverLivenessCheck { @@ -217,11 +225,32 @@ message ProposalVote { // The selector being voted for bytes selector = 4; // The timestamp when the vote was created - int64 timestamp = 5; + uint64 timestamp = 5; // The BLS signature with the voter's address quilibrium.node.keys.pb.BLS48581AddressedSignature public_key_signature_bls48581 = 6; } +message TimeoutState { + // The latest quorum certificate seen by the pacemaker. + QuorumCertificate latest_quorum_certificate = 1; + // The previous rank's timeout certificate, if applicable. + TimeoutCertificate prior_rank_timeout_certificate = 2; + // The signed payload which will become part of the new timeout certificate. + ProposalVote vote = 3; + // TimeoutTick is the number of times the `timeout.Controller` has + // (re-)emitted the timeout for this rank. When the timer for the rank's + // original duration expires, a `TimeoutState` with `TimeoutTick = 0` is + // broadcast. Subsequently, `timeout.Controller` re-broadcasts the + // `TimeoutState` periodically based on some internal heuristic. Each time + // we attempt a re-broadcast, the `TimeoutTick` is incremented. Incrementing + // the field prevents de-duplicated within the network layer, which in turn + // guarantees quick delivery of the `TimeoutState` after GST and facilitates + // recovery. + uint64 timeout_tick = 4; + // The timestamp of the message (not the timeout state) + uint64 timestamp = 5; +} + message QuorumCertificate { // The filter for the prover's commitment in the trie bytes filter = 1; @@ -231,8 +260,8 @@ message QuorumCertificate { uint64 frame_number = 3; // The selector (hash) of the confirmed frame bytes selector = 4; - // The timestamp when the vote was created - int64 timestamp = 5; + // The timestamp of the message (not the certificate) + uint64 timestamp = 5; // The aggregated BLS signature from all voters quilibrium.node.keys.pb.BLS48581AggregateSignature aggregate_signature = 6; } @@ -246,8 +275,10 @@ message TimeoutCertificate { repeated uint64 latest_ranks = 3; // The latest quorum certificate from all timeouts QuorumCertificate latest_quorum_certificate = 4; + // The timestamp of the message (not the certificate) + uint64 timestamp = 5; // The aggregated BLS signature from all voters - quilibrium.node.keys.pb.BLS48581AggregateSignature aggregate_signature = 5; + quilibrium.node.keys.pb.BLS48581AggregateSignature aggregate_signature = 6; } message GlobalFrame { diff --git a/protobufs/keys.go b/protobufs/keys.go index 45c9a46..9264090 100644 --- a/protobufs/keys.go +++ b/protobufs/keys.go @@ -319,6 +319,10 @@ func (s *BLS48581AggregateSignature) Identity() string { return string(s.GetPublicKey().GetKeyValue()) } +func (s *BLS48581AggregateSignature) GetPubKey() []byte { + return s.PublicKey.KeyValue +} + func (s *BLS48581Signature) Verify( msg, context []byte, blsVerifier BlsVerifier,