syntax = "proto3"; package chainfire.internal; // Internal Raft RPC service for node-to-node communication service RaftService { // Vote requests a vote from a peer rpc Vote(VoteRequest) returns (VoteResponse); // AppendEntries sends log entries to followers rpc AppendEntries(AppendEntriesRequest) returns (AppendEntriesResponse); } message VoteRequest { // term is the candidate's term uint64 term = 1; // candidate_id is the candidate requesting the vote uint64 candidate_id = 2; // last_log_index is index of candidate's last log entry uint64 last_log_index = 3; // last_log_term is term of candidate's last log entry uint64 last_log_term = 4; } message VoteResponse { // term is the current term for the voter uint64 term = 1; // vote_granted is true if the candidate received the vote bool vote_granted = 2; // last_log_id is the voter's last log ID uint64 last_log_index = 3; uint64 last_log_term = 4; } message AppendEntriesRequest { // term is the leader's term uint64 term = 1; // leader_id is the leader's ID uint64 leader_id = 2; // prev_log_index is index of log entry immediately preceding new ones uint64 prev_log_index = 3; // prev_log_term is term of prev_log_index entry uint64 prev_log_term = 4; // entries are log entries to append repeated LogEntry entries = 5; // leader_commit is leader's commit index uint64 leader_commit = 6; } message LogEntry { // index is the log entry index uint64 index = 1; // term is the term when entry was received uint64 term = 2; // data is the command data bytes data = 3; } message AppendEntriesResponse { // term is the current term uint64 term = 1; // success is true if follower contained entry matching prevLogIndex bool success = 2; // conflict_index is the first conflicting index (for optimization) uint64 conflict_index = 3; // conflict_term is the term of the conflicting entry uint64 conflict_term = 4; }