Расчет ЭЦП

Расчет ЭЦП строится по тем же принципам, что и в EON 1 (TestNet3 - EON Peer API / Transaction signature, но Bencode-строка не приводится к uppercase):

  1. Формируется словарь с данными на подпись.

  2. Из словаря формируется Bencode-строка.

  3. В кодировке UTF-8 берутся байты.

  4. Полученные байты подписываются приватным ключом.

  5. Полученная подпись вставляется в соответствующее поле.

Для транзакции

Для формирования словаря используются следующие поля (аналогичны структуре транзакции):

  • timestamp : long

  • deadline : long

  • publisher : String

  • fee : long

  • tags : map<string> (необязательное поле)

  • commands : list<map> (команды формируются как на подпись)

Пример (JSON):

{
    "commands": [
        {
            "data": {
                "alg": "ed25519",
                "id": "EON-27Z6X-N77SJ-B8GEM",
                "key": "9zUema0KRJFkx2mC4HjEZZ0xCH0MMAdGH34rXfz2p4o="
            },
            "deadline": 300,
            "network": "core.dev.Ti2YGY",
            "publisher": "EON-HRAEQ-8NZL7-C9LHJ",
            "timestamp": 1592296782,
            "type": "core.auth.pk.new",
            "version": 1
        }
    ],
    "deadline": 300,
    "fee": 1000,
    "publisher": "EON-HRAEQ-8NZL7-C9LHJ",
    "timestamp": 1592296782,
    "version": 1
}

Для команды

Для формирования словаря используются следующие поля (аналогичны структуре команды):

  • version : long

  • network : String

  • timestamp : long

  • deadline : long

  • publisher : String

  • type : String

  • data : map

  • reference : string (необязательное поле)

  • note : string (необязательное поле)

Пример (JSON):

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

Подпись транзакций и команд

Транзакция подписывается аккаунтом, заданным в поле publisher. Для каждого типа команды есть свои правила по определению того, кто должен ее подписать (если подпись команде вообще требуется).

Подписываются команды и транзакции с учетом настроек мультиподписи. Т.е. если включена мультиподпись, то вместо указанного аккаунта должны подписывать те аккаунты, которые указаны в мультиподписи. Причем они подписывают с учетом настроек их мультиподписи, если она включена (кроме ситуации, когда аккаунт включает себя в настройку мультиподписи - в таком случае необходима ЭЦП аккаунта).

Например::

  • Аккаунт A выпускает транзакцию. Он должен ее подписать.

  • Если аккаунт A задал в мультиподписи аккаунты B и C, то в транзакции ожидаются подписи аккаунтов B и C (с учетом их настроек мультиподписи).

  • Если аккаунт B задал мультиподпись на аккаунт С, то в транзакции ожидается подпись только аккаунта C (с учетом его настроек мультиподписи).

  • Если аккаунт C задал мультиподпись на аккаунты С и D, то в транзакции ожидаются подписи аккаунтов С и D (ЭЦП C и для D с учетом настроек мультиподписи).

  • Если аккаунт D не задавал настройки мультиподписи, то в транзакции должно быть две ЭЦП: от аккаунтов С и D.

Last updated