UPDATE.
Заопенсорсил платежный шлюз: github.com/Overtorment/Cashier-BTC По разным причинам существующие платежные шлюзы (такие как Bitpay) вас могут не устраивать. В этой статье мы рассмотрим создание собственного Bitcoin шлюза с нуля.
Предполагается что читатель знаком с устройством сети биткоин. Если нет, то рекомендую эти статьи: “Как на самом деле работает протокол Биткоин” и “Биткойн: введение для разработчиков” Условно, нашу предполагаемую систему я бы разделил на 4 части:
- Работа с адресами
. Генерация пары публичного и приватного ключа (как известно, хеш публичного ключа является биткоин адресом, а соответствующий приватный ключ позволяет им распоряжаться) - Получение информации из биткоин сети
. Состояние транзакций, баланс на адресах. - Создание и подпись транзакций
. Формирование корректной транзакции, подпись ключом/ключами, преобразование в hex. Полученный hex готов к трансляции в сеть. - Трансляция транзакций
. Aka broadcast, send, push. Передача hex транзакции сети биткоин чтобы майнеры начали работу по включению транзакции в блокчейн.
Для выполнения указаных операций нам понадобится подобрать набор програмных решений, которые упростят нам жизнь. Самые популярные и используемые решения могут выполнять все или почти все указанные выше операции, но ничего не мешает нам комбинировать решения, или даже написать свой велосипед для определенных этапов.
Получение информации из биткоин сети
Самый “тяжеловесный” пункт. Классическим решением является поднятие собственного эталонного полного узла Биткоин, он же — каноничный bitcoind. Это позволит нам общаться с ним по JSON-RPC. С ним мы сможем как получать информацию из сети, так и пушить транзакции. На что стоит обратить внимание:
- После установки, синхронизация узла может занять длительное время. Только после синхронизации узел можно использовать.
- Займет немало места. Уже 40+ гигабайт.
- Мне лично неизвестно какую нагрузку по запросам сможет выдержать.
- Любые проблемы с падением/обновлением лягут на ваши плечи.
Альтернатива — имплементация полного узла на Ruby+PostgreSQL, Toshi. Неканоничная, но стремящаяся к полной совместимости реализация. Обратите внимание, из-за дополнительных индексов, база данных займет 220+ гигабайт места. Опять таки, требуется синхронизация с сетью. Возможно, есть другие имплементации полного узла (мне неизвестны). Еще одна альтернатива
— использование публичного API провайдера. На его плечи ляжет получение информации из сети и трансляция транзакций.
Сейчас есть:
- chain.com
- blockchain.info/ru/api (не рекомендую)
- www.blockcypher.com
- chain.so/api
- coinalytics.co
- www.blocktrail.com
- coinkite.com/developers
- другие
Лично я рекомендую подключить несколько решений с фейловером.
Про ASP.NET Core
Небольшой ликбез для тех, кто 15 лет писал приложения на WinForms (а то и вовсе на джаве какой) и всё проспал. ASP.NET Core – это самый современный веб-фреймворк от Microsoft, который пришел на смену ASP.NET MVC и ASP.NET WebAPI. Опенсорсный, кроссплатформенный, универсальный. Прекрасно себя чувствует в облаках, но и локально работает не хуже. Благодаря модульной архитектуре на нем можно запилить хоть микросервисы, хоть бложик. Короче, любой современный дотнет-разработчик должен его знать, даже если он (о, ужас!) не владеет английским.
И если раньше для этого приходилось читать скучную документацию от Microsoft, помноженную на машинный перевод, то теперь есть вариант получше. Эндрю Лок — автор одного из самых популярных блогов, освещающих ASP.NET Core, Microsoft MVP и .NET-разработчик с внушительным стажем. Так что если читать книгу, посвященную ASP.NET Core во всей его полноте, то его кандидатура в качестве автора подходит как нельзя лучше. А добровольцы из сообщества постарались, чтобы компетенции Лока не оказались испорчены неудачным переводом.
Трансляция транзакций
Результатом создания и подписи транзакций являются двоичные данные (hex), готовые к пушу в сеть. Пока сеть не увидит транзакцию, считайте, нет никакой транзакции. Когда сеть увидела транзакцию, она считается неподтвержденной. Транзакцию достаточно передать одному узлу биткоин, после чего за считаные секунды транзакцию увидит большая часть Биткоин сети. Транслировать транзакции умеют некоторые клиентские либы из раздела “Работа с адресами” (через какието свои захардкодженые ендпоинты), или любой полный узел. Транслировать транзакцию можно даже руками, зайдя на специальную страничку Биткоин API провайдера и вбив транзакцию в специальную форму. Канонично, подтвержденной транзакцией является транзакция, включенная в 6 и больше последовательных блоков (или в 1-3. Неканонично, но быстрее). Транзакции с нулевой (или недостаточной) комиссией могут оставаться неподтвержденными долгое время (до месяца, в моей практике). Такие транзакции желательно периодически ретранслировать.
Общие принципы работы платежного шлюза
Вариант 1
Предположим, у нас есть уникальный счет (invoice, order), представленый к оплате клиенту, и платить клиент будет в биткоинах. Начнем с того, что надо сконвертировать валюту оригинального счета (USD например) в BTC. Задача это тривиальная и рассматривать мы ее не будем. Далее. Стандартом де факто является генерация нового уникального адреса биткоин под каждый заказ (он же счет, он же invoice, он же ордер). Ожидается, что средства на этот счет переведет только наш клиент, только 1 раз, и только строго указанную сумму (можно больше, никто не обидится, но никак не меньше). Т.о. при поступлении средств на указанный биткоин адрес в нужном количестве, заказ считается оплаченным.
Вкратце, цепочка такая:
- ордер в системе ->
- генерируем соответствующий ордеру уникальный адрес биткоин ->
- показываем клиенту ->
- ждем оплату на адрес ->
- ордер закрыт (отмена по истечению срока годности или же поступление BTC и засчитываем факт оплаты)
При поступлении биткоинов на адрес у вас есть варианты засчитать неподтвержденный или подтвержденный баланс. Есть небольшой шанс что транзакция откатится, причем это может быть как по вине плательщика (который на самом деле злоумышленник), так и по независящим от него обстоятельствам.
Если вы имеете возможность “отобрать” предоставленный товар или услугу у клиента в случае выявленного факта отмены транзакции, я рекомендую засчитывать неподтвержденный баланс. Это будет означать почти мгновенный процесс оплаты для клиента (в противовес часа ожидания, например). А если какие то транзакции выявятся откаченными в итоге, запросить клиента о повторном платеже, угрожая отобрать услугу/товар.
Не ожидайте что подобный фрод вас тут же массово настигнет, откат транзакций это очень большая редкость, а “вручную” стимулировать подобный откат (на который кстати у злоумышленника нет никаких гарантий успеха) технически неподкованным клиентам нереально (в противовес чарджбекам по кредитным картам).
Еще один пример когда можно засчитывать неподтвержденный баланс — если на подготовку заказа клиента уходит больше одного часа (например обрабатывается корзина покупателя, готовится к отправке курьерской службой). Тут куча времени перепроверить баланс перед самой отправкой товаров.
Для остальных случаев можно ввести некий порог, выше которого обязательно ожидать подтвержденного баланса (например 0.25 BTC). Для максимальной надежности сделать его нулевым.
После закрытия ордера вы можете оставить биткоины на этом адресе до востребования, или для удобства перевести на единый “агрегационный” кошелек мерчанта. Будьте осторожны, в последнем случае вы можете скомпрометировать такой коммерческий показатель как “оборот”, т.к. транзакцию оплаты может отследить каждый платящий клиент. Для переводов вам понадобится создавать, подписывать и транслировать транзакции, используя приватные ключи от адресов.
Пару слов о времени жизни ордера.
Если ваш товар или услуга жестко привязаны к эквиваленту в фиатной валюте (например USD), то типичный срок жизни ордера составляет 7-15 минут из-за волатильности курса.
Вариант 2
Подходит когда вы не выставляете счета на оплату, а аккаунт юзера содержит некий единый баланс, который он пополняет и с которого тратит. Тут понадобится сгенерить биткоин адрес на пользователя, и показывать ему, с просьбой пополнить на любую сумму. В данном случае надо мониторить адрес на входящие транзакции, пополнять юзеру внутренний баланс при наличии оных. В данном случае я рекомендую засчитывать только подтвержденные транзакции (от 3х блоков и выше).
- генерация адреса пользователю ->
- мониторинг транзакций на адрес ->
- пополнение внутреннего счета при наличии входящих транзакций
Устанавливаем полную ноду биткоина с Bitcoin Core – пошаговое руководство
21.05.2020 Андрей Асмаков
#Bitcoin Core#ноды#полные ноды
Децентрализация – ключевая характеристика биткоина. Благодаря децентрализации биткоин не имеет единой точки управления и отказа. Децентрализация также означает необходимость в как можно большем числе полных нод.
ForkLog составил пошаговую инструкцию по установке полной ноды биткоина при помощи наиболее популярного клиента сети Bitcoin Core.
Что такое полная нода и для чего она нужна
Мы освещали этот вопрос в образовательной карточке, но все же напомним: полной нодой считается любой компьютер, подключенный к блокчейну и полностью с ним синхронизированный. Полные ноды хранят все данные блокчейна, начиная с генезис-блока.
Полные ноды бесплатно обслуживают сеть, загружают и валидируют каждый блок с транзакциями, руководствуясь исключительно алгоритмом консенсуса. Они являются полностью независимыми. Полные ноды отвергают противоречащие консенсусу блоки или отдельные транзакции.
«Биткоин – это изощренная децентрализованная сеть доверия, которая может поддерживать мириады финансовых процессов. В то же время каждая нода в сети биткоина следует нескольким простым математическим правилам. Взаимодействие между многими нодами – вот что ведет к изощренному поведению, а не какая-то изначально заложенная сложность или доверие к одной ноде. Подобно муравьиной колонии, биткоин – это устойчивая сеть простых нод, следующих простым правилам, которые вместе могут делать удивительные вещи без какой-либо центральной координации», — пишет известный биткоин-евангелист Андреас Антонопулос в своей книге Mastering Bitcoin.
Развернуть полную ноду может любой пользователь с доступом к компьютеру с достаточными характеристиками и интернет-соединением. По состоянию на 20 мая 2022 года, сеть биткоина поддерживали более 10 тысяч нод, большая часть которых развернута в Северной Америке и Западной Европе.
Данные: bitnodes.io
Возможно, кто-то спросит, зачем устанавливать полную ноду, если можно просто воспользоваться одним из многих доступных кошельков. Ответов несколько:
Вы верите в биткоин и хотите, чтобы сеть росла и была успешной. Каждая новая нода приближает будущее, в котором люди осуществляют биткоин-транзакции и никакое правительство или третья сторона не могут этому помешать.
Вы планируете осуществлять большое число транзакций и хотите быть уверенными в том, что ваши транзакции будут верифицированы. Если вы не управляете собственной нодой, вы доверяете верификацию своих транзакций кому-то другому. Полная нода обеспечивает полный контроль над личными финансами.
Наконец, не забываем про такой немаловажный аспект, как приватность — хотя анонимность транзакций в биткоине в полном понимании этого слова и отсутствует, управление полной нодой помогает эту проблему в определенной степени решить.
Минимальные технические требования
Перед установкой полной ноды необходимо убедиться, что ваш компьютер удовлетворяет ряду минимальных технических требований. Согласно bitcoin.org, это:
- Десктопный компьютер или ноутбук с последними версиями Windows, Mac OS X или Linux;
- 200 Гб свободного пространства на жестком диске с минимальной скоростью чтения / записи 100 MB/s; 2 Гб оперативной памяти (RAM);
- Широкополосное интернет-соединение с upload-скоростью как минимум 400 Kb/s. Также важно, чтобы соединение было неограниченным и с высокими upload-лимитами.
В идеале ПО для полной ноды должно работать 24/7, но это может получиться не у всех, поэтому рекомендуемое время его работы составляет как минимум шесть часов в день.
Устанавливаем полную ноду
Реквизитом стал ноутбук Dell Inspiron 15 3584 (Core i3-7020U (2.30 GHz), DDR4 4GB, HDD 1TB) с Windows 10. Устанавливаем Bitcoin Core – наиболее популярный клиент сети, работу над которым ведет широкое сообщество разработчиков. Как будет видно ниже, это достаточно простой процесс, большая часть которого сводится к установке самого кошелька.
Заходим на https://bitcoin.org/en/download, где нас встречает Bitcoin Core 0.19.1 — последняя версия ПО, выпущенная в марте этого года.
По умолчанию здесь представлена прямая ссылка на .exe файл, но также можно выбрать архив .zip или скачать версии для других операционных систем.
Скачав установочный файл, приступаем непосредственно к установке. Мы в шаге от возможно самого главного решения в нашей жизни!
Следующим шагом необходимо выбрать диск, на который программа будет установлена. По умолчанию установщик предложит выбрать диск C. Для этого необходимо 52Мб свободного пространства, которые у нас имеются:
Начинаем процесс распаковки:
Спустя короткое время распаковка завершена, и Bitcoin Core готов к работе. Почти.
Далее идет очень важный этап — необходимо указать диск, на котором будут храниться данные блокчейна. И как видно на скрине ниже, к сегодняшнему дню его полный размер вырос до 284 Гб.
По умолчанию установщик предложит выбрать диск C, но возможны ситуации, когда на нем не будет необходимого свободного пространства. Это именно тот случай, который подстерегал и нас. Пришлось выбрать другой диск.
Как видим, разработчики заранее предупреждают, что процесс первоначальной синхронизации не будет простым. Также необходимо быть готовым к тому, что он займет изрядное время.
Кроме того, на пути может встать файерволл, но это решается достаточно быстро и просто.
После всех этих действий мы оказались в самом клиенте, который тут же начинает процесс синхронизации блокчейна с самого начала существования сети биткоина. То есть, загружаются данные всех блоков, в том числе и генезис-блока, созданного Сатоши Накамото. Чувство того, что ты приобщаешься к истории, трудно передать словами!
Как уже говорилось ранее, синхронизация данных блокчейна займет время, и пока она продолжается, можно заняться бэкапом приватных ключей. Методы их хранения и обеспечения безопасности в данном материале рассматриваться не будут.
Синхронизация данных до второй половины 2015 года была выполнена весьма быстро — на это потребовалось около трех часов. Однако далее процесс существенно замедлился, что объясняется возросшим средним размером блока.
Как бы то ни было, спустя почти пять дней беспрерывной работы ноутбука и нервного ожидания, процесс синхронизации был завершен!
Но для запуска полной ноды этого пока еще недостаточно — на данном этапе клиент выступает в роли исключительно кошелька, при этом не самого удобного с точки зрения скорости.
Наша задача — запустить полную ноду. Для этого необходимо осуществить еще несколько действий. В первую очередь — настроить входящие соединения через порт 8333.
Для этого через вкладку Настройки > Опции заходим в сетевые настройки, отмечаем “разрешить входящие подключения” и вручную прописываем параметры порта.
В теории этого должно быть достаточно, однако для того, чтобы изменения вступили в силу, еще необходима перезагрузка программы. К слову, выключение Bitcoin Core всегда следует производить через Файл > Закрытие программы.
Перезагрузив клиент, выжидаем около 15-20 минут, после чего заходим на https://bitnodes.io/, где находим поле проверки доступности ноды.
Если это сделать непосредственно после запуска программы, вас, скорее всего, встретит сообщение, что нода не отвечает:
Наша конечная цель в том, чтобы получить следующий результат:
Иногда просто разрешить входящие соединения через порт 8333 оказывается недостаточно: не все маршрутизаторы поддерживают такую автоматическую конфигурацию, и в этом случае настройку необходимо осуществлять вручную.
Дополнительную информацию по возможным проблемам с конфигурацией можно найти в специальном разделе на Bitcoin.org, либо обратиться за помощью к специалистам.
Тем не менее при достаточных усилиях вопрос вполне разрешим, а это значит, что запуск полной ноды — процесс далеко не такой сложный, как это может показаться на первый взгляд. И по его завершении уже можно смело похвастать, что вы не просто владеете биткоинами, а что вы — и есть биткоин! Ну или как минимум его часть.
Добавим, что полную ноду также можно развернуть на виртуальном сервере, что является темой отдельного разговора, либо же попробовать установить ее на отдельное физическое устройство, выбор которых в последнее время становится все шире.
Andrew Asmakov
Подписывайтесь на новости ForkLog в Telegram: ForkLog FEED — вся лента новостей, ForkLog — самые важные новости и опросы.
Нашли ошибку в тексте? Выделите ее и нажмите CTRL+ENTER