Активно подогреваемый нами интерес к ICO Полибиуса вылился в оглушительный успех — причем в этот раз почти в буквальном смысле этого слова. Оглушенный вниманием 14000 человек, пришедших покупать наши токены в первые минуты после запуска продаж, сайт Полибиуса обвалился. И это было только начало. Как и обещали, рассказываем, что же произошло 31 мая, и что мы могли сделать лучше, чтобы избежать случившегося.
Конечно же, на старте ICO мы были готовы и к DDoS-атакам, и к высокой нагрузке на сервера, однако, признаемся, мы просто-напросто недооценили как возможности злобных хакеров и степень интереса к проекту, так и вероятность нештатных ситуаций.
Техническую платформу (кабинет инвестора, всю инфраструктуру) для ICO Полибиуса предоставляла компания Ambisafe. Начав с разработки блокчейн-продуктов, компания со временем расширила свои интересы в сторону предоставления фирмам набора сервисов и инструментов, необходимых для проведения ICO. Выбрав опытного подрядчика, мы полностью положились на их знания и навыки, не проконтролировав лишний раз те вещи, которые мы могли (и должны были!) проконтролировать. И это была наша первая ошибка.
Хорошая мощность серверов — критически важная деталь, если вы не хотите, чтобы сайт обвалился на старте продаж. Прогнозируя возможную нагрузку на сервера в первые часы проведения ICO, подрядчик предоставил нам требования по их мощности, но уже тогда мы предположили, что этих показателей может быть недостаточно, и повысили характеристики в два раза. Чтобы разделить нагрузку между серверами, мы также расположили в разных местах кабинет пользователя и сам сайт Полибиуса, однако не разделили базу данных и основные файлы кабинета. И это была ошибка номер два.
База данных страдала каждый раз, когда приходило слишком много запросов в кабинет инвестора (и наоборот), и сервер падал, периодически становясь недоступным. Когда проблема стала очевидна, мы увеличили мощность серверов почти в 10 раз по сравнению с первоначальными характеристиками. Однако потребовалось время для того, чтобы изменить конфигурацию кабинета и заново залить все файлы на новые сервера.
Ажиотаж вокруг начала ICO Полибиуса был настолько сильным, что как только счетчик обратного отсчета на сайте polybius.io дотикал до нуля, толпы пользователей ринулись покупать токены, а часть наших пользователей даже умудрилась сделать фальстарт. Сам по себе ажиотаж со стороны реальных пользователей не большая проблема. Проблемой стало повышенное внимание к ICO Полибиуса со стороны ботов — началась DDoS-атака. Примерно за 6 часов от ддосеров пришло порядка 30 млн запросов в личный кабинет инвестора, который в них просто захлебнулся. Ситуация усугублялась тем, что первые часы было вдвойне сложно отбиваться от вредоносного трафика — не всегда было понятно, это реальный человек сидит и жмет «Обновить» в надежде увидеть личный кабинет, или же это бот, который делает то же самое.
Поскольку желающих поучаствовать на старте было очень много, они настойчиво пробивались на сайт через DDoS и продолжали покупать токены, когда сайту легчало. В итоге в системе накопилось огромное количество транзакций, которые не выполнялись вовремя и застряли внутри нее. И тут мы плавно переходим к другой проблеме, которая по понятным причинам волновала участников краудфандинга больше всего.
Поскольку система, в которой происходили транзакции, большая и многомодульная, каждая операция для совершения должна была пройти четкий маршрут. Из-за DDoS-атаки в определенных местах системы модули стали тормозить, поэтому одновременно с отфильтровыванием вредоносного трафика пришлось практически вручную разбирать застрявшие в системе транзакции. Но даже после проталкивания застрявших операций, мы не смогли обеспечить своевременное получение купленных токенов из-за возникшей в сети Ethereum непроходимости. Это была нештатная ситуация, которая породила панику и шквал комментариев по типу «С меня сняли деньги, а токены не начислили. Прошло уже полчаса/час/5 часов…» Сейчас, когда токены уже давно начислены всем пострадавшим инвесторам, нам остается только еще раз извиниться за возникшую ситуацию и объяснить, что стало ее причиной.
В момент старта ICO Полибиуса на блокчейне сети Ethereum проходило еще одно большое ICO (BAT — BasicAttentionToken), и конкуренция между инвесторами привела к перегрузке сети. Чтобы понимали те наши читатели, которые знают не так много про Ethereum — сеть работает таким образом, что чтобы отправить в нее транзакцию, необходимо заплатить комиссию. И чем комиссия выше, тем быстрее транзакция попадает в сеть. На фоне второго ICO, участники которого начали устанавливать огромные комиссии, транзакции Полибиуса с оптимальной комиссией в плане соотношения стоимости и количества времени на подтверждение перестали подтверждаться и встали в очередь в самой сети Ethereum, в этот раз застряв где-то на границе между нашей системой и блокчейном.
Для проведения в Ethereum не единичной, а пачки транзакций, как это было в нашем случае, их необходимо выстроить в очередь, присвоив каждой транзакции (условно) порядковый номер. Порядковые номера должны находиться в абсолютном инкременте — то есть каждая последующая транзакция должна иметь номер на единицу больше, чем предыдущая. А значит, мы не можем отправить в сеть транзакцию номер 10, пока не будут обработаны первые девять. Чтобы не нагружать сеть еще сильнее и не увеличивать количество застрявших транзакций, мы были вынуждены повысить комиссию для всех новых ордеров — новые транзакции стали подтверждаться в штатном режиме и в более приемлемые сроки. Самые первые транзакции (речь идет об огромном количестве ордеров — более тысячи) пришлось оставить «как есть», поэтому прошло несколько суток, прежде чем первые инвесторы смогли получить принадлежащие им токены.
Это нештатное поведение системы и ситуация, которую нашим подрядчикам пришлось решать впервые, поэтому сложно судить, была ли выбрана оптимальная тактика, или мы могли сделать еще больше.
Самое важное, пусть и не уникальное понимание, — когда проблема уже проявилась, все что вы можете сделать, это начать решать ее как можно более оперативно. Первое, что сделали мы, — это увеличили характеристики сервера, взяли более мощное железо, разнесли базу данных по разным серверам, настроили файервол, отфильтровали DDoS-атаки. И все эти процессы заняли около суток. Дополнительное время ушло на то, чтобы наладить процесс проведения транзакций через Ethereum.
Сейчас, когда у нас уже есть опыт ICO, можно смело говорить, что в этом вопросе невозможно быть слишком предусмотрительным. Лучше лишний раз перестраховаться, поэтому если вы вдруг решите провести свое собственное ICO, пожалуйста, подумайте сразу о том, что:
И, самое главное, вы никогда не сумеете предусмотреть все возможные проблемы, поэтому просто будьте готовы к любым неожиданностям. Можно потратить много времени на подсчет ошибок, совершенных по недосмотру, но на ошибках учатся, и мы рады, что они не стали серьезным препятствием для успешного завершения нашей кампании.
Конечно же, на старте ICO мы были готовы и к DDoS-атакам, и к высокой нагрузке на сервера, однако, признаемся, мы просто-напросто недооценили как возможности злобных хакеров и степень интереса к проекту, так и вероятность нештатных ситуаций.
Техническую платформу (кабинет инвестора, всю инфраструктуру) для ICO Полибиуса предоставляла компания Ambisafe. Начав с разработки блокчейн-продуктов, компания со временем расширила свои интересы в сторону предоставления фирмам набора сервисов и инструментов, необходимых для проведения ICO. Выбрав опытного подрядчика, мы полностью положились на их знания и навыки, не проконтролировав лишний раз те вещи, которые мы могли (и должны были!) проконтролировать. И это была наша первая ошибка.
Слишком слабое железо
Хорошая мощность серверов — критически важная деталь, если вы не хотите, чтобы сайт обвалился на старте продаж. Прогнозируя возможную нагрузку на сервера в первые часы проведения ICO, подрядчик предоставил нам требования по их мощности, но уже тогда мы предположили, что этих показателей может быть недостаточно, и повысили характеристики в два раза. Чтобы разделить нагрузку между серверами, мы также расположили в разных местах кабинет пользователя и сам сайт Полибиуса, однако не разделили базу данных и основные файлы кабинета. И это была ошибка номер два.
База данных страдала каждый раз, когда приходило слишком много запросов в кабинет инвестора (и наоборот), и сервер падал, периодически становясь недоступным. Когда проблема стала очевидна, мы увеличили мощность серверов почти в 10 раз по сравнению с первоначальными характеристиками. Однако потребовалось время для того, чтобы изменить конфигурацию кабинета и заново залить все файлы на новые сервера.
Ажиотаж вокруг начала ICO Полибиуса был настолько сильным, что как только счетчик обратного отсчета на сайте polybius.io дотикал до нуля, толпы пользователей ринулись покупать токены, а часть наших пользователей даже умудрилась сделать фальстарт. Сам по себе ажиотаж со стороны реальных пользователей не большая проблема. Проблемой стало повышенное внимание к ICO Полибиуса со стороны ботов — началась DDoS-атака. Примерно за 6 часов от ддосеров пришло порядка 30 млн запросов в личный кабинет инвестора, который в них просто захлебнулся. Ситуация усугублялась тем, что первые часы было вдвойне сложно отбиваться от вредоносного трафика — не всегда было понятно, это реальный человек сидит и жмет «Обновить» в надежде увидеть личный кабинет, или же это бот, который делает то же самое.
Поскольку желающих поучаствовать на старте было очень много, они настойчиво пробивались на сайт через DDoS и продолжали покупать токены, когда сайту легчало. В итоге в системе накопилось огромное количество транзакций, которые не выполнялись вовремя и застряли внутри нее. И тут мы плавно переходим к другой проблеме, которая по понятным причинам волновала участников краудфандинга больше всего.
Перегрузка сети
Поскольку система, в которой происходили транзакции, большая и многомодульная, каждая операция для совершения должна была пройти четкий маршрут. Из-за DDoS-атаки в определенных местах системы модули стали тормозить, поэтому одновременно с отфильтровыванием вредоносного трафика пришлось практически вручную разбирать застрявшие в системе транзакции. Но даже после проталкивания застрявших операций, мы не смогли обеспечить своевременное получение купленных токенов из-за возникшей в сети Ethereum непроходимости. Это была нештатная ситуация, которая породила панику и шквал комментариев по типу «С меня сняли деньги, а токены не начислили. Прошло уже полчаса/час/5 часов…» Сейчас, когда токены уже давно начислены всем пострадавшим инвесторам, нам остается только еще раз извиниться за возникшую ситуацию и объяснить, что стало ее причиной.
В момент старта ICO Полибиуса на блокчейне сети Ethereum проходило еще одно большое ICO (BAT — BasicAttentionToken), и конкуренция между инвесторами привела к перегрузке сети. Чтобы понимали те наши читатели, которые знают не так много про Ethereum — сеть работает таким образом, что чтобы отправить в нее транзакцию, необходимо заплатить комиссию. И чем комиссия выше, тем быстрее транзакция попадает в сеть. На фоне второго ICO, участники которого начали устанавливать огромные комиссии, транзакции Полибиуса с оптимальной комиссией в плане соотношения стоимости и количества времени на подтверждение перестали подтверждаться и встали в очередь в самой сети Ethereum, в этот раз застряв где-то на границе между нашей системой и блокчейном.
Для проведения в Ethereum не единичной, а пачки транзакций, как это было в нашем случае, их необходимо выстроить в очередь, присвоив каждой транзакции (условно) порядковый номер. Порядковые номера должны находиться в абсолютном инкременте — то есть каждая последующая транзакция должна иметь номер на единицу больше, чем предыдущая. А значит, мы не можем отправить в сеть транзакцию номер 10, пока не будут обработаны первые девять. Чтобы не нагружать сеть еще сильнее и не увеличивать количество застрявших транзакций, мы были вынуждены повысить комиссию для всех новых ордеров — новые транзакции стали подтверждаться в штатном режиме и в более приемлемые сроки. Самые первые транзакции (речь идет об огромном количестве ордеров — более тысячи) пришлось оставить «как есть», поэтому прошло несколько суток, прежде чем первые инвесторы смогли получить принадлежащие им токены.
Это нештатное поведение системы и ситуация, которую нашим подрядчикам пришлось решать впервые, поэтому сложно судить, была ли выбрана оптимальная тактика, или мы могли сделать еще больше.
Чему мы научились
Самое важное, пусть и не уникальное понимание, — когда проблема уже проявилась, все что вы можете сделать, это начать решать ее как можно более оперативно. Первое, что сделали мы, — это увеличили характеристики сервера, взяли более мощное железо, разнесли базу данных по разным серверам, настроили файервол, отфильтровали DDoS-атаки. И все эти процессы заняли около суток. Дополнительное время ушло на то, чтобы наладить процесс проведения транзакций через Ethereum.
Сейчас, когда у нас уже есть опыт ICO, можно смело говорить, что в этом вопросе невозможно быть слишком предусмотрительным. Лучше лишний раз перестраховаться, поэтому если вы вдруг решите провести свое собственное ICO, пожалуйста, подумайте сразу о том, что:
- нагрузка в первые часы может быть просто зашкаливающией и превосходить даже самые смелые ожидания;
- если ваш проект на слуху, то внимание со стороны ддосеров вам гарантировано, поэтому позаботьтесь о защите от возможных атак;
- если одновременно с вашим будет проходить еще 10 ICO, лучше заранее потратить время на размышление о том, какую тактику выбрать — ждать ли несколько дней, когда транзакции так или иначе, но пройдут, или вложить дополнительные ресурсы и форсировать проведение ордеров через сеть;
- стоит уделить больше внимания своевременному информированию инвесторов о возникших проблемах — это однозначно поможет снизить количество одинаковых запросов в техподдержку и освободит ее ресурсы для решения других насущных задач.
И, самое главное, вы никогда не сумеете предусмотреть все возможные проблемы, поэтому просто будьте готовы к любым неожиданностям. Можно потратить много времени на подсчет ошибок, совершенных по недосмотру, но на ошибках учатся, и мы рады, что они не стали серьезным препятствием для успешного завершения нашей кампании.