Ivan Bogatyy
12 799
Блоги

Как мы заработали $100 тысяч на торговле криптокотятами

Правильный выбор котят на волне хайпа и бот для арбитража.

Поделиться

В избранное

В избранном

Перевод материала подготовил Артём Слободчиков.

Главный герой истории: Founder Cat #4 («Котёнок-Основатель №4»)

Сейчас все уже слышали о CryptoKitties («Криптокотятах») — забавной игре, вирусная популярность которой обрушила трафик криптовалюты Ethereum. Ниже — история о том, как мы заработали $107 тысяч, инвестируя в CryptoKitties, и ненадолго даже поставили мировой рекорд по самой крупной продаже крипто-коллекционного токена (сейчас мы на втором месте).

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

История началась обычным субботним вечером (2 декабря 2017 года), когда я отлаживал какой-то смарт-контракт на Ethereum. Что-то явно было не так: транзакции зависали в очереди и получали подтверждение гораздо медленнее обычного. Короткое расследование показало, что неподтвержденных (pending) транзакций в сети было в 10–20 раз больше обычного, и необычно много транзакций шли на один и тот же таинственный адрес 0x06012..66d. Так я впервые узнал о существовании «Криптокотят», которым предстояло стать знаменитыми в ближайшие дни.

Инвестиционная стратегия

На следующее утро я позвонил Олегу Остроумову, своему другу, который управляет топовым московским криптовалютным хэдж-фондом. Для меня игра CryptoKitties была всего лишь любопытным феноменом, но Олег сразу увидел в ней возможность для прибыльного инвестирования.

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

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

Поэтому мы решили купить Founder Cats («Котят-основателей») с однозначными номерами, несмотря на их высокую цену: кто-то недавно выкупил их по 25 эфиров за штуку, а потом снова выставил на рынок, увеличив цену вдвое (50 эфиров, то есть $25 тысяч). Цена Founder Cat №1 была ещё выше, около 150 эфиров.

Олег купил Founder Cat №4, №6, №8 по 50 эфиров за штуку, а я выложил $5000 за двадцатипроцентную долю в Founder Cat №4. Мы считали, что хайпу еще расти и расти, поэтому выставили котят на продажу по цене 250 эфиров за штуку, то есть в пять раз дороже, чем при покупке.

К слову, мы убили примерно час из-за того, что изначально выставили низкий gas price (комиссия майнерам за транзакцию) — пришлось переустанавливать MetaMask. Урок усвоен: когда делаешь покупку на $25 тысяч, лучше не пытаться сэкономить $20 на комиссии.

Едва повесив трубку после разговора с Олегом, я задумался, что эта сделка имеет все шансы стать моим новым рекордом на самый абсурдный способ потратить $5000. Реальность, конечно, оказалась еще абсурднее.

Тонкое искусство выхода на пике

В следующие несколько дней игра вошла в фазу вирусного взрыва. Учитывая то, насколько она аддиктивна, заниматься чем-то ещё было сложно. Долго это безумие продолжаться не могло — игровой процесс был значительно проще, чем у Pokemon Go. Игроки могли либо покупать котят, либо разводить их, чтобы получать новых. Мы предположили, что всё кончится максимум через пару недель, так что было важно заранее сформулировать рациональную стратегию выхода и придерживаться её.

«Google Тренды» для запроса cryptokitties. Разбиение по странам там, кстати, тоже весьма интересное

Мы использовали три метрики. Во-первых, «Google Тренды» для запроса cryptokitties показывали, насколько часто люди гуглили игру — это хороший способ предсказывать интерес и будущие вливания денег.

Во-вторых, GasGuzzlers показывает смарт-контракты, которые потребляют больше всего газа в сети, и общий объём потребляемого ими газа. Когда мы только купили котят, на игру приходилось примерно четыре процента, а на пике популярности — 20%.

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

Газ (gas) — плата, взимаемая с разработчиков за выполнение смарт-контрактов в сети Ethereum. Выплачивается в эфирах.

vc.ru

Четвёртого и пятого декабря несколько менее престижных котят (№35, №78 и №87) были куплены почти по 200 эфиров за штуку, так что мы были уверены в выборе цены. Однако пятого и шестого декабря все метрики достигли потолка, и к концу шестого числа популярность явно начала спадать.

Заметив это, шестого декабря мы в экстренном порядке снова созвонились, пытаясь понять, что нам делать со своими котятами по 250 эфиров, ни одного из которых ещё никто не купил. Я предложил выставить их заново с меньшей ценой в 100 эфиров, Олег же твёрдо держался прежней цены.

Спор мы разрешили самым очевидным образом: я продал ему свои 20% по оценке котёнка в 100 эфиров, в результате удвоив свои вложения за несколько дней. Увы, радоваться выгодной сделке мне оставалось примерно двадцать минут.

Доска лидеров с «Котами Основателями» №18 и №4 в топе

Я продолжал наблюдать за площадкой из любопытства. Буквально через 20 минут после выкупа моей доли Олегом, я увидел продажу нашего котёнка №4 за 247 эфиров. Я был настолько уверен в том, что это сам Олег создаёт фейковую активность вокруг своего лота, что едва не поленился его об этом спрашивать.

Но когда всё-таки спросил, то познал истинную силу стратегии HODL — это была реальная покупка, и эфиры уже лежали на кошельке. Мы понятия не имели, кто купил котёнка и почему, зато установили мировой рекорд по продаже коллекционного предмета на блокчейне.

Самые популярные контракты на Ethereum по данным GasGuzzlers. Текущий объём CryptoKitties в 0,92% — далеко позади доли 25% на пике

Бот для автоматического арбитража

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

Мы решили запустить бота для арбитража, чтобы заработать на более дешёвых котятах. Как и любая стратегия перепродажи, наша состояла из трёх шагов:

  • Определить кластеры криптокотят, у которых должна быть примерно одинаковая цена. Мы ориентировались на три параметра: редкость (Rarity), задержка (Cooldown) и поколение (Generation). Достаточно дорогими были только котята из первого и нулевого поколений. Тех котят, у которых три показателя были одинаковыми, мы считали эквивалентными, игнорируя красоту картинок или вариации Cattribute — различные атрибуты криптокотиков.
  • Скупать дешёвых котят в каждом классе. В нашем случае мы покупали только самого дешёвого по каждому параметру.
  • Перепродавать дороже. В нашем случае мы хотели избежать нисходящей конкуренции с другими спекулянтами, так что продавали каждого криптокотика по цене чуть меньшей, чем у второго в категории. Примерно так же делает Google на своих аукционах второй цены.

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

Такой механизм мгновенной реакции похож на фронт-раннинг, хотя ему больше бы подошло название «пост-раннинг»: невозможно провести транзакцию «купить котёнка» перед транзакцией «выставить на аукцион», так что первая должна происходить сразу после второй.

Наш стикер с Котёнком №8. +10 к эффективности арбитража

Что до более технического уровня, есть несколько вариантов реализации этого алгоритма.

  • Каждый раз, когда вы видите зависшую транзакцию внесения на торги, можно попытаться выкупить криптокотёнка в том же блоке. Для этого можно запустить транзакцию «купить» с немного меньшей ценой. Например, если в транзакции «выставить на аукцион» фигурирует цена в 25 gwei, то в своей транзакции «купить» можно заплатить 24,999 gwei.
  • Либо можно выставить ровно ту же цену, то есть и транзакция «выставить на аукцион», и транзакция «купить» будут стоить по 25 gwei.
  • Альтернативно, можно дождаться, пока транзакция «выставить на аукцион» будет подтверждена в очередном блоке, и сразу после этого выслать транзакцию «купить» в следующий блок со значительно более высокой ценой за газ, например 100 gwei.

В первом случае вы рискуете оказаться в ситуации, когда вы чуть-чуть не успеваете в подтверждённый блок, после чего ваша транзакция может на несколько часов зависнуть в состоянии «обрабатывается», если на площадке резко возрастёт активность.

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

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

Тут тоже есть два пути: можно либо запустить три стратегии с трёх аккаунтов, либо переключаться между ними в рамках одного, манипулируя значением nonce. Не вдаваясь в дальнейшие технические подробности, приведу общий псевдокод бота:

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

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

Итоги

Более чем через месяц после того, как хайп пошёл на убыль, случилась приятная неожиданность: кто-то купил нашего котёнка №6. 29 эфиров — это, конечно, меньше, чем изначальная цена покупки, но всё же неплохие деньги. К тому же, эфир на тот момент уже стоил в два раза больше.

Оставшемуся котёнку №8 достаётся всё внимание Олега. С изображением животного выходят наклейки для ноутбука, футболки и даже значки ручной работы из серебра 985 пробы. А если у вас есть опыт SMM — котёнок нанимает ассистента вести свой аккаунт в Instagram!

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

Да, у воображаемых котят нет никакой «обоснованной» или «справедливой» цены. Тем не менее, игра остаётся интересной, и в нее можно играть и выигрывать. И разумеется, предсказать, когда именно этот пузырь лопнет, было невозможно, хотя мы и были близки.

Что до моих $5000 прибыли от этого приключения, я решил пожертвовать их Летней компьютерной школе через Московский центр непрерывного математического образования (ЛКШ — отличный детский лагерь и одно из мест, где я научился программировать), а также Freedom of the Press Foundation. Здесь я снова удвоил свои деньги благодаря щедрой программе уравнивания пожертвований, которую Google предоставляет своим сотрудникам.

Блог автора, литературная помощь в составлении материала — Алина Асеева.

#блокчейн #криптовалюты #cryptokitties

{ "author_name": "Ivan Bogatyy", "author_type": "self", "tags": ["\u0431\u043b\u043e\u043a\u0447\u0435\u0439\u043d","\u043a\u0440\u0438\u043f\u0442\u043e\u0432\u0430\u043b\u044e\u0442\u044b","cryptokitties"], "comments": 19, "likes": 36, "favorites": 36, "is_advertisement": false, "section_name": "blog", "id": "36653", "is_wide": "" }
{ "is_needs_advanced_access": false }

Комментарии Комм.

Популярные

По порядку

0

Прямой эфир

Подписаться на push-уведомления
[ { "id": 1, "label": "100%×150_Branding_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox_method": "createAdaptive", "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "ezfl" } } }, { "id": 2, "label": "1200х400", "provider": "adfox", "adaptive": [ "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "ezfn" } } }, { "id": 3, "label": "240х200 _ТГБ_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fizc" } } }, { "id": 4, "label": "240х200_mobile", "provider": "adfox", "adaptive": [ "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "flbq" } } }, { "id": 5, "label": "300x500_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "ezfk" } } }, { "id": 6, "label": "1180х250_Interpool_баннер над комментариями_Desktop", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "adfox": { "ownerId": 228129, "params": { "pp": "h", "ps": "bugf", "p2": "ffyh" } } }, { "id": 7, "label": "Article Footer 100%_desktop_mobile", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fjxb" } } }, { "id": 8, "label": "Fullscreen Desktop", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fjoh" } } }, { "id": 9, "label": "Fullscreen Mobile", "provider": "adfox", "adaptive": [ "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fjog" } } }, { "id": 10, "disable": true, "label": "Native Partner Desktop", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fmyb" } } }, { "id": 11, "disable": true, "label": "Native Partner Mobile", "provider": "adfox", "adaptive": [ "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fmyc" } } }, { "id": 12, "label": "Кнопка в шапке", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "p1": "bscsh", "p2": "fdhx" } } }, { "id": 13, "label": "DM InPage Video PartnerCode", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox_method": "createAdaptive", "adfox": { "ownerId": 228129, "params": { "pp": "h", "ps": "bugf", "p2": "flvn" } } }, { "id": 14, "label": "Yandex context video banner", "provider": "yandex", "yandex": { "block_id": "VI-223676-0", "render_to": "inpage_VI-223676-0-1104503429", "adfox_url": "//ads.adfox.ru/228129/getCode?pp=h&ps=bugf&p2=fpjw&puid1=&puid2=&puid3=&puid4=&puid8=&puid9=&puid10=&puid21=&puid22=&puid31=&puid32=&puid33=&fmt=1&dl={REFERER}&pr=" } }, { "id": 15, "label": "Плашка на главной", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "p1": "byudx", "p2": "ftjf" } } }, { "id": 16, "label": "Кнопка в шапке мобайл", "provider": "adfox", "adaptive": [ "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "p1": "byzqf", "p2": "ftwx" } } } ]