Gogoproto
Modules are encouraged to utilize Protobuf encoding for their respective types. In the Cosmos SDK, we use the Gogoproto specific implementation of the Protobuf spec that offers speed and developer experience improvements compared to the official Google protobuf implementation.Guidelines for protobuf message definitions
In addition to following official Protocol Buffer guidelines, we recommend using these annotations in.proto files when dealing with interfaces:
- Use
cosmos_proto.accepts_interfaceto annotateAnyfields that accept interfaces:- Pass the same fully qualified name as
protoNametoInterfaceRegistry.RegisterInterface. - Example:
(cosmos_proto.accepts_interface) = "cosmos.gov.v1beta1.Content"(not justContent).
- Pass the same fully qualified name as
- Annotate interface implementations with
cosmos_proto.implements_interface:- Pass the same fully qualified name as
protoNametoInterfaceRegistry.RegisterInterface. - Example:
(cosmos_proto.implements_interface) = "cosmos.authz.v1beta1.Authorization"(not justAuthorization).
- Pass the same fully qualified name as
accepts_interface and implements_interface annotations to determine whether some Protobuf messages are allowed to be packed in a given Any field.
Signer
Signer specifies which field should be used to determine the signer of a message for the Cosmos SDK. This field can be used for clients as well to infer which field should be used to determine the signer of a message. Read more about the signer field here.Scalar
The scalar type defines a way for clients to understand how to construct protobuf messages according to what is expected by the module and sdk.cosmos.AddressString, cosmos.ValidatorAddressString, cosmos.ConsensusAddressString, cosmos.Int, cosmos.Dec.
Implements_Interface
Implement interface is used to provide information to client tooling like telescope on how to encode and decode protobuf messages.Method,Field,Message Added In
method_added_in, field_added_in and message_added_in are annotations to indicate to clients that a method, field, or message has been supported since a later version. This is useful when new methods or fields are added in later versions and the client needs to be aware of what it can call.
The annotations are used as follows:
Amino
The amino codec was removed inv0.50+, this means there is not a need register legacyAminoCodec. To replace the amino codec, Amino protobuf annotations are used to provide information to the amino codec on how to encode and decode protobuf messages.
Amino annotations are only used for backwards compatibility with amino. New modules are not required use amino annotations.
Name
Name specifies the amino name that would show up for the user in order for them see which message they are signing.Field_Name
Field name specifies the amino name that would show up for the user in order for them see which field they are signing.Dont_OmitEmpty
Dont omitempty specifies that the field should not be omitted when encoding to amino.Encoding
Encoding instructs the amino json marshaler how to encode certain fields that may differ from the standard encoding behavior. The most common example of this is howrepeated cosmos.base.v1beta1.Coin is encoded when using the amino json encoding format. The legacy_coins option tells the json marshaler how to encode a null slice of cosmos.base.v1beta1.Coin.
Module Query Safe
Thecosmos.query.v1.module_query_safe annotation (source) marks a query method as safe to call from within the state machine — for example from another module’s keeper, via ADR-033 intermodule calls, or from CosmWasm contracts.
true, the annotation asserts that the query is:
- Deterministic: given a block height, it returns the exact same response on every call and does not introduce state-machine-breaking changes across SDK patch versions.
- Gas-tracked: gas consumption is correctly accounted for, preventing attack vectors where high-computation queries consume no gas.