Добро пожаловать в серию статей о разработке 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
при создании нового элемента.
Получайте лучшие предложения по программному обеспечению прямо в свой почтовый ящик