Структура команды и транзакции

Структурно транзакция разделена на 2 элемента: команду и транзакцию.

  • Команда - конкретная операция в сети. Задается типом операции и набором необходимых для операции полей. Например, регистрация, перевод и т.д.

  • Транзакция - контейнер для нескольких команд, который и отправляется в сеть. Транзакция задает комиссию и ее плательщика.

Структура команды

  • version* : int - версия формата.

  • id* : String - идентификатор команды (рассчитывается по хешу команды (по принципам ЭЦП) и времени создания команды, алгоритм хеширования определяется версией).

  • type* : String - тип операции.

  • publisher* : String - отправитель в сеть.

  • timestamp* : long - время создания команды.

  • deadline* : long - время жизни команды.

  • data* : Map<String, Long|String|Map<...>> - данные команды.

  • note : String - комментарий.

  • confirmations*: Map<String, String> - подписи (ID аккаунта - ЭЦП в Base64).

  • reference : String - зависимость от другой команды в транзакции.

* - обязательные поля.

Пример:

{
    "data": {
        "alg": "ed25519",
        "id": "EON-27Z6X-N77SJ-B8GEM",
        "key": "9zUema0KRJFkx2mC4HjEZZ0xCH0MMAdGH34rXfz2p4o="
    },
    "deadline": 300,
    "id": "CMD-GC3KG-HB3LK-2ETBN",
    "network": "core.dev.Ti2YGY",
    "publisher": "EON-HRAEQ-8NZL7-C9LHJ",
    "timestamp": 1592296782,
    "type": "core.auth.pk.new",
    "version": 1
}

Структура транзакции

  • version* : int - версия формата.

  • id* : String - идентификатор транзакции (рассчитывается по хешу транзакции (по принципам ЭЦП) и времени создания транзакции, алгоритм хеширования определяется версией).

  • commands* : List<Command> - команды в транзакции.

  • publisher* : AccId - плательщик комиссии.

  • fee* : long - комиссия.

  • confirmations*: Map<String, String> - подписи (ID аккаунта - ЭЦП в Base64).

  • timestamp* : long - время создания транзакции.

  • deadline* : long - время жизни транзакции.

  • tags : Map<String, String> - теги.

  • block : String - идентификатор блока, в котором транзакция была подтверждена (используется только при запросе транзакции с пира).

* - обязательные поля.

Пример:

{
    "commands": [
        {
            "data": {
                "alg": "ed25519",
                "id": "EON-27Z6X-N77SJ-B8GEM",
                "key": "9zUema0KRJFkx2mC4HjEZZ0xCH0MMAdGH34rXfz2p4o="
            },
            "deadline": 300,
            "id": "CMD-GC3KG-HB3LK-2ETBN",
            "network": "core.dev.Ti2YGY",
            "publisher": "EON-HRAEQ-8NZL7-C9LHJ",
            "timestamp": 1592296782,
            "type": "core.auth.pk.new",
            "version": 1
        }
    ],
    "confirmations": {
        "EON-HRAEQ-8NZL7-C9LHJ": "HyZIa5n3fKxlUY6lnJVjYhAICGnIPi2czQnW7T+h/CDJORR5gJPfmYaIP22/yHCHWhfCkWV4aLZkc2k6XcePAg=="
    },
    "deadline": 300,
    "fee": 1000,
    "id": "TX-GC3KG-HFN93-GHF6R",
    "publisher": "EON-HRAEQ-8NZL7-C9LHJ",
    "timestamp": 1592296782,
    "version": 1
}

Основные правила функционирования транзакции

  • Транзакцию подписывает отправитель транзакции, заданный в поле publisher.

  • Транзакция выполняется атомарно. Ошибка в обработке любой команды в транзакции приведет к ошибке всей транзакции. Ни одна команда не будет принята.

  • Все команды в транзакции выполняются последовательно.

  • В команду включается поле publisher для того, чтобы только правильный аккаунт мог выпустить транзакцию в сеть.

  • В команде есть поле reference, которое позволяет управлять взаимосвязью команд. Если поле задано, то указанная команда должна включаться в текущую транзакцию и располагаться раньше текущей команды в перечне команд транзакции.

Last updated