
为什么你的地址和别人的不一样:地址格式,以及转账为何失败
凡是自我保管加密资产的人,迟早都会撞上同一个令人困惑的时刻。你复制自己的收款地址,打算给自己转点比特币,结果它和你以前见过的地址长得不一样。或者某家交易所拒收它。又或者你把比特币现金发到了一个看起来和比特币地址一模一样的东西上,然后花掉难受的一个小时去弄清楚究竟发生了什么。
这些都不是随意为之。地址格式编码着关于「这些币可以怎样被花掉」的真实信息,而一旦你能读懂它们,困惑基本上就烟消云散了。
地址是一组花费条件
有用的心智模型不是「地址是一个账号」。而是这样:地址是一段压缩后的说明,讲的是要让这些币动起来,必须满足什么条件。
向以 1 开头的地址转账,条件就是某一个特定的公钥必须产生一枚签名。向较长的那种 bc1q… 地址转账,条件可能是两个特定的密钥必须都签名。同一条链、同样的钱、完全不同的规则——而地址格式,正是这条链告诉你适用哪套规则的方式。
格式之所以越来越多,原因就在这里。每当比特币获得一种锁住币的新方式,它就需要一种记录「币被锁在哪里」的新写法。
你会在比特币上遇到的格式
传统地址——1… 最初的那种。支付到公钥哈希:一把密钥,一枚签名。所有地方都支持,也是花费成本最高的,因为签名数据要完整计入区块大小。
脚本地址——3… 支付到脚本哈希。币被锁到一段脚本而非一把密钥上——可能是多签门限、时间锁,什么都行。地址是这些条件的哈希,所以从外面你根本看不出条件是什么。早期的隔离见证,也正是借这条路为了兼容性被夹带进来的。
原生隔离见证——bc1q… Bech32。签名数据被移入一个独立的见证结构,这既降低了花费成本,也修复了交易延展性。Bech32 使用小写,校验和比 base58 更强,其设计目标就是让笔误被检测出来,而不是被默默接受。
原生隔离见证有两种长度,而这个差别很重要:
- 总共 42 个字符——P2WPKH。一把密钥,一枚签名。
- 总共 62 个字符——P2WSH。一段脚本,例如一份二取二多签。
Taproot——bc1p… 最新的一种。隐私更好、复杂花费更便宜,代价是仍有一些老旧服务不接受它。
为什么 SSP 的地址看起来不寻常
人们感到意外的正是这里,而它有一个令人满意的解释。
SSP 是一个二取二多签钱包。你的币并不是被锁在单独一把密钥上,而是锁在一段脚本上,这段脚本要求来自你的浏览器扩展和你的手机的两枚签名。这意味着 SSP 的比特币地址是 P2WSH 而非 P2WPKH,也就是 bc1q 的长格式:62 个字符,而不是大多数人习惯的 42 个。
如果你一直盯着自己的地址、觉得它长得过分,那它本来就该这么长。多出来的长度是一段二取二脚本的哈希,而不是单个公钥的哈希。地址更长,是因为条件更丰富。
这偶尔会绊倒那些只按模式匹配短格式的老服务。这是他们那一侧的局限——P2WSH 已经问世十年了——但知道错误为何发生仍然有用,因为提示信息通常就是那句帮不上忙的「地址无效」。
每条链做出了不同的选择
SSP 支持数条 UTXO 链,而每一条书写多签地址的方式都不相同:
| 链 | SSP 中的脚本类型 | 地址长这样 |
|---|---|---|
| 比特币 | P2WSH | bc1q…(62 个字符) |
| 莱特币 | P2WSH | ltc1q… |
| 比特币现金 | P2SH | bitcoincash:p… |
| 狗狗币 | P2SH | 以 9 或 A 开头 |
| Zcash | P2SH | t3… |
| Ravencoin | P2SH | 以 r 开头 |
| Flux | P2SH | t3… |
莱特币紧跟比特币的设计,只换了可读前缀,所以它的地址看着很眼熟。Zcash 与 Flux 使用两字节的版本号,因而脚本地址带有醒目的 t3 前缀。狗狗币挑了自己的版本字节,于是它的脚本地址以 9 或 A 开头——和它那些熟悉的、单密钥的 D… 地址毫无相似之处。
要紧的是:一条链的地址前缀是共识层面的常量,而不是品牌标识。正因为有它们,钱包才能在你转出任何东西之前就拒绝一个地址。
比特币现金的陷阱,以及 CashAddr 为何存在
有一段历史值得了解,因为它真的可能让你损失金钱。
2017 年比特币现金从比特币分叉出去时,原样继承了比特币的地址格式——相同的版本字节,密钥地址用 0x00,脚本地址用 0x05。一个传统格式的 BCH 地址和一个传统格式的 BTC 地址是无法区分的。不是相似,而是结构上完全一致。
人们不断地把 BTC 发到 BCH 地址、把 BCH 发到 BTC 地址,因为没有任何软件能把它们分辨开。币并没有被销毁——同一把私钥同时控制着两边——但要取回它们,就得把私钥导入另一条链的钱包,而许多用户没法安全地做到这一点。
CashAddr 就是那个补救方案:一种带 bitcoincash: 前缀的 bech32 风格格式,被刻意设计成与比特币的格式互不兼容,好让跨链转账高声失败,而不是悄悄成功。这正是 SSP 展示比特币现金地址时带上完整前缀的原因。它看着啰唆。啰唆本身就是功能。
转账为何失败,以及每种失败意味着什么
「地址无效」。 通常是校验和不通过——一处笔误、一次被截断的粘贴,或者一串大小写混用的 bech32。Bech32 不区分大小写,但绝不能混用;某些复制粘贴路径会把这一点搞坏。偶尔它意味着发送方的服务不支持你的格式。
「不支持的地址类型」。 服务能识别这个地址,但不肯往那里发——典型情况是一家从未添加 Taproot 的老交易所,或者只处理短格式隔离见证的服务。这不是你该去修的问题;换一条提现通道,或者用一个中转地址。
整条链都搞错了。 在这里,bech32 的可读前缀会保护你:bc1 和 ltc1 不同,钱包会检查。base58 系的链风险更高,因为一个有效的狗狗币地址在另外好几条链上,结构同样是有效的。
发出去了,但什么也没到账。 要么你在看错误那条链的浏览器,要么资金进了一个有效但不属于你的地址。不存在撤回这回事。
实用规则
复制,永远不要手打。 每种格式都带校验和,恰恰是因为人会打错字。别让它去干那份本不该存在的活。
先把前缀和链对上,其他都在其次。 比特币是 bc1、1 或 3。莱特币是 ltc1、L 或 M。比特币现金是 bitcoincash:。这一眼就能拦下那些代价高昂的错误。
要预期多签地址更长。 如果你在用 SSP 或任何基于脚本的钱包,长格式才是对的。长度不是出错的征兆。
收款方是新的时候,先发一笔小额测试,尤其是发往交易所,尤其是大额转账。手续费和另一种结局比起来微不足道。
钱包提供新收款地址时就用新的。 重复使用地址,会在任何盯着链的人眼里把你的交易串联起来。避免这一点不花任何成本。
地址格式看着像一堆随意的琐碎知识,直到你意识到每一种都是关于「币可以怎样移动」的一句声明。一旦这样去读它们,往自己的钱包收款就不再是一次信仰之跃,而变成了你真正可以核验的事——而这正是自己掌握密钥的全部意义所在。


