MSTR Cat

区块链/等级 II · 运作机制/2.1 密码学/课程 6

地址与编码:Base58Check、Bech32、Bech32m

错误的字母表:从 Base58Check 到 BCH 校验和

材料区块浏览器界面(例如 mempool.space 或 blockchain.com)用于比较字符串长度的文本编辑器BIP-173与BIP-350规范文档

好奇

  1. 为什么地址中只改动一个字符几乎总会使其失效,却仍有一些输入错误能蒙混过关?
  2. 一串字母和数字如何能够指向某个特定的锁定脚本,而无需将该脚本存储在链上?
  3. Bech32 能为拼写错误提供怎样的保障,而 Base58Check 只能降低这类错误发生的可能性?

探索

  1. 地址并不是存储在UTXO集合中的对象,而是输出脚本的一种便于人类使用的编码。区块链只存储字节,但软件会将其转换为字符串,供人阅读和输入。这一转换层必须防止抄写错误,因为一个输错却看似有效的地址可能会把资金发送到错误的地方。中本聪最初的设计Base58Check通过使用由58个字符组成的字母表来解决这一问题,该字母表剔除了视觉上容易混淆的‘0’、‘O’、‘I’和‘l’。
  2. Base58Check 编码格式包括一个版本字节、数据内容(如 20 字节的哈希值)以及一个 4 字节的校验和。该校验和是根据前面数据的双 SHA-256 哈希值的前 4 个字节计算得出的。传统的 Pay-to-Public-Key-Hash (P2PKH) 地址使用版本字节 0x00,因此地址字符串以 ‘1’ 开头;而 Pay-to-Script-Hash (P2SH) 则使用版本字节 0x05,其地址字符串以 ‘3’ 开头。这种编码结构使得钱包能够在接受某个地址之前验证其完整性。
  3. 隔离见证(SegWit)于2017年8月在区块高度481,824激活,引入了需要新编码方式的原生见证输出。Base58Check并不适合SegWit较长的数据结构和特定的错误模式。Pieter Wuille和Greg Maxwell在BIP-173(2017年)中提出了Bech32。它使用由32个字符组成的受限字符集——数字和小写字母,但排除了‘1’、‘b’、‘i’和‘o’,其中‘1’被保留用作分隔符。统一使用一种大小写既避免了歧义,也更适合二维码。
  4. Bech32地址以人类可读部分“bc”和分隔符“1”开头,其后是数据以及一个由六个字符组成的校验和。该校验和基于Bose-Chaudhuri-Hocquenghem(BCH)码,强度远高于Base58Check由SHA-256派生的校验和。BCH码可保证检测出影响不超过四个字符的任何错误,并且通常还能定位输入错误的位置。原生SegWit v0地址(P2WPKH和P2WSH)使用这种格式,以“bc1q”开头。
  5. 开发者后来发现原始 Bech32 多项式存在一个缺陷:插入或删除特定的字符序列可能会得到一个有效但不同的地址。为了在不破坏现有 v0 地址的前提下修复这一问题,BIP-350(2020年)引入了 Bech32m。它修改了校验和计算中的一个常数,使此类插入和删除能够被检测出来。2021年11月激活的 Taproot 地址(SegWit 版本1)使用 Bech32m,以“bc1p”开头。
  6. 测试网地址使用“tb1”作为前缀,而非“bc1”。数据部分编码的是见证程序:对于 SegWit 版本0,它是公钥或脚本的哈希值;对于 Taproot,则是经过调整(tweak)的32字节公钥。当软件扫描二维码或接受手动输入时,会运行 BCH polymod 函数来验证完整性。打开区块浏览器,每种类型各找一个地址:以“1”开头的传统 P2PKH 地址、以“bc1q”开头的 SegWit v0 地址,以及以“bc1p”开头的 Taproot 地址。记下它们的长度和前缀。

关键事实

  • Base58Check 使用由 58 个字符组成的字母表,其中排除了 ‘0’、‘O’、‘I’ 和 ‘l’,同时还包含一个通过两次 SHA-256 计算得出的四字节校验和。
  • 传统的 P2PKH 地址以 ‘1’ 开头(版本字节为 0x00),而 P2SH 地址则以 ‘3’ 开头(版本字节为 0x05)。
  • Bech32由BIP-173(2017年)定义,它使用32个字符组成的编码格式以及基于BCH的校验和,以此检测可能影响最多4个字符的错误。
  • 原生 SegWit v0 地址(P2WPKH/P2WSH)采用 Bech32 编码,以 ‘bc1q’ 开头。
  • Bech32m由BIP-350(2020年)定义,它解决了Bech32中的校验和缺陷,对于SegWit 1至16版本而言是必需的。
  • Taproot地址(SegWit版本1)采用Bech32m编码,以“bc1p”开头。

练习 九、六、三、一

9收集从区块浏览器中找到9个真实的比特币地址:其中3个以“1”开头,3个以“3”开头,2个以“bc1q”开头,1个以“bc1p”开头。
6归类根据前缀、长度以及所代表的脚本类型,将这9个地址分为6类。
3提炼将这6组差异简化为3种核心差异,即这些编码在处理数据完整性与视觉歧义方面的不同方式。
1凝结用一句话解释,为什么从 Base58Check 转向 Bech32 是由错误检测的数学原理推动的,而不仅仅出于美观考虑。

事实核查

日期、数字及数据均依据下方列出的已发表资料进行核实。

在互动学院中打开 →

EN PT ES JA KO RU DE FR MS