Добро пожаловать в серию статей о разработке Advanced EOS, здесь я коснусь передовых методов и функций, которые редко рассматриваются в учебных пособиях или курсах. Цель этой серии - собрать воедино недостающие части, которые вам понадобятся для завершения своих навыков в качестве разработчика распределенных приложений в сети EOS. Каждый пост отсортирован по сложности, поэтому, если вы хотите получить общий обзор, я бы рекомендовал начать с части 1 и постепенно продвигаться вверх. Полный код этих примеров можно найти здесь, на GitHub.



Поскольку это сложные или расширенные темы, я опасно предполагаю, что вы уже знаете основы и хотите расширить свои знания. По этой причине код, представленный в этих статьях, будет кратким только для обсуждаемой цели.

Этот пост будет относительно коротким, но он будет посвящен фундаментальному и, казалось бы, не раскрытому методу с многоиндексными таблицами и уникальными первичными индексами.

Уникальные индексы

К настоящему времени мы можем создавать строки в наших таблицах, индексируемые по нашим уникальным account_name идентификаторам, но как нам использовать другой primary_key и обеспечить его уникальность? К счастью, разработчики EOSio предоставили нам функцию available_primary_key().

Начнем с создания структуры для определения Item в нашей items таблице. Мы будем использовать uint64_t как обычно, чтобы указать наш первичный ключ с именем id.

// @abi table items i64
struct Item {
  uint64_t          id;
  string            name;
  uint64_t          attack;
  account_name      owner;

  auto primary_key() const { return id; };
  EOSLIB_SERIALIZE(Item, (id)(name)(attack));
};

typedef multi_index<N(items), Item> items_table;

Вы заметите, что это та же структура таблицы, которую мы использовали в Advanced EOS Series - Part 3 - Secondary Indexes. Теперь давайте обновим наши действия, чтобы сгенерировать уникальный первичный ключ, вместо того, чтобы требовать их в качестве аргумента.

void inventory::create(const account_name account, const string name, const uint64_t attack) {

  items_table items(_self, _self);

  items.emplace(account, account, [&](auto& item) {
    item.id = items.available_primary_key();
    item.name = name;
    item.attack = attack;
    item.owner = account;
  });
}

Мы удалили uint64_t index из нашего действия void post(const account_name username, uint64_t index const string& msg_str) и заменили index на items.available_primary_key(), чтобы установить первичный ключ id при создании нового элемента.

Получайте лучшие предложения по программному обеспечению прямо в свой почтовый ящик