Custom_json транзакции: для чего, идеи использования и как сделать разработчикам к ним доступ легче


Здравствуйте. Я, кажется, когда-то писал про то, что у нас мало используются custom_json транзакции. Расскажу, что это такое, что они позволяют делать и как улучшить ситуацию в плане использования и предложу несколько идей реализации.

Что такое custom_json транзакции

Это такой вид транзакций, где могут быть любые данные, представленные в JSON формате. Приведу операцию в get_account_history @hipster за то, что в его аккаунте был пример:

        "custom_json",
        {
          "required_auths": [],
          "required_posting_auths": [
            "hipster"
          ],
          "id": "follow",
          "json": "["follow\",{"follower":"hipster\","following":"someguy123\","what":["blog"]}]"
        }

Также пример от @xtar, который покажет вам, что не только подписку с их помощью можно делать:

        "custom_json",
        {
          "required_auths": [],
          "required_posting_auths": [
            "xtar"
          ],
          "id": "bookchain",
          "json": "{"bookchain":{"operations":[{"name":"book\","op":"create\","fields":{"book_id":1,"book_author":"автор\","book_form":"sti\","book_main_genre":"poe\","book_more_genres":"lir\","book_tags":"tag\","book_title":"Title\","book_description":"Descr"}}],"signature":"HxxSI6I0ZOGexF1J1iOMKqS6O5BDpebTLGWEu72XjJ4eR8ynvAxUGoEJO9skfi7csicyKd\\/o1CZkxp4hRFOpWY0="}}"
        }
    Здесь написано, что JSON bookchain, действие - создание, поля:

"book_id" (Id книги):1,"book_author":"автор\","book_form":"sti\","book_main_genre":"poe\" (Жанр книги),"book_more_genres":"lir\", (Прочие жанры)"book_tags":"tag\", (Теги книги)"book_title":"Title\" (Заголовок книги, её название),"book_description":"Descr" (Описание)

То есть можно делать с их помощью всё, что угодно. Но о сложностях использования расскажу чуть позже.

Предлагаемые идеи:

  1. Можно сделать Custom_json операцию создания пользователя, а затем выводить список пользователей, авторизовывать их, проверяя публичные ключи, прописанные в JSON. В результате получим свою систему пользователей, которая не будет зависить от пользователей блокчейна, что позволит, например, сделать бесплатные регистрации, сохранив открытость и децентрализацию;
  2. Можно товары/услуги добавлять в виде постов, а можно - в виде custom_json, а затем выводить их;
  3. Можно при помощи custom_json добавлять какую-то статистику, например, курса GOLOS, а затем выборку делать из блокчейна, а не из базы данных, которая ненадёжна;
  4. Можно сделать каталог файлов, хранящихся в IPFS. Одним из полей будет ipfs_address, которое будет содержать адрес файла в сети IPFS;
  5. Можно сохранять свои заметки в зашифрованном виде, которые сможете прочитать только вы, авторизовавшись при помощи одного из ключей. Это позволит не засорять ленту закрытыми записями, но при этом хранить свои мысли децентрализовано, и поломки различные, глюки или удаления случайные вам будут не страшны.

Можно придумать многое другое. Давайте покажу пример создания custom_json транзакции с вашей заметкой. Правда шифрованием заниматься не будем, но если захотите, думаю найдёте, как это сделать (Сам пока этим не интересовался).

Создаём custom_json транзакцию с заметкой:

Для custom_json у нас есть broadcast golos.broadcast.customJson. Вот пример кода:

var wif = '5key' // Ваш ключ
var requiredAuths = ''; // Чаще всего пустой
var requiredPostingAuths = 'denis-skripnik'; // Укажу свой логин, так как транзакцию делаю я;
var id = 'notes';
                const json = JSON.stringify(
                    ["notes", {
operations: {
name: "note",
op:"create",
fields: {
note_id: 1,
note_tags: ["жизнь", "планы" ,"День"],
note_title:"Сделать завтра",
note_text: "Написать пост."
}
                    }
                    }]
                )

golos.broadcast.customJson(wif, requiredAuths, requiredPostingAuths, id, json, function(err, result) {
  console.log(err, result);
});

Здесь я сделал заметку с id 1, тегом "жизнь", заголовком ""Сделать завтра" и текстом "Написать пост".

Вот что я нашёл в истории своего аккаунта. Если вам тоже интересно, вот ссылка: http://ropox.tools/steemjs/api/account_history/get_account_history?blockchain=Golos.io&ws=wss%3A%2F%2Fws.golos.io&account=denis-skripnik&from%3D-1=-1&limit%3D100=10000&query%3D%7B%7D=%7B%22select_ops%22%3A%5B%22custom_json%22%5D%7D. А вот код:

  [
    83944,
    {
      "trx_id": "dc6a5bb068c565322481557e5e61c01285f98038",
      "block": 20094787,
      "trx_in_block": 2,
      "op_in_trx": 0,
      "virtual_op": 0,
      "timestamp": "2018-09-18T18:52:03",
      "op": [
        "custom_json",
        {
          "required_auths": [],
          "required_posting_auths": [
            "denis-skripnik"
          ],
          "id": "notes",
          "json": "["notes\",{"operations":{"name":"note\","op":"create\","fields":{"note_id":1,"note_tags":["жизнь\","планы\","День"],"note_title":"Сделать завтра\","note_text":"Написать пост."}}}]"
        }
      ]
    }
  ]
]

Методы получения custom_json:

  1. Собирать в свою базу все операции, распределяя по таблицам. Так можно найти нужные нам custom_json операции и добавить в базу данных;
  2. Используя get_account_history с таким кодом в query:
    {"select_ops":["custom_json"]}

Больше вариантов я не знаю. Если они есть, буду рад увидеть комментарии от знающих.

Предложение:

Очень не хватает метода API get_custom_json, который бы по id выводил список транзакций.
Примерный вариант:

golos.api.get_custom_json(id, limit, function(err, result) {
console.log(err, result);
});

Выводит custom_json по id. Можно ещё добавить автора (То, что идёт из requiredPostingAuths:

golos.api.get_custom_json(id, requiredPostingAuths, limit, function(err, result) {
console.log(err, result);
});

Надеюсь, понятно. Был бы рад увидеть сей функционал в @viz.world и Golos.

А пока:

  1. Создаём приложение с custom_json транзакциями;
  2. Получаем список пользователей;
  3. Обращаемся к их аккаунтам через get_account_history с фильтром операций;
  4. Выделяем то, что нам нужно: созданные нашим приложением custom_json операции;
  5. Закидываем их в базу данных и выводим на страницах.

Всё

Надеюсь, пост был интересен и полезен. Буду рад комментариям и репостам.


Comments 7


@denis-skripnik Давно жду, когда торренты в Голосе запилят на кастом-json

18.09.2018 20:42
0

А почему не в виде постов? Когда-то создавали локальный Клиент, где 1 пост = 1 торрент, и был тег, по которому это всё фильтровалось.

18.09.2018 22:54
0

@denis-skripnik Денис, спасибо! Ответил на мой вопрос к VIZ про то, как своё магаз игровых айтемов завести на БЧ...

PS: фунелюблю имена полей с underscore в JSON. Кажись это не канонично для JSON.

20.09.2018 11:08
0

Пожалуйста. Думал, что это просто понять. Но как по мне, делать базу данных из операций - это непросто, да ещё и трудоёмко для ресурсов сервера (Много перативки и диска должно быть).
Поэтому хочу метод для отображения.
Хотя склоняюсь к тому, чтобы тоже в своих сервисах складывать операции из БЧ в БД.

Не знал, что не канонично. Благодарю.

20.09.2018 11:26
0

Вот первый попавшийся ишуй на гитхаб

Суть в том, что если есть underscore в ключах, то скорее всего будут проблемы при прямой десериализации.
Если же в качестве ключей юзать camelCase, то все вопросы по поводу "как сериализовать" сразу отпадают.

28.09.2018 14:05
0

Это вообще не про Голос или Стим.

28.09.2018 14:50
0