Автор: СЬОРС ПРОВОСТ
Источник: https://sprovoost.nl/2022/11/10/what-is-a-bitcoin-address/
Адрес Биткойн не является частью блокчейна Биткойн, а представляет собой токен, который программное обеспечение Биткойн (кошелек) использует для сообщения, куда отправлять Биткойны: либо на определенный открытый ключ (P2PK), либо на хеш открытого ключа (P2PKH). , хэш скрипта (P2SH), хэш открытого ключа SegWit (P2WPKH) или хеш скрипта SegWit (P2WSH). Адрес также содержит некоторые метаданные о его типе.
(Примечание переводчика: типы адресов Биткойна будут продолжать увеличиваться по мере обновления сети Биткойн и стандартизации методов сценариев. Фактически, упомянутые выше типы адресов, за исключением P2PK и P2PKH, появились с первоначальным выпуском Биткойна. , остальное появилось позже. Теперь, в связи с обновлением Taproot, активированным в 2021 году, у Биткойна появился другой тип адреса «P2TR»).
Биткойн-адреса используют уникальную систему нумерации для обозначения вышеуказанных способов оплаты. В этой статье мы познакомим вас с каждой из этих различных систем нумерации и предоставим углубленный анализ преимуществ биткойн-адресов в целом и адресов bech32. Кроме того, мы объясним, откуда взялась уязвимость (более низкая угроза), содержащаяся в первой версии адресов bech32, и как она была устранена. Наконец, мы коснулись влияния квантовых вычислений.
- Эта статья взята из моей новой книги «Биткойн: незавершенное исследование» -
История истории
Когда вы отправляете кому-то биткойны, вы, по сути, создаете транзакцию с несколькими входами и хотя бы одним выходом. Выходные данные определяют, кто может их потратить, посредством встроенных ограничений (юридически называемых обременениями, которые ограничивают передачу права собственности на актив).
Самое тривиальное бремя — позволить кому-либо тратить биткойны. Это не очень хорошая идея, потому что Биткойн будет быстро украден. Таким образом, на заре развития Биткойна подавляющее большинство биткойнов в блокчейне могло использовать только два ограничения: оплата по открытому ключу (P2PK) или оплата по хэшу открытого ключа (P2PKH). Первое можно понимать как «Только те, кто владеет закрытым ключом, соответствующим открытому ключу, могут тратить биткойны».
В то время мы также могли отправлять биткойны на IP-адрес получателя, но эта функция была прекращена в 2012 году. Чтобы использовать его, вам необходимо подключиться к IP-адресу получателя платежа, запросить открытый ключ у получателя платежа, и получатель платежа предоставит вам открытый ключ1. Затем ваш кошелек создаст биткойны с помощью сценария P2PK.
Сегодня этот рабочий процесс может показаться странным2, но он соответствует общей схеме одноранговых приложений, таких как Napster и Kazaa того времени, которая заключалась в прямом подключении к другим людям и загрузке данных от них. Сегодня вы, скорее всего, не знаете IP-адрес вашего друга, а если он использует мобильное устройство, его IP-адрес может даже постоянно меняться. Хотя вы можете указать своему узлу Биткойн подключаться конкретно к узлу вашего друга, в целом он будет подключаться только к случайным узлам, см. главу 2.
Более распространенный метод транзакции аналогичен банковскому переводу. Получатель дает вам адрес, и вы отправляете биткойны на этот адрес, точно так же, как если бы вы отправляли деньги на банковский счет. Изначально мы все использовали в качестве адреса P2PKH (значение P2PKH объяснено ниже).
Таким образом, транзакция не отправляется непосредственно получателю платежа, а транслируется через все узлы сети и в конечном итоге обнаруживается узлом майнинга и упаковывается в блок. Вполне возможно, что узел вашего контрагента увидел транзакцию от однорангового узла или получил блок, в котором происходит транзакция.
Третий метод транзакции — майнинг, при котором вознаграждение за блок, полученное в результате майнинга, отправляется себе. Первоначально в программное обеспечение Биткойн было встроено программное обеспечение для майнинга. Итак, как только вы загрузите программное обеспечение Биткойн, ваше программное обеспечение Биткойн начнет майнинг, а затем отправит Биткойны на ваш кошелек, в этом случае нет необходимости обмениваться адресами. Все эти биткойны используют P2PK в качестве ограничения 3.
Какой адрес?
Адреса — это удобный способ указать, какой скрипт должен войти в блокчейн. Как мы уже говорили выше, цель скрипта — наложить ограничения на биткойны и разрешить их тратить только получателю4. Сам адрес не существует в блокчейне, и адрес даже не содержит полного скрипта.
Из двух наиболее часто используемых типов скриптов в прошлом адреса использовались только для хеширования открытого ключа (P2PKH). Когда кошелек видит такой адрес, он генерирует сценарий, который требует от человека, который тратит биткойны в нем, иметь соответствующий открытый ключ для этого хеша (фактический сценарий представлен в главе 10). Публикуется только хэш, а открытый ключ остается секретным до тех пор, пока получатель не потратит биткойны.
Адреса P2PKH начинаются с цифры 1, за которой следует хэш открытого ключа. Адрес имеет кодировку Base58, как показано в следующем примере:
1HLoFgMiDL3hvACAfbkDUjcP9r9veUcqAF
Что такое базовая система?
Чтобы понять base58, нам сначала нужно понять основные принципы базовой системы.
Возьмем, к примеру, базу 10, представьте, что это ваши 10 пальцев. Итак, если вы хотите выразить число 115 (1, 1, 5), вам нужно сделать три жеста обеими руками, соответствующие цифрам 1, 1, 5. Поскольку люди изобрели глиняные таблички и бумагу, эти цифры можно писать и ручкой, что гораздо удобнее, чем пальцами. Таким образом, base10 — это десятичная система, в которой используются 10 различных символов и различные комбинации этих 10 символов для выражения любого числа (целого числа).
Помимо этого, существует множество различных базовых систем. Например, древние вавилоняне использовали базу base60. Для чтения машинного кода мы обычно используем шестнадцатеричный код, также известный как base16, состоящий из 16 символов: цифр от 0 до 9 и букв от A до F. Между тем, внутри компьютеров предпочтение отдается основанию 2 (двоичная система счисления), поскольку транзисторы имеют только два состояния: включено и выключено. Это означает, что все делается с помощью всего двух чисел: 0 и 1, и вы можете использовать их для обозначения любого числа.
Сатоши Накамото представил систему base58, в которой используются 58 различных символов: цифры от 0 до 9 и большинство строчных и прописных букв алфавита. Однако некоторые буквы и цифры, которые пользователи легко путают и неправильно идентифицируют, не включены, например, цифра 0 и прописная буква O, а также прописная буква I и строчная буква l.
Вы когда-нибудь видели исходный код вложения электронной почты? Куча странных цифр. Это base64, а base58 рождается на основе bas64. Однако base64 содержит такие символы, как подчеркивание, знак плюса, знак равенства и косая черта. base58 удаляет эти символы, что упрощает визуальную проверку и может эффективно применяться к URL-адресам.
Base58 и хеш с оплатой по открытому ключу
Какое это имеет отношение к P2PKH? Адреса P2PKH начинаются с 1, за которым следует хеш открытого ключа в кодировке Base58.
Это информация, которую вам нужно отправить кому-то другому, если вы хотите получить от него биткойны. Вы также можете просто отправить им 0x005 и открытый ключ. Возможно, они смогут успешно транслировать 0x00, но, скорее всего, нет.
Теоретически вы можете отправить кому-нибудь другой биткойн-скрипт, представленный в шестнадцатеричном формате (формат, используемый в блокчейне), поскольку биткойн-скрипты представляют собой двоичные сообщения. В блокчейне такой биткойн-скрипт будет означать: «Если у этого человека есть правильный хеш открытого ключа и соответствующий ему открытый ключ, вы можете потратить этот биткойн. Если вы хотите углубиться, описано, как работает биткойн-скрипт». в главе 10.
Хотя существует так много представлений на выбор, люди обычно выбирают стандартизированные форматы адресов. Это объясняет, почему все традиционные адреса биткойнов начинаются с 1 и имеют примерно одинаковую длину.
Помимо отправки биткойн-адресов, base58 также можно использовать для передачи закрытых ключей. В этом случае ведущим символом является 5 (представляющий 128 как байт версии), за которым следует закрытый ключ.
Раньше пользователи использовали бумажные кошельки, которые можно было распечатать. Если они генерируются безопасно, без бэкдоров, то в документе есть строка, начинающаяся с «1» с одной стороны, и строка, начинающаяся с «5» с другой стороны, с примечанием, что могут быть представлены только адреса биткойнов, закрытый ключ должен не быть разделенным.
Существуют также адреса, начинающиеся с «3», что означает, что биткойны заблокированы в хеше сценария, а не в хеше открытого ключа. Мы представим Pay to Script Hash (P2SH) в главе 10. Такие адреса обычно являются адресами с мультиподписью, но также могут быть адресами SegWit6.
Хотя адреса Base58 работают хорошо, есть возможности для улучшения. Итак, у нас есть беч32.
появляется bech32
В марте 2017 года Питер Вуилле рассказал о новом формате адреса bech32. Bech32 используется с момента успешной активации SegWit. Как следует из названия, bech32 — это система Base32. То есть вы можете использовать практически все буквы и все цифры, за исключением некоторых, которые могут вызвать путаницу.
Поясняющее видео: https://youtu.be/NqiN9VFE4CU
Самая большая разница между bech32 и base58 заключается в том, что прописные и строчные буквы не смешиваются. Каждая буква появится только один раз (либо в верхнем, либо в нижнем регистре), поэтому ее будет намного легче прочитать. Точное соответствие между каждой буквой или цифрой и соответствующим ей значением фиксировано, но довольно произвольно: Q означает просто 0, P просто означает 1, без какого-либо глубокого смысла.
- таблица сопоставления bech32. Например, q означает 0, а 3 означает 17 (1+16) –
Адрес bech327 состоит из двух частей, разделенных цифрой «1», например, bc1q9kdcd08adkhg35r4g6nwu8ae4nkmsgp9vy00gf.
Первая половина намеренно читается, например, «bc» (для Биткойна) или «Inbc» (Lightning Network для Биткойна). Значения, представленные такими буквами, как «b» и «c», не имеют значения. Они существуют только для того, чтобы люди могли их понять: «Понятно, если адрес начинается с «bc», он относится к Биткойну как к криптовалюте». Однако кошелек проверит, существуют ли эти значения, в качестве проверки достоверности, и эти значения. также включены в контрольную сумму.
«1» — это просто символ-разделитель, который не представляет никакого значения. Если вы посмотрите на таблицу сопоставлений для bech32, вы увидите, что цифра «1» не включена, что означает «пропустить ее».
Вторая половина начинается с номера версии SegWit. Версия 0 представлена Q(bc1q…) (см. главу 3). Версия 1 — это то, что мы называем Taproot (см. часть 4 этой книги), обозначаемое буквой «P» (bc1p...). В случае SegWit версии 0 за номером версии будут следовать 20 или 32 байта, представляющие хэш открытого ключа или хэш сценария соответственно. Разница в длине связана с тем, что SegWit использует хэш SHA256 скрипта (32 байта), а не хэш RIPEMD160 скрипта (20 байт).
В base58 хеш скрипта имеет ту же длину, что и хеш открытого ключа. Но в SegWit их длина различна. Таким образом, просто взглянув на длину адреса, вы можете сразу определить, платите ли вы сценарию или хешу открытого ключа. Кстати, Taproot устраняет эту разницу в длине, еще больше улучшая конфиденциальность.
Таким образом, для Bench32 характерно использование всего 32 символов для второй половины адреса, а в остальном он мало чем отличается от Base58. Посмотрите эту функцию, и вы поймете: «Ага, это адрес P2PKH». В данном случае Pay-to-Witness-Public-Key-Hash (P2WPKH), где «Witness» относится к SegWit, но основная идея остается прежним: люди и компьютеры могут идентифицировать тип адреса по короткому префиксу, за которым следует хэш открытого ключа или скрипта.
32-мерная игра в дартс
Однако простота – не единственное преимущество. Еще одним преимуществом является исправление ошибок, по крайней мере, обнаружение ошибок.
Если вы введете неверный адрес, худшее, что может случиться, — это то, что вы отправите Биткойн на неправильный хэш открытого ключа. Когда получатель попытается потратить биткойны, он или она обнаружит, что хэш его открытого ключа не соответствует требованиям блокчейна, поскольку отправитель ранее ввел неправильный адрес. Этот биткойн никогда не будет восстановлен.
К счастью, адрес base58 имеет в конце контрольную сумму. Таким образом, если вы введете неверный адрес, проверка контрольной суммы в конце адреса не удастся. Ваш кошелек предупредит вас и откажется отправлять транзакцию (блокчейн не защитит вас, но ваш кошелек защитит). Однако, если вам совсем не повезет, можно получить правильную контрольную сумму, даже если вы допустите ошибку.
Беч32 создан, чтобы избежать таких крайних совпадений. Кроме того, Bech32 не только сообщит вам, если вы допустили ошибку, но и где вы допустили ошибку. Конкретный метод заключается в том, чтобы взять все байты адреса и хешировать их с помощью сложной математической формулы. Даже если вы допустите 4 ошибки, Bech32 все равно будет знать, где вы допустили ошибку и каково фактическое значение. Если вы допустите более 4 ошибок, Bech32 ничего не сможет сделать.
Давайте проиллюстрируем это аналогией: вы рисуете на стене кучу непересекающихся кругов. Яблочко каждого круга представляет правильное значение, а другие точки внутри круга представляют ошибку ввода. Если вы опытный игрок в дартс, то в большинстве случаев вы попадете в яблочко, а это означает, что вы потеряли правильную ценность. Если вы слегка не попадаете в яблочко, но все равно попадаете в круг, это означает, что введенное вами значение немного неверно. Проверка ошибок — это знание того, что вы пропустили яблочко. Коррекция предполагает перемещение дротика к ближайшему яблочку.
Идея здесь в том, что вы хотите сделать круг как можно шире, чтобы вместить самых неосторожных игроков в дартс, но не хотите тратить слишком много места. Точно так же мы не хотим, чтобы биткойн-адрес состоял из сотен символов. Это любимая задача оптимизации математиков.
В отличие от 2D-стены, bech32 похож на 32D-стену с 32D-гиперсферой. Когда вы вводите свой адрес, где-то в пределах этого 32-мерного пространства происходит небольшое отклонение, но как бы это ни выглядело, вы все равно находитесь внутри этой гиперсферы. В этом случае ваш кошелек знает, что не так, и может эффективно предотвратить потерю биткойнов, вызванную отправкой на неправильный адрес8.
уязвимость bech32
В 2019 году люди обнаружили, что если последним символом адреса bech32 является P, и вы позже случайно введете один или несколько Q, проверка контрольной суммы все равно пройдет, и вы не получите сообщение об ошибке ввода. Программное обеспечение вашего кошелька посчитает, что адрес был введен правильно, что позволит вам отправить Биткойн на неправильный адрес, в результате чего Биткойн станет невозможно потратить, как мы объяснили выше.
Хорошей новостью является то, что bech32 работает только с SegWit, а адреса SegWit имеют ограничение по длине — они могут составлять только 20 байт или 32 байта. К счастью, если вы введете дополнительный Q после адреса длиной 20 или 32 байта, введенный вами адрес будет недействителен, поскольку его длина превышает предел. Ваш кошелек заметит эту проблему и откажется отправлять биткойны. Первоначально предполагалось ввести аналогичное ограничение длины адреса для Taproot, но решение, упомянутое ниже, устраняет эту необходимость. Гибкая длина адреса поможет нам улучшить Taproot в будущем.
родился bech32m
Для устранения уязвимостей bech32 был предложен новый стандарт bech32m9. bech32m на самом деле представляет собой очень простое изменение: к формуле контрольной суммы bech32 добавляется дополнительное число, чтобы гарантировать, что любые дополнительные символы будут генерировать недопустимую контрольную сумму.
Этот новый стандарт применяется только к адресам Taproot и будущим адресам. Для адресов SegWit ничего не меняется, поскольку они уже защищены ограничением длины в 20 или 32 байта. На момент написания большая часть программного обеспечения кошельков поддерживает новый стандарт bech32m.
Что заставило меня избавиться от беспокойства и полюбить квантовые вычисления?
Кстати, Pay-to-Public-Key-Hash (P2PKH) считается более устойчивым к квантовым атакам, поскольку вам не нужно раскрывать свой открытый ключ. Обратной стороной было то, что хеши занимали больше места, но в то время это не было проблемой, потому что блоки были далеко не заполнены.
Многие люди обеспокоены тем, что квантовые компьютеры в конечном итоге подорвут безопасность криптографии Биткойн, предоставив квантовым хакерам возможность украсть Биткойны. Если им удастся украсть миллионы биткойнов, это может даже вызвать крах рынка.
Проблема в том, что, несмотря на широкое распространение P2PKH, открытые ключи от 5 до 10 миллионов биткойнов стали общедоступными. По иронии судьбы, поскольку так много биткойнов уязвимы для квантовых хакеров, нет смысла пытаться защитить оставшиеся биткойны таким образом. Даже если ваши биткойны защищены от кражи, поскольку вы используете P2PKH, они неизбежно станут бесполезными из-за обвала цен.
Физик Степан Снигирев и математик Эндрю Поэльстра объясняют возможность квантовых атак иметь разрушительные последствия в краткосрочной перспективе и возможные контрмеры в двух эпизодах подкаста под названием «Что сделал Биткойн».
Пространства в блоках сейчас становится очень мало, поэтому отсутствие необходимости хранить хеши открытых ключей в ценном пространстве блоков помогает пользователям экономить деньги. Вот почему в новом софт-форке Taproot (см. часть 4 этой книги) адрес Биткойна снова становится P2PK10. Обратите внимание, что использование адресов Taproot не является обязательным, поэтому, если вы не согласны с приведенными выше доводами, вы можете не использовать Taproot.
сноска
1. Чтобы удовлетворить любопытство энтузиастов «археологии» кода: узел отправителя будет иметь диалоговое окно пользовательского интерфейса, запрашивающее сумму перевода и IP-адрес. Функция StartTransfer() создает транзакцию пустого чека, в которую контрольный заказ на узле-получателе вставляет сценарий P2PK (как scriptPubKey). Затем OnReply2() вставляет сумму, подписывает транзакцию, возвращает транзакцию получателю и передает ее. исходный код. ↩
2. И это небезопасно, это тоже признал Сатоши Накамото. ↩
3. Почему версия, первоначально выпущенная Сатоши Накамото, поддерживала как P2PK, так и P2PKH? Мы не уверены, почему именно. Метод оплаты P2PK на самом деле используется только для оплаты IP-адресов и выплаты вознаграждений за блоки майнерам. Ни то, ни другое не требует человеческого взаимодействия. В сценариях, связанных с человеческим взаимодействием, пользователи используют P2PKH. Используемый адрес относится к P2PKH, а не к P2PK. Автоматизированным системам не нужна концепция адресов, поскольку они также могут обрабатывать сценарии, поэтому нет необходимости в таких понятиях, как адреса P2PK. ↩
4. До сих пор сценарий был похож на банковский счет. Как мы узнаем в главе 10, скрипты делают гораздо больше, чем просто хранят деньги для владельца. ↩
5. Пара шестнадцатеричных чисел с префиксом 0x обычно используется для обозначения байта, который может представлять 16 × 16 = 256 различных значений. Следовательно, 0x00 представляет собой байт, а его значение равно 0. ↩
6. Как объяснялось в главе 3, SegWit обычно использует адреса bech32. Однако прошло немало времени, прежде чем все кошельки и биржи стали поддерживать платежи на адреса bech32. Чтобы продолжить использовать некоторые преимущества SegWit, мы вводим тип адреса, который с точки зрения отправителя выглядит как обычный P2SH, но за которым стоит магия SegWit. Этот тип адреса называется адресом P2SH-P2WPKH. ↩
7.bech32, предложенный BIP173. ↩
8. Ранние кошельки Ethereum не использовали обнаружение ошибок, поскольку в их стандартах адресов отсутствовали контрольные суммы. Хотя EIP55 представил контрольные суммы в 2016 году, не все кошельки выполняют обнаружение ошибок. Даже в 2017 году люди все еще теряли эфир из-за ввода неправильного адреса. ↩
9.bech32m предложено BIP 350. ↩
10. См. примечания к BIP 341 для конкретных причин. ↩
