Сегодня мы поговорим о четырех типах адресов Биткоина: P2PK, P2MS, P2PKH, P2SH. Отдельно за скобками мы оставим Segwit и Taproot адреса, про которые подробнее поговорим в отдельных статьях.
P2PK (Pay-to-Public-Key)
Тип адреса P2PK использует шаблон скрипта, запирающий средства с помощью открытого ключа(в scriptPubkey). Чтобы потратить средства с адреса данного типа пользователю необходимо предоставить в отпирающем скрипте(scriptSig) подпись, которая проверяется открытым ключом из запирающего скрипта.
Преимущества:
- Простота скрипта. Этот тип адреса использует простой шаблон скрипта, в сравнении с другими типами адресов.
- Совместимость. Пользователи могут легко отправить средства на адреса других типов с адреса P2PK.
Недостатки:
- Безопасность. Из схемы 1 видно, что открытый ключ в явном виде расположен в запирающем скрипте. Напомним, что открытый ключ вычисляется из секретного ключа, которым мы генерируем цифровую подпись. То есть тот, кто знает секретный ключом, тот управляет биткоинами на адресе. Для современного компьютера задача нахождения секретного ключа по открытому ключу фактически является невыполнимой. Однако наука движется вперёд, и мы всё ближе подходим к моменту появления квантового компьютера, достаточно мощного, чтобы взломать современную криптографию, включая подписи Шнорра и ECDSA, использующиеся в Биткоине и других криптовалютах. Существуют оценки, согласно которым такой квантовый компьютер может появится в ближайшие 5-15 лет. Поэтому использование в запирающем скрипте открытого ключа в явном виде в будущем может привести к взлому P2PK адресов. Однако подчеркну ещё раз, на сегодняшний день это пока невозможно!
- Длина открытого ключа. Длина открытого ключа составляет 33 или 65 байт, в зависимости от того, какой вид ключа используется: сжатый или несжатый. Чем больше весит скрипт, который содержит в том числе открытый ключ, тем дороже стоит транзакция.
P2MS (Pay-To-Multisig)
Тип адреса P2MS использует в качестве скрипта и условий траты мультиподпись. Средства запираются на адресе с помощью скрипта, содержащего n открытых ключей. Чтобы потратить биткоины с P2MS адреса, необходимо предоставить m различных подписей, сгенерированных с использованием m различных секретных ключей, которые соответствуют m открытым ключам из запирающего скрипта. При этом m<n.
Сегодня адреса P2MS встречаются очень редко, так как в основном для реализации условий траты через мультиподписи используют либо P2SH, либо его bech32 аналог p2wsh. Особых достоинств при использовании P2MS выделить нельзя, а недостатки аналогичны недостаткам адреса P2PK.
P2PKH(Pay-To-Pubkey-Hash)
Адреса данного типа всегда начинаются с 1. Пример(один из адресов биржи Binance):
1NDyJtNTjmwk5xPNhjgAMu4HDHigtobu1s
Тип адреса P2PKH использует шаблон скрипта, запирающий средства с помощью хэш-значения от открытого ключа. Для того чтобы потратить средства на P2PKH адресе, пользователь должен предоставить в отпирающем скрипте подпись (r,s) и открытый ключ pubKey для её проверки.
Механизм работы данного скрипта следующий:
- Открытый ключ из отпирающего скрипта дублируется, и одна из копий(верхняя в стеке) хэшируется с помощью опкода OP_HASH160
- Результат хэширования сравнивается с хэш-значением из запирающего скрипта: HASH160(pubKey). Если эти два значения равны, то дальше с помощью предоставленного открытого ключа будет проверена подпись.
- Пользователь получит право потратить средства, если проверка подписи прошла успешно.
Генерация P2PKH адреса
Генерируются P2PKH по следующей схеме:
Преимущества:
- Простота. Скрипт P2PKH адреса прост и лёгок в использовании.
- Поддерживается всеми кошельками и приложениями.
- Контрольная сумма. В отличие от P2PK формата P2PKH адреса имеют контрольную сумму, которая помогает избежать опечаток при вводе.
Недостатки:
- Комиссия. Главным недостатком P2PKH адреса является более высокая комиссия по сравнению с использованием P2SH и Bech32 адресами при сравнимых скриптах(с аналогичной логикой).
Небольшое замечание:
Некоторые авторы, сравнивая P2PKH с P2PK адресами, утверждают, что P2PKH более безопасен из-за использования вместо открытого ключа в явном виде его хэш-значение в запирающем скрипте. Таким образом, открытый ключ не будет виден стороннему наблюдателю до первой траты с адреса P2PKH. В частности, можно будет использовать адреса P2PKH один раз, что частично может помочь после появления квантового компьютера. Весьма спорное утверждение, на мой взгляд.
Да, действительно при появлении квантового компьютера достаточной мощности криптография на эллиптических кривых, используемая, в частности, в Биткоине, будет взломана. Имея открытый ключ в явном виде, можно будет легко найти секретный ключ. При этом хэш-функции по-прежнему будут безопасны. Поиск исходного сообщение(прообраза) по хэш-значению будет являться для квантового компьютера непосильной задачей.
Однако, когда пользователь решит потратить средства с P2PKH адреса, он соберёт транзакцию и отправит её в сеть Биткоина. После этого она далеко не сразу будет замайнена(попадёт в новый блок). Сначала она распространиться по сети, и это займёт некоторое время(15-20 секунд). Дальше она попадет в мемпул и будет лежать там, пока какой-нибудь майнер не захочет включить её в блок. И всё это время от отправки транзакции в сеть и до её включения в новый блок внешнему наблюдателю будет виден открытый ключ в явном виде. Таким образом, при наличии квантового компьютера у хакера средства с адреса будут украдены. Поэтому использование хэш-значения открытого ключа вместо самого ключа в явном виде не несёт дополнительный уровень безопасности для P2PKH адресов в контексте используемой в Биткоине схемы работы сети.
P2SH (Pay-to-Script-Hash)
Адреса данного типа всегда начинаются с 3. Пример:
3FRE6YvB4n5Qtqsu9mL8rW3PzPUWzawd6x
Впервые P2SH был представлен в BIP16 в 2012 году. Позволяет пользователям, отправляя биткоины на этот тип адресов, закрывать средства на хэш-скрипта. Затем для траты биткоинов с этого адреса необходимо предоставить оригинальный “выкупающий скрипт”(redeem script), хэш-значение от которого будет соответствовать хэшу в запирающем скрипте.
При равенстве хэша от redeem скрипта в scriptSig и хэша в scriptPubkey, выкупающий скрипт проверяется полностью по стандартным правилам.
Генерация P2SH адреса
Генерируются P2SH по следующей схеме:
Преимущества:
- Сложные скрипты. Позволяет реализовывать сложные скрипты, не накладывая большой комиссионной нагрузки на отправителя. Например, если реализовывать мультиподпись с помощью P2MS адреса, то отправитель обязан включить в scriptPubkey транзакции все открытые ключи, действительные для конкретной мультиподписи. Это как минимум два открытых ключа, каждый из которых в лучшем случае весит вместе с префиксом 33 байта, в худшем - 65 байт. При отправке средств на P2SH адрес с мультиподписью, для отправителя не важно какая мультиподпись 1-из-2 или 15-из-15, scriptPubkey будет фиксированной длины.
- Безопасность. Данное преимущество проявляется при одноразовом использовании адреса(т.е. адрес используется для одной пары транзакций: одной транзакцией адрес пополняется, второй транзакцией средства с адреса переводятся на другие адреса). Почему это важно? Для внешнего наблюдателя не виден скрипт, который использует P2SH адрес до первой траты средств с этого адреса. Это происходит из-за того, что в выходе отправитель на P2SH адрес указывает лишь хэш-значение redeem скрипта. Redeem скрипт, а точнее его шаблон может использоваться для кластеризации адресов и, как потенциальное следствие этого , дальнейшей деанонимизации пользователей. В особенности, если вы используете P2SH адреса со сложным уникальным шаблоном.
Пример: транзакция
68a0d4329a1e9be307396fcacb1674c03b19b4f5bf9d1f8e5ab280328ac17a59
Адреса 3FRE6YvB4n5Qtqsu9mL8rW3PzPUWzawd6x и 3ErLDMSeCvbBhZLNYJEff6Nm7uo2Bn1aa1 используют один и тот же тип скрипта(мультиподпись 2-из-3). С большой долей вероятности оба адреса принадлежат одной сущности. Соответственно, их можно поместить в один кластер и продолжить следить за движениями средств.
- Совместимость со всеми типами адресов.
Недостатки:
- Комиссия. Относительным недостатком является более высокая комиссия по сравнению с bech32 комиссия выше(приблизительно на 15%).
Сегодня мы поговорили о четырёх типах Биткоин адресов, об их недостатках и преимуществах, оставив в стороне, на мой взгляд, два наиболее любопытных типа адресов: Segwit и Taproot. О них мы поговорим в следующих статьях.