P2PKH

Pay-to-PubKey-Hash (P2PKH)

P2PKH (Pay-to-Public-Key-Hash) является основной формой совершения транзакции и наиболее распространенной формой транзакции в сети Bitcoin. Транзакции, которые платят на адрес Bitcoin, содержат скрипты P2PKH, которые разрешаются путем отправки открытого ключа и цифровой подписи, созданной соответствующим закрытым ключом.

ScriptPubKey и ScriptSig для транзакции показаны ниже:

<ScriptPubKey=OP_DUP OP_HASH160<Public KeyHash> OP_EQUAL OP_CHECKSIG ScriptSig= <Signature><Public Key> 

Содержание

Обзор P2PKH (Pay-to-PubKey-Hash)

Было разработано два способа оплаты, которые называются P2PK (Pay-to-Public-Key) и P2PKH (Pay-to-Public-Key Hash).

Позже Сатоши Накамото решил использовать P2PKH вместо P2PK по двум причинам:

  • Криптография на эллиптических кривых (криптография, используемая открытым ключом и закрытым ключом) – уязвима для модифицированного алгоритма Шора при решении задачи дискретного логарифма на эллиптических кривых. Это означает, что в будущем квантовый компьютер сможет получить закрытый ключ из открытого ключа. Публикуя открытый ключ только тогда, когда монеты были потрачены (и при условии, что адреса не используются повторно), такая атака становится неэффективной.
  • С хэшем меньше 20 байт будет легче печатать и легче его встраивать в небольшие носители информации, такие как QR-коды.

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


Процесс проверки:

Стек Скрипт Описание
Пустро (Empty). <sig> <pubKey> OP_DUP OP_HASH160 <pubKeyHash> OP_EQUALVERIFY OP_CHECKSIG scriptSig и scriptPubKey объединяются.
<sig> <pubKey> OP_DUP OP_HASH160 <pubKeyHash> OP_EQUALVERIFY OP_CHECKSIG Константы добавляются в стек.
<sig> <pubKey> <pubKey> OP_HASH160 <pubKeyHash> OP_EQUALVERIFY OP_CHECKSIG Верхний элемент стека дублируется.
<sig> <pubKey> <pubHashA> <pubKeyHash> OP_EQUALVERIFY OP_CHECKSIG Верхний элемент стека хэшируется.
<sig> <pubKey> <pubHashA> <pubKeyHash> OP_EQUALVERIFY OP_CHECKSIG Константа добавлена.
<sig> <pubKey> OP_CHECKSIG Равенство проверяется между двумя верхними элементами стека.
true Пусто (Empty). Подпись проверяется для двух верхних элементов стека.

Пример P2PKH – Pay-to-PublicKey Hash

На приведенной ниже схеме показано использование функции P2PKH в рамках рабочего процесса, который Алиса (Alice) использует для отправки транзакции Бобу (Bob), и который Боб позже использует для проведения этой транзакции. И Алиса, и Боб будут использовать наиболее распространенную форму стандартного типа транзакции с оплатой открытым ключом (P2PKH). Pay-to-PublicKey Hash позволяет Алисе тратить Сатоши на типичный биткоин-адрес, а затем позволяет Бобу дальше тратить эти Сатоши, используя простую пару криптографических ключей.

P2PKH

Прежде чем Алиса сможет создать первую транзакцию, Боб должен создать пару закрытого и открытого ключей. Биткоин использует алгоритм цифровой подписи эллиптической кривой (ECDSA) с кривой secp256k1. Секретные ключи secp256k1 – это 256 бит случайных данных. Копия этих данных детерминированно преобразуется в открытый ключ secp256k1. Поскольку преобразование может быть надежно повторено позже, нет необходимости хранить открытый ключ.

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

Боб предоставляет Алисе хэш открытого ключа. Данные хэши почти всегда отправляются в кодировке биткоин-адресов, которые представляют собой строки в кодировке base58, содержащие номер версии адреса, хэш и контрольную сумму для обнаружения ошибок (чтобы поймать опечатки). Адрес может быть передан через любой носитель, включая односторонние носители, которые мешают отправителю общаться с получателем. Стоит отметить, что адрес может быть дополнительно закодирован в другой формат, такой как QR-код, содержащий URI Bitcoin. Как только Алиса получит адрес и расшифрует его обратно в стандартный хэш, она сможет создать первую транзакцию. Она создает стандартный вывод транзакции P2PKH, содержащий инструкции, который позволяет любому потратить этот вывод, если они могут доказать, что они контролируют закрытый ключ, соответствующий хэшированному открытому ключу Боба. Эти инструкции называются сценарием pubkey или scriptPubKey.

Алиса транслирует транзакцию и она добавляется в цепочку блоков. Сеть классифицирует её, как неизрасходованный вывод транзакции (Unspent Transaction Output или UTXO), а криптовалютный кошелек Боба отображает этот вывод, как расходуемый баланс. Когда, некоторое время спустя, Боб решает провести UTXO, он должен создать вход, который ссылается на транзакцию Алисы, созданную ее хэшем, называемым идентификатором транзакции (TXID), и конкретный выход, который она использовала по ее индексному номеру (выходному индексу). Затем он должен создать сценарий подписи – набор параметров данных, удовлетворяющих условиям, которые Алиса поместила в сценарий pubkey предыдущего вывода. Скрипты подписи также называют scriptSigs.

См. также на BitcoinWiki

Источники