# Application Blockchain Interface (ABCI) ABCI is the interface between Tendermint (a state-machine replication engine) and an application (the actual state machine). The ABCI message types are defined in a [protobuf file](https://github.com/tendermint/abci/blob/master/types/types.proto). For full details on the ABCI message types and protocol, see the [ABCI specificaiton](https://github.com/tendermint/abci/blob/master/specification.rst). For additional details on server implementation, see the [ABCI readme](https://github.com/tendermint/abci#implementation). Here we provide some more details around the use of ABCI by Tendermint and clarify common "gotchas". ## Validator Updates Updates to the Tendermint validator set can be made by returning `Validator` objects in the `ResponseBeginBlock`: ``` message Validator { bytes pub_key = 1; int64 power = 2; } ``` The `pub_key` is the Amino encoded public key for the validator. For details on Amino encoded public keys, see the [section of the encoding spec](./encoding.md#public-key-cryptography). For Ed25519 pubkeys, the Amino prefix is always "1624DE6220". For example, the 32-byte Ed25519 pubkey `76852933A4686A721442E931A8415F62F5F1AEDF4910F1F252FB393F74C40C85` would be Amino encoded as `1624DE622076852933A4686A721442E931A8415F62F5F1AEDF4910F1F252FB393F74C40C85` (Note: in old versions of Tendermint (pre-v0.19.0), the pubkey is just prefixed with a single type byte, so for ED25519 we'd have `pub_key = 0x1 | pub`) The `power` is the new voting power for the validator, with the following rules: - power must be non-negative - if power is 0, the validator must already exist, and will be removed from the validator set - if power is non-0: - if the validator does not already exist, it will be added to the validator set with the given power - if the validator does already exist, its power will be adjusted to the given power ## Query Query is a generic message type with lots of flexibility to enable diverse sets of queries from applications. Tendermint has no requirements from the Query message for normal operation - that is, the ABCI app developer need not implement Query functionality if they do not wish too. That said, Tendermint makes a number of queries to support some optional features. These are: ### Peer Filtering When Tendermint connects to a peer, it sends two queries to the ABCI application using the following paths, with no additional data: - `/p2p/filter/addr/`, where `` denote the IP address and the port of the connection - `p2p/filter/pubkey/`, where `` is the peer node ID (ie. the pubkey.Address() for the peer's PubKey) If either of these queries return a non-zero ABCI code, Tendermint will refuse to connect to the peer.