Продолжаем серию материалов посвященных разработке с помощью технологий блокчейна. В этой статье разработчик из Waves рассказывает о том, как провести набирающий популярность ICO, а также об опыте поднятия ноды в облаке Azure.  В последнее время стал популярным уход от привычной модели IPO в пользу проведения ICO — initial coin offering — организационно куда более простого процесса. Техническая основа ICO — токены. Выпуск токенов происходит путём добавления в блокчейн транзакции с их описанием, количеством и уникальным ID. После выпуска любое количество токенов может быть отправлено на любой кошелёк в блокчейне. ICO — это продажа компанией своих токенов в обмен на более-менее стабильные криптовалюты. Поскольку внешнего регулятора в лице государства тут нет, приходится полагаться на репутацию. Здесь в игру вступают эскроу — авторитетные люди или компании, кошельки которых используются для хранения средств до завершения ICO. В случае, если ICO завершилось, собрав денег меньше минимального порога, эскроу возвращают всё обратно инвесторам. Иногда используют кошельки с несколькими подписями (multisig wallets). К примеру, для сети Bitcoin такие кошельки описаны здесь. О том, как провести ICO на Waves, я расскажу дальше. Криптовалютная платформа Waves была запущена в апреле 2016 года, ICO-инвестиции составили 30 тысяч биткоинов, а на сегодняшний день капитализация платформы — более 100 миллионов долларов. В блокчейне Waves используется алгоритм Proof-of-stake, с минимальным майнящим балансом в 10 000 Waves. Один из основных способов использования Waves — это именно проведение ICO. Сеть платформы состоит из так называемых нод (node — узел), которые сообщаются между собой и предоставляют API для использования клиентскими кошельками. Основной программный интерфейс платформы — Node API, поддерживающий работу с различными транзакциями: переводом средств, выпуском токенов и лизингом Waves. Также нода предоставляет API децентрализованной биржи (DEX). Большинство методов API доступны из web-клиента, но их, конечно, можно использовать и напрямую. К примеру, получим список последних 20 неподтверждённых (ожидающих добавления в блокчейн) транзакций: Полную документацию Node API можно найти там же, где и подробное описание установки ноды: в GitHub-репозитории. Одно из преимуществ обладания Waves-нодой — это возможность майнинга. Нода, на балансе которой есть от 10000 Waves, участвует в генерации блоков, и за каждый сгенерированный блок она получает комиссию со всех транзакций, находящихся в блоке, а также бонус в виде некоторого количества MRT (Miners Reward Token), которым, в свою очередь, можно торговать на бирже. Чтобы организовать майнящую ноду в сети Waves, нужно развернуть её на своём сервере. Никаких особых требований к железу у ноды нет, но 4 Гб оперативной памяти и 10 Гб свободного дискового пространства всё же стоит иметь. Также весьма удобный способ поднять ноду — это воспользоваться готовой виртуальной машиной в MS Azure. Находим Waves Platform в Azure Marketplace и нажимаем кнопку "Создать". Затем — несколько простых шагов по настройке вашей виртуальной машины с Waves на борту. Первым делом, выберите название и создайте учётную запись. Также определитесь с типом диска, способом аутентификации и географическим расположением машины: Теперь найдите подходящую вам конфигурацию железа: И, наконец, сконфигурируйте сеть и уточните дополнительные параметры: Осталось проверить настройки и оплатить подписку. Поздравляю, теперь вы — участник сети Waves! Как уже упоминалось выше, DEX расшифровывается как "decentralized exchange" и позволяет торговать токенами, которые есть в блокчейне. Работа DEX обеспечивается матчером, который хранит ордера пользователей и отправляет в блокчейн транзакции обмена токенами для исполняющихся ордеров. Основное преимущество такой биржи — в том, что все деньги хранятся в кошельке пользователя, а матчер лишь сопоставляет ордера. Прежде чем попасть в блокчейн Waves, exchange-транзакции всегда проверяются нодами на соответствие цен в ордерах, чтобы матчер не мог внедрить "неправильные" транзакции. В DEX не нужно ждать добавления новых валют, и это делает его удобной площадкой для быстрого проведения ICO: вы можете выпустить свой токен и, как только issue-транзакция окажется в блокчейне, выставить его на продажу. Вкратце, процесс выглядит следующим образом: Однако, у такой схемы есть и минусы. Во-первых, на данный момент в Waves отсутствуют multisig-кошельки, а значит, инвесторы должны полностью доверять создателю ICO или его эскроу. Во-вторых, чтобы оперировать криптовалютами, не родными для платформы, нужно сначала воспользоваться шлюзом для перевода средств из стороннего блокчейна в блокчейн Waves. Для "внешних" криптовалют внутри платформы созданы специальные токены, которые обмениваются один к одному с этой же валютой в её настоящем блокчейне. Waves позволяет вести безопасную биржевую торговлю и проводить ICO и краудфандинговые кампании, одновременно являясь чем-то вроде sidechain-технологии для других фиатных и криптовалют. Подробнее про sidechain можно почитать в этой статье. Коммьюнити Waves активно ведёт собственные разработки, улучшающие и дополняющие платформу. Здесь я расскажу про datafeed — программу, интегрирующуюся с нодой и агрегирующую информацию о сделках, заключаемым через DEX. Допустим, нам нужна история сделок по какой-нибудь паре, то есть, те ордера, exchange-транзакции от которых уже попали в блокчейн. Для этого используем метод /api/trades/{amountAssetId}/{priceAssetId}/{limit}. В качестве примера, запросим последние 50 сделок для пары WAVES/BTC: Эти и другие данные из datafeed могут быть использованы для отслеживания хода ICO: например, для получения статистики по криптовалютам и размерам сделок при покупке ICO-токенов. Проект datafeed находится в бета-версии, поэтому официальной документации пока что нет. Текущий черновик с описанием основых методов — под спойлером. REST API server http://marketdata.wavesplatform.com/api/ GET /symbols — get the list of symbols GET /markets — get the list of all asset pairs traded, with ticker and matchers info GET /tickers — get the tickers for all asset pairs traded GET /ticker/{amountAsset}/{priceAsset} — get the ticker for the specified asset pair GET /trades/{amountAsset}/{priceAsset}/{limit} — get the last {limit} trades for the specified asset pair. Response includes both unconfirmed and confirmed transactions (there is a confirmed boolean field on each reported tick) GET /trades/{amountAsset}/{priceAsset}/{from_timestamp}/{to_timestamp} — get all trades (up to a max of 100) between {from_timestamp} and {to_timestamp} GET /trades/{amountAsset}/{priceAsset}/{address}/{limit} — get the last {limit} trades for the specified {address} and asset pair GET /candles/{amountAsset}/{priceAsset}/{timeframe}/{limit} — get the last {limit} candles for the specified asset pair and {timeframe} (valid timeframes are 5, 15, 30, 60, 240, 1440 minutes) GET /candles/{amountAsset}/{priceAsset}/{timeframe}/{from_timestamp}/{to_timestamp} — get all candles between {from_timestamp} and {to_timestamp} with the specified {timeframe} GET /matchers — get the list of all available matchers http://marketdata.wavesplatform.com/api/symbols
http://marketdata.wavesplatform.com/api/markets
http://marketdata.wavesplatform.com/api/ticker/waves/btc
http://marketdata.wavesplatform.com/api/trades/mrt/btc/25
http://marketdata.wavesplatform.com/api/trades/waves/btc/1493121600000/1493488800000
http://marketdata.wavesplatform.com/api/trades/waves/btc/3PMAVpWdSqPWrLvkYRqukmSyhv6btc8rnVB/5
http://marketdata.wavesplatform.com/api/candles/waves/btc/1440/10
http://marketdata.wavesplatform.com/api/candles/waves/btc/1440/1493121600000/1493488800000 Both amountAsset and priceAsset can be Asset IDs or Asset Symbols. They can also be mixed. Symbols are case insensitive. Authored by Peter Black. Вполне можно предположить, что через 10-15 лет криптовалюты и блокчейн-технологии будут настолько же привычными, насколько сегодня нам привычны пластиковые карты. Уже сейчас многие люди, особенно в развитых странах, начинают противиться контролю со стороны государства и банков. Это движение к децентрализации порождает множество проектов, подавляющему большинству которых необходимо финансирование, которое логичнее всего искать среди целевой аудитории — в криптовалютной индустрии. Именно здесь, в области финансирования и проведения ICO, платформа Waves может занять ключевую позицию и стать одним из лидирующих игроков криптомира, позволяя новым проектам быстро и эффективно находить инвестиции. Помимо ICO и токенизации, команда Waves ведёт исследования в области анонимного голосования на блокчейне, а также планирует разработку и внедрение защищённого месенджера на базе платформы. Филипп Филиппак — frontend-разработчик Waves Platform. Пришёл в профессиональную разработку в 2012 году, занимался различными проектами, в том числе Пробок.нет, LabicomConnect и timestore. Участвовал в gamedev-конкурсе js13kGames. В данный момент занимается разработкой ICO-платформы Lapti. Увлекается software-архитектурой и изучением алгоритмов.