Към съдържанието
ДаретеEN

Скриптовият език

P2WPKH

P2WPKH биткойн заключва монетите към хеш на публичен ключ, а подписът им е в witness. Вижте скрипта, hex записа и bc1q адреса.

От Dimitar Zurnov · Обновено на 4 ноември 2026
Адаптирано от Learn Me a Bitcoin на Greg Walker.

P2WPKH (pay to witness public key hash) е SegWit заключващ скрипт (scriptPubKey), който заключва изхода към 20-байтовия хеш на публичен ключ. За да го похарчите, показвате подпис и публичния ключ в witness, частта от входа, която пази SegWit данните, а не в отключващия скрипт. Правилата съвпадат с по-стария P2PKH, но witness струва по-малко такса.

Заключващият скрипт на P2WPKH има фиксиран вид. Нищо не трябва да се тълкува, затова го разпознавате с един поглед.

Как изглежда P2WPKH заключването?

Заключващият скрипт на P2WPKH има две части: опкода OP_0 и push на 20 байта. Ето пример:

OP_0
OP_PUSHBYTES_20
841b80d2cc75f5345c482af96294d04fdd66b2b7

Като hex същото заключване е:

0014841b80d2cc75f5345c482af96294d04fdd66b2b7

Първият байт, 00, е OP_0. Вторият, 14, е 20 в десетична бройна система и показва, че следват 20 байта. Общо са 22 байта. Изход 0 на трансакция c178d8dacdfb989f9d4fa45828ed188cd54a0414d625c3e61e75c5e3ac15a83a носи това заключване.

Заключващият скрипт P2WPKH е 22 байта: OP_0, push на 20 байта и хешът на публичния ключ. OP_0 (байт 00) версия 0: witness програма OP_PUSHBYTES_20 (байт 14) следващите 20 байта са хешът Хеш на публичния ключ, 20 байта 841b80d2cc75f5345c48 2af96294d04fdd66b2b7 HASH160 на компресиран публичен ключ Общо: 1 + 1 + 20 = 22 байта
Заключването има две фиксирани части и един хеш. Хешът е HASH160 на компресиран публичен ключ.

OP_0 е версията на witness. Скрипт, който започва с OP_0 и после push на 20 байта, винаги се чете като P2WPKH. Push на 32 байта след OP_0 значи P2WSH, а водещият OP_1 значи P2TR.

Какво има в witness?

Отключващият скрипт на P2WPKH вход трябва да е празен. Всички данни за отключване отиват в witness, който има два елемента:

Елемент Размер Съдържание
0 72 байта (48) DER кодиран ECDSA подпис, плюс един sighash байт (тук 01)
1 33 байта (21) Компресираният публичен ключ, който започва с 02 или 03

Witness се записва като брой на елементите, после всеки елемент с дължината си отпред:

02
48
3045022100c7fb3bd38bdceb315a28a0793d85f31e4e1d9983122b4a5de741d6ddca5caf8202207b2821abd7a1a2157a9d5e69d2fdba3502b0a96be809c34981f8445555bdafdb01
21
03f465315805ed271eb972e43d84d2a9e19494d10151d9f6adb32b8534bfd764ab

Записан като един hex низ, witness започва с 02 и 48, после идва 72-байтовият подпис, след това 21 и 33-байтовият ключ. Общо са 108 байта. Witness за този пример е входът 0 на трансакция 1674761a2b5cb6c7ea39ef58483433e8735e732f5d5815c9ef90523a91ed34a6.

Дължините в witness са записани във формата compact size (променлива дължина на числата), а не с опкодите OP_PUSHBYTES, които ползва отключващият скрипт при P2PKH. Witness е просто данни, а не скрипт.

Само компресирани публични ключове са позволени. Bitcoin Core прилага това правило като проверка за стандартност, така че трансакция с P2WPKH харчене и некомпресиран ключ не се разпространява между нодовете. Хешът в заключването изглежда същият, затова грешката се вижда едва при опит за харчене.

Как биткойн проверява P2WPKH харченето?

P2WPKH не се изпълнява като нормален скрипт. Когато нодовете видят такова заключване, прилагат специалните правила за witness и после проверяват харченето като P2PKH.

  1. Двата елемента на witness отиват в стека: първо подписът, после публичният ключ.
  2. 20-байтовият хеш се превръща в P2PKH скрипт: OP_DUP OP_HASH160 <хеш> OP_EQUALVERIFY OP_CHECKSIG.
  3. Скриптът се изпълнява. Хешът на публичния ключ трябва да съвпада със заключването, а подписът трябва да е валиден за трансакцията.
Три стъпки проверяват P2WPKH харченето: witness отива в стека, заключването става P2PKH скрипт и скриптът се изпълнява. 1. Witness отива в стека първо подписът, после публичният ключ 2. Заключването става P2PKH OP_DUP OP_HASH160 <хеш, 20 байта> OP_EQUALVERIFY OP_CHECKSIG 3. Скриптът се изпълнява публичният ключ дава хеша в заключването подписът съвпада с трансакцията Валидно: монетите се харчат
Същите проверки като при P2PKH, но подписът и ключът са преместени от отключващия скрипт.

Подписът за SegWit вход следва правилата на BIP 143. Те включват стойността на входа в подписаните данни, така че подписът обвързва сумата, която се харчи. По-старите подписи не са обвързвали стойността.

Как се прави P2WPKH адрес?

Адресът е bech32 кодирането на witness програмата, тоест версията и 20-байтовият хеш от заключването. Започвате от публичния ключ:

  1. Вземете компресирания публичен ключ и приложете HASH160 (SHA-256, после RIPEMD-160). Получавате 20 байта.
  2. Сложете OP_0 и 20-те байта заедно, така че заключващият скрипт да е 0014 плюс хеша.
  3. Кодирайте програмата с bech32, както го дефинира BIP 173.

Резултатът започва с bc1q, защото q е bech32 знакът за версия 0. Примерният хеш по-горе дава bc1qssdcp5kvwh6nghzg9tuk99xsflwkdv4hgvq58q. P2WPKH адресът винаги е с 42 знака, защото хешът в него е 20 байта. Страницата за адреси описва и другите формати.

Защо P2WPKH е по-евтин от P2PKH?

Witness се отчита с отстъпка във виртуалните байтове на трансакцията. Всеки witness байт се брои за една тегловна единица, а останалите байтове за четири, така че witness байт струва 0.25 виртуални байта.

Отключване Къде са данните Байта Виртуални байта
P2PKH отключващ скрипт 107 107
P2WPKH witness 108 27

Цифрата 108 включва байта с броя на елементите (02), така че подписът и ключът сами заемат 107 байта. Изходите нямат такава отстъпка. P2PKH заключването е 25 байта, а P2WPKH заключването е 22 байта, така че P2WPKH изходът е и малко по-малък. Таксите се плащат на виртуален байт, затова харченето на P2WPKH изход струва около една четвърт от мястото за отключване на P2PKH.

Откъде идва P2WPKH?

P2WPKH е бил добавен заедно със Segregated Witness (SegWit), дефиниран в BIP 141. SegWit премести данните за отключване в witness. Така подписите са спрели да променят txid на трансакцията. SegWit правилата са влезли в сила на блок 481,824 през август 2017 г. Страницата за SegWit ъпгрейда описва останалата промяна.

Как изглеждат истинските P2WPKH трансакции?

Пример 1. Изход 0 на трансакция dfcec48bb8491856c353306ab5febeb7e99e4d783eedf3de98f3ee0812b92bad е P2WPKH заключване. Вход 0 на трансакция f91d0a8a78462bc59398f2c5d7a84fcff491c26ba54c4833478b202796c8aafd го харчи. И двете трансакции са потвърдени в блок 481,824, първият блок, на който важат SegWit правилата. Преди този блок нодовете не са проверявали witness програмите, така че това е едно от най-ранните P2WPKH харчения, които правилата са наложили.

Пример 2. Изход 0 на трансакция 7c53ba0f1fc65f021749cac6a9c163e499fcb2e539b08c040802be55c33d32fe заключва монетите към bc1qvugyzunmnq5y8alrmdrxnsh4gts9p9hmvhyd40. Хешът му идва от некомпресиран публичен ключ. Във веригата изглежда валиден, но нодовете считат харченето му за нестандартно, така че е трудно да се похарчи. Не заключвайте монетите си така.

Използвайте P2WPKH, когато портфейлът ви го поддържа. Повечето го правят днес. За по-старата вложена форма вижте P2SH-P2WPKH.

В този раздел: Скриптовият език

Целият курс „Биткойн от нулата“

Нещо не изглежда наред? Кажете ни