Pages:
Author

Topic: Давайте создадим с нуля биржу Open Source? - page 4. (Read 32151 times)

kzv
legendary
Activity: 1722
Merit: 1285
OpenTrade - Open Source Cryptocurrency Exchange
> Mr.Elf
Скорее всего у вас старая версия node.js
если бы вы все делали по моей инструкции с гитхаба, то установили бы версию 12.6.0
Проверить версию можно командой
Code:
node -v
Если версия неправильная, то введите команды
Code:
nvm install 12.6.0
nvm use 12.6.0

>progof
Для биржи я держу два выделенных сервера и один виртуальный.
Один выделенный для базы данных, другой выделенный для демонов монет, виртуальный для бэкапов.
На любой из выделенных у меня легко влезет хоть пять полных блокчейнов биткоина, но я так не делаю ибо в битке есть команда prune. С этой командой блокчейн биткоина у меня весит около 3 гигов.
У большинства нормальных форков эта команда тоже есть.
Из нормальных форков этой команды нет у догов и приходится хранить весь из сучий блокчейн целиком ))
У всяких шитков на конструкторах этой команды может не быть, но там размер блокчейна и не превысит никогда одного гигабайта...
jr. member
Activity: 157
Merit: 4
KZV, на вашей бирже есть биткоин и вес его блокейна +\- 300 ГБ и с каждым дней вес растет. Как вы решили эту проблему? Не думаю что у вас выделенный сервер с полным блокчейном битка.

PS: можете мне ответить в лс Smiley
newbie
Activity: 3
Merit: 0
Новая ошибка, запускаю движок совместно с Apache2 для роботы с доменом

Apache2 настроен по этой инструкции 
https://www.digitalocean.com/community/tutorials/how-to-install-the-apache-web-server-on-ubuntu-18-04

Зависимости для движка биржи по этой:
https://github.com/UbuntuEvangelist/opentrade

Запускаю этой командой и ошибка:
     
root@opentrade:/var/www/opentrade/server# node main.js
/var/www/opentrade/node_modules/ws/lib/websocket.js:347
      ...options
      ^^^

SyntaxError: Unexpected token ...
    at createScript (vm.js:74:10)
    at Object.runInThisContext (vm.js:116:10)
    at Module._compile (module.js:533:28)
    at Object.Module._extensions..js (module.js:580:10)
    at Module.load (module.js:503:32)
    at tryModuleLoad (module.js:466:12)
    at Function.Module._load (module.js:458:3)
    at Module.require (module.js:513:17)
    at require (internal/module.js:11:18)
    at Object. (/var/www/opentrade/node_modules/ws/index.js:3:19)
kzv
legendary
Activity: 1722
Merit: 1285
OpenTrade - Open Source Cryptocurrency Exchange
У вас сервер базы данных не работает.
Следуйте инструкциям на гитхабе

Code:
cd ~/opentrade/databaseServer
[sudo] forever start main.js
cd ~/opentrade/accountsserver
git checkout master
[sudo] forever start main.js
cd  ~/opentrade/server
[sudo] forever start main.js
newbie
Activity: 3
Merit: 0
Ребята мне нужна подсказка, возможно это банальный вопрос, но у меня возникла такая ошибка при запуске движка биржи:

SSL Proxy listening on port 443
events.js:180
      throw er; // Unhandled 'error' event
      ^
Error: connect ECONNREFUSED IP:40545
    at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1056:14)

Emitted 'error' event at:
    at ClientRequest. (/home/opentrade/node_modules/ws/lib/websocket.js:554:15)
    at ClientRequest.emit (events.js:203:13)
    at Socket.socketErrorListener (_http_client.js:402:9)
    at Socket.emit (events.js:203:13)
    at emitErrorNT (internal/streams/destroy.js:91:Cool
    at emitErrorAndCloseNT (internal/streams/destroy.js:59:3)
    at processTicksAndRejections (internal/process/task_queues.js:77:11) {
  errno: 'ECONNREFUSED',
  code: 'ECONNREFUSED',
  syscall: 'connect',
  address: 'IP',
  port: 40545
}


Движок c офф. репозитория запускаю на Ubuntu 18.04 LTS, все зависимости node установились без ошибок.
kzv
legendary
Activity: 1722
Merit: 1285
OpenTrade - Open Source Cryptocurrency Exchange
У меня обработка ордера это многоэтапная процедура.

1. Добавление ордера
Проверить токен доступа для пользователя
Проверить валидность запроса от веб интерфестайса
Проверить: не заблокированы ли коины для ордера
Проверить баланс пользователя
Если с балансом пользователя что-то не так, по привести его в соответствие с блокчейном и историей оредеров
Добавить ордер в таблицу
Еще раз проверить баланс пользователя.

2. Матчинг орера по какой-то монете
Блокирование монеты для торгов
Получение двух перекрывающихся по цене ордеров
Блокирование ордеров для отмены
Блокирование пользователей в ордерах для торгов
Обновление ордеров
Обновление балансов пользователей ордеров
Обновление балансов по комиссиям донаторов и рефералов
Обновление истории торгов
Разблокирование всех кого ранее блокировал

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

legendary
Activity: 1792
Merit: 1028
dzyk.ru
Вручную запустил 10 экземпляров приложения-тестировщика. Локов не было.
Функции написаны на дефолтном языке. Функция купли или продажи содержит всего 250 строк включая пробелы и комментарии и другие артефакты для отладки

legendary
Activity: 3108
Merit: 1358
Про другие языки программирования ничего не сказано.
Это на совести разработчиков модулей. Если речь о ноде, то при использовании этого модуля, к примеру, можно писать функции на яваскрипте. Но сначала придется переписать весь зависимый код в приложении, вряд ли kzv будет этим заниматься.
legendary
Activity: 2422
Merit: 2166
Единственное отличие sqlite от "взрослых" СУБД в том, что у неё есть только встроенные функции и нет родного языка для написания новых функций. Однако, во многих случаях можно писать функции на том же языке, на котором пишется приложение, использующее sqlite. Для этого в api присутствуют функции sqlite3_create_function и sqlite3_create_window_function. При разработке на c/c++ не составляет проблем определить функцию, которой можно будет пользоваться в запросах, в sqlite для .Net присутствует аналогичная функциональность. То же верно и для модулей к иным средам и средствам разработки, однако node-sqlite в их число не входит. Если сильно надо, то можно написать расширение на c++ или использовать другой модуль sqlite, их для ноды много.

Да, верно. Эта, на первый взгляд, простая система управления базами данных тоже поддерживает создание и использование дополнительных нестандартных функций в SQL-запросах:
https://sqlite.org/c3ref/create_function.html

Исходя из представленной документации, в интерфейсе SQLite можно на языке C/C++ написать аналогичные функции buybtcR() и sellbtcR() и задать пойнтеры на них в соотвествующих параметрах xFunc, xStep и xFinal. Про другие языки программирования ничего не сказано.

Оказывается, SQLite не такой уж и Лайт. Smiley
legendary
Activity: 3108
Merit: 1358
Речь идёт конкретно о постгресе, и в нем функции писать хоть на PHP. И можно хоть делитом вызывать, как и в любой СУБД, следующей стандарту SQL.

Далеко не все системы управления базами данных поддерживают вызовы функций селектом. Насколько я знаю, SQLite, которая используется в этой open-source бирже, точно не поддерживает такие вызовы из запросов.
Плохо известно.

create table test(ID, data);
insert into test(ID, data) values (1, x'0dfeed');
delete from test where lower(hex(data)) = '0deed';

Единственное отличие sqlite от "взрослых" СУБД в том, что у неё есть только встроенные функции и нет родного языка для написания новых функций. Однако, во многих случаях можно писать функции на том же языке, на котором пишется приложение, использующее sqlite. Для этого в api присутствуют функции sqlite3_create_function и sqlite3_create_window_function. При разработке на c/c++ не составляет проблем определить функцию, которой можно будет пользоваться в запросах, в sqlite для .Net присутствует аналогичная функциональность. То же верно и для модулей к иным средам и средствам разработки, однако node-sqlite в их число не входит. Если сильно надо, то можно написать расширение на c++ или использовать другой модуль sqlite, их для ноды много.
legendary
Activity: 2422
Merit: 2166
А что именно делают эти селекты?
Там же еще и апдейты и инсерты должны быть...
Функции вызываются обычно селектом, если более сложной логики не нужно. А внутри функций может быть что угодно, хоть многотомник на питоне.

Далеко не все системы управления базами данных поддерживают вызовы функций селектом. Насколько я знаю, SQLite, которая используется в этой open-source бирже, точно не поддерживает такие вызовы из запросов.

Скорее всего, kzv имел в виду стандартные команды SQL:
1) select * from table
2) insert into *
3) update * where

Чтобы вести активные торги между достаточно большим количеством пользователей, ордера на покупки или продажу должны быстро создаваться, показываться и исполняться на бирже. Под "созданием" понимается добавление новой строки в таблицу базы данных (командой INSERT), под "показом" понимается считывание данных из базы (командой SELECT), под "исполнением" понимается изменение поля "статус" в строке (командой UPDATE). Также ещё разумно будет предусмотреть удаление ордера из таблицы (командой DELETE), для этого действия тоже требуется некоторое время.
legendary
Activity: 1792
Merit: 1028
dzyk.ru
Энтерпрайз).... может кто-то я хочет Postgre форкнуть))) предыдущий за него топил)))
legendary
Activity: 3108
Merit: 1358
А что именно делают эти селекты?
Там же еще и апдейты и инсерты должны быть...
Функции вызываются обычно селектом, если более сложной логики не нужно. А внутри функций может быть что угодно, хоть многотомник на питоне.

Любителям ноды по душе придется модуль plv8. А так, помимо родного plpgsql, поддерживается с полсотни всяких язычков, включая никому не нужные.

все внутри БД
Одна беда есть только, с масштабированием. Использование хранимых процедур автоматически создает большой геморрой, когда возникнет желание поднять производительность с помощью репликации и балансирования нагрузки. Чтобы такого не было, надо в самих процедурах предусмотреть работу с базой, недоступной на запись.

Для опенсорс проекта это всё избыточно, наверно... Кому нужен энтерпрайз - сам разработает.
legendary
Activity: 1792
Merit: 1028
dzyk.ru
А что именно делают эти селекты?
Там же еще и апдейты и инсерты должны быть...

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

все внутри БД
kzv
legendary
Activity: 1722
Merit: 1285
OpenTrade - Open Source Cryptocurrency Exchange
А что именно делают эти селекты?
Там же еще и апдейты и инсерты должны быть...
legendary
Activity: 1792
Merit: 1028
dzyk.ru
20 тыс ордеров проведено. после этого в стаканах осталось по 2 тыс не исполненных ордеров. публикую последние строки теста
Quote
select buybtcR(705.22,0.00740590,3);11121 mcs select sellbtcR(630.92,0.00802493,3); 26765 mcs
select buybtcR(185.07,0.00962241,3);29069 mcs select sellbtcR(435.84,0.00473537,2); 10746 mcs
select buybtcR(408.71,0.00244875,3);155708 mcs select sellbtcR(658.31,0.00410866,2); 11257 mcs
select buybtcR(576.58,0.00998753,1);11023 mcs select sellbtcR(583.55,0.00196305,2); 11201 mcs
select buybtcR(700.78,0.00913356,2);22160 mcs select sellbtcR(42.29,0.00914930,2); 22007 mcs
select buybtcR(782.88,0.00190901,1);11078 mcs select sellbtcR(585.37,0.00329407,1); 11190 mcs
select buybtcR(547.61,0.00391641,1);11045 mcs select sellbtcR(21.15,0.00649772,2); 11123 mcs
select buybtcR(266.02,0.00375255,1);11229 mcs select sellbtcR(676.89,0.00164506,1); 11248 mcs
select buybtcR(675.64,0.00207455,3);11109 mcs select sellbtcR(871.95,0.00921576,3); 11065 mcs
select buybtcR(785.30,0.00054354,2);177927 mcs select sellbtcR(700.23,0.00991648,2); 11193 mcs
select buybtcR(891.13,0.00927551,3);22193 mcs select sellbtcR(220.54,0.00568675,1); 22072 mcs
select buybtcR(612.18,0.00840720,1);11016 mcs select sellbtcR(261.95,0.00297831,2); 11230 mcs
select buybtcR(637.21,0.00190780,1);11089 mcs select sellbtcR(801.72,0.00492443,2); 11151 mcs

вот последний ордер из 20 тыс исполнился за 0.11 сек
в следующий раз запущу 100 копий приложения для тестирования, посмотреть не будет ли ерорлоков БД
legendary
Activity: 1792
Merit: 1028
dzyk.ru
Конечно нормально.
Если с такой скоростью будет работать реальная биржа, то это будет очень круто!
Не будет. Это 200 ордеров на пустом стакане. Вечером будет время, 10 тыс прогоню и посчитаю
kzv
legendary
Activity: 1722
Merit: 1285
OpenTrade - Open Source Cryptocurrency Exchange
Конечно нормально.
Если с такой скоростью будет работать реальная биржа, то это будет очень круто!
legendary
Activity: 1792
Merit: 1028
dzyk.ru
Привет, kzv. Год назад в новогодние праздники был разговор о sqlite и о ядрах бирж.
Я тут накидал биржу прямо внутри PostgreSQL .. 2 функции всего купить битки за рубли и продать.
200 ордеров выполняются чуть больше чем за 2 секунды. Нормально?

Quote
1578325171347409
SystemSeconds:1578325171.347409
select buybtcR(783.10,0.00394383,2);select sellbtcR(197.55,0.00911647,2);
select buybtcR(277.77,0.00768230,2);select sellbtcR(628.87,0.00477397,2);
select buybtcR(952.23,0.00513401,3);select sellbtcR(717.30,0.00635712,2);
select buybtcR(16.30,0.00606969,2);select sellbtcR(804.18,0.00137232,3);
select buybtcR(129.79,0.00400944,3);select sellbtcR(218.26,0.00998924,2);
select buybtcR(612.64,0.00839112,3);select sellbtcR(524.29,0.00637552,1);
select buybtcR(292.52,0.00972775,2);select sellbtcR(769.91,0.00526745,2);
select buybtcR(283.31,0.00891529,1);select sellbtcR(919.03,0.00807725,2);
select buybtcR(526.00,0.00949327,3);select sellbtcR(663.23,0.00192214,2);
select buybtcR(64.17,0.00348893,3);select sellbtcR(63.10,0.00457702,3);
select buybtcR(902.21,0.00970634,1);select sellbtcR(539.76,0.00266666,1);
select buybtcR(512.54,0.00760249,2);select sellbtcR(39.28,0.00531606,3);
select buybtcR(930.81,0.00931835,1);select sellbtcR(738.53,0.00284293,1);
select buybtcR(687.86,0.00354049,1);select sellbtcR(880.08,0.00440104,1);
select buybtcR(228.97,0.00330337,3);select sellbtcR(686.67,0.00350360,3);
select buybtcR(657.30,0.00588640,1);select sellbtcR(923.97,0.00439560,1);
select buybtcR(684.22,0.00814767,2);select sellbtcR(215.82,0.00482491,3);
select buybtcR(147.66,0.00920128,3);select sellbtcR(431.95,0.00641081,1);
select buybtcR(786.00,0.00281059,1);select sellbtcR(226.11,0.00447034,3);
select buybtcR(556.44,0.00276235,3);select sellbtcR(906.80,0.00169607,3);
select buybtcR(495.44,0.00126075,2);select sellbtcR(935.00,0.00984752,2);
select buybtcR(749.77,0.00383188,1);select sellbtcR(232.26,0.00294160,2);
select buybtcR(152.39,0.00244413,3);select sellbtcR(793.47,0.00125475,3);
select buybtcR(74.53,0.00745071,3);select sellbtcR(521.56,0.00052529,1);
select buybtcR(797.80,0.00240062,1);select sellbtcR(967.41,0.00656564,1);
select buybtcR(93.48,0.00759735,2);select sellbtcR(78.23,0.00520210,3);
select buybtcR(461.42,0.00204655,3);select sellbtcR(755.58,0.00573319,3);
select buybtcR(999.99,0.00157807,3);select sellbtcR(125.47,0.00889956,3);
select buybtcR(870.54,0.00054058,3);select sellbtcR(923.07,0.00004162,2);
select buybtcR(163.13,0.00180372,1);select sellbtcR(819.70,0.00913027,2);
select buybtcR(579.43,0.00552485,2);select sellbtcR(99.64,0.00687387,2);
select buybtcR(304.30,0.00757294,1);select sellbtcR(877.61,0.00576971,2);
select buybtcR(35.42,0.00628910,1);select sellbtcR(925.38,0.00833239,3);
select buybtcR(979.43,0.00831037,1);select sellbtcR(983.60,0.00903366,2);
select buybtcR(163.97,0.00497259,3);select sellbtcR(76.99,0.00888949,2);
select buybtcR(629.48,0.00248044,1);select sellbtcR(316.87,0.00700620,1);
select buybtcR(74.16,0.00231428,3);select sellbtcR(651.13,0.00223656,3);
select buybtcR(280.04,0.00971466,2);select sellbtcR(113.28,0.00719269,1);
select buybtcR(944.32,0.00592540,3);select sellbtcR(847.68,0.00336351,3);
select buybtcR(344.94,0.00003231,2);select sellbtcR(233.89,0.00833243,2);
select buybtcR(481.94,0.00482950,3);select sellbtcR(182.56,0.00712087,1);
select buybtcR(413.98,0.00040864,2);select sellbtcR(637.64,0.00673936,2);
select buybtcR(609.11,0.00184622,2);select sellbtcR(328.37,0.00730729,3);
select buybtcR(920.91,0.00202213,2);select sellbtcR(257.27,0.00653130,3);
select buybtcR(260.50,0.00087644,1);select sellbtcR(93.74,0.00686125,1);
select buybtcR(576.69,0.00361601,1);select sellbtcR(288.78,0.00666557,3);
select buybtcR(329.64,0.00288379,3);select sellbtcR(3.58,0.00984363,3);
select buybtcR(188.20,0.00331479,2);select sellbtcR(918.93,0.00958637,1);
select buybtcR(121.14,0.00699075,3);select sellbtcR(774.27,0.00383832,1);
select buybtcR(861.92,0.00916273,3);select sellbtcR(548.04,0.00793657,3);
select buybtcR(909.64,0.00904933,2);select sellbtcR(576.20,0.00498144,1);
select buybtcR(864.58,0.00273911,1);select sellbtcR(848.94,0.00463662,1);
select buybtcR(180.42,0.00291053,2);select sellbtcR(139.06,0.00727550,1);
select buybtcR(838.13,0.00492422,1);select sellbtcR(221.97,0.00178208,1);
select buybtcR(138.24,0.00121259,2);select sellbtcR(931.90,0.00324807,2);
select buybtcR(836.83,0.00622095,2);select sellbtcR(334.97,0.00496074,3);
select buybtcR(608.88,0.00658831,3);select sellbtcR(72.55,0.00151230,2);
select buybtcR(363.60,0.00647207,2);select sellbtcR(91.15,0.00331386,2);
select buybtcR(583.57,0.00934495,2);select sellbtcR(761.78,0.00658747,3);
select buybtcR(883.04,0.00157272,3);select sellbtcR(207.84,0.00517715,3);
select buybtcR(829.94,0.00426199,3);select sellbtcR(326.01,0.00244327,3);
select buybtcR(984.84,0.00638654,1);select sellbtcR(136.07,0.00897560,2);
select buybtcR(783.28,0.00005409,3);select sellbtcR(114.67,0.00293678,3);
select buybtcR(49.16,0.00721006,2);select sellbtcR(707.91,0.00986467,2);
select buybtcR(865.18,0.00473894,3);select sellbtcR(382.90,0.00099559,2);
select buybtcR(809.10,0.00657120,1);select sellbtcR(53.42,0.00051508,2);
select buybtcR(692.08,0.00780868,3);select sellbtcR(589.64,0.00119111,1);
select buybtcR(595.05,0.00529899,2);select sellbtcR(888.72,0.00304285,1);
select buybtcR(609.73,0.00169820,2);select sellbtcR(596.20,0.00618925,2);
select buybtcR(70.09,0.00829808,1);select sellbtcR(169.65,0.00923728,1);
select buybtcR(826.77,0.00225491,3);select sellbtcR(878.28,0.00357193,3);
select buybtcR(659.15,0.00814909,2);select sellbtcR(778.26,0.00257469,3);
select buybtcR(308.16,0.00836104,1);select sellbtcR(612.44,0.00198021,2);
select buybtcR(782.26,0.00674605,1);select sellbtcR(401.19,0.00200352,1);
select buybtcR(231.00,0.00434009,1);select sellbtcR(154.72,0.00532846,2);
select buybtcR(380.21,0.00014579,2);select sellbtcR(737.41,0.00305408,1);
select buybtcR(552.32,0.00649659,3);select sellbtcR(809.79,0.00685986,1);
select buybtcR(645.89,0.00311950,3);select sellbtcR(843.91,0.00532960,3);
select buybtcR(518.51,0.00642692,2);select sellbtcR(718.87,0.00362154,1);
select buybtcR(152.88,0.00677812,2);select sellbtcR(685.72,0.00063561,2);
select buybtcR(700.30,0.00618958,1);select sellbtcR(5.71,0.00001125,3);
select buybtcR(655.37,0.00261570,3);select sellbtcR(341.35,0.00181161,3);
select buybtcR(653.30,0.00879009,1);select sellbtcR(186.26,0.00885014,3);
select buybtcR(828.96,0.00503461,3);select sellbtcR(191.11,0.00904170,1);
select buybtcR(868.92,0.00706067,1);select sellbtcR(932.48,0.00738959,1);
select buybtcR(551.44,0.00926576,3);select sellbtcR(552.57,0.00494407,1);
select buybtcR(814.14,0.00799646,2);select sellbtcR(995.30,0.00657201,3);
select buybtcR(874.31,0.00324541,3);select sellbtcR(759.32,0.00637771,1);
select buybtcR(262.78,0.00794910,2);select sellbtcR(166.95,0.00470564,2);
select buybtcR(873.02,0.00865085,3);select sellbtcR(611.98,0.00412483,1);
select buybtcR(538.56,0.00645602,2);select sellbtcR(32.96,0.00579021,2);
select buybtcR(832.61,0.00518151,3);select sellbtcR(489.81,0.00112648,1);
select buybtcR(814.35,0.00048500,1);select sellbtcR(452.12,0.00637656,3);
select buybtcR(247.03,0.00413078,1);select sellbtcR(717.60,0.00017457,2);
select buybtcR(582.68,0.00812947,3);select sellbtcR(995.16,0.00477361,2);
select buybtcR(640.77,0.00074260,1);select sellbtcR(219.79,0.00222602,1);
select buybtcR(737.94,0.00923513,2);select sellbtcR(850.59,0.00438562,3);
select buybtcR(899.09,0.00948911,2);select sellbtcR(536.74,0.00333569,2);
select buybtcR(949.82,0.00477551,1);select sellbtcR(967.28,0.00884318,2);
select buybtcR(780.22,0.00458039,1);select sellbtcR(257.59,0.00904781,2);
1578325173597722
SystemSeconds:1578325173.597722
legendary
Activity: 3108
Merit: 1358
А теперь давайте создадим тоже самое только децентрализованную и без необходимости пополнять баланс для полных нод...
А давайте создадим межпространственный туннель и отправимся в параллельную вселенную...

Примерно того же порядка пост. Можете - создавайте топик и делайте, нахрена шитпостить в чужих?
Pages:
Jump to: