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.
You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session.