Mike Hearn — разработчик Bitcoin и соавтор нескольких BIP, документов с описанием предлагаемых технических решений. Он работал над библиотекой bitcoinj, проверкой соединений, отбором нужных транзакций и обменом сообщениями при оплате. Чтобы понять его вклад, удобно проследить путь от кошелька в телефоне до магазина, ожидающего платёж.
Разработчику биткоин-кошелька не нужно самостоятельно писать весь код сетевого общения. Можно воспользоваться библиотекой — набором готовых функций, на основе которых строят приложение. Одна из таких библиотек — bitcoinj. Её файл AUTHORS называет Mike Hearn среди многих участников и отсылает к истории изменений в Git. Так можно проследить конкретные вклады в разработку. Это не означает, что Hearn один написал все функции или сегодня руководит всем проектом. [1]
bitcoinj — библиотека на Java для управления кошельком, отправки и получения транзакций без локально установленного Bitcoin Core. Для телефона удобен режим SPV, сокращение от Simplified Payment Verification: он использует заголовки блоков и относящиеся к кошельку транзакции вместо полной проверки каждой транзакции. Это экономит трафик и ресурсы устройства. Документация описывает также экспериментальную полную проверку. Режимы различаются: облегчённая работа не означает ту же проверку всех правил, только выполненную быстрее. [2]
Представим ноутбук, вышедший из спящего режима. Соединение с другим узлом может выглядеть открытым, хотя уже не работает. BIP 31 от Hearn позволяет отправить ping с nonce — здесь это число, различающее конкретные запросы. Другой узел возвращает то же число в сообщении pong. Для версий протокола выше 60000 это позволяет сопоставить запрос и ответ, а также измерить время отклика. Проверяется связь: сам ответ не доказывает честности узла или действительности платежа. [3]
Зачем телефону скачивать транзакции, которые его не касаются? BIP 37, написанный Hearn и Matt Corallo, описывает фильтр Bloom — компактный инструмент для отбора возможных совпадений. filterload устанавливает фильтр, filteradd добавляет элемент, а filterclear удаляет фильтр. Через него может пройти посторонняя транзакция; это ложноположительный результат. Более точный фильтр уменьшает трафик, но может облегчить другому узлу связывание транзакций с IP-адресом кошелька. Поэтому экономия данных не обеспечивает приватность автоматически. [4]
Телефону нужно выяснить, действительно ли полученная транзакция принадлежит определённому блоку. Сообщение merkleblock из BIP 37 предоставляет данные для доказательства Merkle: несколько отпечатков данных, то есть хешей, позволяют проверить связь транзакции с общим отпечатком в заголовке блока. Загружать весь блок для этого не требуется. Однако доказательство не исключает, что другой узел скрыл остальные транзакции. SPV также не заменяет полной проверки их действительности. Документация bitcoinj объясняет опасность ситуации, когда атакующий контролирует все соединения кошелька и выбирает, что ему показать. [4] [5]
При покупке нужно знать сумму и получателя. BIP 70 от Gavin Andresen и Hearn вводит для этого PaymentRequest. Сообщение содержит детали платежа: выходы, определяющие, куда транзакция должна направить средства, сумму и необязательный срок действия запроса. Личность продавца можно удостоверить сертификатами X.509, как у веб-серверов. Но протокол допускает и pki_type none — запрос без такой проверки. Сам формат платёжного запроса поэтому ещё не доказывает удостоверенную личность магазина. [6]
Если запрос указывает платёжный сервер, после вашего разрешения кошелёк отправляет туда сообщение Payment. Ответ PaymentACK может означать, что магазин принял платёж в обработку. Покупателю это полезно, но остаётся заявлением сервера продавца, а не доказательством подтверждения транзакции в блоке. Аналогично refund_to лишь указывает, куда магазин может отправить возврат; само поле не возвращает деньги. Приложение должно различать сообщения о платеже и фактическое движение средств. [6]
Старое руководство может создать впечатление, будто описанный способ работает везде. В реестре BIP 70 отмечен как Deployed, то есть внедрённый. При этом примечания к Bitcoin Core 0.20.0 фиксируют полное удаление его поддержки из этой программы. Противоречия нет: спецификация, которую использовали раньше, необязательно поддерживается каждым современным клиентом. Работа этого разработчика помогает понять развитие кошельков; для практического применения нужно также проверить возможности конкретной программы и её версии. [6] [7]
Для полной картины прочитайте эту статью вместе с Jeff Garzik, Gloria Zhao, Merkle Tree. На эту статью также ссылаются Jeff Garzik, Gloria Zhao.