Skip to content
Exchange for Viz, Golos, Steem and Whaleshares blockchain
Branch: master
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
js_modules
.gitattributes
500_ops_test.js
README.md
config.json
exchange.js
package-lock.json
package.json

README.md

VIZ-exchange

Обменник для VIZ, STEEM, GOLOS и Whaleshares. Поддерживаются все направления. Opensource.

Функционал:

  1. Поддержка четырёх блокчейнов с возможностью увеличения их количества.
  2. Все настройки находятся в config.json – трогать javascript код не придётся;
  3. Направления: VIZ/Golos, Golos/VIZ, VIZ/Steem, Steem/VIZ, VIZ/Whaleshares, Whaleshares/VIZ, Golos/Steem, Steem/Golos, Golos/Whaleshares, Whaleshares/Golos, Steem/Whaleshares, Whaleshares/Steem. Направления с некоторыми блокчейнами могут быть недоступны, если эти блокчейны имеют статус активности false.
  4. Курс обмена привязан к VIZ и выставляется в каждом блокчейне в json файле. Например, в Golos указан курс 0,5, т.к. 1 Golos = 0,5 VIZ, но эти значения можно изменить.
  5. Курс обмена в парах, где отсутствует VIZ, рассчитывается исходя из цены каждого из этих двух токенов к VIZ.
  6. Поддерживаются только токены Golos, Steem, WLS, VIZ. Токены SBD и GBG не поддерживаются.
  7. Стабильность. В случае выключения скрипта или его перезагрузки все необработанные блоки и непроверенные переводы сохранятся, а парсинг блоков начнётся от последнего обработанного.
  8. Проверка всех действий. Если перевод не дошёл (например, из-за отклонённого блока), он будет проведён ещё раз.
  9. Надёжность. На этапе тестирования были отправлены переводы с различными ошибками: с указанием неверных memo, с суммой, превышающей количество токенов на балансе аккаунта-отправителя и с несуществующим аккаунтом в блокчейне-получателе. Во всех случаях средства были успешно возвращены отправителю. Тестовые переводы с нормальными параметрами, в том числе 500 переводов одной транзакцией, прошли успешно.
  10. Возможность заработка. Вы можете указать желаемую комиссию, и пользователю будет переводиться сумма за вычетом этой комиссии.
  11. VIZ-exchange имеет открытый код и полностью бесплатен.
  12. В описании аккаунта (metadata.profile.about) можно увидеть курсы обмена токенов, а также максимально возможное количество токенов для обмена. Например, в аккаунте на Голосе может отображаться, что вы можете обменять 1 Golos на VIZ, 2 Golos на Steem и 5 Golos на Whaleshares при курсе к VIZ 0,5 и к Steem 0,33 (рассчитывается на основе курса Golos/VIZ и Steem/VIZ). При этом максимально возможное количество токенов для обмена указывается с учётом этих курсов, т.е. если вы видите, что можете обменять на VIZ максимум 1 Golos и курс 0,5, значит ваш баланс в VIZ составляет 0,5. Если балансы в других блокчейнах не изменялись, обновление информации происходить не будет. То есть, если в блокчейнах VIZ и Steem балансы не изменялись, и вы не меняли курс или комиссию, на Голосе описание останется прежним.
  13. Вы можете изменить статус блокчейна на false, тогда направления обмена с ним будут недоступны, и информация добавляться не будет.

Правила обмена:

  1. Пользователь узнаёт аккаунт шлюза.
  2. Производит перевод любой суммы (в пределах суммы, которая есть у него на балансе) на аккаунт шлюза с указанием memo в следующем формате: blockchain:login. Пример: VIZ:denis-skripnik. Это значит, что происходит обмен токенов другого блокчейна на VIZ, при этом токены VIZ будут зачислены на баланс аккаунта denis-skripnik. Обратите внимание, что VIZ в данном случае – не токен, а блокчейн. То есть, если пользователь отправит перевод с memo wls:login, средства вернутся, поскольку надо писать не wls, а whaleshares.
  3. Если при переводе будет допущена какая-то ошибка, средства будут возвращены ответным переводом, при этом ошибка будет указана в memo. При корректной отправке перевода на указанный аккаунт будет зачислена сумма в нужном токене. При этом в memo будет содержаться сообщение об успешном обмене, а также будут указаны логин шлюза, курс обмена и комиссия.

работа с config.json:

Сейчас здесь можно увидеть 4 раздела в соответствии с названиями блокчейнов: VIZ, Golos, Steem, Whaleshares. В каждом из этих разделов в первой строке прописан параметр active. При установке значения true (без кавычек) блокчейн будет активен, при установке значения false – неактивен. Далее прописано название токена (у VIZ это "token": "VIZ"). В следующей строке прописано название библиотеки (у VIZ это VIZ-js-lib). Далее прописан адрес паблик-Ноды: параметр node. В трёх следующих строках прописаны логин "login", постинг ключ "posting_key" (для обновления информации об аккаунте) и активный ключ "active_key" (для переводов). Все три параметра обязательно нужно указывать, заменив в значениях user на логин, 5j на постинг ключ, 5k на активный ключ. Параметр how_to_VIZ указывает, сколько VIZ сможет получить пользователь при переводе 1 токена. Например, у VIZ это 1, а у Golos – 0,5. Данные значения указаны по умолчанию для примера, вы можете их изменить. Параметр fee – это процент комиссии (по умолчанию 0). Указывается без знака процента. Данные параметры прописываются таким же образом во всех секциях config.json (VIZ, Golos, Steem, Whaleshares).

Установка:

  1. В папке, где вы хотите видеть VIZ-exchange, выполняете: git clone https://github.com/denis-skripnik/VIZ-exchange.
  2. Переходите в папку шлюза: cd VIZ-exchange.
  3. Правите config файл (см. информацию выше).
  4. Запускаете: node exchange или pm2 start exchange.js.

Для работы в фоновом режиме (чтобы вы могли закрыть окно консоли) необходимо использовать pm2. Он устанавливается командой: sudo npm install pm2 -g


Концепция множества частных шлюзов.

Каждый пользователь имеет своё мнение по поводу того, какова стоимость того или иного токена. Как вариант, можно разместить заявку на биржах, однако проблема в том, что обычно пользователи блокчейнов пользуются разными биржами (кто-то одной, кто-то другой). Создав шлюз при помощи VIZ-exchange, вы повысите шансы найти покупателя или продавца нужного токена в соответствии с вашим видением цены.

Технические детали.

Используемые технологии:

  1. node.js.
  2. Файловая база данных nedb.
  3. VIZ-js-lib, Golos-js, Steem, wlsjs – библиотеки блокчейнов.
  4. Код модульный.

Структура папок и файлов:

  1. В корневой папке находится основной файл exchange.js. Здесь подключаются модуль обновления информации об аккаунте update_accounts, модуль получения блоков blocks-generator и helpers – модуль с методами-помощниками (например, sleep приостанавливает выполнение на определённое время). Также здесь подключается methods – модуль с методами api и broadcast блокчейнов, trxdb – модуль, работающий с базой данных транзакций, conf – подключение config.json. Кроме того, на базе содержимого config файла составляется массив со списком блокчейнов; прописывается функция вызова метода, получающего блоки, в цикле блокчейнов – это позволяет работать с блоками всех добавленных блокчейнов. Функция workingTrx работает с транзакциями, добавленными в базу данных, и проверяет их наличие каждые 1,5 минуты. Ниже вызывается метод обновления аккаунтов из модуля update_accounts каждые 3 секунды.
  2. package.json и package-lock.json – два файла, в которых прописаны используемые npm модули.
  3. 500_ops_test.js – файл, в котором тестируется отправка 500 переводов в одной транзакции. Для его работоспособности необходимо изменить значения параметров login и wif (активный ключ) соответственно с name и 5k на свои значения.
  4. В папке databases после запуска шлюза находятся 5 баз данных: Golos_block.db, Steem_block.db, VIZ_block.db, Whaleshares_block.db и trxs.db. Первые 4 содержат последний/ие блоки соответствующих блокчейнов, а последняя – транзакции с переводом, которые необходимо проверить. Структура баз данных блоков – это объекты, содержащие last_block со значением в виде номера блока и _id – уникальный идентификатор объекта в базе. База с транзакциями содержит номер транзакции, аккаунты отправителя и получателе перевода, сумму с токеном (например, "1,000 Golos") и memo.
  5. Папка js_modules: 5.1. blocksdb.js – это файл, работающий с базой данных блоков. Здесь прописаны метод получения последнего блока (аргументами являются название блокчейна и номер последнего необратимого блока; если ответ будет пустым, происходит возврат), который называется getBlock, а также метод обновления объекта, содержащего последний блок (updateBlock). 5.2. Файл blocks-generator.js – сама генерация блоков. Здесь подключается модуль x2y, в котором производится просмотр операций блока, а также работа с ними, если они являются переводами, и в memo нет определённых текстов, которые прописаны в условии; helpers – различные помощники (например, приостановка работы скрипта); methods – методы блокчейнов, bdb – файл работы с базой данных блоков. Также прописаны константы LONG_DELAY и SHORT_DELAY, которые содержат значения 12000 и 3000. Они отвечают за длительность паузы в случае ошибки. Ниже расположена функция generate с именем блокчейна в аргументах. Здесь происходит получение последнего необратимого блока, получение блока из базы chain_blocks.db (где chain – имя блокчейна), а также запускается цикл прохождения по блокам. Если в базе нет блока, цикл запускается от последнего необратимого, а если есть – от находящегося в БД. Если во время цикла блок > необратимого, происходит приостановка на delay секунд и повторно вызывается получение параметров блокчейна. Если bn < необратимого, происходит проверка: если 0 < количества успешных операций, delay = 3000 мс, а иначе – delay = 12000. Также в этом случае номер блока увеличивается на 1, и происходит обновление в базе данных. Весь код цикла обёрнут в try/catch. Если обнаружена ошибка (catch), она выводится на экран, и происходит приостановка цикла на 1 секунду. 5.3. helpers.js – модуль с методами-помощниками: unixTime (получение текущего времени в unixtime формате), sleep (приостановка), nowDateTime (получение текущей даты и времени в понятном строковом формате). 5.4. methods.js: вызывается config файл и происходит добавление библиотек блокчейнов по циклу. Кроме того, получается из config файла и устанавливается адрес паблик-Нод. getOpsInBlock – получает операции в блоке, требует указания названия блокчейна и номера блока. getAccount – для getAccounts. Принимает название блокчейна и один (не несколько) логин. getProps – getDynamicGlobalProperties. Требуется указать только название блокчейна. accountUpdate – обновление информации. Принимает название блокчейна, логин, активный ключ, memo (публичный ключ) и строку с сообщением информации об аккаунте. transfer – перевод с использованием подписи транзакции и отправки при помощи api.broadcastTransactionSyncrenise. Требуется указать название блокчейна, активный ключ, логин (от кого), кому, сумму и memo. getBlockHeader – используется для получения даты последнего необратимого блока без данных блока. Принимает название блокчейна, block_num. getTransaction – получение транзакции: блокчейн, id транзакции. 5.5. transactionsdb.js – файл работы с базой транзакций. Содержит методы добавления транзакции, удаления, обновления и получения транзакции старше определённого времени. По поводу последнего: берётся текущее время, вычитается 90 секунд, указывается в методе получения списка транзакций старше этого времени. 5.6. update_accounts.js – модуль обновления информации в аккаунтах. Здесь подключаются модули helpers для вывода текущей даты и времени в нормальном виде, а также methods и config файл. Единственный метод тут – это updateAccounts. Перед ним формируется массив msg_strings, который содержит старые варианты строк (необходимо для сравнения с новым). Далее происходит цикл в цикле – в первом и во втором происходит проход по блокчейнам, при этом второй цикл выполняется при каждой итерации первого. В первом проверяется активный статус блокчейна, указывается токен, а также начала строк вывода информации о количестве токенов на балансе аккаунта и курсах обмена. Во втором проверяется активность блокчейна, а также то, что он не совпадает с блокчейном из первого цикла. Далее отображается курс токена блокчейна из первого цикла к токену блокчейна из второго цикла, название токена текущего блокчейна. Отображается информация об аккаунте шлюза блокчейна из второго цикла и записывается в переменную баланс этого аккаунта. Также записывается в специальную переменную значение комиссии, рассчитывается её величина в токенах, после чего эта сумма вычитается из баланса аккаунта. Затем итоговая сумма округляется до 3 знаков после запятой. Также во втором цикле указывается строка для количества токенов на балансе аккаунтов с конкретными данными по текущему блокчейну, а также строка с курсом токена первого цикла к токену второго. Обе заканчиваются запятой (последняя убирается после дочернего цикла). На этом второй цикл заканчивается, и происходит проверка на совпадения старой строки с новой. Если они отличаются, происходит формирование новой строки и её отправка в блокчейн. В конце происходит очистка msg_strings с последующим добавлением текущих значений. Всё. 5.7. x2y.js – модуль, в котором происходит обработка блока: Просмотр операций (функция processBlock). В ней происходит проход по циклу операций; если это перевод, проводится проверка, что имя получателя равно аккаунту шлюза, и что memo не содержит запрещённых строк (например, "return:", "токен не поддерживвается" и т.п.). Также перед циклом операций устанавливается счётчик ok_ops_count со значением 0. Он указывает на количество успешных операций и прописывается в return. Если ошибок не выявлено, вызывается метод processTransfer, аргументами которого являются название блокчейна и содержимое перевода. Он возвращает 1, если операция успешна и 0, если нет. Это позволило вызвать функцию в значении счётчика ok_ops_count (ok_ops_count += processTransfer(x, opbody)). В самом методе происходит работа с операцией: получение названия токена блокчейна-отправителя, назначение memo переменной и перевод memo в нижний регистр, после чего происходит создание массива, содержащего информацию до двоеточия и после него. Далее происходит проверка, совпадает ли первая часть (до двоеточия) с названием одного из блокчейнов в массиве chains, который формируется на базе config файла. Если да, производится дальнейшая работа над переводом, если нет – сумма возвращается отправителю с сообщением, что указанный им блокчейн не существует. При совпадении первой части с названием блокчейна в списке происходит его указание в переменной y, а также получение из config файла названия токена этого блокчейна и установка значением переменной to логина получателя средств (вторая часть memo). Далее производится расчёт курса токена блокчейна-отправителя к блокчейну-получателю, расчёт комиссии и происходит расчёт итоговой суммы. После создания переменной let receive_approve, которая указывает на статус, происходит получение данных аккаунта, куда планируется отправить токены. Если массив с данными аккаунта не пуст и нет ошибки, устанавливается статус "ok", если он пуст – receive_approve равен "noAccount", если ошибка (catch) – "noConnection". Далее происходит получение данных аккаунта шлюза, который будет отправлять токены, и проверяется баланс: если он меньше суммы, которую должен получить пользователь, receive_approve = "noBalance", если catch – "noConnection". Далее проверяется, что блокчейн отправителя – это Golos или Steem. Если так, происходит проверка токена: SBD/GBG – возврат средств с сообщением о том, что токен не поддерживается (статус 'noSupportedToken'). Далее происходит проверка в условии статуса. Если ok, к сумме перевода добавляется название токена блокчейна-получателя, указывается memo об успешном переводе с указанием аккаунта шлюза, курса и комиссии. Если статус "noBalance", "noSupportedToken", "noConnection" или undefined, "noAccount", происходит возврат средств с соответствующими им memo. Также в каждом условии статуса происходит возврат числа успешных переводов (1 или 0). Это реализовано при помощи указания return перед методом sendTransfer. Сам метод принимает блокчейн, активный ключ, логины отправителя, получателя, сумму и заметку (memo). Он находится выше и выполняет перевод, после чего проверяет, что возвратил метод трансфера. Если значение не 0, он получает текущее время в unixtime, добавляет в базу транзакций и возвращает 1. Если 0 – возвращает 0. Статус того или иного перевода (ok, nobalance и т.п.), а также количество успешных операций выводятся в консоль.

Как добавить новый блокчейн:

Данная инструкция предназначена для разработчиков, т.к. простые пользователи VIZ-exchange вряд ли справятся с этой задачей.

  1. Зайдите в файл js_modules/methods.js и ознакомьтесь со списком используемых методов. Изучите документацию к библиотеке нужного вам блокчейна и определите, есть ли там нужные методы. Убедитесь, что запрашиваемые данные и их формат совпадают с указанными в файле.
  2. Зайдите в config.json и создайте новую секцию настроек. Можно просто скопировать секцию из блокчейнов, например, Golos, начиная с самого параметра и заканчивая "},". Проверьте, чтоб ваша ide не выдавала ошибки.
  3. Переименуйте Golos в ваш блокчейн, если вы использовали копирование. Далее измените значение параметра lib на другое.
  4. Аналогичным образом пропишите другую паблик-Ноду в параметре node.
  5. Запишите данные: логин, ключи.
  6. Задайте курс токена к VIZ и комиссию (если нужна).
  7. Добавьте блокчейн в файле blocksdb.js так, как добавлены уже существующие.
  8. Проверьте, запустив node exchange 2> errors.log.
  9. Буду рад пулл-реквестам.

Внимание

  1. Автор VIZ-exchange не несёт ответственности за обман пользователей теми, кто заявляет о создании шлюза.
  2. Автор не несёт ответственности за неработоспособность шлюза из-за нехватки ресурсов на сервере его создателя, из-за неоплаты сервера или по другим причинам.
  3. Автор VIZ-exchange не несёт ответственности за возможные атаки на шлюзы. В случае отправки большего количества средств, чем должно быть, либо в случае отсутствия возврата/отправки платежа обменивающему просьба прислать по контактам ниже лог с ошибками, которые были во время таких транзакций.

Контакты:

По вопросам, связанным со скриптом, обращаться по контактам:

  1. Telegram: https://t.me/skripnikdenis
  2. Vk: https://vk.com/denis_skripnik
  3. E-mail: scadens@yandex.ru
You can’t perform that action at this time.