Расширенная серия EOS - Часть 2 - Синглтоны

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



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

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

Упорство

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

Определение синглтона

В этом примере мы будем использовать синглтон для хранения состояния конфигурации наших контрактов. Давайте определим наш синглтон с помощью структуры. Мы будем использовать логическое значение closed и char_count, которое мы можем использовать для ограничения размера сообщений пользователей.

struct Config {
  bool		closed = false;
  uint32_t	char_count = 144;
};

typedef singleton<N(settings), Config> settings_table;

Затем мы создадим переменную-заполнитель для нашего экземпляра, сделав ее глобальной в контексте нашего контракта.

settings_table config;

Инициализация синглтона

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

singletons(action_name self) : contract(self), config(_self, _self) {}

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

Получение одноэлементных значений

Теперь, когда у нас есть инициализированный синглтон, мы можем начать взаимодействие со значениями, считывая значение char_count и выводя его на консоль.

auto state = config.get();
print(state.char_count);

Вот и все! Наш config.get() извлекает синглтон, который мы инициализировали ранее, и назначает его нашей переменной state. Теперь мы можем получить доступ к свойствам нашего struct, используя точечную нотацию.

Установка одноэлементных значений

В этом примере мы обновим свойство char_count с помощью функции-члена singleton.set(STRUCT,PAYER). . Давайте рассмотрим два метода обновления нашего синглтона.

Метод 1 - встроенное обновление

Самый простой метод - построить нашу структуру inline, передав ее непосредственно нашей функции set, как мы ее установили, например:

config.set(Config{true, 172}, _self);

Здесь мы устанавливаем closed в значение true, а наше char_count в 172, при этом делегируя _self в качестве плательщика за эту RAM. Этот метод является чистым, когда ваша структура содержит только несколько свойств и поддерживает порядок свойств, но нам понадобится лучший метод для более крупных структур.

Метод 2 - получение и обновление

Затем давайте повторно откроем наш контракт, используя метод выборки и обновления. Сначала мы получим текущее состояние Config с помощью метода singleton.get(), установим значение closed, а затем снова установим состояние.

auto state = config.get();
state.closed = false;
config.set(state, _self);

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

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