比特币的新老格式地址对比分析
扫描二维码
随时随地手机看文章
Bitcoin Cash从0.16.2版本开始推出了CashAddr格式,老的比特币格式的地址被称为Legacy(遗产)地址,升级节点至0.16.2后,所有的RPC地址展示都用了CashAddr格式,包括listunspent,listtransactions,validateaddress等常用的RPC命令。
快速看看BCH新老地址的对比:
1. 新地址是和老地址一一对应的,它们对应了同一个私钥,只是换了种写法
2. 新地址可以发送余额给老地址,老地址可以发送余额到新地址
3. 新地址是大小写不敏感的,可以全部转成大写,也可以全部转成小写,优先小写格式,同一地址不能大小写混用
4. 新地址的前缀可写可不写,老地址没有前缀,通过首字符来标识类型
5. 新地址用base32编码,老地址用base58编码
6. 新地址格式不是一个软分叉,也不是一个硬分叉(这个有点争议,改了大家都依赖的节点程序其实算是一个软分叉)
自从比特币分叉出BCH以来,两个分叉币就逐渐地往不同的方向走了,软分叉的BTC支持了隔离见证,也增加了隔离见证地址等功能,默认生成新地址(getnewaddress)是p2sh-segwit隔离见证地址了,如果想要生成其它格式的地址,可以使用address_type来指定地址类型,例如要生成原始格式地址,address_type要填legacy。现在,Bitcoin Cash也有了自己的地址格式,而且推荐用户优先选用新的地址格式。
BCH的新地址格式类似这样:
bitcoincash:qpg6rgmpxr838cnwjhatdyuxkdz644xku54fe5yk99
bchtest:qqfpw4e90jhanpz2uspe29czwswgk5rd9v3yczymwq
开头是一个网络名,后面是一个q开头的base32编码的字符串,包含了版本号、公钥哈希值、校检码等信息,它们根据一些规则来拼接成这样一个地址,具体原理请参考这里。
新弄一个地址格式的初衷,在于区别老地址和新地址,以免用户充错币。例如充错BTC到BCH地址,由于BCH已经做了防重放攻击,这样相当于将BTC打过去了与BCH地址相同的一个BTC地址上去了,要找回的话还挺麻烦,需要将BCH钱包的私钥,导入到BTC钱包上,才能将币打出,类似的将BCH充值到BTC地址也一样。如果私钥不由自己掌握,或者交易所、钱包等商家不提供找回服务,那么这个币就相当于丢了。有些服务商为了防止用户打错,干脆将BTC和BCH地址充值地址弄成一致的,这样用户就不会打错了,即使打错了,也是充值到自己的账号去,可以随时提走。
新格式解决了一些问题,然而也带来了一些问题,特别是在新旧格式交替的过程中,会使人懵逼,一会新地址格式,一会老地址格式,虽然背后都是同一个私钥,但是人阅读起来还是有非常大差别。全部人都用老地址格式,或者全部人用新地址格式,都不会有问题,部分人使用新地址格式,部分人使用老的,就会像语言障碍一样,需要转换一下,才能看得懂。
除了新老地址混用的问题,其次新地址看起来其实蛮丑的,使用小写使得整个地址看起来密集,冗长,虽然开发者说是为了更易于书写和阅读,其实完全没有起到这个作用,比起 18SdNMjLMA9PJLnYr2MJtH8fndwYhq26vP 这样的老地址,实在是难看了很多,老的比特币地址其实经过了精心的设计,通过base58编码,避免了一些容易看错的字母和数字;使用首字母来标识类型,能够让人一眼知道这是个啥地址,比如m或n开头的,是一个测试环境地址,而1开头是正式环境地址,如果是3开头的,那么它是一个P2SH地址。新地址格式,通过前面的版本号来看地址所属的网络,不能再轻松看出差别了,新地址格式的确没有老地址那么简洁易用。
不过,目前走到这步,也都需要支持新地址格式,这样才能尽快解决这个兼容问题,让人们不再去关注这种差别,而可以自然地使用BCH。Bitcoin Cash开发者的方向,也应该将精力用在刀刃上,去解决那些更重要的问题,而不是解决一个问题,引入另外一个问题,因为要解决类似这种地址兼容的问题,需要漫长的时间等待所有人都用上新地址,甚至直到永远,也还是有人用老地址,这样总是要做兼容,这是非常不好的实践。
由于BTC和BCH在分叉路上越走越远,因为它们有更多的不一样了,自然对应的业务逻辑也都不一样了,这点对于该生态的开发者来说,需要付诸更多精力,及时关注二者的技术发展动态,及时更新业务逻辑。