P2WSH
P2WSH биткойн заключва монетите към SHA-256 хеш на собствен скрипт. Вижте bc1q адреса, формата на witness и ограниченията.
От Dimitar Zurnov · Обновено на 4 ноември 2026
Адаптирано от Learn Me a Bitcoin на Greg Walker.
P2WSH (pay to witness script hash) е SegWit заключващ скрипт (scriptPubKey), който заключва изхода към SHA-256 хеша на собствен скрипт, наречен witness скрипт. За да го похарчите, показвате този скрипт като последния елемент на witness и давате данните, които той иска, в елементите преди него. P2WSH работи като по-стария P2SH, но данните за отключване са в witness, затова харченето струва по-малко.
Witness скриптът може да е почти всеки скрипт. Повечето са мултисиг скриптове, които искат няколко подписа.
Как изглежда P2WSH заключването?
P2WSH заключващият скрипт е OP_0, следван от push на 32 байта. Push-ът е хешът на скрипта:
OP_0
OP_PUSHBYTES_32
65f91a53cb7120057db3d378bd0f7d944167d43a7dcbff15d6afc4823f1d3ed3
Като hex заключването е 34 байта:
002065f91a53cb7120057db3d378bd0f7d944167d43a7dcbff15d6afc4823f1d3ed3
Изход 1 на трансакция 46ebe264b0115a439732554b2b390b11b332b5b5692958b1754aa0ee57b64265 носи това заключване.
OP_0 е версията на witness, същата като при P2WPKH. Заключване, което започва с OP_0 и push на 32 байта, винаги се чете като P2WSH. Push на 20 байта след OP_0 значи P2WPKH.
Хешът на скрипта използва един проход на SHA-256. Блоковете и трансакциите ползват двойно SHA-256, а P2SH ползва HASH160. P2WSH не ползва нито едно от двете. 32-байтовият хеш е по-устойчив на колизии, както обяснява следващият раздел.
Защо един SHA-256, а не HASH160?
P2SH ползва HASH160, който дава 160-битов хеш. При P2SH мултисиг съподписващ може да променя части от скриптовете и да търси двойка, която споделя един хеш. Единият скрипт е мултисигът, на който се съгласяват останалите подписващи. Другият е скрипт, който съподписващият може да удовлетвори сам. Това е търсене на колизия. По парадокса на рождения ден за 160 бита са нужни около 2^80 хеш операции. За 256-битов хеш същото търсене е около 2^128, което е недостижимо.
Затова P2WSH ползва по-дълъг хеш. Той струва 11 байта повече в заключването.
Какво има в witness?
Отключващият скрипт на P2WSH вход трябва да е празен. Witness съдържа елементите за отключване, а накрая witness скрипта като последен елемент. Witness скриптът играе ролята, която в P2SH има redeem script (скриптът, който се разкрива при харчене). Примерът по-долу харчи 2-of-3 мултисиг, който иска два подписа. Witness има четири елемента:
| Елемент | Размер | Съдържание |
|---|---|---|
| 0 | 0 байта (00) |
Празен елемент dummy, който OP_CHECKMULTISIG изисква |
| 1 | 71 байта (47) |
Първият подпис |
| 2 | 71 байта (47) |
Вторият подпис |
| 3 | 105 байта (69) |
Witness скриптът, самият 2-of-3 мултисиг |
Елементът 0 съществува, защото OP_CHECKMULTISIG изважда от стека един елемент повече, отколкото използва. Всеки мултисиг скрипт в witness го изисква. Целият witness като hex е:
04004730440220415899bbee08e42376d06e8f86c92b4987613c2816352fe09cd1479fd639f18c02200db57f508f69e266d76c23891708158bda18690c165a41b0aa88303b97609f780147304402203973de2303e8787767090dd25c8a4dc97ce1aa7eb4c0962f13952ed4e856ff8e02203f1bb425def789eea8be46407d10b3c8730407176aef4dc2c29865eb5e5542bf0169522103848e308569b644372a5eb26665f1a8c34ca393c130b376db2fae75c43500013c2103cec1ee615c17e06d4f4b0a08617dffb8e568936bdff18fb057832a58ad4d1b752103eed7ae80c34d70f5ba93f93965f69f3c691da0f4607f242f4fd6c7a48789233e53ae
Първият байт, 04, е броят на елементите. Witness скриптът в края се декодира като 2-of-3 мултисиг:
OP_2
OP_PUSHBYTES_33 03848e308569b644372a5eb26665f1a8c34ca393c130b376db2fae75c43500013c
OP_PUSHBYTES_33 03cec1ee615c17e06d4f4b0a08617dffb8e568936bdff18fb057832a58ad4d1b75
OP_PUSHBYTES_33 03eed7ae80c34d70f5ba93f93965f69f3c691da0f4607f242f4fd6c7a48789233e
OP_3
OP_CHECKMULTISIG
Всеки ключ е компресиран публичен ключ. Входът, който го харчи, е входът 0 на трансакция b38a88b073743bcc84170071cff4b68dec6fb5dc0bc8ffcb3d4ca632c2c78255.
Как биткойн проверява P2WSH харченето?
P2WSH е особен случай. Заключването не изпълнява скрипта. Вместо това биткойн извършва три стъпки с witness:
- Хешира последния елемент на witness, witness скрипта, със SHA-256. Резултатът трябва да съвпада с 32-байтовия хеш в заключването.
- Поставя останалите елементи на witness в стека, в същия ред.
- Изпълнява witness скрипта като нормален скрипт върху този стек.
Ако и трите стъпки преминат, входът е отключен.
Подписите в witness скрипта следват правилата на BIP 143, както при P2WPKH.
Как се прави P2WSH адрес?
Адресът е bech32 кодирането на witness програмата. Вземате witness скрипта, хеширате го със SHA-256 и правите заключването 0020 плюс хеша. После кодирате версия 0 и хеша с bech32.
2-of-3 заключването по-горе дава bc1qvhu3557twysq2ldn6dut6rmaj3qk04p60h9l79wk4lzgy0ca8mfsnffz65. Адресът започва с bc1q и винаги е с 62 знака, защото хешът в него е 32 байта. Изход 1 на трансакция 46ebe264b0115a439732554b2b390b11b332b5b5692958b1754aa0ee57b64265 го показва и в нашия explorer.
Какви ограничения важат за P2WSH скрипт?
Bitcoin Core задава три правила за стандартност при харчене по P2WSH. Консенсусът допуска по-голям скрипт, до 10,000 байта, както дефинира BIP 141. Ограниченията по-долу определят какво нодовете разпространяват:
- Witness скриптът е най-много 3,600 байта.
- Елементите преди скрипта са най-много 100 на брой.
- Всеки от тях е най-много 80 байта.
Трансакция, която нарушава някое от тях, е нестандартна. Нодовете не я разпространяват, макар че майнърът все пак може да я включи в блок. Числата са в policy.h на Bitcoin Core. За сравнение, P2SH redeem script трябва да се побира в лимита от 520 байта за един push.
Защо P2WSH, а не P2SH?
P2WSH и P2SH вършат една и съща работа: заключват монетите към скрипт, който разкривате по-късно. P2WSH има две предимства:
- Данните за отключване са в witness, който струва по-малко виртуални байта. Плащате по-малко такса при харчене.
- Witness скриптът може да е до 3,600 байта според правилата за разпространение (10,000 по консенсус), срещу 520 байта за P2SH redeem script.
Използвайте P2WSH, когато портфейлът ви може да праща към bc1q адреси. Ако не може, P2SH-P2WSH обвива същия скрипт в P2SH изход.
Как изглеждат истинските P2WSH трансакции?
Пример 1: 2-of-3 мултисиг. Изход 1 на трансакция 0ca3ce42ca8037d955d04ed8fd89d10581793fc1ab451dec1116fb63a74c24f4 заключва монетите към bc1qwqdg6squsna38e46795at95yu9atm8azzmyvckulcc7kytlcckxswvvzej. Вход 0 на трансакция 1b2a44f4f8b59d6d7075a3dbd72493a6a158218589e722d7525d1d99b7f287a5 го харчи. Witness скриптът вътре е 2-of-3 мултисиг със същата структура като примера по-горе.
Пример 2: хеш пъзел. Изход 0 на трансакция c6cfbac310715dc35ae5a1edbeae78def5955a67cd891aa3457d8cd4cdb5398a заключва монетите към bc1qae8a988zl89ggyth378fg6rate67c05xe3fse2ddz7r72gyvextqh3f88c. Witness скриптът му е:
OP_HASH256 OP_PUSHBYTES_32 a23421f2ba909c885a3077bb6f8eb4312487797693bbcfe7e311f797e3c5b8fa OP_EQUAL
Харченето подава два байта, 1234 в hex. Двойният SHA-256 на тези два байта е a23421f2…, което съвпада със скрипта. Входът 0 на трансакция 64f427122f7951687aea608b5474509a30616d4e5773a83bc1ed8b8271ad1991 е самото харчене.
Това е учебен пример. Не е безопасно да го копирате. Харченето не съдържа подпис, така че всеки, който види данните 1234, може да ги използва повторно в трансакция, която праща монетите другаде. Истинските P2WSH заключвания трябва да проверяват подпис.
В този раздел: Скриптовият език
Целият курс „Биткойн от нулата“
Нещо не изглежда наред? Кажете ни