架构师_程序员_码农网

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

搜索
查看: 21|回复: 0

区块链 Base58、Base58Check、Bech32、Bech32m 编码详解

[复制链接]
发表于 昨天 09:01 | 显示全部楼层 |阅读模式
Base58、Base58Check、Bech32 和 Bech32m 是区块链技术中常用的编码格式,主要用于提高可读性、减少错误并确保数据完整性。这四种编码在保障安全性、兼容性和纠错能力方面各具优势,是现代区块链地址体系的重要基石。

Base58

“Base58” 是由中本聪发明的编码方法,是从一种著名的编码方法 “Base64” 改造而来。Base64 的字符集包括:所有的数字和大小写字母,还有两种符号(“+” 和 “/”);总计 64 种字符。而中本聪从中删去了数字 0、大写字母 I 和 O、小写字母 l 以及符号,就成了 Base58。

字符集:123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz

QQ截图20251017084710.jpg

Base58Check

和 Base58 相比,Base58Check 编码只多了一步校验和的计算。如下图:

QQ截图20251017084920.jpg

Base58Check 解决了传统编码方式中易出错、难辨认、无校验的问题,为区块链中的关键数据(如地址、私钥)提供了一种安全、紧凑、人类友好且具备错误检测能力的表示方法。 虽然现在逐渐被更先进的 Bech32/Bech32m(用于 SegWit 地址)取代,但它在早期比特币生态中起到了至关重要的作用。

Bech32

“Bech32” 是由 BIP 0173 定义的编码方法,该 BIP 的两位作者是 Pieter Wuille 和 Greg Maxwell 。不过,这种编码也有自身的源流:“Bech” 指的是 “BCH”,是一种由三位数学家分别在 1959 和 1960 年发明的循环纠错编码算法(BCH 这个名字就来自于这三位数学家的姓氏)。而 “32” 则表示,该编码法的字符集只有 32 种字符:小写的英文字母和数字,除去数字 “1”、字母“b”、“i”和“o”。

QQ截图20251017085732.jpg

在 BIP 0173 的开头,作者们指出了 Base58 的不理想之处:

  • Base58 同时使用大小和小写的英文字母,这使得其数据在绘制成二维码时,无法使用体积更小的 “数字字母表” 模式,只能使用体积更大的 “字节数据” 模式。
  • 同时使用大小写也使得它不便于抄写、在手机键盘上输入以及念出来。
  • 校验和需要连续两次 SHA256 运算,运算缓慢,而且没有定位错误的功能。
  • 大部分可定位错误的编码方法都只适用于字符集大小是质数幂的情形,而 58 并非质数幂。
  • Base58 的解码较为复杂,运算也较慢。

于是,Bech32 这种新方法只使用小写字母和数字;在有需要的时候(比如绘制二维码的时候),这些字母可以全部换成大写,从而获得更紧凑的表现形式。更小的二维码,由于 Bech32 地址是单数形式,因此您可以使用字母数字模式将它们编码为二维码。这意味着您可以创建更紧凑的二维码,因为 Base58 需要大写和小写字母(这意味着您不能使用字母数字模式),而 Bech32 则不需要。如下图:

QQ截图20251017090106.jpg

如您所见,尽管 Bech32 地址包含更多字符,但使用字母数字模式的能力意味着二维码总体上使用的数据更少

同时,Bech32 还具备定位错误的能力:它不仅能发现你抄写错误了,还能指出你的哪几位抄错了(这种发现错误的能力远远优于 Base58)。

实际上,BCH 算法还具有 “纠错” 功能:它不仅能指出你的哪几位抄错了,还能指出它应该是什么字符。然而,BIP 0173 的作者们发现了它内在的危险性:一方面,强化纠错功能会削弱定位错误的功能;另一方面,如果用户过于信任软件的纠错能力,那么软件就有可能将用户输入的错误数据纠正成一个 “有效但无用” 的数据 —— 虽然作为一段 BCH 编码数据,它是有效的了;但是,凭借它复原出来的比特币脚本却有可能不是收款方能够控制的、甚至不是任何人能够控制的。这是极其危险的。因此,BIP 0173 慎重提醒:“除了提醒用户哪几位可能抄错了之外,软件不应该实现纠错能力(给出纠正建议)。”

除此之外,Bech32 沿用了 Base58 编码中的模式:

1.Bech32 数据的开头会有一段 “带有含义的数据(hrp)”,就类似于 Base58 中的前缀,可以说明这是一段什么样的数据。
hrp 可以使用的字符远远多于 32 个;于是,Bech32 还将数字 “1” 作为分隔符,用来分割 hrp 和真正要被解码的数据。
除了比特币,还有许多别的项目也采用了 Bech32 ;不同项目的数据就使用 hrp 来相互区别。这里有一份已注册的 hrp 的列表,非常有趣(但也仅仅是有趣) 。
2.Bech32 也设计了校验和,占据编码后的数据的最后 6 个字符。

Bech32m

“Bech32m” 是由 BIP 0350 定义的编码方法。链接:超链接登录可见。 它的提出是因为开发者们在 Bech32 编码中发现了一个漏洞:

当最后一个字符是 “p” 的时候,在该字符前面插入或删除任意数量个 “q”,都不会导致校验和报错(该数据仍将被视为有效),那么校验和机制就完全失去作用了。

如果不再增设标准化的比特币脚本,这问题很容易解决:P2WPKH 地址和 P2WSH 地址都有确定的长度,增加长度校验就好。然而,考虑到未来我们还会增加新的标准化脚本,其地址长度可能发生改变,就有必要修复这个问题。

Bech32m 通过改变 Bech32 校验和生成程序中的一个参数,修复了这个问题。

当前,Bech32m 仅用于编码随 “Taproot” 升级而增加的 “P2TR” 脚本的地址。未来可能用在其它标准化脚本的地址编码中。

参考:

超链接登录可见。
超链接登录可见。
超链接登录可见。




上一篇:tiktok,抖音 抓包通杀frida脚本,可定位so文件patch位置
下一篇:比特币地址类型 Legacy、Nested SegWit、Native SegWit、Taproot 介绍
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

免责声明:
码农网所发布的一切软件、编程资料或者文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。

Mail To:help@itsvse.com

QQ|手机版|小黑屋|架构师 ( 鲁ICP备14021824号-2 )|网站地图

GMT+8, 2025-10-18 02:52

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表