В прошлой части мы остановились на том, что не плохо было бы узнать о факте платежа от bitcoind, вместо того, чтобы перебирать все выданные адреса.
Полный цикл статей для разработчиков платежного шлюза для bitcoin читайте здесь:
ПРИНИМАЕМ ОПЛАТУ В BITCOIN: ЧАСТЬ ПЕРВАЯ, ТЕОРЕТИЧЕСКАЯ
ПРИНИМАЕМ ОПЛАТУ В BITCOIN: ЧАСТЬ ВТОРАЯ. ИНСТРУМЕНТЫ И ПОДГОТОВКА
ПРИНИМАЕМ ОПЛАТУ В BITCOIN: ЧАСТЬ ТРЕТЬЯ, СВОЙ TESTNET. С БЛЭКДЖЕКОМ
ПРИНИМАЕМ ОПЛАТУ В BITCOIN: ЧАСТЬ ЧЕТВЕРТАЯ, БЛИЖЕ К ДЕЛУ!
ПРИНИМАЕМ ОПЛАТУ В BITCOIN: ЧАСТЬ ПЯТАЯ, ЕСТЬ НЮАНСЫ
Во первых, таким перебором мы замедляем всю систему, и при большом количестве платежей это становится серьезной проблемой. А во вторых, вполне достаточно "во первых".
Я упомянул в прошлой статье, что bitcoind все же умеет присылать уведомления, хотя и делает это несколько своеобразно. Технически при возникновении определенных событий происходит запуск системной команды (программы) с передачей данных в качестве аргумента командной строки. Навскидку таких события три: alertnotify
, blocknotify
и walletnotify
. Нас интересуют два последних.
Для того, чтобы получить уведомления нам нужно в файле конфигурации bitcoin.conf
указать соответственно:
walletnotify=command1 %s blocknotify=command2 %s
Что это нам даст, и как это работает? При любой транзакции, связанной с нашим кошельком, то есть с любым адресом, выданным нашим bitcoind, будет выполнена команда
command1
, указанная для walletnotify
, причем в качестве параметра %s
будет подставлен хеш транзакции. Конечно, хотелось бы, чтобы были и сам адрес и сумма - но имеем то, что имеем. Имея TxId мы уже можем получить полную информацию о транзакции, включая все адреса и суммы.
Теперь о нюансах.
Команда будет запущена максимум два раза. Иногда - один. Первый раз - при получении неподтвержденной транзакции и добавлении её в mempool. Второй раз - при включении транзакции в блок, то есть при получении первого подтверждения. В некоторых случаях первое уведомление может не прийти вообще. А как же нам быть, если мы хотим считать платеж совершенным после канонических шести подтверждений?
Тут нам на помощь приходит blocknotify
. Команда command2
будет выполняться при добавлении каждого нового подписанного блока, и хеш блока будет приходить вместо параметра %s. Дальше мы можем либо проверить все наши зарегистрированные транзакции на количество подтверждений (да, такая информация в транзакции приходит от bitcoind), либо просматривать каждый блок на предмет наличия в нем транзакций с нашими адресами (долго, не эффективно, но иногда необходимо)
Как будет реализована программная часть, реализующая уведомления, - полностью отдано на откуп разработчика. Это может быть хоть bash-скрипт, хоть программа на C/C++, хоть PHP. Главное, чтобы ваше приложение могло быть запущено из командной строки.
Читайте также
Принимаем оплату в bitcoin: Часть Третья, свой testnet. С блэкджеком
В прошлой статье я рассказал как установить bitcoind ( ну как минимум на Ubuntu Linux) и как подключится к testnet. Но testnet - хорошее решение, когда вы проводите тесты готового сайта, уже развернутого на сервере в интернете. А вот для локальной разработки это далеко не самое удобное решение.
Принимаем оплату в bitcoin: Часть вторая. Инструменты и подготовка
Возможно мне не удалось напугать вас в достаточной степени, чтобы вы отказались от этой безумной идеи - принимать оплату в bitcoin. Ну тогда у меня для вас есть еще одна порция головной боли на пятую точку.