Глоссарий / Адреса и ключи
Адрес P2PKH
Другие названия: Pay-to-Public-Key-Hash, Выход P2PKH.
- Что такое адрес P2PKH?
- P2PKH представляет собой тип выхода, который блокирует монеты на 20-байтовом хеше публичного ключа, поэтому сам ключ остается скрытым до момента, когда вы тратите.
Pay to public key hash представляет собой шаблон скрипта, лежащий в основе каждого адреса, который начинается с 1. Его скрипт блокировки занимает ровно 25 байт и выполняет пять операций, когда монеты перемещаются. Поскольку выход фиксирует отпечаток, а не ключ, неистраченный выход P2PKH не сообщает наблюдателю ничего о публичном ключе за ним.
Как это работает
Выход P2PKH несет один скрипт блокировки, всегда одной и той же формы: OP_DUP OP_HASH160 <хеш из 20 байт> OP_EQUALVERIFY OP_CHECKSIG. Этот хеш из 20 байт является HASH160, то есть RIPEMD-160, примененным к SHA-256 сжатого публичного ключа, и именно так ключ из 33 байт превращается в обязательство из 20 байт.
При трате в scriptSig входа передаются два элемента: подпись, затем публичный ключ. Выполнение идет по порядку. OP_DUP копирует ключ, OP_HASH160 сокращает копию до 20 байт, OP_EQUALVERIFY сравнивает ее с зафиксированным значением и прерывается при расхождении, а OP_CHECKSIG проверяет подпись относительно транзакции. Обе проверки должны пройти; провал любой из них делает недействительной всю транзакцию, а не только этот вход.
Размеры следуют из структуры. Выход P2PKH занимает в блокчейне 34 байта: сумма из 8 байт, длина из 1 байта и скрипт из 25 байт. Вход занимает примерно 148 vbyte, потому что подпись ECDSA в кодировке DER занимает от 71 до 72 байт, сжатый ключ добавляет еще 33, и все это находится вне свидетеля (witness), где каждый байт весит в четыре раза больше.
Где это встречается
Каждый адрес, начинающийся с 1, является адресом P2PKH, что охватывает большинство монет, перемещенных до активации SegWit в блоке 481 824 в августе 2017 года. Обозреватели блоков указывают тип у каждого выхода, поэтому вы можете проверить, на что смотрите, ничего не декодируя.
Деталь, которую стоит запомнить, касается того, когда ваш публичный ключ становится публичным. Пока вы не потратили монеты, в блокчейне хранится только хеш. Первая трата публикует ключ в scriptSig навсегда. Если после этого вы снова используете тот же адрес, любой последующий баланс оказывается за ключом, который уже виден всем, а это снимает слой защиты, который вам ничего не стоил. Это проблема приватности сразу же, и именно поэтому долгая дискуссия о будущих атаках на криптографию эллиптических кривых сосредоточена на повторно используемых и уже потраченных адресах, а не на новых.
На практике: пусть кошелек выдает вам новый адрес для получения на каждый платеж, и пусть сдача также уходит на новый адрес. Современное программное обеспечение делает и то и другое по умолчанию.
Адрес P2PKH vs P2WPKH
P2PKH и P2WPKH фиксируют одно и то же и стоят очень по-разному. Оба блокируют монеты на 20-байтовом HASH160 одного сжатого публичного ключа, и оба открываются одной подписью этого ключа. Различает их то, где записываются данные для разблокировки. P2PKH хранит подпись и ключ в scriptSig, которые считаются по четыре весовые единицы на байт; P2WPKH переносит их в свидетель, где считается одна. Поэтому один и тот же секрет может дать адрес на 1 и адрес bc1q, которые совсем не похожи, хранят монеты независимо друг от друга и различаются более чем вдвое по стоимости их опустошения.