Перед тем, как отправить кому-нибудь крупную сумму Bitcoin-денег по интернету, важно убедиться, что вы используете правильный адрес.

Есть несколько способов сделать это, и здесь в зависимости от того, кому вы собираетесь переслать средства, насколько доступны их ключи, и каковы способности и образ работы выбранного ими ПО, вам нужно подобрать правильное решение.

Верификация адреса Bitcoin-кошелька

Подпись реципиента с использованием ключа их кошелька



Если вам кажется, что у реципиента имеется ключ, привязанный к их целевого кошельку в интернете (а не в физическом хранилище), и что используемая ими программа кошелька поддерживает авторизацию сообщений посредством ключей кошелька, то возможно, это может быть значимой опцией.

К сожалению, на данный момент не существует стандарта для формата подписей с использованием Bitcoin-ключей, и на сегодняшний день нам доступны всего пару общих форматов.

Первый формат на самом деле представляет собой скорее отсутствие формата: клиент просто предоставляет вам 3 значения, необходимых для подтверждения сообщения, и вы можете поступать с ними как пожелаете:

* Адрес кошелька: 13qL64jHUEV35FdDCfdh7FNPYXwKQPxTut
* Сообщение: noreply@cryptonavigator.com / my voice is my passphrase authenticate me
* Подпись: G2zYXhGcGFYX3RmH5NX8LkMaFkBB6ozj ... eWiD5qra1r5gTg=

Этот формат предполагает некоторые сложности. Для начала, вам нужно вносить эти значения по-отдельности, а затем у вас также могут возникнуть проблемы с белым пространством, которое не позволяет нормально валидировать подписи.

Есть еще один формат, набирающий обороты, и позволяющий добиться лучшей защиты ASCII. Этот стиль форматирования был изначально введен в проекте под названием Privacy Enhanced Mail (PEM), - это было одно из первых предложений подписи и шифровки почты в интернете, а позже он был усвоен PGP (RFC https://tools.ietf.org/html/rfc4880).

Однако не путайте этот формат с другими форматами, так как они используют несколько разные правила, если речь заходит о шифровании.

Это значит, что, в зависимости от того, каким ПО для кошелька пользуется клиент, у вас может и не быть возможности валидировать предоставленную ими подпись.

Если вам интересно, как этот формат выглядит, то здесь все достаточно ясно:


-----BEGIN BITCOIN SIGNED MESSAGE-----
noreply@cryptonavigator.com / my voice is my passphrase authenticate me
-----BEGIN SIGNATURE-----
13qL64jHUEV35FdDCfdh7FNPYXwKQPxTut
G2zYXhGcGFYX3RmH5NX8LkMaFkBB6ozjW/qQ2U6QYONo6rzX9CcnW5GLNze+XXjgd5pa7C6x7eWiD5qra1r5gTg=
-----END BITCOIN SIGNED MESSAGE-----

Ключевое отличие данного формата (как указано в теме и в наборе правил PGP):

* Между заголовками и сообщением не должно быть никаких разделителей типа empty-line;
* Начало и окончание whitespace / newlines при верификации подписи игнорируются;
* Длина строк не ограничена 80 символами;
* Отсутствие концепта значений заголовка (типа версий).

Причина, по которой мы обращаем на это внимание, заключается в том, что на самом деле не существует стандарта для такого формата подписи, и поэтому он может видоизменяться. Следовательно, у вас могут возникать проблемы с теми клиентами, с которыми вы пока еще не работали.

Учитывая все это, когда вам все-таки удалось успешно подтвердить сообщение такого плана, вы сможете знать, что кто бы ни создал это сообщение, владеет ключом, привязанным к кошельку, который привязан к данному сообщению.

Чтобы исключить риск подмены сообщения, отправитель должен будет связаться с реципиентом напрямую. К примеру, в моем сообщении вы могли заметить, что я указал «my voice is my passphrase authenticate me». Это позволяет отправителю убедиться в том, что именно я выписал сообщение.

Чтобы облегчить этот процесс, Andrew Yanovsky поработал над созданием простенького сайта, который способен валидировать оба формата, и все происходит на стороне клиента, поэтому вы можете сохранить файлы локально и работать независимо от веб-сайта, если захотите.

Примечание: важно отметить, что такой рабочий поток не предусматривает P2SH и кошельки с мульти-подписями, которые с течением времени набирают все большую популярность.

Проводим микро-транзакцию



Самый простой способ подтвердить адрес – это просто выслать небольшую сумму денег на тот адрес и напрямую связаться с получателем, который бы подтвердил наличие денег на счете. Именно по такому принципу работают многие сервисы онлайн-платежей, однако для этого, опять же, нужно, чтобы ключи были в доступности для получателя, чтобы те смогли провести транзакцию.

Если вы собираетесь работать по такому же принципу, то здесь следует учитывать несколько аспектов:

* Не высылайте менее .0001, так как транзакция может “застрять”, и тогда она не будет обработана.
* Не забудьте включить комиссию за транзакции, даже если они будут мизерными.

Как только транзакция будет проведена, и вы воспользуетесь инструментом вроде blockchain.info для проверки подтверждения транзакции, вы можете связаться с владельцем адреса, и переспросить, были ли перечислены средства.

Этот подход в отличии от подписки ключей для кошелька также может работать с кошельками с мульти-подпиской и кошельками P2SH, которые в скором времени будут очень популярными.

Двойное подтверждение адреса кошелька напрямую



Если ключи находятся в оффлайн (то есть, на физическом носителе), то единственной действенной опцией можно считать валидацию каждого символа адреса посредством защищенного прямого канала связи. Лично я не рекомендовал бы вам доверять такому подходу, если вы работаете с крупными суммами. Проводя двойную проверку, вы сокращаете вероятность банальной ошибки, однако следует помнить о том, что нельзя полностью исключать человеческий фактор.

Ни одно из этих решений не будет идеальным, и загадывая наперед, хотелось бы видеть больше сервисов типа OneName.io и обменников с авторизированными аккаунтами, - это поможет хоть как-то решить данную проблему, но а пока что, рекомендуем вам просто быть аккуратными и внимательными.