8 июня 2020

Создание DOGE кошелька: пошаговая инструкция

История нашего пользователя.
———

Я разработчик на php и сегодня расскажу вам об этапах и проблемах при создании проекта «Криптокошелек Dogecoin» (далее DOGE). По техническому заданию нужно разработать сайт, на котором пользователи смогут создавать себе кошельки, принимать, хранить и отправлять DOGE.

Самым простым и правильным решением, как кажется, будет купить выделенный сервер, запустить на нем Dogecoin ноды (node) и подключиться к ней локально через RPC. Но этот вариант изначально не подходил. Во-первых, из-за стоимости сервера. Сервер с необходимыми параметрами стоит от $50 в месяц. Этот проект изначально не планировался быть коммерческим, т.е. для пользователей все должно было быть бесплатным. А значит затраты на его содержание должны быть минимальны. Во-вторых, поддержка ноды требует наличие квалифицированного специалиста в этой области. А это тоже дополнительные расходы. Мы пробовали собственными силами поднять Dogecoin ноду, но она работала крайне нестабильно — часто зависала или появлялась рассинхронизация с основной сетью. Нас это очень расстроило.

Для работы с чужой нодой нужно было решить три вопроса:

1) Как создавать адреса и где хранить ключи
2) Как получать новые транзакции
3) Как формировать новые транзакции

Первый вопрос оказался не таким простым. Перечитав гору статей и просмотрев мегабайты исходных кодов (не только на PHP) – был собран набор библиотек, который позволял генерировать пару ключей и адрес.

Второй вопрос был самым простым. Чтобы узнать какая транзакция подтверждена – надо просматривать новые блоки. Как получать новые блоки? Используя «медлительность» блокчейна, можно опрашивать ноду с какой-то периодичностью (пусть 1 раз в минуту). И в случае появления нового блока запросить его содержимое у ноды. Даже если транзакция будет получена на 2 минуты позже – никто не расстроится. А с учетом необходимости нескольких подтверждений это будет вообще незаметно.

Решение третьего вопроса потребовало огромного количества времени и сил. Готового решения не нашлось. Формирование транзакции описано много раз, но без примеров. А те примеры что были – содержали лишь простейшие варианты. Хорошо еще, что Dogecoin построен по принципу Bitcoin. Большую часть информации удалось получить оттуда.

Как оказалось формирование оптимальной транзакции это сложнейший процесс. Для получения низкой комиссии длина транзакции должна быть как можно короче. А значит, нужен алгоритм, выбирающий из десятка выходов те, что будут давать минимальную «сдачу», причем эта сдача не может быть меньше dust! Отладка и тестирование этого алгоритма заняла несколько месяцев.

Теперь вернемся к вопросу о подключении к блокчейну.

Первый вариант реализации — аренда ноды. Поиск выдает несколько вариантов, но все они либо не-Dogecoin, либо со стоимостью несколько сотен долларов в месяц.

Второй вариант – это подключение через API блокэсплореров. Поиск по «Dogecoin blockexplorer API» выдавал следующие варианты:

sochain.com/DOGE и chain.so/DOGE/ — это один и тот же ресурс от Block.io, Inc., есть API sochain.com/api но оно работает только из браузера! Защита сайта не пропускает вызовы из скрипта. На письма не ответили.

blockchair.com/dogecoin — мощный ресурс. Минусы – сложность бесплатного получения ключа API и дороговизна платного.

doge.tokenview.com/ 500 Internal Server Error

cryptoapis.io/  Лимит 500 вызовов в сутки

live.blockcypher.com/doge/ — отличный ресурс! Оригинальная методика подписи транзакций. Минусы: лимиты на количество вызовов API в минуту, рассинхронизация ноды (отправленные через них транзакции не видны другим нодам). Первоначальное изучение мы производили здесь.

dogeblocks.com/ изначально здесь был Insight со своим API – отличный бесплатный ресурс! Им мы пользовались долгое время. Но потом он «умер» и несколько месяцев не работал. А сейчас там Blockbook, который не умеет отдавать UTXO по нескольким адресам сразу.

dogechain.info/ — также ресурс от Block.io, Inc. Бесплатное, но скудное API dogechain.info/api/blockchain_api: нет «получить транзакции блока» и нет «получить UTXO по нескольким адресам». Какое-то время это был единственный ресурс в сети, через который мы могли «общаться» с Dogecoin. Для получения транзакций блока пришлось даже парсить html-страницу.

Работало все нестабильно. И вот, однажды, один из пользователей посоветовал ресурс NOWNodes, которым дальше и пользуемся.

Итог:

Для создания веб-кошелька минимально необходимы следующие API:

1) Получить последний (максимальный) номер блока в сети
2) Получить содержимое/данные (не только txid) всех транзакций блока
3) Получить баланс одного адреса и нескольких адресов (недоступно в Blockbook)
4) Получить список UTXO одного адреса и нескольких адресов (недоступно в Blockbook)
5) Отправить сформированную и подписанную транзакцию в сеть

P.S. Как оказалось, недостаточно просто отправить транзакцию в сеть! Даже если нода вернула положительный ответ (без ошибки) – это еще НЕ значит что транзакция попала в mempool. Приходится через некоторое время после отправки проверять «существует ли транзакция?» Иногда она просто пропадает! Мы до сих пор не понимаем причину этого.

Обсудить в Discord!