syntax = "proto3"; package tendermint.abci; option go_package = "github.com/tendermint/tendermint/abci/types"; // For more information on gogo.proto, see: // https://github.com/gogo/protobuf/blob/master/extensions.md import "tendermint/crypto/proof.proto"; import "tendermint/types/types.proto"; import "tendermint/crypto/keys.proto"; import "tendermint/types/params.proto"; import "google/protobuf/timestamp.proto"; import "gogoproto/gogo.proto"; // This file is copied from http://github.com/tendermint/abci // NOTE: When using custom types, mind the warnings. // https://github.com/gogo/protobuf/blob/master/custom_types.md#warnings-and-issues //---------------------------------------- // Request types message Request { oneof value { RequestEcho echo = 1; RequestFlush flush = 2; RequestInfo info = 3; RequestInitChain init_chain = 4; RequestQuery query = 5; RequestBeginBlock begin_block = 6 [deprecated = true]; RequestCheckTx check_tx = 7; RequestDeliverTx deliver_tx = 8 [deprecated = true]; RequestEndBlock end_block = 9 [deprecated = true]; RequestCommit commit = 10; RequestListSnapshots list_snapshots = 11; RequestOfferSnapshot offer_snapshot = 12; RequestLoadSnapshotChunk load_snapshot_chunk = 13; RequestApplySnapshotChunk apply_snapshot_chunk = 14; RequestPrepareProposal prepare_proposal = 15; RequestProcessProposal process_proposal = 16; RequestExtendVote extend_vote = 17; RequestVerifyVoteExtension verify_vote_extension = 18; RequestFinalizeBlock finalize_block = 19; } } message RequestEcho { string message = 1; } message RequestFlush {} message RequestInfo { string version = 1; uint64 block_version = 2; uint64 p2p_version = 3; string abci_version = 4; } message RequestInitChain { google.protobuf.Timestamp time = 1 [(gogoproto.nullable) = false, (gogoproto.stdtime) = true]; string chain_id = 2; tendermint.types.ConsensusParams consensus_params = 3; repeated ValidatorUpdate validators = 4 [(gogoproto.nullable) = false]; bytes app_state_bytes = 5; int64 initial_height = 6; } message RequestQuery { bytes data = 1; string path = 2; int64 height = 3; bool prove = 4; } message RequestBeginBlock { bytes hash = 1; tendermint.types.Header header = 2 [(gogoproto.nullable) = false]; CommitInfo last_commit_info = 3 [(gogoproto.nullable) = false]; repeated Evidence byzantine_validators = 4 [(gogoproto.nullable) = false]; } enum CheckTxType { NEW = 0 [(gogoproto.enumvalue_customname) = "New"]; RECHECK = 1 [(gogoproto.enumvalue_customname) = "Recheck"]; } message RequestCheckTx { bytes tx = 1; CheckTxType type = 2; } message RequestDeliverTx { bytes tx = 1; } message RequestEndBlock { int64 height = 1; } message RequestCommit {} // lists available snapshots message RequestListSnapshots {} // offers a snapshot to the application message RequestOfferSnapshot { Snapshot snapshot = 1; // snapshot offered by peers bytes app_hash = 2; // light client-verified app hash for snapshot height } // loads a snapshot chunk message RequestLoadSnapshotChunk { uint64 height = 1; uint32 format = 2; uint32 chunk = 3; } // Applies a snapshot chunk message RequestApplySnapshotChunk { uint32 index = 1; bytes chunk = 2; string sender = 3; } message RequestPrepareProposal { bytes hash = 1; tendermint.types.Header header = 2 [(gogoproto.nullable) = false]; // txs is an array of transactions that will be included in a block, // sent to the app for possible modifications. repeated bytes txs = 3; ExtendedCommitInfo local_last_commit = 4 [(gogoproto.nullable) = false]; repeated Evidence byzantine_validators = 5 [(gogoproto.nullable) = false]; // the modified transactions cannot exceed this size. int64 max_tx_bytes = 6; } message RequestProcessProposal { bytes hash = 1; tendermint.types.Header header = 2 [(gogoproto.nullable) = false]; repeated bytes txs = 3; CommitInfo proposed_last_commit = 4 [(gogoproto.nullable) = false]; repeated Evidence byzantine_validators = 5 [(gogoproto.nullable) = false]; } // Extends a vote with application-side injection message RequestExtendVote { bytes hash = 1; int64 height = 2; } // Verify the vote extension message RequestVerifyVoteExtension { bytes hash = 1; bytes validator_address = 2; int64 height = 3; bytes vote_extension = 4; } message RequestFinalizeBlock { bytes hash = 1; tendermint.types.Header header = 2 [(gogoproto.nullable) = false]; repeated bytes txs = 3; CommitInfo decided_last_commit = 4 [(gogoproto.nullable) = false]; repeated Evidence byzantine_validators = 5 [(gogoproto.nullable) = false]; } //---------------------------------------- // Response types message Response { oneof value { ResponseException exception = 1; ResponseEcho echo = 2; ResponseFlush flush = 3; ResponseInfo info = 4; ResponseInitChain init_chain = 5; ResponseQuery query = 6; ResponseBeginBlock begin_block = 7 [deprecated = true]; ResponseCheckTx check_tx = 8; ResponseDeliverTx deliver_tx = 9 [deprecated = true]; ResponseEndBlock end_block = 10 [deprecated = true]; ResponseCommit commit = 11; ResponseListSnapshots list_snapshots = 12; ResponseOfferSnapshot offer_snapshot = 13; ResponseLoadSnapshotChunk load_snapshot_chunk = 14; ResponseApplySnapshotChunk apply_snapshot_chunk = 15; ResponsePrepareProposal prepare_proposal = 16; ResponseProcessProposal process_proposal = 17; ResponseExtendVote extend_vote = 18; ResponseVerifyVoteExtension verify_vote_extension = 19; ResponseFinalizeBlock finalize_block = 20; } } // nondeterministic message ResponseException { string error = 1; } message ResponseEcho { string message = 1; } message ResponseFlush {} message ResponseInfo { string data = 1; // this is the software version of the application. TODO: remove? string version = 2; uint64 app_version = 3; int64 last_block_height = 4; bytes last_block_app_hash = 5; } message ResponseInitChain { tendermint.types.ConsensusParams consensus_params = 1; repeated ValidatorUpdate validators = 2 [(gogoproto.nullable) = false]; bytes app_hash = 3; } message ResponseQuery { uint32 code = 1; // bytes data = 2; // use "value" instead. string log = 3; // nondeterministic string info = 4; // nondeterministic int64 index = 5; bytes key = 6; bytes value = 7; tendermint.crypto.ProofOps proof_ops = 8; int64 height = 9; string codespace = 10; } message ResponseBeginBlock { repeated Event events = 1 [(gogoproto.nullable) = false, (gogoproto.jsontag) = "events,omitempty"]; } message ResponseCheckTx { uint32 code = 1; bytes data = 2; string log = 3; // nondeterministic string info = 4; // nondeterministic int64 gas_wanted = 5; int64 gas_used = 6; repeated Event events = 7 [(gogoproto.nullable) = false, (gogoproto.jsontag) = "events,omitempty"]; string codespace = 8; string sender = 9; int64 priority = 10; // mempool_error is set by Tendermint. // ABCI applications creating a ResponseCheckTX should not set mempool_error. string mempool_error = 11; } message ResponseDeliverTx { uint32 code = 1; bytes data = 2; string log = 3; // nondeterministic string info = 4; // nondeterministic int64 gas_wanted = 5 [json_name = "gas_wanted"]; int64 gas_used = 6 [json_name = "gas_used"]; repeated Event events = 7 [(gogoproto.nullable) = false, (gogoproto.jsontag) = "events,omitempty"]; // nondeterministic string codespace = 8; } message ResponseEndBlock { repeated ValidatorUpdate validator_updates = 1 [(gogoproto.nullable) = false]; tendermint.types.ConsensusParams consensus_param_updates = 2; repeated Event events = 3 [(gogoproto.nullable) = false, (gogoproto.jsontag) = "events,omitempty"]; } message ResponseCommit { // reserve 1 bytes data = 2; int64 retain_height = 3; } message ResponseListSnapshots { repeated Snapshot snapshots = 1; } message ResponseOfferSnapshot { Result result = 1; enum Result { UNKNOWN = 0; // Unknown result, abort all snapshot restoration ACCEPT = 1; // Snapshot accepted, apply chunks ABORT = 2; // Abort all snapshot restoration REJECT = 3; // Reject this specific snapshot, try others REJECT_FORMAT = 4; // Reject all snapshots of this format, try others REJECT_SENDER = 5; // Reject all snapshots from the sender(s), try others } } message ResponseLoadSnapshotChunk { bytes chunk = 1; } message ResponseApplySnapshotChunk { Result result = 1; repeated uint32 refetch_chunks = 2; // Chunks to refetch and reapply repeated string reject_senders = 3; // Chunk senders to reject and ban enum Result { UNKNOWN = 0; // Unknown result, abort all snapshot restoration ACCEPT = 1; // Chunk successfully accepted ABORT = 2; // Abort all snapshot restoration RETRY = 3; // Retry chunk (combine with refetch and reject) RETRY_SNAPSHOT = 4; // Retry snapshot (combine with refetch and reject) REJECT_SNAPSHOT = 5; // Reject this snapshot, try others } } message ResponsePrepareProposal { ModifiedTxStatus modified_tx_status = 1; repeated TxRecord tx_records = 2; bytes app_hash = 3; repeated ExecTxResult tx_results = 4; repeated ValidatorUpdate validator_updates = 5; tendermint.types.ConsensusParams consensus_param_updates = 6; enum ModifiedTxStatus { UNKNOWN = 0; UNMODIFIED = 1; MODIFIED = 2; } } message ResponseProcessProposal { ProposalStatus status = 1; bytes app_hash = 2; repeated ExecTxResult tx_results = 3; repeated ValidatorUpdate validator_updates = 4; tendermint.types.ConsensusParams consensus_param_updates = 5; enum ProposalStatus { UNKNOWN = 0; ACCEPT = 1; REJECT = 2; } } message ResponseExtendVote { bytes vote_extension = 1; } message ResponseVerifyVoteExtension { VerifyStatus status = 1; enum VerifyStatus { UNKNOWN = 0; ACCEPT = 1; REJECT = 2; } } message ResponseFinalizeBlock { repeated Event events = 1 [(gogoproto.nullable) = false, (gogoproto.jsontag) = "events,omitempty"]; repeated ExecTxResult tx_results = 2; repeated ValidatorUpdate validator_updates = 3; tendermint.types.ConsensusParams consensus_param_updates = 4; bytes app_hash = 5; int64 retain_height = 6; } //---------------------------------------- // Misc. message CommitInfo { int32 round = 1; repeated VoteInfo votes = 2 [(gogoproto.nullable) = false]; } message ExtendedCommitInfo { int32 round = 1; repeated ExtendedVoteInfo votes = 2 [(gogoproto.nullable) = false]; } // Event allows application developers to attach additional information to // ResponseBeginBlock, ResponseEndBlock, ResponseCheckTx and ResponseDeliverTx. // Later, transactions may be queried using these events. message Event { string type = 1; repeated EventAttribute attributes = 2 [(gogoproto.nullable) = false, (gogoproto.jsontag) = "attributes,omitempty"]; } // EventAttribute is a single key-value pair, associated with an event. message EventAttribute { string key = 1; string value = 2; bool index = 3; // nondeterministic } // ExecTxResult contains results of executing one individual transaction. // // * Its structure is equivalent to #ResponseDeliverTx which will be deprecated/deleted message ExecTxResult { uint32 code = 1; bytes data = 2; string log = 3; // nondeterministic string info = 4; // nondeterministic int64 gas_wanted = 5; int64 gas_used = 6; repeated Event events = 7 [(gogoproto.nullable) = false, (gogoproto.jsontag) = "events,omitempty"]; // nondeterministic string codespace = 8; } // TxResult contains results of executing the transaction. // // One usage is indexing transaction results. message TxResult { int64 height = 1; uint32 index = 2; bytes tx = 3; ResponseDeliverTx result = 4 [(gogoproto.nullable) = false]; } message TxRecord { TxAction action = 1; bytes tx = 2; // TxAction contains App-provided information on what to do with a transaction that is part of a raw proposal enum TxAction { UNKNOWN = 0; // Unknown action UNMODIFIED = 1; // The Application did not modify this transaction. ADDED = 2; // The Application added this transaction. REMOVED = 3; // The Application wants this transaction removed from the proposal and the mempool. } } //---------------------------------------- // Blockchain Types // Validator message Validator { bytes address = 1; // The first 20 bytes of SHA256(public key) // PubKey pub_key = 2 [(gogoproto.nullable)=false]; int64 power = 3; // The voting power } // ValidatorUpdate message ValidatorUpdate { tendermint.crypto.PublicKey pub_key = 1 [(gogoproto.nullable) = false]; int64 power = 2; } // VoteInfo message VoteInfo { Validator validator = 1 [(gogoproto.nullable) = false]; bool signed_last_block = 2; } // ExtendedVoteInfo message ExtendedVoteInfo { Validator validator = 1 [(gogoproto.nullable) = false]; bool signed_last_block = 2; bytes vote_extension = 3; } // CanonicalVoteExtension // TODO: move this to core Tendermint data structures message CanonicalVoteExtension { bytes extension = 1; int64 height = 2; int32 round = 3; string chain_id = 4; bytes address = 5; } enum EvidenceType { UNKNOWN = 0; DUPLICATE_VOTE = 1; LIGHT_CLIENT_ATTACK = 2; } message Evidence { EvidenceType type = 1; // The offending validator Validator validator = 2 [(gogoproto.nullable) = false]; // The height when the offense occurred int64 height = 3; // The corresponding time where the offense occurred google.protobuf.Timestamp time = 4 [(gogoproto.nullable) = false, (gogoproto.stdtime) = true]; // Total voting power of the validator set in case the ABCI application does // not store historical validators. // https://github.com/tendermint/tendermint/issues/4581 int64 total_voting_power = 5; } //---------------------------------------- // State Sync Types message Snapshot { uint64 height = 1; // The height at which the snapshot was taken uint32 format = 2; // The application-specific snapshot format uint32 chunks = 3; // Number of chunks in the snapshot bytes hash = 4; // Arbitrary snapshot hash, equal only if identical bytes metadata = 5; // Arbitrary application metadata } //---------------------------------------- // Service Definition service ABCIApplication { rpc Echo(RequestEcho) returns (ResponseEcho); rpc Flush(RequestFlush) returns (ResponseFlush); rpc Info(RequestInfo) returns (ResponseInfo); rpc CheckTx(RequestCheckTx) returns (ResponseCheckTx); rpc Query(RequestQuery) returns (ResponseQuery); rpc Commit(RequestCommit) returns (ResponseCommit); rpc InitChain(RequestInitChain) returns (ResponseInitChain); rpc ListSnapshots(RequestListSnapshots) returns (ResponseListSnapshots); rpc OfferSnapshot(RequestOfferSnapshot) returns (ResponseOfferSnapshot); rpc LoadSnapshotChunk(RequestLoadSnapshotChunk) returns (ResponseLoadSnapshotChunk); rpc ApplySnapshotChunk(RequestApplySnapshotChunk) returns (ResponseApplySnapshotChunk); rpc PrepareProposal(RequestPrepareProposal) returns (ResponsePrepareProposal); rpc ProcessProposal(RequestProcessProposal) returns (ResponseProcessProposal); rpc ExtendVote(RequestExtendVote) returns (ResponseExtendVote); rpc VerifyVoteExtension(RequestVerifyVoteExtension) returns (ResponseVerifyVoteExtension); rpc FinalizeBlock(RequestFinalizeBlock) returns (ResponseFinalizeBlock); }