比特币和以太坊的常见地址格式各自带着一层检错校验
抄错一位的比特币地址,通常连发都发不出去,币也就到不了别人那里。地址里带着校验,也就是有一部分信息是由地址其余的内容算出来的。bitcoin.org 的中文页《你需要了解的一些事》里有一句:「比特币系统能检测出打字错误,通常不会让你不小心付款到一个无效地址」。
校验能查出多少错,各种写法不一样。bc1 开头的比特币地址,只保证查出不超过 4 个字符被写成别的字符这类错误;以太坊地址按 EIP-55 写成大小写混排时,字母的大小写就是校验,一个随机生成的地址打错以后,碰巧仍能通过校验的概率是 0.0247%。另有一种情形校验根本不管,就是粘贴进来的是一个完整、有效、但不属于收款人的地址。这个地址每一位都和自己的校验对得上,这一关拦不下它。
bc1、0x、T 开头的地址带的校验不一样
Base58 是数字和大小写字母混写的一种编码,比特币原始软件里的地址就用它。Bech32 是比特币给隔离见证(后来加进来的一类交易输出)定的地址格式,生成出来是全小写,主网地址以 bc1 开头;隔离见证 v1 及以后的版本改用它的修订版 Bech32m。十六进制用 0 到 9 十个数字和 a 到 f 六个字母来写,以太坊地址就这样写,EIP-55 写法里这些字母有大写也有小写。
| 地址的写法 | 格式 | 校验能查出的错 | 查不出、或不作保证的 |
|---|---|---|---|
| 数字和大小写字母混写 | 比特币 base58 老式地址 | 地址里含一段检错校验,比特币开发者文档说它的用处就是抓手误 | 这种校验没有检错保证;大小写混写,手抄、用手机键盘输入都不容易写准 |
| bc1q 开头,生成出来是全小写 | 比特币隔离见证 v0(Bech32) | 不超过 4 个字符被写成别的字符,一定查得出 | 写错超过 4 个字符时,漏检的可能小于十亿分之一,不是零 |
| bc1p 开头(v1),生成出来是全小写 | 比特币隔离见证 v1 及以上(Bech32m) | BIP-350 保留了 Bech32 对写错字符的那份保证 | 多一位、少一位这类错误,没有同样的保证 |
| 0x 开头,后跟 40 个十六进制字符,共 42 个字符 | 以太坊(大小写混排写法) | 字母写大写还是小写由地址算出,打错后排法对不上就查得出 | 随机地址打错后,碰巧通过校验的概率是 0.0247% |
| T 开头,34 个字符 | 波场 Base58Check,按波场开发文档,钱包和区块浏览器里显示的就是这种形式 | — | 同属 base58,大小写混写,手抄同样不容易写准 |
bc1 后面紧跟的那个字符是版本号,0 写作 q,1 写作 p,所以 v0 地址以 bc1q 开头,v1 以 bc1p 开头。这类地址的最后 6 个字符就是校验,不带别的信息。
钱包提示地址无效时可以自己改几个字符再试吗?
手里这串地址过不了校验,就别一个字符一个字符地去试。Bech32 这类校验在数学上也能拿来纠错,BIP-173 专门讲过为什么不该这样用:纠错会削弱检错,纠错把无效的输入改成有效的输入,可错得多了,改出来的有效地址不一定是正确的那个;用了一个不正确但有效的地址,资金可能无法挽回地丢失。所以标准让钱包这类实现不做纠错,最多提示错误可能出在字符串的哪个位置,不给出改法。
你自己挨个换字符、换到钱包不再报错为止,做的正是标准不让钱包做的这件事,而且错在哪一位、错了几位,你并不知道。改出来那个地址能过校验,也只说明它是某一个有效地址。
回到地址最初的出处重新取一次。对方用文字发来的,从那条消息里重新复制;给的是二维码,就重新扫;转进自己的另一个钱包或账户,到那边的收款页重新复制。取到新的一份以后,先把输入框里原来那串清空,再把新的整串粘贴进去。
粘贴进来的是别人的完整地址时校验照样通过
校验只管这串字符自己对不对得上,不管地址是谁的。别人的地址也是钱包正常生成的,每一位都和这个地址自己的校验吻合,填进你的收款栏,钱包看到的就是一个有效地址,转账照常能发出。
这种错和抄写无关。复制和粘贴之间,剪贴板里的内容如果被换过,粘贴出来的就已经不是你复制的那一串;在自己的转账记录里找地址,记录里也可能混着别人放进来的仿造地址,开头和结尾几位与你转过的地址相同,只有中间不一样。
所以发出前要对的,是这串地址是不是对方给你的那一个。拿粘贴好的地址和对方发来的原文比,开头、结尾、中间都对一遍,中间那段尤其别跳过。
地址填错的币已经发出去了还能要回来吗?
bitcoin.org 那一页写的是「任何比特币交易都是不可撤销的,只能由收款人退回比特币。」转的是比特币,能做的只有找到收款人,请他退回。
转的是以太坊上的 ETH 或代币,以太坊的中文常见问题里说「在以太坊上发送的交易是不可逆的。」发错地址以后能做的有这几件:
- 认识这个地址的所有者,就直接联系对方,请他退还资金。
- 这个地址属于交易所或已知服务,就联系它们的支持团队,他们也许能提供帮助。
- 你把代币发到了合约地址,就查这个合约有没有提款或恢复功能(这种情况很少见)。
ethereum.org 这一页还写着:「在大多数情况下,无法找回资金。」以太坊不归任何中心化组织、实体或个人所有,没有人能撤销交易。
用复制粘贴或扫码代替手抄收款地址
比特币地址可以通过任何渠道发给要付款给你的人,也可以编进二维码。能复制粘贴或扫码的时候,就别手抄;拿到以后不在上面改字符,大小写也不改。
bc1 开头的地址生成出来是全小写,放进二维码时按标准应当用大写。扫码得到一整串大写的 bc1 地址,照原样用就行。
从交易所提币到自己的钱包,收款地址同样从钱包的收款页复制过来。