kib-sources / odc-banknote-core

Код на Си, работающий с банкнотами, включая odcb файлы
1 stars 0 forks source link

Косяки в описании... #2

Open PavelMSTU opened 2 weeks ago

PavelMSTU commented 2 weeks ago

Есть ряд косяков

UUID bank_id;

Во-первых лучше написать не bank_id а bin.

Во-вторых, лучше сделать это строкой длиной в 20 байт, чтобы подробно описать страну и сам банк.

Например:

CB:RUSSIA:0001....

означает центральный банк России, ключевой набор номер 0001.

Или

BIN:548476....

через бин.


Далее append-applicability хороший блок. Но нужно заранее знать в хедере сколько их будет. Иначе, при сокращении можно сократить теоретически и блоки append-applicability.

Поэтому в хедер добавляем поле:

UINT count_append_applicability_blocks = 0;

которое равно 0, если нет дополнительных блоков append-applicability, или равно количеству блоков append-applicability добавленных в конец банкноты.


Теперь по свопу. э

BLOCK_SWAP -- НЕ НУЖЕН.

Просто для каждого блока BLOCK_CHAIN нужно хранить дополнительные поля:

// ------------------
    // Дополнительные поля -- доп. подтверждение банком.
    // при ОНЛАЙН платеже
    SALT salt_bank = 0;
    HASH hash_bank = 0;
    SIGN hash_bank_by_bpk = 0;

Которые подписываются банком эмитентом тогда и только тогда ,когда:

  1. все предыдущие блоки тоже подписаны ранее
  2. текущий блок валиден

Таким образом можно хранить ТОЛЬКО хедер, все append-applicability блоки, по желанию блоки комментариев и последний блок, указывающий на владельца.

В этом случае BLOCK_SWAP заменяем на BLOCK_GAP вида

typedef struct{
    BLOCK_SIZE size;
    const BLOCK_TYPE type = "gap.................";

} BLOCK_GAP;

Данный блок валиден тогда и только тогда, когда следующий НЕ комментирующий блок -- это BLOCK_CHAIN c подписанными полями salt_bank, hash_bank и hash_bank_by_bpk

PavelMSTU commented 2 weeks ago

Далее

 UUID banknote_id;
    UUID bank_id;

некорректно!

Сначала идентификатор банка, потом идентификатор банкноты

PavelMSTU commented 2 weeks ago

Неправильное наименование поля BLOCK_CHAIN

// [sok_a](bpk) подпись отправителя 
    SIGN sokA_by_bpk;

Лучше написать

// [sok_a](bpk) подпись получателя 
SIGN sok_owner_by_bpk;

Так же нужно ввести поле WID -- wallet ID и добавить его

Так же нужно ввести поле KEY -- и добавять сам ключ как один из параметров

// KEY sok_owner -- высчитывается из sok_owner_by_bpk через bok
SIGN sok_owner_by_bpk;

KEY sok_owner не нужно добавлять, т.к. оно высчитывается из sok_owner_by_bpk. Но пояснить в комментах можно.


Далее

    // HASH hash0 = hash(bank_id, banknote_id, parent_hash, sokA_by_bpk, counter, salt)
    HASH hash0;
    SIGN hash0_spkB;

Неверно, нужно

    // HASH hash0 = hash(bank_id, banknote_id, parent_hash, sokA_by_bpk, counter, salt)
    HASH hash0;
    SIGN hash0_spk_owner;

Тут А (owner) подписывает, а не B !!!


Далее

    SALT salt;

    // hash = hash(hash0, hash0_spkB, salt)
    HASH hash;

    // Подпись хеша
    SIGN hash_by_spkA;

тут неверно.

Заменить на

    SALT salt;

    // hash = hash(hash0, hash0_spkB, salt)
    HASH hash;

    // Подпись хеша
    SIGN hash_by_spk_or_bpk_previous_owner;
PavelMSTU commented 2 weeks ago

Чтобы была возможность менять bpk и bok , нужно в BLOCK_HEADER добавлять поле:

KEY bok;

И этот bok и, соотвественно, закрытый bpk действуют в рамках всей банкноты.

Если bpk скомпроментирован, то соответственно, все купюры нужно вывести из обращения.

PavelMSTU commented 2 weeks ago

По поводу

WID owner

поля.

Оно нужно только на стороне сервера!

Поэтому при дополнительной подписи, мы сохраняем внутри сервера цепочку из wid-ов. Но в самом блокчейне odcb -- это НЕ нужно.