Проведение пробного опроса с использованием смарт-контракта.

Продолжая тему «Как провести опрос» (1), я начну с объяснения третьей части.

Настроить таблицу сохранения третьего результата.

/// @abi table surveyresult i64
    struct surveyresult
    {
      account_name owner;
      uint64_t no1count;
      uint64_t no2count;
      uint64_t no3count;
      uint64_t no4count;
uint64_t primary_key() const {return owner;}
EOSLIB_SERIALIZE(surveycon,(owner)(no1count)(no2count)(no3count)(no4count))
    };
    typedef multi_index<N(surveyresult),surveyresult> _result;

В зависимости от того, какой владелец установлен в качестве первичного ключа, объявите таблицу с номером 1 кумулятивного ответа опроса как no1count, а оставшиеся в порядке no2count, no3count, no4count.

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

auto iter=result.find(_self);
      if(iter!=result.end())
      {
        result.modify(iter,_self,[&](auto& surveyresult)
        {
          surveyresult.no1count = (selnum==1)?iter->no1count+1:iter->no1count;
          surveyresult.no2count = (selnum==2)?iter->no2count+1:iter->no2count;
          surveyresult.no3count = (selnum==3)?iter->no3count+1:iter->no3count;
          surveyresult.no4count = (selnum==4)?iter->no4count+1:iter->no4count;
        });
      }
      else
      {
        result.emplace(_self,[&](auto& surveyresult)
        {
          surveyresult.owner = _self;
          surveyresult.no1count = (selnum==1)?1:0;
          surveyresult.no2count = (selnum==2)?1:0;
          surveyresult.no3count = (selnum==3)?1:0;
          surveyresult.no4count = (selnum==4)?1:0;
        });
      }

Напишите добавление источника прямо над return; существующей функции добавления действия. Исходного кода может показаться много, но если таблицы результатов нет, то вставьте. Если есть таблица результатов, то модифицируйте. В случае emplace инициализирует начальное значение 1 или 0 в соответствии с selnum, которое является выбранным респондентом. В случае модификации измените существующее значение, добавив 1 в соответствии с selnum, которое является выбранным респондентом.

Наконец, действие для просмотра результатов. Это действие не обязательно является обязательным, поскольку в реальной ситуации мы можем просмотреть таблицу результатов непосредственно из сообщения eos.js или rpc.

void result()
    {
      _result result(_self,_self);
      uint64_t no1;
      uint64_t no2;
      uint64_t no3;
      uint64_t no4;
auto iter=result.find(_self);
      if(iter!=result.end())
      {
        no1=iter->no1count;
        no2=iter->no2count;
        no3=iter->no3count;
        no4=iter->no4count;
      }
      print("no1 : ",no1," no2 : ",no2," no3 : ",no3," no4 : ",no4);
return;
    }

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

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

Сначала напишите опрос.

Опрос зарегистрирован. Я проверил таблицу Surveycon, чтобы подтвердить данные.

С разрешения пользователя user1 выберите номер 4.

Ошибка произойдет, если вы выберете дубликат, или если учетная запись не та, которая указана для действия.

С разрешения пользователя user2 выберите номер 4.

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

Напоследок распечатайте результат.

Я просмотрел таблицу результатов опроса, чтобы проверить результат печати.

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

Исходный код этого поста не должен использоваться для фактического использования, потому что он был сделан в качестве примера, и поэтому многое было опущено и упрощено, чтобы упростить понимание кода. Фактический код должен быть разработан и реализован должным образом с точки зрения безопасности, стоимости и скорости. Спасибо за то, что следили за мной.

ITAM Games - блокчейн-платформа для прозрачной игровой экосистемы

Подпишитесь на ITAM Games и получайте самую свежую информацию.

Посетите Telegram ITAM Games, чтобы узнать о ITAM Games и Blockchain. Присоединяйтесь, перейдя по ссылке ниже! 👫

Сайт: https://itam.games
Telegram: https://t.me/itamgames