An Autonomous Economic Agent is, in technical terms, defined by the following characteristics:

  • It MUST be capable of receiving and sending `Envelopes` which satisfy the following protobuf schema:
    syntax = "proto3";
    
    package fetch.aea;
    
    message Envelope{
        string to = 1;
        string sender = 2;
        string protocol_id = 3;
        bytes message = 4;
        string uri = 5;
    }
    
    The format for the above fields, except `message`, is specified below. For those with `regexp`, the format is described in regular expression.
    • to and sender: an address derived from the private key of a secp256k1-compatible elliptic curve
    • protocol_id: (`regexp`) `^[a-zA-Z0-9_]*/[a-zA-Z_][a-zA-Z0-9_]*:(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$`
    • bytes: a bytes string representing a serialized message in the specified protocol
    • URI: this syntax
  • It MUST implement each protocol's message with the required meta-fields:
        // Meta fields
        int32 message_id = 1;
        string dialogue_starter_reference = 2;
        string dialogue_responder_reference = 3;
        int32 target = 4;
        oneof performative{
            ...
        }
    
    where `...` is replaced with the protocol specific performatives (see here for details).
  • It MUST implement protocols according to their specification (see here for details).

    Note

    This section is incomplete, and will be updated soon!

  • It SHOULD implement the `fetchai/default:0.5.0` protocol which satisfies the following protobuf schema:
    syntax = "proto3";
    
    package fetch.aea.Default;
    
    message DefaultMessage{
    
        // Custom Types
        message ErrorCode{
            enum ErrorCodeEnum {
                UNSUPPORTED_PROTOCOL = 0;
                DECODING_ERROR = 1;
                INVALID_MESSAGE = 2;
                UNSUPPORTED_SKILL = 3;
                INVALID_DIALOGUE = 4;
              }
            ErrorCodeEnum error_code = 1;
        }
    
    
        // Performatives and contents
        message Bytes_Performative{
            bytes content = 1;
        }
    
        message Error_Performative{
            ErrorCode error_code = 1;
            string error_msg = 2;
            map<string, bytes> error_data = 3;
        }
    
    
        // Standard DefaultMessage fields
        int32 message_id = 1;
        string dialogue_starter_reference = 2;
        string dialogue_responder_reference = 3;
        int32 target = 4;
        oneof performative{
            Bytes_Performative bytes = 5;
            Error_Performative error = 6;
        }
    }
    
  • It is recommended that it processes `Envelopes` asynchronously. Note, the specification regarding the processing of messages does not impose any particular implementation choice/constraint; for example, the AEA can process envelopes either synchronously and asynchronously. However, due to the high level of activity that an AEA might be subject to, other AEAs expect a certain minimum level of responsiveness and reactivity of an AEA's implementation, especially in the case of many concurrent dialogues with other peers. That could imply the need for asynchronous programming to make the AEA's implementation scalable.
  • It MUST have an identity in the form of, at a minimum, an address derived from a public key and its associated private key (where the eliptic curve must be of type SECP256k1).
  • It SHOULD implement handling of errors using the `fetchai/default:0.5.0` protocol. The protobuf schema is given above.
  • It MUST implement the following principles when handling messages:
    • It MUST ALWAYS handle incoming envelopes/messages and NEVER raise. This ensures another AEA cannot take it down by sending an incompatible envelope/message.
    • It MUST NEVER handle outgoing messages and ALWAYS raise. This implies own business logic mistakes are not handled by business logic.

Note

Additional constraints will be added soon!