Перейти к содержимому

Bech32 p2wpkh что это значит

  • автор:

Bitcoin address formats and performance comparison

Mr Robot

FixedFloat uses Bech32 addresses by default, as our team is committed to introducing new technologies.

Bitcoin address performance comparison chart

For simplicity, we use the following abbreviations:
I — P2PKH, adress starts with “1”
II — P2SH, adress starts with “3”
III — Bech32, adress starts with “bc1”

Bech32 adoption

Bech32 is a bitcoin address format specified by BIP 0173. It is used for the native segwit version 0 output types, P2WPKH and P2WSH. The upcoming Taproot softfork will add another output type called Pay to Taproot (P2TR). P2TR outputs and future native segwit versions will be using an updated variant of Bech32, called Bech32m (specified by BIP 0350). This page tracks the adoption of Bech32 and Bech32m.

Ideally wallets and services would first support sending to new addresses. When most wallets and services support sending to the new address type, people are more likely to adopt it for receiving.

The amount of bech32 addresses on the blockchain is tracked on this website: https://p2sh.info/dashboard/db/bech32-statistics?orgId=1

No
 ?? Maybe / Haven’t checked / placeholder
Planned The developers said they plan to
PR Merged In the case of software, code has been written and merged, and it will be in next release.
Yes Feature has been released

Contents

Software Wallets

Name Send to Bech32 Receive to P2WPKH/P2WSH Send to Bech32m Receive to P2TR Notes
Armory Yes No Planned around activation  ??
AQUA Yes Yes  ??  ??
bcoin Yes Yes Since 2.2.0  ??
Bisq Yes Yes Dependent on BitcoinJ  ?? As of v1.5.0 https://bisq.network/blog/bisq-v1.5.0-highlights/
Bitcoin Core Since 0.16.0 Since 0.16.0 Since 0.21.1 Since 22.0 Uses P2WPKH as default address since version 0.20.0. Creating P2TR addresses requires manual import for now.
Bitcoin Knots Since 0.16.0 Since 0.16.0 Since 0.21.1 Since 22.0
Blockstream Green Yes Yes Since Mobile 3.7.6+, Desktop 1.0.4+ Planned Bech32m sending support as of GDK 0.0.47
Breadwallet Yes Yes  ??  ?? https://www.reddit.com/r/BRDapp/comments/9xx1hq/as_of_today_brd_fully_supports_native_segwit/
Bitcoin Wallet for Android Yes Yes Since 9.0 No Tested as of v9.20 (October 2022)
BlueWallet Yes Yes Since 6.2.14 No Tested as of v6.3.1 (October 2022)
Breez Yes Yes Yes Yes, via the dev console https://github.com/breez/breez/pull/209
BTC.com No No No No wallet discontinued: https://wallet.btc.com/#/announcement
Caravan Yes Yes Planned  ??
Casa Yes No Yes Planned
C-Lightning Yes Yes Yes  ??
Coinomi Yes Yes No No Tested as of v1.26.0 (October 2022)
Electrum Yes Yes Since 4.1.0 Planned: Descriptor-based keypath spends https://github.com/spesmilo/electrum/issues/7544
Exodus Yes Yes Yes Not yet planned https://support.exodus.com/article/1480-bitcoin-faqs-learn-more-about-btc#
Fully Noded Yes Yes Yes Since v0.2.26 https://twitter.com/FullyNoded/status/1438652812410298370
Guarda Wallet Yes Yes Yes Currently not planned twitter announcement
Iris Wallet Yes Yes Yes Yes https://twitter.com/cryptoquick/status/1585187190627528710
JoinMarket Yes Yes Since v0.9.5  ??
LND Yes Yes Since v0.15 Since v0.15 The coming LND v0.15 release will introduce full P2TR support including scriptpath spends, PSBT signing, and a MuSig2 API.
Muun Yes Yes Yes Yes https://twitter.com/MuunWallet/status/1459294066135474177
Mycelium Yes Yes No No Bech32m not supported as of version 3.16.0.13, tested on October 12th, 2022. https://github.com/mycelium-com/wallet-android/issues/645
Nunchuk Yes Yes Yes Yes https://twitter.com/nunchuk_io/status/1511365917808103426
Phoenix Yes Yes Support in iOS, but not Android No
Samourai Wallet Yes Yes Since v0.99.98 Currently not planned https://twitter.com/SamouraiWallet/status/1415788631491497985?s=20
Sparrow Wallet Yes Yes Yes Yes https://twitter.com/SparrowWallet/status/1415632270434705408
Specter Wallet Yes Yes Yes Yes https://twitter.com/_benkaufman/status/1431293856675508228
Trust Wallet Yes Yes Yes Not planned https://github.com/trustwallet/wallet-core/releases/tag/2.6.5, https://twitter.com/catenocrypt/status/1520152930065817601
Uniblow Yes Yes Since v1.2.2 Not yet planned release1.2.2
Wallet of Satoshi Yes Yes Yes  ?? https://twitter.com/walletofsatoshi/status/1459782761472872451
Wasabi Wallet Yes Yes Since Wasabi 2.0 Planned: via NBitcoin https://twitter.com/NicolasDorier/status/1413693010236170241
https://mempool.space/testnet/tx/05a23151b6ad114fb71e851147861d6c992a438ad4f62d6f0749bc9f200ef254

Hardware Wallets

Hardware wallet manufacturers typically publish a web wallet or browser add-on wallet for use with their hardware. Users can also sometimes connect their hardware wallet to a software wallet like Electrum.

Name Send to Bech32 Receive to P2WPKH/P2WSH Send to Bech32m Receive to P2TR Notes
Trezor + Trezor Suite Yes Yes Yes Yes since Trezor Suite 21.12.2 + Trezor Firmware 1.10.4 (Model One) / 2.4.3 (Model T)
Ledger Live (desktop app) Yes Yes Yes Yes Ledger Live Desktop 2.35 + Bitcoin App 2.0.0, Ledger Live Mobile support TBD. https://blockstream.info/tx/41d46e6f6e58a325eb6c913aa603f4db313f4a1db0649952f06fe2cd70546451
KeepKey chrome app No No  ??  ??
BitBox Desktop app Yes Yes Yes Yes https://twitter.com/_benma_/status/1504455969631350792
Trezor + Electrum Yes Yes Yes Planned
Ledger + Electrum Yes Yes  ??  ??
BitBox + Electrum Yes Yes Yes  ?? https://twitter.com/_benma_/status/1504458280000761857
KeepKey + Electrum Yes Yes  ??  ??
Archos + Electrum Yes Yes  ??  ??
Coldcard + Electrum Yes Yes Yes Yes https://blog.coinkite.com/edge-firmware/
Ballet + app Yes Yes  ??  ??
SeedSigner Yes Yes Planned  ??
Tangem + app Yes Yes  ??  ??
Blockstream Jade + Blockstream Green Yes Yes Yes Planned Bech32m sending support as of GDK 0.0.47 available via Blockstream Green mobile apps 3.7.6+ and desktop app 1.0.4+
Keystone Yes Yes, but only with BTC-only firmware Planned for Q1 2022 Evaluating https://twitter.com/KeystoneWallet/status/1460110906789031938
Foundation Passport Yes Yes Yes Planned https://twitter.com/ShrtCrct6102/status/1661102603810250761

Web Wallets / Wallet Service Providers

Name Send to Bech32 Receive to P2WPKH/P2WSH Send to Bech32m Receive to P2TR Notes
Bitcoin Beach Wallet Yes Yes Yes No https://twitter.com/nicolasburtey/status/1556659398365401088
Coin Wallet Yes Yes  ??  ??
BitGo Yes Yes Yes Yes Full native segwit support on v2 platform, no plans to add native segwit support on v1 platform. Also see: https://blog.bitgo.com/native-segwit-addresses-via-bitgos-api-4946f2007be9, Taproot: https://blog.bitgo.com/taproot-support-for-bitgo-wallets-9ed97f412460
Bitnob Yes Yes Yes Yes https://twitter.com/bernard_parah/status/1469962690483400706
blockchain.com web Yes Yes Yes  ?? https://twitter.com/Pellicceama/status/1563171639063629828
Fireblocks Yes Yes Yes Planned for 2022
HolyTransaction Yes No Yes  ??
Coinb.in Yes Yes  ??  ?? open source JavaScript implementation
Guarda Wallet Yes Yes Yes Currently not planned https://twitter.com/GuardaWallet/status/1194270398730448896

Exchanges

Name Send to Bech32 Receive to P2WPKH/P2WSH Send to Bech32m Receive to P2TR Notes
AgoraDesk Yes Yes Yes Yes
Anycoin Direct Yes No  ??  ?? https://anycoindirect.eu/en/news/details/segwit-activated
Binance Yes Yes No No https://twitter.com/colemaktypo/status/1460337599499882502
Bitaroo Yes Yes Yes No
BitBargain.co.uk Yes No  ??  ??
Bitcoin.de Yes No No No https://twitter.com/Ben_deWaal/status/1460464528181936130
Bitfinex Yes No Planned No https://twitter.com/paoloardoino/status/1460620727342796800
BitMEX Yes Yes Yes  ?? https://twitter.com/BitMEXResearch/status/1492152557044654082
Bitonic Yes  ?? No  ?? https://twitter.com/BitcoinenNL/status/1460284373291384833
Bitpanda Yes  ?? Yes  ?? https://twitter.com/christiant5r/status/1461369956252139520
Bittrex No No  ??  ?? https://www.reddit.com/r/Bitcoin/comments/gqt1m6/bittrex_does_not_even_support_withdrawals_to/
Bittylicious Yes No  ??  ?? https://twitter.com/Bittylicious_/status/998881327347888128
Bitstamp Yes Yes Planned  ?? https://www.bitstamp.net/article/weve-added-support-bech32-bitcoin-addresses-bitsta/
Bitso Yes No Yes  ??
Bitwage  ?? No  ??  ??
Bitwala Yes Yes  ??  ??
Bottlepay Yes Yes No  ?? https://help.bottlepay.com/en/articles/4909780-what-bitcoin-addresses-do-you-support-for-on-chain-withdrawals, https://twitter.com/Stack_Russel_UK/status/1460330265751044097
BSDEX Yes No No No https://www.bsdex.de/en/faq/#deposit-and-withdrawal-options-which-cryptocurrency-address-formats-are-supported-in-bsdex
Bull Bitcoin Yes Yes Yes Planned https://twitter.com/francispouliot_/status/1464264391155666950
CardCoins.co Yes No deposits Yes No deposits https://twitter.com/CardCoinsCo/status/1452680654030872589
CEX.IO No No  ??  ??
Coinbase.com Yes No Not a priority currently No
CoinCorner Yes Yes Yes  ?? https://twitter.com/CoinCorner/status/1461360995746545667
CoinFalcon Yes No  ??  ??
Coinmate.io Yes Yes Yes Yes https://coinmate.io/cz/taproot-revolucni-upgrade-bitcoinu/
Coinsbank.com Yes Yes  ??  ??
Coinygram Yes No  ??  ??
Flyp.me Yes No Yes  ??
FTX US Derivatives Yes Yes Yes  ?? Formerly LedgerX
GDax Yes No  ??  ?? https://www.reddit.com/r/Bitcoin/comments/8c738k/coinbase_gdax_already_allows_sending_to_bc1/
Gemini Yes Yes No No https://np.reddit.com/r/Bitcoin/comments/b66n0v/psa_gemini_is_full_on_with_native_segwit_and_uses/
Genesis  ?? No  ??  ??
Globitex No No  ??  ??
HitBTC Yes No  ??  ??
Hodl Hodl Yes Yes  ??  ?? https://medium.com/@hodlhodl/hodl-hodl-segwit-compatible-exchange-a2231968ac56
Independent Reserve Yes No  ??  ?? https://www.independentreserve.com/bitcoin/investing
Itbit  ?? No  ??  ??
Kraken Yes No Yes No https://blog.kraken.com/post/16740/bitcoin-taproot-address-now-supported-on-kraken/
Liberalcoins Yes Yes  ??  ?? https://liberalcoins.com
LocalBitcoins Yes No  ??  ?? https://twitter.com/LocalBitcoins/status/1322194709159301120
Luno Yes No Planned  ?? https://www.luno.com/blog/en/post/luno-launches-support-for-bech32-addresses
Okcoin Yes Yes Yes  ?? https://twitter.com/Okcoin/status/1471563103049756672
Paxful.com Yes No  ??  ?? https://paxful.com/support/en-us/articles/360011766520-Can-I-Withdraw-Bitcoin-from-Paxful-Wallet-to-My-External-Wallet-
Purse.io Yes Yes  ??  ??
Poloniex.com Yes No  ??  ?? https://www.reddit.com/r/Bitcoin/comments/a3jhcf/you_can_now_withdraw_from_poloniex_to_bech32/
River.com Yes Yes Yes  ??
Robinhood.com Yes  ?? No  ?? https://robinhood.com/us/en/support/articles/cryptocurrency-wallets/#Supportedaddressformatsforcryptowithdrawals
Square CashApp Yes No Yes  ?? https://cash.app/help/us/en-us/20211114-bitcoin-taproot-upgrade
StackinSat.com Yes No deposits Yes No deposits https://twitter.com/StackinSat_FR/status/1500898826416230401
Strike Yes Yes No No https://twitter.com/BTCBoromir/status/1460373287792521232
Swan Yes No deposits Yes No deposits https://twitter.com/SwanBitcoin/status/1468318386916663298
TheRockTrading.com Yes Yes  ??  ?? https://twitter.com/TheRockTrading/status/976787499648512003
VBTC Yes Planned Yes Planned https://twitter.com/VBTC_Vietnam/status/1460978196816416775
Walltime Yes Yes  ??  ?? https://walltime.info
Xapo Yes No  ??  ??

Bitcoin ATM Models

Hopefully when a model updates then all its ATMs everywhere will gain that feature. See https://coinatmradar.com/shop/buy-bitcoin-atm/

Name Send to Bech32 Receive to P2WPKH/P2WSH Send to Bech32m Receive to P2TR Notes
Bitaccess BTM Yes Yes Work in progress Planned https://twitter.com/DylanSeago/status/1520212294898274305
GenesisCoin No No  ??  ??
General Bytes Yes Yes  ??  ?? Depending on configuration. Since version 20190613 https://www.generalbytes.com/en/support/changelog
Lamassu Yes Yes (optional) Planned  ?? https://twitter.com/LamassuBTC/status/1459918440303673349

Blockchain Explorers

To investigate bech32 capability, you can use mainnet TXIDs 4ef47f6eb681d5d9fa2f7e16336cd629303c635e8da51e425b76088be9c8744c and 514a33f1d46179b89e1fea7bbb07b682ab14083a276979f91038369d1a8d689b or look up the addresses bc1qar0srrr7xfkvy5l643lydnw9re59gtzzwf5mdq and bc1qc7slrfxkknqcq2jevvvkdgvrt8080852dfjewde450xdlk4ugp7szw5tk9 .

Some blockchain explorers can only parse the bech32 address and display it, they don’t build an index so users cannot search for bech32 addresses.

To verify bech32m readiness, you can look up the mainnet TXID b10c007c60e14f9d087e0291d4d0c7869697c6681d979c6639dbd960792b4d41 on which the first output should be addressed as bc1pqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqsyjer9e . Note that the superseded bech32 encoding only differs in the last six characters that encode the checksum: bc1pqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqs_3wf0qm_ .

Подробно об обновлении Segregated Witness и последствиях его принятия в Bitcoin

В данной статье мы постарались детально рассмотреть изменения протокола Bitcoin, которые произошли в результате softfork-обновления Segregated Witness. Мы затронули вопросы, связанные с transaction malleability, сохранением обратной совместимости, увеличением пропускной способности, новыми форматами сериализации транзакций, новыми вариантами скриптов, форматом адресов Bech32 и его преимуществами, понятиями веса, размера и виртуального размера. Более того, ниже приведена самая важная статистика по адаптации обновления и представлены ответы на часто задаваемые вопросы по теме данного обновления.

Перед тем как переходить к детальному описанию всех изменений данного обновления, предлагаем познакомиться с главной идеей Segregated Witness. Дословно Segregated Witness переводится с английского, как «отделенный свидетель». В контесте Bitcoin подразумевается, что данные доказательства владения монетами будут храниться отдельно от основных данных транзакции, как обозначено на схеме.
image
Если рассматривать обновление протокола целиком, то оно включает в себя множество других улучшений. SegWit позволяет увеличить пропускную способность сети, отделить данные доказательств владения монетами от остальных данных транзакции, исправить недостатки формата транзакций, связанные с возможностью модификации данных в подписанных транзакциях (transaction malleability), и при этом сохранить обратную совместимость с предыдущими версиями протокола. А наибольшая ценность данного обновления состоит в том, что оно позволяет реализовать множество очень важных off-chain решений поверх протокола Bitcoin.

Проблема transaction malleability и ее решение

Суть в том, что при работе в Bitcoin существует возможность изменить транзакцию таким образом, что она останется корректной при верификации. Эти изменения очень незначительные, они не касаются адресов отправителя и получателя, но их достаточно для изменения результата хеширования. Другими словами, транзакция будет переводить монеты на прежние адреса, но ее измененное хеш-значение уже не даст соответствия модифицированной транзакции с оригинальной.

Очевидно, что вышеописанная ситуация может случиться только с транзакциями, которые еще не получили подтверждения. Без ее решения невозможно добиться надежной работы off-chain протоколов, которые предусматривают построение цепочек из неподтвержденных транзакций. Поскольку при составлении транзакции подписываются не все данные (например, нельзя подписать scriptSig), существует возможность проведения нескольких видов атак:

  1. Изменение формата подписи. В протоколе Bitcoin формат подписи утвержден не строго и зависит от реализации библиотеки OpenSSL, в которой для подписи тоже не определен строгий формат. Третья сторона может изменить перехваченную транзакцию, что повлечет за собой изменение хеш-значения.
  2. Воздействие непосредственно на scriptSig. Как было отмечено ранее, scriptSig содержит набор операций для проверки доказательств, что владельцем монет является определенный пользователь. Но кроме указанных операций, в него можно добавить и другие. Несколько безобидных, ни на что не влияющих операций приведут к изменению хеш-значения транзакции.

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

Выше были упомянуты off-chain протоколы. Для их реализации решение проблемы transaction malleability необходимо. В основе их работы лежит построение цепочек из неподтвержденных транзакций. Изменение хеш-значения первой транзакции повлечет за собой невалидность всей цепочки неподтвержденных.

В обновлении SegWit были определены строгие правила заполнения полей, поэтому проблемы, связанные с transaction malleability, для транзакций нового формата можно считать решенными. Это позволило задавать данные и сериализовать их однозначно, исключая двойственность.

Обратная совместимость при распространении блока по сети

Согласно старым правилам максимальный размер блока равен 1 MB и содержит транзакции со встроенными доказательствами. В то время как новые правила предполагают, что максимальный базовый размер блока 1 MB, но дополнительно существует структура данных с доказательствами. Соответственно, итоговый размер нового блока превышает 1 MB.

С целью обратной совместимости правила работы протокола позволяют работать старым узлам с новыми блоками, но они будут получать блок только в базовой комплектации с максимальным размером 1 MB. Им недоступна структура witness. Новые же узлы получают полноценный блок с транзакциями и доказательствами. Ознакомиться с этим вопросом поможет следующий рисунок.

image

Слева представлена схема работы протокола Биткоин до активации Segregated Witness. Блок имел максимальный размер 1 MB, и он распространялся между различными узлами сети в одном виде.

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

Способы увеличения пропускной способности

Рассмотрим два основных способа решения проблемы увеличения пропускной способности системы. Любое предложение тщательно проверяется и тестируется командой разработчиков протокола Биткоина. Если согласие комьюнити достигнуто и решено внедрить предложение в протокол, выходит обновление.

Hardfork обновление. Самое банальное из обновлений и заключается в увеличении размера блока. Предполагается, что один блок будет вмещать больше транзакций, повышая пропускную способность. Однако такой блок не будут принимать узлы, работающие по старому протоколу, в правилах которого записано, что максимальный размер блока не может превышать 1 МВ. Такое изменение требует hardfork, который организационно более сложен, чем softfork.

SoftFork обновление. Segregated Witness позволяет нам решить эту проблему при помощи softfork. Как именно? Он позволяет нам разделить блок на две части, в первой из которых хранятся транзакции, а во второй – доказательства. При этом новые узлы сети получают обе части, а старые – только блок транзакций размером 1 MB. Старые узлы не могут получать блоки с доказательствами и, соответственно, не могут валидировать транзакции, которые получают, но это позволяет им участвовать в достижении консенсуса и не прибегать к hardfork, а постепенно переходить к новому ПО.

Новшества Segregated Witness

Рассмотрим, что входит в обновление Segregated Witness. Первым и самым важным новшеством Segregated Witness стал новый формат сериализации транзакций. Кроме уже известных полей, в новой транзакции присутствуют три новых: marker, flag, которые применяются для версирования и в данном случае они строго заданы, но в следующих протоколах они могут меняться, а также поле witness. Witness (witness data) – это фактически набор доказательств владения монетами, которые вынесены за пределы основной части транзакции. Структурно он выглядит, как набор входов, при этом каждый элемент witness data соответствует входу с определенным номером, что позволяет сопоставить доказательства с конкретными потраченными монетами.

Witness transaction id

Чтобы получить идентификатор транзакции (transaction id, txid), нужно привести саму транзакцию к одной последовательности данных по специальному формату сериализации, а потом получить хеш-значение от этой последовательности данных. С введением Segregated Witness появился и новый идентификатор, witness transaction id (wtxid), и новый формат сериализации, соответственно. Для старых транзакций, которые тратят средства, не используя Segregated Witness, wtxid будет таким же, как txid, потому что у них не будет новых полей, которые добавились в Segregated Witness.

image

Wtxid нужен, чтобы построить альтернативный Merkle tree для доказательств. Строится он точно так же, как и для обычных транзакций, только вместо хеша транзакции здесь применяется wtxid. Соответственно, wtxid попарно хешируются и дают в результате Merkle root.

Важно отметить, что Merkle root вставляется в coinbase транзакцию, а не в заголовок блока. Если бы root находился в заголовке блока, то изменилась бы структура блока. Узлы, которые поддерживают старый протокол, не могли бы работать с такими блоками. И все старания сохранить обратную совместимость упирались бы в эту несостыковку. Поэтому root вставляется в один из выходов coinbase транзакции. Когда все узлы перейдут на Segregated Witness, эта ситуация может измениться и будут рассматриваться новые подходы.

Witness programs для задания условий траты монет

Давайте рассмотрим, как строится скрипт Segregated Witness транзакции и как он позволяет старым узлам сети понимать, что транзакции Segregated Witness правильные, несмотря на то, что они не получают доказательств владения монетами.

Скрипт описывающий правила траты монет из транзакции нового формата состоит из двух частей. Первая часть – это witness version byte (байт определяющий версию witness program). Он может принимать значения от 0 до 16 (OP0-OP16), сейчас используется OP0. В будущем могут появляться новые версии протокола c поддержкой других версий witness program. Вторая часть – это witness program. Эта часть может иметь размер от 2 до 40 байт.

Witness program является результатом хеширования witness script. Сам witness script содержит полное описание условий траты монет. Witness data содержит доказательства владения монетами, которые должны удовлетворять условиям из witness script. Соответственно witness data всегда состоит из двух частей: witness script и доказательства владения монетами.

Стоит отметить, что witness program не содержит никаких операций (совпадения хеш-значений, проверки электронных подписей), а сам скрипт начинается с кода OP0, следовательно, он валиден для всех старых узлов. Причем узлы, которые не обновились до SegWit, не проверяют доказательства владения монетами для выходов нового формата, они такую трату считают правильной в любом случае. Строго говоря, старые узлы будут принимать транзакции нового формата даже если ее отправитель на самом деле не владеет соответствующими монетами. Именно поэтому SegWit требует, чтобы владельцы большинства майнинговой мощности Биткоина приняли это обновление. Еще одна особенность состоит в том, что scriptSig у транзакции, которая тратит монеты из выхода нового формата, будет пустым.

Новые варианты задания условий траты монет

С введением SegWit было предложено два стандартных формата для scriptPubKey, которые стали альтернативой двум наиболее распространенным форматам задания правил траты монет еще до появления этого обновления. Рассмотрим их по порядку.

Pay to witness public key hash (P2WPKH) является аналогом стандартного pay to public key hash. В чем состоит его отличие? Как было отмечено раньше, scriptSig не заполняется и остается пустым. Все доказательства владения монетами переносятся в структуру witness data.

При этом в scriptPubKey вставляется скрипт, который был рассмотрен ранее, версия и хеш публичного ключа, который является witness program. Узел в сети отличает такой скрипт траты от других благодаря тому, что версия у него равна единице, а размер данных 20 байт. Другая версия и другой размер несут в себе другие правила траты.

image

В данном случае scriptPubKey содержит две части: номер witness версии равный нулю и хеш-значение открытого ключа получателя. ScriptSig будет пустым, а witness data будет содержать электронную подпись и открытый ключ для ее проверки.

Pay to witness script hash (P2WSH) – это аналог стандартного pay to script hash. В данном случае могут использоваться custom script для задания правил траты монет. Как узел сети отличает такой скрипт от предыдущего? В этом случае версия по-прежнему имеет значение единицы, а witness программа занимает 32 байта и является хеш-значением от witness script. Если на узел сети придет транзакция, содержащая какой-то скрипт, который будет иметь первую версию, но его размер будет отличаться от значений 20 или 32 байта, то узел отклонит эту транзакцию, потому что он не будет знать, как с ней работать.

Witness data здесь делится на две части. В первой содержится набор доказательств владения монетами, то есть набор подписей. Во второй части размещается witness script, содержимое которого как раз и задает правила траты монет, но в данном случае оно указывается в момент траты, а в момент отправки монет указывалось его хеш-значение.
image
В данном случае scriptPubKey содержит две части: номер witness версии равный нулю и хеш-значение witness script для случая мультиподписи 1-из-2. ScriptSig будет пустым, а witness data будет содержать электронную подпись и исходный witness script в открытом виде.

P2SH обертка

Новый формат скрипта отличается от старого. Соответственно, старые сервисы и кошельки не будут знать, как работать с таким форматом скрипта и как его составить. С целью обратной совместимости в Segregated Witness транзакциях при помощи P2SH используется специальная «обертка», которая позволяет сформировать транзакцию, обладающую свойствами Segregated Witness транзакции, но не отличающуюся от обычной P2SH для внешнего мира.

P2SH применяется, чтобы упростить работу отправителя и не обременять его деталями реализации Redeem Script получателя. В этом случае получатель дает отправителю только хеш-значение Redeem Script, а сам скрипт передает в scriptSig вместе с доказательствами.

image

В данном случае scriptPubKey содержит операцию хеширования, хеш-значение redeem scrip и операцию сравнения (как для старой версии P2SH). ScriptSig тут будет содержать хеш-значение открытого ключа, а witness data будет содержать электронную подпись и открытый ключ.

Такой подход позволяет не обновленным цифровым кошелькам отправлять транзакции на Segregated Witness адреса, фактически ничего не зная о новых способах задания условий траты монет.

Новый формат адресов Bech32

  • адрес в Base58 занимает больше памяти в QR-кодах, поскольку не может использовать режим буквенно-цифрового представления;
  • base58 является очень неудобным для надежной записи на бумагу, ввода с мобильной клавиатуры или чтения вслух;
  • двойное хеширование контрольной суммы является медленным;
  • декодирование base58 является сложным и сравнительно медленным.

Спецификация Bech32 адреса

Адрес Bech32 имеет длину, которая не превышает 90 символов, и содержит:

  1. Часть, удобную для чтения человеком. Сюда входят данные, которые может понадобиться передать или которые имеют какое-либо отношение к владельцу адреса, длина минимум 1 символ. Например, по умолчанию для адресов mainnet используются символы «bc», а для testnet символы «tb».
  2. Разделитель, который всегда равен «1». Если «1» разрешен внутри человекочитаемой части, то разделителем является последний из символов «1».
  3. Часть с данными имеет длину как минимум 6 символов и состоит только из буквенно-цифровых символов, исключая «1», «b», «i», и «o». В качестве основных данных тут используется версия witness program и данные самой witness program (от 2 до 40 байт).

image

Зачем включать разделитель в адреса? Это позволяет однозначно отделить человекочитаемую часть от части с данными, избежав потенциальных столкновений с другими человекочитаемыми частями, которые используют префикс. Это также позволяет избегать ограничений в наборе символов для человекочитаемой части. Сепаратор равен 1, потому что использование не алфавитно-цифрового символа затруднит копирование адресов (без выбора двойного щелчка в нескольких приложениях). Поэтому был выбран буквенно-цифровой символ вне основного набора символов. Также использование системы счисления по основанию 32 сопровождается увеличением длины адреса на 15% по сравнению с системой счисления по основанию 58, но это не имеет значения при копировании адресов.

Контрольная сумма Bech32 адреса

Последние 6 символов адреса являются контрольной суммой. Контрольная сумма построена на основе БЧХ-кода, который гарантирует обнаружение любой ошибки, затрагивающей не более 4 символов, а шанс того, что контрольная сумма сойдется, когда допущено более 4 ошибок, один из 109.

Одним из преимуществ использования БЧХ-кодов является то, что они могут использоваться для исправления ошибок. Если в адресе было допущено до 4 ошибок, то они будут исправлены автоматически. А если допущено больше ошибок, то они будут обнаружены с высокой вероятностью, но уже без возможности их автоматического исправления.

Верхний и нижний регистр в адресе

Нижний регистр применяется, когда требуется определение значения символа для контрольной суммы.

ПО всегда выводит всю строку адреса Bech32 в нижнем регистре. Если требуется версия в верхнем регистре (например, в целях презентации или использования в QR-коде), то это доступно опционально. Более того, ПО не будет принимать адреса, в которых некоторые символы в верхнем регистре, а некоторые в нижнем. Для отображения нижний регистр обычно более предпочтителен, но для QR-кодов следует использовать верхний регистр, поскольку он позволяет буквенно-цифровое представление, которое кодируется на 45% компактнее, чем байтовое представление.

Понятия веса и размера блока

Еще одним важным изменением, которое внесло обновление Segregated Witness, является введение такого понятия, как вес транзакции и вес блока. До Segregated Witness обычно говорили только о размере транзакции и размере блока. При этом размер блока был ограничен 1 MB. После активации обновления существует два формата транзакций. Соответственно, дальше поддерживать нужно оба.

С целью решения этой проблемы было введено понятие веса транзакции и соответствующих весовых единиц (weight units). Размер основной части транзакции теперь учитывается с коэффициентом 3, а размер witness data с коэффициентом 1. Как можно догадаться, любые данные, которые включались в witness data требовали в 3 раза меньшей комиссии, чем основные данные транзакции. Подобный подход позволяет валидаторам определить более выгодную транзакцию в отношении занимаемого в блоке места и получаемым вознаграждением. Вес рассчитывается по специальной формуле.

block weight = base size * 3 + total size

block weight – вес блока (измеряется в весовых единицах)
base size – базовый размер блока (измеряется в байтах)
total size – итоговый размер блока (измеряется в байтах)

В этой формуле базовый размер транзакции значит, что размер транзакции при сериализации по старым правилам умножается на три и результат суммируется с размером транзакции, сериализованной по новым правилам. В результате получаем вес транзакции.

Вне зависимости от того, по новым или по старым правилам сериализована транзакция старого образца, размер она всегда будет иметь одинаковый, соответственно, вес будет ровно в 4 раза больше. А для Segregated Witness транзакции вес будет чуть меньше, потому что в размер транзакции не будут включаться данные доказательств владения монетами.

Вместе с весом было введено понятие виртуального размера, который вычисляется путем деления веса на четыре. Виртуальный размер (virtual size) используется, чтобы рассчитать комиссии для транзакций и чтобы валидаторы могли понять, насколько им выгодно включать определенную транзакцию в блок используя привычную цену записи, которая измеряется в единицах spb (satoshi per byte).

virtual size = weight units / 4

Поскольку вес транзакции для не Segregated Witness будет в 4 раза больше, чем размер, то виртуальный размер транзакции будет равен обычному размеру. Соответственно, для старых транзакций подсчет комиссии не изменится. Для новых транзакций он будет чуть меньше, потому что подписи выносятся в отдельную структуру. Таким образом, за них можно платить меньшие комиссии, но иметь тот же приоритет у майнеров при включении в блок. При этом, максимальный размер блока без witness data (base size) остался 1 MB, а максимальный вес блока равен 4 MB.

Здесь может возникнуть логичный вопрос: «каким будет фактический размер блока вместе с witness data?». Абсолютно точно ответить на него невозможно. Очевидно, что это значение будет находиться в пределах от 1 MB до 4 MB. Но можно сделать более точную теоретическую оценку. Получится около 1.8 MB. Откуда это значение? Типичный блок с транзакциями на текущий момент состоит примерно на 60% из открытых данных. Если посчитать вес блока размером 1 MB, состоящего на 40% из данных доказательств владения монетами, то получим следующие данные.

400000 байт * 4 = 1600000 условных единиц веса
600000 байт * 1 = 600000 условных единиц веса
1600000 + 600000 = 2200000 условных единиц веса
4000000 / 2200000 = 1.81 MB

То есть, можно предполагать, что эффективный размера блока будет около 1.8 MB. Но очевидно, что на практике это значение будет полностью зависеть от состава транзакций в этом блоке.

Статистика адаптации обновления

По состоянию на июль 2018 года количество SegWit транзакций преодолело отметку 35% от общего количества в сети Биткоин. При этом основные сервисы для работы с Биткоином и цифровые кошельки реализовали поддержку Segregated Witness совсем недавно (например, Electrum и Bitxfy).

image
Диаграмма взята из материалов исследования BitMex Research

В динамике итогового размера блока после активации обновления также можно заметить существенные изменения. В моменты увеличения потока новых транзакций почти все блоки получаются значительно больше 1 MB, а иногда даже больше 2 MB. Кроме того, совершенно очевидно, что после активации SegWit вопрос о необходимости срочного решения проблемы низкой пропускной способности уже не кажется таким острым.

image
По данным аналитики BitMex Research

Если посмотреть на зависимость средней комиссии за транзакцию от количества транзакций нового формата, то тоже можно заметить очень сильную корреляцию в изменениях этих величин.

И не будем забывать, что Segregated Witness дало возможность развитию off-chain решений поверх протокола Bitcoin. Конечно же, адаптация lightning network – это на много более сложная задача по сравнению с SegWit, тем не менее, работа в этом отношении идет полным ходом и уже есть значительные достижения.

Часто задаваемые вопросы

— Правильно ли утверждать, что для Segregated Witness транзакции не будет работать RBF (replace-by-fee)?

Нет, replace by fee будет работать для Segregated Witness транзакций, потому что он основан не на том, какие у вас правила траты, а на том, что вы используете одни монеты и указываете sequence number входа транзакции. Если вы увеличиваете значение на входе, используя те же монеты, и указываете корректные доказательства того, что вы владеете этими монетами, то вы точно так же можете заменить предыдущую транзакцию.

— Как можно изменить хеш неподтвержденной транзакции?

Хеш транзакции является результатом вычисления хеш-функции от всех данных, которые хранятся в транзакции. ScriptSig, который содержится в транзакции, участвует в подсчете хеша, но не может быть подписан. Незначительные изменения в этом поле, которые не повлекут за собой изменения правил проверки подписи, вызовут изменения хеш-значения транзакции. Это значит, что подпись остается валидной, транзакция валидна, но хеш-значение у нее изменится.

— Как в транзакции хранятся witness data?

Как было отмечено, в Segregated Witness транзакции ввели новый формат сериализации. Кроме того, что у нас есть набор входов и выходов, добавляются и другие байты, где хранятся доказательства. Соответственно, там и хранятся эти данные. Максимально просто можно это представить так: есть просто набор данных, где написано, что существует два входа транзакции (байты первого входа и байты второго входа), два выхода, а после них еще два набора Witness data, которые точно так же записаны в виде байтов. Фактически данные доказательств владения монетами перенесены в другое место при сериализации.

— Почему бы не использовать существующий набор символов, например RFC3548 или z-base-32 для Bech32 адресов?

Набор символов выбирается так, чтобы минимизировать двусмысленность, связанную с визуальным их сходством. Порядок выбирается для минимизации количества пар символов, которые отличаются менее чем одним битом данных. Контрольная сумма выбрана для максимизации вероятности обнаружения небольшого числа ошибок, что улучшает эффективность ее работы для типичных ошибок.

Какие существуют виды биткоин-адресов?

В сети биткоина существует несколько видов адресов. Их можно легко отличить по префиксу — символам в начале адреса:

  1. Legacy (P2PKH): начинается с цифры 1. Пример: 1N4Qbzg6LSXUXyXu2MDuGfzxwMA7do8AyL.
  2. Script (P2SH): начинается с цифры 3. Пример: 3J98t1WpEZ73CNmQviecrnyiWrnqRhWNLy. (P2WPKH): начинается с комбинации “bc1q”. Пример: bc1qfg9t7fwn0atn4yf9spca5502vk8dyhq8a9aqd8.
  3. Taproot (P2TR): начинается с комбинации “bc1p”. Пример: bc1peu5hzzyj8cnqm05le6ag7uwry0ysmtf3v4uuxv3v8hqhvsatca8ss2vuwx.

Что такое биткоин-адрес в формате Legacy?

Legacy-адрес — это самый первый стандарт адреса в сети биткоина, предложенный еще Сатоши Накамото. Иначе его называют P2PKH (Pay To Public Key Hash), поскольку он требует от получателя подпись, вычисленную из приватного ключа, и публичный ключ.

Адрес типа Legacy состоит из трех частей:

  • префикс;
  • сгенерированный в результате применения к приватному ключу алгоритмов SHA256 и RIPEMD публичный ключ;
  • контрольная сумма.

Как входящие, так и исходящие переводы с таких адресов поддерживают все кошельки и приложения, работающие в сети биткоина. Главный минус Legacy-адресов — высокие комиссии. Также в них низкая скорость двойного хеширования контрольной суммы и больший вес в QR-кодах.

Каковы отличия Script (P2SH) от Legacy?

Script-адреса появились в предложении по улучшению биткоина BIP-0016 в январе 2012 года благодаря главному научному сотруднику Bitcoin Foundation Гэвину Андресену.

Они имеют ту же структуру, что и Legacy-адреса, но начинаются с цифры 3. Такие адреса предполагают, что при переводе средств получатель должен иметь скрипт, подходящий к скрипту хеша. Эта особенность позволяет снижать комиссию за перевод, перекладывать комиссионные затраты на получателя и создавать адреса с мультиподписью.

В чем преимущества формата SegWit?

Весной 2016 года разработчики Питер Велле и Грег Максвелл в обновлении BIP-0173 предложили новый вид адреса под названием Bech32. Его также называют Segregated Witness (SegWit) или P2WPKH (Pay to Witness Public Key Hash).

Какие существуют виды биткоин-адресов?

Главное преимущество Taproot-адресов для их владельцев — наиболее низкие комиссии по сравнению с другими форматами и более дешевые платежи в сети Lightning Network.
Однако у Taproot есть большой недостаток — данный вид пока поддерживает только небольшое число кошельков. В середине августа 2022 года лишь 0,56% всех исходящих переводов в сети биткоина совершались с адресов этого типа.

Постепенное распространение нового стандарта — норма для децентрализованной сети биткоина, которой пользуются огромное количество приложений и пользователей. Аналогичная ситуация наблюдалась после внедрения SegWit.

Можно ли переводить биткоины между адресами разных форматов?

Сегодня Legacy, Script и SegWit являются полностью совместимыми между собой. То есть между ними можно свободно проводить как входящие, так и исходящие переводы.

Несколько по-другому дело обстоит с Taproot. Большинство используемых некастодиальных кошельков поддерживают отправку транзакций на адрес типа Bech32m, однако не имеют функций по созданию такого адреса. Кроме того, не все биржи криптовалют позволяют отправлять средства на Taproot-адрес. Текущую ситуацию с внедрением Taproot в популярные биткоин-кошельки можно посмотреть на сайте Bitcoin Wiki.

Транзакции P2TR-адресов поддерживают многие используемые обозреватели блоков биткоина, например Blockchair или Blockstream.

Ответы на частые вопросы

Что такое биткоин-адрес?

Биткоин-адрес — это уникальный идентификатор, с помощью которого пользователь может отправлять и получать криптовалюту. Каждый BTC-адрес уникален и генерируется путем сложных механизмов шифрования. Служит аналогом банковского счета в сети биткоина.

Какой формат биткоин-кошелька лучше?

По состоянию на 2022 год рекомендуем использовать SegWit — он является современным стандартом, позволяет платить низкие комиссии за переводы в сети биткоина и поддерживается большинством кошельков. В будущем этот формат, скорее всего, сменит Taproot.

Как выбрать вид биткоин-адреса?

Зачастую приложение для хранения биткоинов позволяет выбрать формат адреса на этапе создания адреса.

Сколько символов в адресе биткоин-кошелька?

Legacy-адрес для первой криптовалюты состоит из 34 символов, SegWit-адреса (Bech32) чаще всего включают 42 знаков, Taproot (Bech32m) — 62 символа.

Сколько всего биткоин-адресов?

По данным Glassnode, в августе 2022 года в сети биткоина было более 38 млн адресов с ненулевым балансом. Ежедневно транзакции отправляют или получают около 1 млн биткоин-адресов.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *