# 2020-04-16: ABCI domain types

The first design iteration of tower-abci used raw protobuf-generated types from the tendermint-proto crate. However, because these types are generated from protobuf definitions, they’re much less ergonomic: they don’t follow Rust naming conventions, they can’t be well-organized into modules, they can’t be easily documented, etc. More importantly, because protobufs require that all fields be optional and have default values, using raw proto types means that validation checks are scattered throughout the codebase.

To fix this, tendermint-rs PR #862 adds a complete model for the ABCI protocol as a set of Rust domain types for each request and response method, and provides validating conversions between the domain types and the raw proto types.

Using this code in tower-abci makes the interface significantly better, with the bulk of the kvstore example application fitting on one screen of code.