Начало
Эта история будет интересна и как любопытный технический проект, и как пример того, насколько внутренние убеждения участников важны и могут влиять на результаты работы и жизнеспособность продуктов. Идея выразить в тексте этот опыт просилась на свет уже давно и в свете наступления очередной волны интереса к криптопроектам, я решил сделать из этого своеобразный творческий эксперимент. Так что не судите строго и приятного чтения.
В далеком 2012 году я работал, в должности заместителя начальника Управления ИТ. Выполнял задачи администрирования довольно крупной сети более чем на 1500 узлов, отвечал за серверную инфраструктуру и автоматизацию процессов. В общем, рабочая жизнь была насыщенной, обильно украшенной техническими задачами и инцидентами, но довольно предсказуемой.
Однажды на работе во время обеда за чашкой кофе, я услышал разговор двух админов из нашего управления. Речь шла о LocalBitcoins — одном из первых популярных p2p обменников криптовалюты. Я и раньше в сети наталкивался на новые слова blockchain и crypto currency, но здесь информация просочилась совсем близко и я поддержал тему своим живым интересом и расспросами. Парни с энтузиазмом стали рассказывать о монетах, биткоине стоимостью почти в 10 баксов и безграничных перспективах. Оказалось, что у каждого уже стоит по паре компов, которые подключившись к неким пулам, «майнят» эти самые монеты. Это выглядело больше как хобби, однако сама идея использования цепочек криптографически связанных блоков вызывала интерес.
Должен признать, что в этот момент я совершил одну из самых досадных и, как это водится, не поправимых ошибок в своей жизни. Но осознание этого придет много лет спустя. Выяснив, что любительским майнингом много не заработаешь я быстро снизил для себя значимость этой темы, как источника дохода самой по себе, поставил на всей отрасли ярлык - «песочница для гиков» (со всем уважением к представителям технического сообщества, к которому и сам себя причисляю) и сосредоточился на самой технологии и ее возможностях. Тогда было сложно рассмотреть в этой зарождающейся индустрии рациональное зерно. Как справедливо говорят хейтеры, «ценности нет». Во всяком случае, напрямую прослеживаемой ценности. Ценность крипты многослойна. Но это тема другой статьи. Факт остается в том, что эта установка сыграла впоследствии свою роковую роль в жизни проекта.
Идея
Итак, через какое-то время исследований и многих часов обсуждений на тему крипторынка с коллегами, я обзавелся сокровищем в размере 3х биткоинов и примерно сотни лайткоинов. Став обладателем крипты и сразу отказавшись от игр с купи/продай мысль заработала по такому маршруту. Если майнеры жгут электричество и в прямом смысле майнят (т.е. добывают) крипту, то это чем-то напоминает времена героев книг Джека Лондона и золотой лихорадки на Клондайке. В детстве я зачитывался книгами этого автора и каким-то образом пазл сложился и мне пришла в голову гениальная мысль. В разгар лихорадки, на приисках процент успешных старателей колебался от 2-3 до 5-6 процентов. Другими словами, если вписываться в эту среду с кайлом и зарабатывать добычей и игрой, то можно оказаться в числе трех счастливчиков из ста участников или попасть в компанию 97 проигравших. Расклад может и не так уж плох, но есть лучше. В одной из книг Джека Лондона упоминалось, что с вероятностью 100% в выигрыше остаются не те, кто устремился за добычей вожделенного металла, а те, кто установил вдоль дороги к прииску трактиры. Эта мысль занозой поселилась в моем мозгу и неспешно вызрела в симпатичный проект. Одновременно с этим, мысль о том, что вся эта тема всего лишь «песочница для гиков», которая проживет пару лет максимум, как троянский конь уже глубоко сидела в сознании и с одной стороны подгоняла, а с другой обесценивала всю затею.
Тем не менее, я нашел себе компаньона в лице своего сокурсника по временам обучения в Питерском Политехе. Я рассказал ему свою идею и концепцию нового сервиса. Это была игра! Моя мысль крутилась вокруг возможности дать успешным игрокам рынка криптовалют с удовольствием потратить свои добытые монеты в честной лотерее. Это и был бы наш «трактир» на той самой дороге к прииску и возможность освоить новые технологии блокчейна. Таков был план :-)
На скриншоте часть веб интерфейса двух лотерей в двух криптовалютах - биткоин и лайткоин
На первом этапе лотерея предлагала сыграть в рамках двух блокчейнов самых популярных, на тот момент, криптовалют – биткоина и лайткоина. Мой коллега по этому проекту с интересом отнесся к задумке и новым для нас тогда технологиям и со свойственной ему обстоятельностью описал математический аппарат лотереи, оформив его по всем правилам научной литературы. (С благодарностью вспоминаю совместную работу и крепко жму руку.)
В качестве бэкенда использован Python + Mongodb с кошельками в соответствующих блокчейнах. Фронт для клиентов был написан в виде сайта с асинхронным javascript, с подключением к API сервера по websocket.
Математика и механика игры
Дальше будет раздел, посвященный математике и описание механики игры. Для этого мне понадобится ввести несколько определений:
Счастливое число L. Число определенной длинны, представляющее собой массив L длинны j. Например, массив L = [0, 5, 8, 15, 7, 9], его длина j = 6.
Минимальная ставка в определенной криптовалюте. Например, минимальная ставка в LTC - Bltc = 0.01. Минимальная ставка в BTC - это Bbtc = 0.001.
Билет. Пользовательская транзакция на любую сумму, отправленная на адрес лотереи разделялась на несколько билетов, где стоимость одного билета равнялась минимальной ставке. Каждый билет по определенному алгоритму, который будет описан ниже, ассоциировался со своим собственным счастливым числом, в обязательном порядке той же длины, что и счастливое число лотереи. При этом оба числа, и билета и лотереи, должны были быть полностью независимы.
Функция совпадения. Принимает на вход два массива в виде аргументов и возвращает количество совпадений чисел в массивах с одинаковыми индексами.
Стоп число s. Каждая лотерея имеет число s <= j. Лотерея останавливается, если число совпавших чисел (Функция совпадения) равна s. Число подбирается так, чтобы вероятность срабатывания при прогнозируемом количестве билетов, была адекватна времени, отведенной на один розыгрыш. Другими словами, чтобы событие совпадения s чисел происходило ближе к финишу лотереи по времени.
Хэш. Мы определяем hash (H) как бинарные данные длинной 256 бит.
Хэш функция. Определяем hash (H256) как функцию, которая конвертирует бинарную строчку в хэш (бинарные данные длинной 256 бит).
Функция вычисления счастливого числа FL Функция конвертации хэша в счастливое число. Для генерации используются все биты хэша. На первом этапе хэш конвертируется в массив 4х битных целочисленных значений. Затем с помощью исключающего ИЛИ этот массив свертывается до массива целых чисел длинной, равной количеству чисел в счастливом числе.
Описание игры
Перейдем непосредственно к описанию процесса и правил игры.
Для примера договоримся, что длина счастливого числа у нас будет j =6, а для остановки нам будет достаточно s >= 5 совпадений. Цель игры в совпадении как можно большего числа цифр счастливого числа игрока с соответствующими цифрами из счастливого числа лотереи. Чем больше чисел совпало, тем больше выигрыш. Если совпали все числа, игрок сорвал джекпот.
На каждую транзакцию выделялись игровые билеты с индивидуальными счастливыми номерами в количестве N = A/B, где А – это сколько монет в транзакции, а В – минимальная цена одного билета. Если монет было больше, остаток не возвращался.
В таблице ниже приведен процесс выдачи билетов для транзакции 0.0032 btc.
Amount |
Ti + Tn |
H256 (Ti + Tn) |
L(T) |
0.001 btc 0.001 btc 0.001 btc 0.0002 btc |
4b22 . . . f8a00 4b22 . . . bf8a1 4b22 . . . bf8a2 no ticket |
41db . . . 82d1 0788 . . . 01a5 f05f . . . 175a n/a |
{13, 15, 2, 5, 1} {13, 6, 15, 12, 0} {4, 10, 9, 11, 4} n/a |
Total: 0.0032 btc |
- |
- |
- |
Здесь хэш транзакции дополняется для каждого билета порядковым номером n. Затем применяется функция H256. И функция генерации счастливого числа. Таким образом используются все биты из ID транзакции и достигается уникальность и независимость счастливых чисел.
Каждая новая транзакция не только вычисляет счастливое число для каждого вновь выданного билета, но и запускает генерацию нового главного счастливого числа лотереи по следующему алгоритму: L = FL (H1 ⊕ H2 ⊕ · · · ⊕ Hn)
Где L - счастливое число, H1 ... Hn - это хеши транзакций в игре от первого до n, FL - функция генерации счастливого числа, ⊕ – XOR (исключающее ИЛИ).
Такой подход приводит к любопытной механики игры. Каждая ставка имеет фиксированный билет со своим счастливым числом. При этом любая транзакция в адрес лотереи приводит к генерации нового главного счастливого числа случайным образом, что приводит к новому розыгрышу среди уже выданных билетов. Отсюда был слоган «Один билет = много розыгрышей». Выданные билеты будут играть до тех пор, пока число совпавших чисел одного из билетов не будет равно стоп числу s. Если для любого билета совпадут все числа то выигрышный билет забирает джекпот, а игра так же останавливается и фиксируются текущие выигрыши по всем билетам в розыгрыше в соответствии с, индивидуально для каждого билета, совпадениями.
Интерфейс
Интерфейс пользователя отображал все билеты в игре с такими дополнительными характеристиками как хэш транзакции, статус транзакции (подтверждена или нет), текущий потенциальный выигрыш каждого билета, в случае, если бы игра была остановлена прямо в этот момент. В колонке «History Wins» – визуально можно было увидеть как конкретный билет в процессе новых транзакций набирал больше или меньше совпадений, но все еще не достаточно, чтобы остановить игру. Свои билеты можно было выделить и сохранить в закладках для отслеживания. Таблица обновлялась автоматически с сервера через websocket без перезагрузки страницы. Выплаты выигрышей отправлялись обратно на адрес с которого была сделана ставка.
По задумке, покупая дополнительный билет в лотерее, игрок инициирует расчет нового случайного счастливого числа лотереи и таким образом, разыгрывает в этот момент все свои купленные ранее билеты! Это стимулирует игроков покупать на старте как можно больше билетов, ведь после этого, каждая транзакция это новый шанс для всего пула выданных билетов и дополнительный азарт, когда игрок докупая новые билеты, сам запускает розыгрыш лотереи.
Напомню, что к завершению розыгрыша приводит совпадение >= s значений в счастливых числах (совпадение максимального числа цифр приносит игроку jackpot). На момент завершения фиксируются текущие выигрыши для всех билетов. Из механики понятно, что чем больше билетов в игре, тем выше вероятность окончания игры и выпадения jackpot’а при каждой новой транзакции.
Банк лотереи и выплаты распределялись в следующих пропорциях:
0 совпадений — 0% выплат. Билеты проигрывают.
1 совпадение — 35% выплат распределяются среди выигравших.
2 совпадения — 17% выплат распределяются среди выигравших.
3 совпадения — 13% выплат распределяются среди выигравших.
4 совпадения — 13% выплат распределяются среди выигравших.
5 совпадений — 17% выплат распределяются среди выигравших.
6 совпадений — выигравший забирает jackpot.
5% - распределяются поровну между пополнением jackpot банка и средствами на техническую поддержку сервиса. Оплата комиссий для выплат выигрышей происходит за счет отчислений на обслуживание сервиса.
Результаты
В модели и расчетах необходимо было ответить на несколько основных вопросов:
Какова вероятность совпадения 1, 2, 3,..., j значений из счастливого числа.
Какое ожидаемое число билетов(транзакций) в каждом розыгрыше? Зависит от s, j.
Какова отдельно вероятность jackpot’а?
Применив биномиальное распределение не трудно посчитать, что для каждого отдельного розыгрыша лотереи с s = 5 и j = 6 вероятность совпадения 5 чисел и следовательно остановки равна Ps ~ 5.3644 ·10−6 , а вероятность jackpot’а Pj ~ 5.9605 · 10−8.
Найдем вероятность, что игра остановится на n-ом билете. Эта вероятность будет определяться одновременно тремя событиями. Первое – игра не остановилась до n-го билета. Второе – игра не остановилась из-за джекпота во время n-го билета. И третье – игра должна остановиться во время n-го билета (совпадение s значений). На графике приведена зависимость вероятности для игры остановиться на n-ом билете.
Далее, нам интересно будет оценить ожидаемое значение <N> билетов в игре к моменту наступления события остановки игры. В результате получилось, что для s = 5 ожидаемое число билетов в розыгрыше будет равно <N>s=5 ≈ 541.13.
На представленном ниже графике можно увидеть распределение вероятности остановки игры при розыгрыше с участием N билетов в игре.
По графику видно, что розыгрыш с принятыми параметрами, уже где-то после 1000 выданных билетов приводит к окончанию лотереи с вероятностью выше 90 процентов в следующей транзакции. Изменяя длину счастливого числа j и число совпадений для остановки s можно регулировать насколько скоро будут заканчиваться розыгрыши в зависимости от числа участников.
Эпик фейл
Итак, в результате у нас была работающая лотерея с интересным розыгрышем. Все используемые для генерации случайные числа хранились в блокчейне и легко проверялись. Интерфейс позволял быстро и без регистраций (игрок идентифицировался по транзакции) приобрести билеты и буквально онлайн следить за ходом игры. Игра была опубликована, но трафик был катастрофически мал. Началась самая мучительная стадия, о сервисе предстояло как-то рассказать миру. Дальше последовала регистрация на десятке тематических форумов и заполнение каталогов с криптопроектами информацией о лотерее. Дополнительно, было решено вложить часть крипты в баннерную рекламу на паре наиболее раскрученных форумов. Результаты были удручающие. Посещаемость сайта росла крайне медленно и неровно. И тут что-то случилось. Вдруг сайт показал посещаемость в несколько тысяч уникальных визитов в день. За несколько дней в пике посещаемость доходила до пары тысяч визитов. Статистика показала, что пользователи пришли из Китая. Какой из каналов привел посетителей было не понятно. Однако спустя неделю, поток китайских визитов как внезапно появился так же и стремительно сошел на нет. За это время игра принесла порядка 10 биткоинов дохода.
Тем временем, я распространил информацию о готовой лотерее среди знакомых и вызвал интерес человека, который мог инвестировать в проект. И именно здесь мое первоначальное ошибочное отношение ко всей криптовалютной индустрии сыграло свою роль. Я с энтузиазмом рассказывал о непосредственно сервисе и лишь вскользь и пренебрежительно отзывался о самой экосистеме блокчейна, как незрелой, хайповой и сосредоточенной на очень узком кругу около компьютерной публики. Сейчас очевидно, что потенциальные партнеры слышали в моих речах именно этот посыл и заходить в странную, очень узкоспециализированную тему всего на пару лет не спешили. Именно так внутреннее отношение автора к области, для которой разрабатывался сервис, фатально повлияло на возможности проекта быть поддержанным новыми ресурсами. Естественно сейчас, склонность к быстрым суждениям относительно блокчейн индустрии уже давно сменил интерес к этому феномену и как к технологическому прорыву и как к социальному явлению. Но тогда разглядеть потенциал этого направления оказалось не так то просто, что выражалось не только в неудаче конкретного проекта, но и в множестве, теперь звучащих невероятно захватывающе, историй потери ключей доступа к криптоактивам по небрежности и ошибок в оценке перспектив развития.
Тем временем, доход от сайта лотереи был потрачен на рекламные компании и, просуществовав еще год, лотерея была благополучно закрыта а домен больше не продлялся. Так, в 2014 году закончилась история создания и похорон криптолотереи LotITBit вместе с бюджетом на рекламу и хостинг в размере 13 биткоинов и порядка 100 лайткоинов. История не терпит сослагательных наклонений, но думаю будет интересно оценить для справки, что на момент написания статьи, по текущим ценам на маркете, бюджет проекта был бы немногим менее 800 тысяч долларов.
Что дальше?
Чтобы не заканчивать на этой минорной ноте, хочу сказать, что на этом проекте были обкатаны многие интересные технологии, которые я потом с успехом перенес в проекты вне блокчейн индустрии.
Что касается криптовалют сейчас, то я собираюсь запастись попкорном, чтобы посмотреть что будет теперь дальше. Станут ли технологии блокчейна настолько удобными, чтобы вырасти в полноценный web3.0, как отнесутся основные юрисдикции мира к криптовалютам в ближайшем будущем и куда заведет человечество распределенный блокчейн через десяток лет с перспективами национальных цифровых валют?