Радостно наблюдать, что на проекте появляются
удобные сервисы, предоставляющие дополнительный функционал (например, razumgolosa.com, reviews.steemul.ru).
В голове крутится множество идей по развитию сервисов на платформе голос,
но останавливает невозможность разграничения контента (если я ошибаюсь, поправьте).
Сейчас контент разграничивается тегами, причем, несмотря на возможность указания нескольких тегов, поиск можно вести только по одному. Это создаёт определённые проблемы.
Например, мы хотим сделать сервис оценки кулинарных рецептов на платформе голос. Понятно, что подобный функционал можно реализовать в виде обычных постов, но это будет не очень удобно. Если в рамках отдельного сервиса мы создадим тег #суперрецепт и будем фильтровать контент по нему, мы потеряем возможность использовать теги внутри сервиса. Т.к. нельзя будет одновременно искать(фильтровать) по #суперрецепт + #десерт.
API блокчейна, а именно все функции get_discussions_by_XXX позволяют фильтровать только по 1 тегу, т.е. это ограничение платформы. Несмотря на наличие поля filter_tags, т.к. по сути оно почти нигде не используется(в коде ноды) и фильтрации не происходит(проверено с помощью библиотеки steemjs).
Вот структура discussion_query, которая передаётся в функции в качестве аргумента и единственное упоминание filter_tags в коде функции validate
struct discussion_query {
void validate()const{
FC_ASSERT( filter_tags.find(tag) == filter_tags.end() ); // <- единственная проверка filter_tags
FC_ASSERT( limit <= 100 );
}
string tag;
uint32_t limit = 0;
set<string> filter_tags;
optional<string> start_author;
optional<string> start_permlink;
optional<string> parent_author;
optional<string> parent_permlink;
};
Какие я вижу решения?
- Самое простое - во все свои теги добавлять корневой тег, т.е.
#суперрецепт, #суперрецептдесерт, #суперрецептпервое и.т.д
Но если фильтрацию нужно вести по 3-4 тегам? #суперрецептдесертнапитки ? создавать всевозможные комбинации из тегов... смахивает на нездоровый костыль, хотя если будет фильтрация не больше чем по 2-м тегам, то вполне может быть. - Внести изменения в код ноды голоса, добить недописанный функционал filter_tags. И коннектиться не к wss://ws.golos.io, а к своей ноде. Однако, я не уверен, что такой хитрый вариант сработает.
В перспективе, если изменения будут действительно хорошими их можно будет добавить в очередной хардфорк, но это именно в перспективе, хотелось мы иметь работающее решение уже сейчас.
Хотелось бы услышать комментарии, особенно по пункту 2 от людей хорошо знакомых с блокчейном. Возможно, есть простой 3-ий вариант, о котором я не догадываюсь.
Тег сервиса в посте добавлять не обязательно. Обязательно записывать название приложения в json_metadata ('app': appname + '/' + appversion). Это лишит пользователя возможности, добавив вручную тег, постить из golos.io от лица другого сервиса и наоборот. Steemit и eSteem, уже используют, а Busy и SteepShot будут использовать этот стандарт для идентификации постов, сделанных конкретным приложением.
Это не решает описанную проблему фильтрации на уровне блокчейна, но если вносить изменения, то полезнее будет добавить фильтрацию по json_metadata['app'], чем дописывать filter_tags (что тоже не помешало бы).
идея хорошая, правда это получается ещё более сложное решение, т.к. без фильтрации на ноде по json_metadata это не имеет смысла... а в Steemit это реализовано на уровне блокчейна?
Получается такое же по сложности, потому что теги все равно лежат в json_metadata['tags'].
Steemit на сегодняшний день просто добавляет app в json_metadata при создании поста и больше ничего не делает.
appname и appversion не решит проблемы разграничения, поскольку ничего не мешает подглядеть версию, написать и отправить. Да, затруднит, но оставит шанс тем, кто целенаправленно хочет чего-то сломать. Единственный способ, который я пока нашел - это подпись метаданных секретным ключом. Если такая необходимость появится, то будет возможность включения проверки подписи по ключу. И вот тогда, точно никто со стороны писать не будет.
Мы тоже о таком думали. Можно добавлять в json_metadata какой-то хэш, уникальный для каждого сообщения, который только сервис может расшифровать и таким образом убедиться, что это точно сообщение, созданное сервисом.
Самое простое было запарсить блокчейн Голоса и работать как с обычной базой данных :))
www.mapala.net - сыровато еще, но на том и держится.
Там же еще дело такое, что теги русские не принимаются, т.е. по пункту 1 надо воротить что-то типа:
ru--superdesertru--superdesert -- гигантский костыль :)) если честно.
Дописать код - это замечательно, но что если нужно доставать/фильтровать данные не по тегу, а по любой другой записи в мета? Например, по цене за товар.
а как запарсить весь блокчейн? как следить за изменениями более менее понятно, есть уже готовые сервисы. А вот как спарсить то что уже есть? у функций get_discussions_by_XXX есть ограничение на 100 постов ( FC_ASSERT( limit <= 100 ); ) его как то можно обойти или есть другие функции или можно напрямую читать блокчейн минуя API ?
Блокчейн парсится поблочно, начиная с любого блока, есть такая штука в API - get_block. Каждый блок содержит информацию о произошедшей транзакции, как минимум, с автором и прямой ссылкой на его статью. После получения информации о произведенной транзакции, можно получить полные данные о статье запросом get_content(author, permlink). Все возвращаемые данные записываем в базу.
get_discussions_by_XXX -- не используется вообще.
Теги анализируются при разборе блока, все они записаны в поле metadata['tags'].
Какие есть готовые сервисы для наблюдения? Очень интересно)
я вот такой знаю steemitpond.
Он для steemit-а, но можно легко переделать под голос. Хотя наверно там идея та же - get_block. Код я не смотрел.
Сейчас за фильтрацию отвечает нода?
Тогда надо просто сделать функцию, которая будет фильтровать по нескольким тегам.
Не думаю, что это что-то мудреное.
По мне так интерфейс Голоса должен быть сделан в виде обширной древовидной структуры с множественными вложениями по тематикам, как папки на жестком диске. Иногда человек ищет что-то, а теги правильные подобрать не может, а в древе он идет от корня основной темы в глубь.
Те или иные новые вложенные подтемы в древе, наверное, должны появляться после одобрения сообществом.
@synergen, перелогинься :D
Нет нормального способа фильтровать по тэгам сразу из блокчейна. @dark.sun верно говорит, самый удобный способ -- обрабатывать события на блокчейне и записывать в SQL базу данных.
@andrey.dev Поздравляю! Вы получили личную награду!
С Днём Рождения - 2 лет на Голосе
Вы можете нажать на бейдж, чтобы увидеть свою страницу на Доске Почета.
Приветствую Вас на платформе Голос!
Я бот @radogost и меня создали для того, чтобы приветствовать новичков и
помогать им осваиваться на просторах Голоса.
Если вы ещё мало знаете о платформе Голос, то рекомендую ознакомиться со
следующими материалами:
Основы оформления постов на Голосе + полный курс по работе с Markdown
Что такое токены Голос, Сила Голоса и Золотой Видео
Я здесь впервые
Как пользоваться платформой Голос?
Вознаграждение на Голосе: кому и сколько
Как создать пост на платформе Голос?
Если у вас есть конкретные вопросы, то можете задать их в комментарии к этому сообщению и я Вам обязательно отвечу.