Зачем это нужно?

До 2021-го года я не видел практического применения криптовалют. Потом наткнулся на книги Андреаса Антонопулоса. Меня зацепило его утверждение, что криптовалюты подобны интернету денег. Если это так, то криптобиржи для интернета денег подобны ВордПрессу интернета информации.

Примерно в то же время я узнал, что на 10.397 криптовалют приходится около 380 криптобирж. Если следовать философии Биткойна, должно быть наоборот.

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

Почему криптобирж так мало?

Потому что для запуска криптобиржи, нужно от 100.000 до 500.000 долларов (12).

Можно ли срезать эти затраты?

Здесь есть два варианта.

Первый: Купить готовую биржу. Знакомый говорил, что в Китае код таких бирж продается за несколько тысяч долларов. Но нет никакой гарантии, что эта криптобиржа будет работать как надо.

Второй вариант – открытое ПО.

Криптобиржа с открытым кодом

Есть минимум одна криптобиржа с открытым кодом.

Здесь опять две проблемы.

Во-первых, это китайский продукт и большинство документации на китайском. Это проблема для всех, кто не владеет китайским.

Во-вторых, эта криптобиржа слишком сложна. Традиционный подход к разработке ПО таков: Сначала делаем что-то очень простое, а потом, по мере необходимости добавляем нужные функции.

В случае же с этой биржей есть много разных функций, которые нужны далеко не всем. Ниже показана структура системы согласно документации.

Устройство криптобиржи с открытым кодом. Источник: https://github.com/jammy928/CoinExchange_CryptoExchange_Java
Устройство криптобиржи с открытым кодом. Источник: https://github.com/jammy928/CoinExchange_CryptoExchange_Java

Эта криптобиржа предоставляет приложения для Андроида и Эппла, и, скорее всего, позволяет работать под большой нагрузкой.

Здорово, но не нужно, если я хочу обмениваться криптой с моими 10 друзьями через веб-приложение в стиле "инженерный дизайн".

Я задался еще одним вопросом.

Насколько трудно создать минимальную криптобиржу с нуля?

Ответить на этот вопрос можно только опытным путем. Поэтому я решил сделать простейшую криптобиржу, чтобы понять, как она может быть устроена.

Какие валюты менять?

Если это биржа минимальна, то должно быть две криптовалюты.

Я решил взять Биткойн и Тезер (Tether, USDT).

Тезер – это криптовалюта, создатели которой утверждают, что на каждый токен Тезера есть доллар в банке (некоторые люди с этим несогласны). Поэтому если у Вас есть 1 Тезер, то это по сути один доллар. Курс Тезера скачет меньше, чем курс Биткойна.

Отказ от ответственности

Тот факт, что для этого проекта я использовал Биткойн и Тезер не означает, что я рекомендую то или другое в качестве вложения. У меня нет ни Биткойна, ни Тезера, есть совсем немного Кардано.

Лучшим доступным средством сохранить деньги я считают золотые и серебряные монеты (физические, которые можно положить в сейф, а не ETF).

Как устроена система

Структура простейшей криптобиржи выглядит так:

Испытательные сети (testnets) для Биткойна и Эфира нужны, чтобы можно было отлаживать код, не переводя настоящие деньги. Тезер является смартконтрактом на базе Эфира, поэтому, чтобы работать с Тезером нужна испытательная сеть для Эфира.

Сердцем системы является BPM-движок на базе Камунды. Этот BPM-движок хранит все свои данные в in-memory базе данных H2.

Зачем нужна Камунда

BPM-движки (Камунда, Flowable, Activiti, jBPM, TIBCO iProcess, Pega и другие) используются, когда нужно реализовать взаимодействие с несколькими разнородными системами. В нашем случае Камунда оркестрирует взаимодействие с испытательными сетями Биткойна и Эфира.

Другая причина использовать Камунду – визуальное представление процесса, которое улучшает взаимопонимание программистов и специалистов предметной области (такая схема понятна и тем, и другим).

У Камунды есть бесплатная (Community Edition) и платная (Enterprise Edition) версии. Насколько я знаю, это так останется для версий 7.x. Восьмая версия Камунды будет полностью закрытой и в России продаваться не будет, т. к. производитель присоединился к санкционной вакханалии. Самая дешевая платная версия сейчас стоит около 50.000 евро в год.

В версиях 7.х отличие бесплатной Community Edition от платной Enterprise Edition есть только в веб-приложениях, наличии инструмента аналитики Optimize и поддержки со стороны производителя. Все остальное в обоих версиях одинаково (в т. ч. движок).

Ряд российских и немецких банков в продакшене используют бесплатную версию. Также есть отечественный и бесплатный аналог Enterprise Edition: Excamad.

Одно из ключевых преимуществ Камунды – это активное русскоязычное сообщество в Телеграме.

Описание процессов на визуальном языке BPMN

Например, процесс обмена Биткойна на Тезер выглядит так:

BPMN-схема процесса обмена Биткойна на Тезер
BPMN-схема процесса обмена Биткойна на Тезер

Квадратики с шестеренками изображают куски кода на Джаве и Кложуре (например, Get USDT balance of the exchange). Они называются служебными задачами (service tasks).

Квадратики с человечком в верхнем левом углу являются т. н. пользовательским задачами (например, Ask the user to transfer the BTC and enter the target USDT address). В этом случае человеку надо зайти в перечень задач (task list) в веб-приложении Камунды и отметить задачу, как выполненную.

Квадратики с жирной окантовкой являются подпроцессами, для которых есть отдельная схема (например, Wait for the BTC to arrive).

Обращаю внимание, что пользовательские задачи Wait нужны исключительно в целях демонстрации и отладки. Дело в том, что в открытой версии (Camunda Community Edition) невозможно увидеть в веб-приложении завершенные экземпляры процессов. Если в конце процесса поставить такую задачу, то выполнение процесса остановится и его можно будет увидеть.

Процесс продолжится после того, как пользователь отметить задачу как выполненную в перечне задач (task list).

Делегаты на Джаве

Делегаты на Джаве позволяют выполнять код в соответствующих местах BPMN-диаграммы. ApproveUsdtTransfer.java является примером такого делегата.

Ключевое место любого делегата на Джаве – это метод execute, который принимает экземпляр DelegateExecution в качестве аргумента:

@Override
public void execute(final DelegateExecution delEx) throws Exception {
  final ERC20 usdtContract = loadErc20Contract.apply(
    new LoadErc20ContractInput()
      .withPrivateKey(privateKey)
      .withUsdtContractAddress(usdtContractAddress)
      .withEthNetworkUrl(ethNetworkUrl));
      
  final BigInteger usdtAmount = (BigInteger) delEx.getVariable("USDT_AMOUNT");
  final BigInteger amountToApprove = usdtAmount.add(BigInteger.ONE);
  usdtContract.approve(exchangeAddress, amountToApprove).send();
}

Через объект DelegateExecution код на Джаве может взаимодействовать с движком BPM. Например, в коде выше строка

final BigInteger usdtAmount = (BigInteger) delEx.getVariable("USDT_AMOUNT");

считывает значение переменной процесса USDT_AMOUNT.

Если делегат на Джаве выбрасывает исключение (кроме BPMNError), оно будет отображено в виде инцидента в кокпите (часть пользовательской оболочки Камунды). Там можно повторить попытку выполнить этот код.

Делегаты на Кложуре

Кложур – это Лисп на платформе JVM. Этот язык позволяет изменять код приложения без его перезапуска и магии вроде JRebel.

Это очень удобно для прототипирования: Можно изменять диаграмму BPMN в Камунда Моделере и изменять код делегатов, который в ней выполняется, через REPL (которая работает, например, внутри плагина для Идеи Cursive). Возможность быстро менять код и видеть результаты делает разработку субъективно более приятной.

Поэтому ряд служебных задач реализован на Кложуре.

Рассмотрим пример. Служебная задача Determine whether or not we have any ETH реализована на Кложуре – это видно потому, что в моделере в поле Delegate Expression написано ${ClojureDelegate}. Это название Спринг-компонента с кодом из ClojureDelegate.java.

Во вкладке Input/Output Вы можете увидеть, что переменной cljfn (Clojure function) присвоено значение check_if_or_we_have_any_eth.

Функция check_if_or_we_have_any_eth выглядит так:

(defn check_if_or_we_have_any_eth
  [de]
  (let [available-eth (.getVariable de "EXCHANGE_ACCOUNT_BALANCE_WEI")]
     (.setVariable de "ANY_ETH_AVAILABLE" (> available-eth 0)))
)

Этот код означает следующее:

  • Мы определяем функцию с названием check_if_or_we_have_any_eth (первая строка).

  • Эта функция принимает объект de (DelegateExecution) в качеcтве аргумента (вторая строка).

  • В третьей строке мы сохраняем в переменной available-eth значение переменной процесса EXCHANGE_ACCOUNT_BALANCE_WEI. Кложуристый код (.getVariable de "EXCHANGE_ACCOUNT_BALANCE_WEI") делает то же, что de.getVariable("EXCHANGE_ACCOUNT_BALANCE_WEI") на Джаве.

  • В крайней строке мы устанавливаем переменную процесса ANY_ETH_AVAILABLE равной результату выражения available-eth > 0.

Как попробовать эту криптобиржу в действии?

Для этого нужно

  1. установить испытательные сети,

  2. правильно сконфиругировать Камунду,

  3. обменять Биткойн на Тезер и

  4. Тезер на Биткойн.

Как это сделать, описано в приложениях 1, 2 и 3 ниже.

Известные проблемы этого решения

Если Вы внимательно посмотрите на код, то заметите ряд серьезных проблем, включая следующие:

  • Отсутствие системы двойной записи (double-entry accounting): В текущей реализации биржа учитывает только деньги, которые есть в том или ином крипто-кошельке. Она не учитывает деньги, которые идут (но еще не пришли) в кошелек биржи, а также те деньги, которые биржа пообещала отдать пользователям в рамках уже запущенных обменных процессов (но еще не отправила). Чтобы учитывая кредиторскую и дебиторскую задолженность, нужна система двойной записи.

  • Отсутствие нормальной обработки ошибок: Если обмен не может быть произведен по той или иной причине, деньги должны быть возвращены отправителю. На данный момент такого механизма нет.

  • Плохая проектировка процесса: В данной реализации есть две схемы BPMN для одного и того же делового процесса (обмен одной валюты на другую). Скорее всего, можно сделать одну схему BPMN и адаптировать ее под пары валют с помощью переменных процесса. Это улучшит сопровождаемость системы.

Если я знаю про эти проблемы, почему они не устранены?

Обменник Биткойна на Тезер бесполезен для реальной жизни

После того, как прототип был более-менее готов и работал на моей локальной машине, я спросил товарища: "Если я хочу отправить 1 доллар в тезеровом эквиваленте, сколько мне надо будет заплатить накладных?" Накладные – это в т. ч. "газ" – деньги за использование их сети.

Он ответил: "Все зависит от времени. На Реддите полно сообщений от людей, отправивших 100 долларов за 300 долларов накладных."

Здесь стало ясно, что прототип не готов для следующего шага – развертывании где-нибудь на Хероку и отладкой на реальных деньгах. Для этого нужна валюта, в которой можно делать проверочные переводы на суммы, которые на страшно потерять. С Тезером и любыми валютами, основанными на Эфире, это не пройдет.

Уже после того, как обмен Биткойна на Тезер заработал, я узнал, что для копеечных платежей могут быть пригодны следующие криптовалюты:

  1. Elrond

  2. Iota

  3. Hbar

  4. Graph

  5. Cardano (якобы у этой валюты накладные за перевод не могут превышать 30 центов)

  6. Solona

Так это или нет, можно узнать только опытным путем.

Что дальше?

Предлагаю посмотреть код и попробовать его согласно приложениям ниже.

Если Вы знаете, как его улучшить, поделитесь, пожалуйста, вашим мнением мне в Телеграм (@dpisarenko) и здесь в комментариях.

Кто знает, может быть из этой искры возгорится пламя и у нас когда-нибудь появится свой маленький криптообменник в каждом подъезде.


Приложение 1: Установка испытательного окружения

Использовать переводы с реальными деньгами для отладки прототипа опасно. Поэтому нам надо установить две локальные испытательные сети: Одну для Биткойна (BTC), вторую для Тезера (USDT). USDT – это смарт-контракт, который работает на Эфире. Поэтому нам нужна испытательная сеть для Эфира.

Далее описано, как установить обе сети.

Шаг 1: Установить Докер

Я использую Докер, чтобы сократить количество ручных операций при установке испытательных сетей. Поэтому вам понадобится Докер. Установите его, если это еще не сделано.

Шаг 2: Создать контейнеры Докера

После того, как Докер установлен, выгрузите (git clone) хранилище minimal-crypto-exchange. Там вы найдете файл docker-compose.yml.

В командной строке выполните команду docker-compose up -d в той же директории, где находится файл docker-compose.yml.

Шаг 3: Исправить ошибку в испытательной сети Биткойна

Этот материал осноснован на этом ответе ответе.

Шаг 3.1: Откройте командную строку

Чтобы открыть командную строку, щелкните по иконке в настольном приложении Докера:

После этого вы увидите вот это:

Шаг 3.2: Измените конфигурацию узла Биткойн

Введите следующую команду в командной строке:

vi /root/.bitcoin/bitcoin.conf

Добавьте следующий параметр в файл и сохраните его.

peerbloomfilters=1

Выполните следующую команду в командной строке:

cat /root/.bitcoin/bitcoin.conf

Если все правильно, вы увидите следующее:

/ # cat /root/.bitcoin/bitcoin.conf
regtest=1
dnsseed=0
upnp=0
server=1
zmqpubrawtx=tcp://0.0.0.0:28332
zmqpubhashblock=tcp://0.0.0.0:28332
whitelist=0.0.0.0/0
txindex=1
addressindex=1
timestampindex=1
spentindex=1
uacomment=bitcore
rpcworkqueue=128
dbcache=16384
rpcallowip=0.0.0.0/0
rpcuser=test
rpcpassword=test
peerbloomfilters=1
[regtesb]
rpcbind=0.0.0.0
port=19000
rpcport=19001

Шаг 3.3: Перезапустите узел Биткойна

Для этого нажмите кнопку Restart в настольном приложении Докера:

Шаг 4: Проверьте, что веб-приложение испытательной сети Биткойна работает

Откройте адрес http://localhost:3002 в браузере. Браузер попросит имя пользователя и пароль. Введите electrumx в качестве имени пользователя и test в качестве пароля.

После этого вы увидите следующий экран:

Это веб-приложение BTC Explorer.

Шаг 5: Проверьте, что доступно веб-приложение испытательной сети Эфира (Blockscout)

Если вы введете адрес http://localhost:4000 в браузере, то увидите следующее:

Это веб-приложение Blockscout.

Шаг 6: Установите смарт-контракт USDT

В командной строке перейдите в директорию erc20/npm-prj. В ней выполните команду ./deploy-USDT.sh.

Эта команда выдаст текст вроде USDT contract deployed to: 0x0B0fA2cC0edd477953D864d8d45c7453c6142802. Запишите этот адрес.

После этого откройте отображение транзакций в Блокскауте по адресу http://localhost:4000/txs. Там должна быть видна запись Token Minting.

Возможные проблемы

Чтобы выполнить этот шаг, вам нужно установить Hardhat. Чтобы установка прошла правильно, может потребоваться удалить папку HardHat из erc20/npm-prj/node_modules/.bin.

Шаг 7: Установить адрес смарт-контракта USDT в конфигурации Камунды

Возьмите адрес смарт-контракта USDT из предыдущего шага и вставьте его в качестве значения параметра accounts.eth.usdt.contract-address в файле minimal-crypto-exchange/process-engine/src/main/resources/application.yaml:

accounts:
  usdt:
    contract-address: '0x0B0fA2cC0edd477953D864d8d45c7453c6142802'

Шаг 8: Добавьте Эфира в счет биржи

Суть этого шага заключается в следующем. В испытательной сети Эфира будет счет криптовалютной биржи. Мы создали пустую испытательную сеть, поэтому на этом счету нет денег (нет Эфира). В этом шаге мы положим Эфир на этот счет.

Шаг 1: Откройте командную строку geth

Если вы работаете под МакОС, щелкните на кнопку CLI в пользовательской оболочке Докера.

Шаг 2: Запустите интерфейс JavaScript

В оболочке geth введите команду geth attach http://localhost:8178.

Шаг 3: Разблокируйте буферный счет

Воспользуйтесь следующей командой, чтобы разблокировать буферный счет. Первый аргумент – адрес буферного счета, второй – пароль.

web3.personal.unlockAccount('0x411167FeFecAD12Da17F9063143706C39528aa28',
'carsdrivefasterbecausetheyhavebrakes', 600);

Шаг 4: Отправьте Эфир

Воспользуйтесь кодом ниже, чтобы отправить 1000 единиц Эфира с буферного счета на счет криптобиржи:

eth.sendTransaction({
from: '0x411167FeFecAD12Da17F9063143706C39528aa28',
to: '0x190FD61ED8fE0067f0f09EA992C1BF96209bab66',
value: web3.toWei(1000, 'ether')});

web3.toWei(1000, 'ether') означает 1000 ETH (1000 единиц Эфира).

Не закрывайте командную строку geth, т. к. она понадобится вам в следующем шаге.

Шаг 9: Добавьте Эфира на счет отправителя USDT

Этот шаг аналогичен шагу 8. Поэтому здесь даны команды без объяснений.

Шаг 1: Разблокируйте буферный счет

web3.personal.unlockAccount('0x411167FeFecAD12Da17F9063143706C39528aa28',
'carsdrivefasterbecausetheyhavebrakes', 600);

Шаг 2: Отправьте Эфир

eth.sendTransaction({
from: '0x411167FeFecAD12Da17F9063143706C39528aa28',
to: '0xDd1e8cC92AF9748193459ADDF910E1b96E88154D',
value: web3.toWei(1000, 'ether')});

Приложение 2: Обмен Биткойна на Эфир

Здесь описано, как с помощью криптобиржи можно обменять Биткойн на Эфир.

Шаг 1: Создайте Биткойн-адреса 1 и 2

Откройте командную строку узла Биткойн с помощью

docker exec -it minimal-crypto-exchange_node_1 /bin/bash

Создайте и запишите два адреса в испытательной сети Биткойна, Адрес 1 и Адрес 2 с помощью команды

bitcoin-cli -regtest getnewaddress

в описанной выше командной строке.

Шаг 2: Намайните 101 Биткойнов в счет Адрес 1

bitcoin-cli -regtest generatetoaddress 101 <Адрес 1>

Примечание: Если не ошибаюсь, количество должно быть не менее 101.

Шаг 3: Установите адрес криптобиржи в Камунде равным Адрес 2

Откройте файл minimal-crypto-exchange/process-engine/src/main/resources/application.yaml в Идее. Установите параметр accounts.btc.exchange.address равным Адрес 2 из шага 1 выше.

Шаг 4: Удалите файлы кошельков

Если в директории minimal-crypto-exchange/process-engine есть файлы

  • _minimalCryptoExchangeBtcWallet.spvchain и

  • _minimalCryptoExchangeBtcWallet.wallet,

то удалите их.

Шаг 5: Отправьте Эфир на счет криптобиржи

Шаг 1: Откройте командную строку geth

Если работаете в Макоси, щелкните на кнопку CLI в пользовательской оболочке Докера.

Шаг 2: Запустите интерфейс JavaScript

В командной строке geth введите geth attach http://localhost:8178.

Шаг 3: Разблокируйте буферный счет

Воспользуйтесь следующей командой, где первый агрумент – адрес буферного счета, а второй – пароль.

web3.personal.unlockAccount('0x411167FeFecAD12Da17F9063143706C39528aa28',
'carsdrivefasterbecausetheyhavebrakes', 600);

Шаг 4: Отправьте эфир

С помощью команды ниже отправьте один Эфир из буферного счета на счет криптобиржи:

eth.sendTransaction({
from: '0x411167FeFecAD12Da17F9063143706C39528aa28',
to: '0x190FD61ED8fE0067f0f09EA992C1BF96209bab66',
value: 1000000000000000000000000});

Шаг 6: Запустите Камунду

Запустите приложение с помощью основного класса com.dpisarenko.minimalcryptoexchange.MinimalCryptoExchangeProcessApplication.

В видео How to build and launch Camunda process engine показано как собрать и запустить код процессуального движка.

Шаг 7: Запустите процесс обмена Биткойна на Тезер в Камунде

Откройте адрес http://localhost:8080 в браузере (имя пользователя и пароль – demo). Перейдите в перечень задач (task list) и запустите процесс Exchange BTC for USDT Process.

Шаг 8: Дождитесь, пока токен дойдет до пользовательской задачи

Ждите до тех пор, пока не увидите следующую картину в кокпите (синий кружок на пользовательской задаче):

Шаг 9: Отправьте Биткойн по адресу Адрес 2

В командной строке узла Биткойна, выполните команду

bitcoin-cli -regtest sendtoaddress <Адрес 2> 0.00001

чтобы отправить 0.00001 единиц Биткойна по адресу Адрес 2 (например, bitcoin-cli -regtest sendtoaddress 2N1z8DaS2SC4N65A1pda25t8TgE5ynYRpDz 0.00001).

Эта команда выведет на экран идентификатор транзакции. Запишите его и отметьте как BTC Tx ID.

Шаг 10: Введите BTC Tx ID в формуляр пользовательской задачи

В браузере, вернитесь в веб-приложение Камунды и откройте формуляр пользовательской задачи в перечне задач (task list):

Введите значение BTC Tx ID в поле с названием ID of the "customer to exchange" BTC transaction и нажмите кнопку Complete.

Шаг 11: Проверьте транзакцию USDT в Блокскауте

Откройте отображение транзакций (http://localhost:4000/txs) в Блокскауте. Если все прошло успешно, вы увидите транзакцию с отправкой USDT:

Приложение 3: Обмен Эфира на Биткойн

Теперь рассмотрим обратный процесс, т. е. когда пользователь отправляет Тезер криптобирже и получает взамен Биткойн.

Шаг 1: Запустите процесс в Камунде

В браузере перейдите в перечень задач (task list) и запустите процесс Exchange USDT for BTC Process.

Шаг 2: Откройте отображение экземпляра процесса в кокпите

Вы увидите, что токен (синий круг) на квадратике пользовательской задачи в начале процесса:

Это означает что нам надо завершить пользовательскую задачу в перечне задач (task list). Если вы его откроете, то увидите задачу Transfer USDT to the exchange outside of the exchange.

Это значит, что нам надо отправить Тезер на счет криптобиржи и ввести идентификатор транзакции в формуляр.

Шаг 3: Отправьте Тезер на счет биржи

Откройте файл erc20/npm-prj/scripts/send-usdt-to-exchange.js в текстовом редакторе. Вы увидите следующий код:

async function main() {
const USDT = await ethers.getContractFactory("USDT");
const usdtAddress = "0xa682a5972D1A8175E2431B26586F486bBa161A11";
const usdt = await USDT.attach(usdtAddress);
const amount = ethers.BigNumber.from('350000000000000000000');
const exchange = "0x190FD61ED8fE0067f0f09EA992C1BF96209bab66";
const usdtSender = "0xDd1e8cC92AF9748193459ADDF910E1b96E88154D";

Измените строку

const usdtAddress = "0xa682a5972D1A8175E2431B26586F486bBa161A11";

так, чтобы usdtAddress стал равен адресу из шагов Шаг 6: Установите смарт-контракт USDT и Шаг 7: Установить адрес смарт-контракта USDT в конфигурации Камунды из Приложения 1.

Сохраните файл и после этого запустите скрипт erc20/npm-prj/send-usdt-to-exchange.sh. Появится ряд сообщений. Перейдите к той их части, которая начинается с Sending USDT.... Она может выглядеть так:

Sending USDT...
Done, result= {
hash: '0x906b3cd21c808164ec93460efc5ed8033ee85095b6195662980c4ba5af62e263',

Значение в поле hash является идентификатором транзакции, в рамках которой мы отправили Тезер криптобирже. Запишите его.

Шаг 4: Введите идентификатор транзакции в формуляр в перечне задач Камунды

Откройте перечень задач Камунды и щелкните по ссылке Claim, чтобы присвоить эту задачу себе. После этого вы сможете ввести идентификатор транзакции в формуляр.

Введите идентификатор транзакции из шага 3 в поле с названием ID of the incoming transaction (USDT sender to the exchange).

После этого нажмите на кнопку Complete.

Шаг 5

Вернитесь обратно в кокпит. Если все сработало как ожидалось, вы увидите токен в конце процесса.

В нижней части страницы вы можете увидеть переменные процесса. Одна из них называется TARGET_BTC_ADDRESS и содержит адрес, по которому биржа отправила Биткойн.

Предположим, что он равен 2NDjv4EUtXxKpfHCMuTmNg4miU9QDqy8vKs.

Если вы откроете веб-приложение Bitcoin Explorer по адресу http://localhost:3002/address/2NDjv4EUtXxKpfHCMuTmNg4miU9QDqy8vKs, то увидите соответствующую транзакцию.

Комментарии (14)


  1. rPman
    15.03.2022 19:47
    +6

    Один момент, данный если я верно понял, описанный проект не является криптовалютной биржей — это обменник, еще не увидел в схемах учет внутренних лимитов на сделки, так как чтобы совершить обмен нужно чтобы запрашиваемая валюта была в принципе в наличии (но там в начале был вроде соответствующий дисклеймер — что нет обработки ошибок).

    Обменник отличается от криптовалютной биржи наличием отложенных ордеров. Для реализации отложенных ордеров у биржи заводится понятие счета (кошелек). Т.е. сделки совершаются не со внешними криптовалютами bitcoin/ethereum а внутренними виртуальными счетами. Так же в результате появляются такие вещи как частичное исполнение сделки.

    Поверх этого в принципе на биржах наворачивается дополнительные плюшки вида — отображение информации (история сделок, график, список отложенных ордеров — стакан и т.п.) сделки по маркету (когда биржа сама перебирает необходимое количество лимитных сделок), стоп ордера (заказ на создание сделок в зависимости от цены на рынке), маржинальная торговля и прочее прочее.

    А еще, все биржи так или иначе работают маркетмейкером (либо связаны с ним прямо или косвенно, например особые условия по комиссиям или беспроцентные кредиты), алгоритм этот еще боле интересный и сложный.

    Ну и конечно симуляция бурной деятельности для рынков (фиктивные торги), где нет ликвидности и клиентов. Почти наверняка у всех криптовалютных бирж это главная функция и способ получения денег (читай мошенничество против своих клиентов)


    1. DmitriiPisarenko Автор
      15.03.2022 22:02

      Спасибо за обратную связь.


  1. academic777
    15.03.2022 22:36
    +1

    «Титер» — просто шик


    1. DmitriiPisarenko Автор
      16.03.2022 15:34

      Спасибо, исправил.


  1. jesaiah4
    16.03.2022 00:07

    конечно очень начальный уровень. У нас в бинансе например пол системы работает на 2м, 3м уровне кафки , агрегационные join окна стримов это вершина it софтвара.


    1. DmitriiPisarenko Автор
      16.03.2022 10:58

      Спасибо за обратную связь.


  1. VaalKIA
    16.03.2022 07:17
    +1

    Что бы что-то менять не нужен USDT, возьмите другие альткоины, например LiteCoin. Если вы хотите использовать BTC, то правильная биржа должна держать свою полную ноду и полагаться только на её данные, то есть, не использовать сторонние ресурсы для просмотра транзакций и т.п.


    1. DmitriiPisarenko Автор
      16.03.2022 10:58

      Спасибо.


  1. spbru
    16.03.2022 09:53

    Для P2P обмена, который представлен в статье идеально подошел бы не сайт обменника, а отдельная крипта суть которой была бы в смарт-контрактах обмена любых валют. Тогда обменников был бы триллион.

    А обменник созданный из сотни строчек кода находящийся на сервере с защитой сделанной за такой же малый бюджет, что и код - это тупик.


    1. DmitriiPisarenko Автор
      16.03.2022 10:58

      Спасибо.


  1. OptimumOption
    16.03.2022 10:12
    +1

    А что насчет OpenDAX?


    1. DmitriiPisarenko Автор
      16.03.2022 10:57

      У меня сложилось ощущение, что открытый код у них -- всего лишь способ побудить человека обратиться к их продажникам.

      По моему ощущению, документации там маловато.


  1. Unique_name
    17.03.2022 08:43
    +1

    Биржа, в частности, матчинговый движок... Это всё хорошо. Технических реализаций тут может быть великое множество.

    Но главное, что здесь не упомянуто - организационно-административный процесс. А именно: комплаенс и открытие счетов. И даже если вы не собираетесь работать с банковскими счетами, то проверять трансферы клиентов очень даже придётся. В противном случае, проект превратится в мойку с последующими проблемами для владельцев.

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

    Это я всё к тому, что технически - криптобиржа уже давно не является чем-то запредельно сложным. Да - хорошая лабораторная работа. Но как бизнес - это очень и очень хлопотно. И сетап в комплексе - далеко не 500к дол, а значительно выше именно из-за вышеперечисленных причин.


    1. DmitriiPisarenko Автор
      17.03.2022 11:02

      Спасибо за комментарий.

      Насчет комплаенса -- неуверен, что это актуально для мелких операций.

      Обоснование: Один мой знакомый решил обменять 500 евро на Биткойн. На сайте LocalBitcoins нашел человека. Они встретились в кафе. Продавец отправил ему Биткойн. Когда достаточно узлов подтвердили перевод, мой знакомый отдал продавцу деньги наличными.

      Насколько я знаю, никто ни у кого паспорт не проверял.