Уважаемые пользователи Голос!
Сайт доступен в режиме «чтение» до сентября 2020 года. Операции с токенами Golos, Cyber можно проводить, используя альтернативные клиенты или через эксплорер Cyberway. Подробности здесь: https://golos.io/@goloscore/operacii-s-tokenami-golos-cyber-1594822432061
С уважением, команда “Голос”
GOLOS
RU
EN
UA
goloscore
5 лет назад

Кошелек golos_wallet для Bittrex на платформе CyberWay

Примечание: предлагаем делегатам @vik, @arcange, @ropox, @primus, @on0tole, @anyx, @kuna, @xtar, @yudina-cat, @stihi-io, @kulturagolosa, @vvk, @denis-skripnik, @testz, @steepshot, @semasping, @dmilash, @xanoxt и всем пользователям, заинтересованным в поддержке Голоса, поделиться своими предложениями относительно кошелька в комментариях к данному посту.

Аннотация

Настоящее описание кошелька golos_wallet предназначено для разработчиков платформы CyberWay, приложений платформы CyberWay, а также пользователей блокчейна Golos, заинтересованных в поддержке и сопровождении приложения Golos на платформе CyberWay.

1. Функциональные возможности cli_wallet блокчейна Голос

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

Приложение cli_wallet можно вызвать в режиме демона, задав в командной строке опцию –rpc-endpoint. При запуске в таком режиме cli_wallet обрабатывает json-rpc запросы. Ответы cli_wallet формирует также в формате JSON.

2. Необходимость в разработке нового кошелька для платформы CyberWay

Основное направление биржи криптовалют Bittrex — покупка и продажа криптовалют. Биржа Bittrex хранит данные аккаунтов и их балансов в своей собственной базе пользователей. Для взаимодействия с различными блокчейнами Bittrex адаптирует свое программное обеспечение. В частности, Bittrex взаимодействует с блокчейнами, созданными на базе логики Steemit, через приложение cli_wallet. Для поддержки интерфейса с приложением cli_wallet биржа Bittrex использует специальную оболочку, собственной разработки.

Приложение cli_wallet является оберткой вокруг библиотек блокчейна Голос. Адаптирование данного приложения под блокчейн другой архитектуры (например, по CyberWay) не представляется возможным.

Кошелек cleos, являющийся кошельком блокчейна CyberWay, архитектурно реализован по другому. Данный кошелек должен быть универсальным для всех приложений блокчейна CyberWay и встраивание в него протокола (аналогичного cli_wallet) для отдельного приложения может вызвать проблемы в будущем . Поэтому адаптирование кошелька cleos, в силу архитектуры самого блокчейна CyberWay, под протокол cli_wallet также является технически сложным решением.

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

3. Требования к новому кошельку для платформы CyberWay

Новый кошелек (далее — golos_wallet), обеспечивающий взаимодействие биржи Bittrex с приложением Голос на платформе CyberWay, должен удовлетворять следующим требованиям:
— интерфейс кошелька golos_wallet с Bittrex должен соответствовать интерфейсу cli_wallet с Bittrex;
— интерфейс с пользователем должен быть сохранен. Несмотря на то, что смарт-контракты и кошелек будут взаимодействовать по другим транзакциям, пользователь не должен почувствовать различие в формировании запроса;
— кошелек golos_wallet должен обеспечить поддержку фильтра для получения истории транзакций;
— кошелек golos_wallet должен обеспечивать прием, обработку запросов с выдачей результата в соответствии с форматом JSON;
— кошелек golos_wallet должен функционировать в режиме удаленного вызова с использованием API.

В первой версии блокчейна CyberWay приложение golos_wallet должно поддерживать перечень операций, приведенных в разделе 6 (поддержка остальных операций в первой версии CyberWay не предусмотрена).

4. Описание технического решения

Кошелек golos_wallet реализован в виде приложения, содержащего набор скриптов на nodejs. Логика приложения представляет собой эмуляцию кошелька cli_wallet. Также как и в cli_wallet запросы от Bittrex в формате JSON поступают на rpc-порт (англ. remote procedure call). Запрос содержит необходимый массив параметров для выполнения конкретной операции. Операции выполняются так, как если бы их выполнение было в консоли.
Кошелек cli_wallet можно использовать через отправление API-запроса на rpc-порт. Выполнение происходит в автоматизированном режиме.
Для хранения информации о транзакциях с трансферными операциями база данных Mongo дополнена таблицей истории транзакций.

Структурная схема взаимодействия Bittrex с приложениями cli_wallet и golos_wallet, а также взаимодействие golos_wallet с компонентами узлов блокчейна приведена на рис. 1.


Рис. 1 — Структурная схема взаимодействия Bittrex с кошельками cli_wallet и golos_wallet

В верхней части схемы (выделено красной пунктирной линией) показано взаимодействие cli_wallet с Bittrex и с демоном блокчейна Голоса (Golosd). Нижняя часть схемы представляет техническое решение реализации кошелька golos_wallet на блокчейне CyberWay. Выделенные части схемы в красном — новые компоненты CyberWay, реализующие кошелек.

Приложение golos_wallet принимает запрос и формирует транзакцию с трансферами. Сформированная транзакция передается на один из сервисов nodeos, где она проверяется на валидность. В сервисе nodeos размещается событийная модель (от англ. event engine), которая генерирует события. На его вход из сети поступают блоки и транзакции. Выполняется анализ их содержимого (от англ. parsing), формируются события и мета-блок, куда помещается вся результирующая информация.

Приложение golos_wallet получает от компонента nodeos сформированный мета-блок через порт ЕЕ — представляющий собой плагин узла (ноды) CyberWay, который формирует пакеты в формате JSON и рассылает их своим подписчикам. Логика golos_wallet выделяет из получаемого мета-блока только данные о трансферах и сохраняет их в БД в таблице истории транзакций. (Следует заметить, что сформированная транзакция с трансферной операцией сохраняется в истории не сразу, а только после того, как она отправится в сеть и появится в одном из блоков, подписанным блок-продюсером. Последнее будет означать, что данная транзакция валидная может быть сохранена в истории). Для Bittrex важна информация о транзакциях с трансферными операциями, включенными в конкретные блоки и сохраненными в истории транзакций. Bittrex через кошелек периодически обращается в историю транзакций для получения информации о выполненных трансферах.

5. Описание операции transfer с использованием golos_wallet

Биржа Bittrex предоставляет возможность пользователю обменять токены одного блокчейна на токены другого блокчейна, а также совершить обмен токенов блокчейна на другую криптовалюту (например, на биткоины). Для выполнения трансферной операции пользователь заходит на веб-сайт Bittrex и создает операцию на перевод средств со своего кошелька на кошелек Bittrex, указав в транзакции свой ключ. Логика bittrex формирует запрос вида transfer с указанием имени аккаунта, количества переводимых средств. Запрос поступает на rpc-порт кошелька golos_wallet. В кошельке формируется транзакция с операцией transfer, именем аккаунта и его подписью. Сформированная транзакция отправляется в компонент nodeos, где выполняется базовая проверка данных, в том числе проверка на существование аккаунта и на совпадение подписи. Необходимую информацию для выполнения проверки компонент nodeos получает из БД состояния системы.

Как только в порт ЕЕ компонента nodeos отправится сформированный мета-блок, содержащий транзакцию с операцией transfer, приложение golos_wallet выделит из него информацию о транзакции, блоке, в котором она находится, и сохранит полученные данные таблице истории транзакций.

Для контроля всех трансферных операций биржа Bittrex через golos_wallet периодически обращается в БД (mongo) для получения истории транзакций. По указанному ключу в транзакции биржа Bittrex в своей базе пользователей определяет имя аккаунта, от которого поступили средства на баланс биржи.

6. Операции, поддерживаемые кошельком golos_wallet в первом релизе CyberWay

6.1. Операция info

Операция info используется для получения информации о блоке. Сигнатура операции имеет вид:

variant wallet_api::info()const 

Операция info не имеет входных параметров. Перечень получаемой информации:
virtual_supply — виртуальный запас;
current_supply — текущий запас;
verage_block_size — средний размер блока;
maximum_block_size — максимальный размер блока;
last_irreversible_block_num — последний необратимый номер блока;
hardfork_version — версия блокчейна;
head_block_num — актуальный номер блока;
head_block_id — идентификатор блока;
head_block_age — время жизни блока (в секундах).

6.2. Операция transfer

Операция transfer используется для перевода средств с кошелька одного аккаунта в кошелек другого. Сигнатура операции имеет вид:

annotated_signed_transaction wallet_api::transfer(
string from,
string to,
asset amount,
string memo,
bool broadcast
)

Параметры:
from — имя аккаунта, с кошелька которого будут переводиться средства;
to — имя аккаунта, в кошелек которого будут переводиться средства;
amount — сумма переводимых средств;
memo — запись в транзакции, зашифрованная публичным ключом «memo»;
broadcast — «true», если транзакция пересылается на демон.

6.3. Операция list_accounts

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

vector< account_name_type > wallet_api::list_accounts(
const string& lowerbound,
uint32_t limit
) 

Параметры:
lowerbound — имя первого возвращаемого аккаунта. Если такое имя отсутствует, список будет начинаться с имени, непосредственно следующего за lowerbound;
limit — значение, ограничивающее количество выводимых на монитор имен аккаунтов. Максимальное значение — 1000.

Задание параметров lowerbound и limit позволяет формировать страницу в удобном для просмотра виде. Для просмотра всего списка имен аккаунтов рекомендуется вначале значение lowerbound устанавливать в виде пустой строки (“”). Затем на каждой итерации параметру lowerbound передавать последнее возвращаемое имя аккаунта для следующего вызова list_accaunt().
Возвращает список всех зарегистрированных в блокчейне имен аккаунтов с соответствующими им идентификаторами. Список отсортирован по именам в алфавитном порядке.

6.4. Операция list_my_accounts

Операция list_my_accounts используется для получения информации об аккаунтах с помощью личного ключа, имеющегося в кошельке. Кошелек должен быть предварительно разблокирован. Операция не имеет входных параметров. Сигнатура операции имеет вид:

vector< golos::api::account_api_object > wallet_api::list_my_accounts() 

6.5. Операция import_key

Операция import_key используется для импорта личного ключа в формате WIF в кошелек для его дальнейшего использования аккаунтом при подписании транзакций. Сигнатура операции имеет вид:

bool import_key(string wif_key) 

Параметр:
wif_key — личный ключ в формате WIF.

Пример использования операции:

import_key 5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3

6.6. Операция get_account_history()

Операция get_account_history используется для получения истории транзакций для аккаунта. Сигнатура операции имеет вид:

map< uint32_t, golos::plugins::operation_history::applied_operation >
wallet_api::get_account_history(
        string account,
        uint32_t from,
        uint32_t limit
)  

Параметры:
account — имя аккаунта, история которого запрашивается;
from — порядковый номер операции. Параметр является произвольным, по умолчанию принимает значение «-1» — последний номер операции;
limit — максимальное количество запрашиваемых операций. Принимает целочисленное значение от 0 до 1000. Параметр является произвольным, по умолчанию принимает значение «100».

Пример вызова операции get_account_history:

get_account_history cyberfounder -1 100

6.7. Операция filter_account_history

Операция filter_account_history используется для получения истории транзакций для аккаунта, отфильтрованной по определенным признакам. Сигнатура операции имеет вид:

history_operations filter_account_history(
string account,
uint32_t from,
uint32_t limit,
account_history_query query
)

Параметры:
account — имя аккаунта, история которого запрашивается;
from — порядковый номер запрашиваемых операций. Параметр является произвольным, по умолчанию принимает значение «-1» — последний номер операции;
limit — максимальное количество запрашиваемых операций. Принимает целочисленное значение от 0 до 1000. Параметр является произвольным, по умолчанию принимает значение «100»;
query — параметр в виде структуры, содержащей признаки, по которым выполняется фильтрация. Содержит следующие поля:
select_ops — перечень операций, которые необходимо получить. Значение может содержать имена операций (в том числе оканчивающие на «_operation»), а также ключевые слова:
* ALL — все операции;
* REAL — только операции явно заданные;
* VIRTUAL — только виртуальные операции;
filter_ops — перечень операций, которые следует исключить. Принимает те же значения, что и select_ops. Это поле является произвольным и по умолчанию принимает значение пусто;
direction — «направление» операции относительно аккаунта (например, операция vote определяет двух аккаунтов: того, кто голосует и того, за чей пост голосуют). Это поле является произвольным и принимает следующие значения:
* any — отсутствие направления фильтрации (значение по умолчанию);
* sender — характеризует аккаунта как отправителя (например, creator или voter);
* receiver— характеризует аккаунта как получателя (например, created или voted);
* dual — характеризует аккаунта как отправителя и получателя одновременно (например, voting self post или операция неоднозначно определяющая аккаунта).

Операция может быть вызвана с одним заданным параметром (например, filter_account_history(account)) для получения 100 последних операций аккаунта.

Примеры вызова filter_account_history():

filter_account_history cyberfounder -1 100 {"select_ops":["REAL","interest"], "filter_ops":["transfer"]}

filter_account_history cyberfounder -1 100 {"direction":"receiver","filter_ops":["producer_reward"]}

7. Заключение

Результаты прогона golos_wallet в тестовом режиме на операциях, изложенными в разделе 6, показали, что реализованное техническое решение обеспечивает функционирование golos_wallet в соответствии с требованиями раздела 3.

Каналы коммуникации с Golos•Core

  • https://t.me/goloscoretc (решение технических вопросов, связанных с работой блокчейн, нод, api и др.)
  • https://t.me/joinchat/BLwf_A118xQ57nsM1Q4MPA (канал для вноса предложений от комьюнити, обсуждение перехода на кодовую базу EOS)
  • https://t.me/golos_tools (решение вопросов по различным интерфейсам и дополнительным инструментам, создаваемым Golos•Core)
  • https://t.me/goloscore_analytics (решение вопросов по работе экономики блокчейн, статистическим экономическим данным, аналитике данных)
  • https://t.me/goloscoretech (новостной канал, с актуальной информацией от Golos•Core)

Мы будем очень рады, если вы поддержите делегата @goloscore. Заходите на страничку https://golos.io/~witnesses голосуйте за делегата Golos•Core!
Спасибо за внимание и хорошего дня!

С уважением,

Команда Golos•Core: @andreypf, @korpusenko, @maslenitsa, @muhazokotuha, @zxcat, @annaeq, @anazarov79, @kaynarov, @s-medvedev, @eugin, @dedbaraded, @jimak.

7
224.025 GOLOS
На Golos с August 2017
Комментарии (42)
Сортировать по:
Сначала старые