# 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 example, the 32-byte Ed25519 pubkey `76852933A4686A721442E931A8415F62F5F1AEDF4910F1F252FB393F74C40C85` would be Amino encoded as `1624DE622076852933A4686A721442E931A8415F62F5F1AEDF4910F1F252FB393F74C40C85` 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