比特币钱包地址
钱包的地址是根据钱包公钥匙计算出出来的,但是不同链上的计算方式不一样,编码方式也不一样,以太坊使用的是十六进制编码,EIP-55利用了其大小写对地址进行校验。
比特币的地址是使用的base58Check进行编码,将版本号和校验和加入了地址中,这样可以有效防止因认为输错而发生错误转账,下面介绍一下比特币的钱包地址:
一、base58编码
base58编码和base64编码不一样,不仅仅是使用的字符集不一样,而且使用的编码方式也不一样。base64是将3字节数据用4个字节来表示,这样可以有效避免二进制中的控制字符,达到很好的传输目的。
而base58呢?它更像是2进制、8进制、16进制的进制。他的目的有一下几个:
相比Base64,Base58不使用数字"0",字母大写"O",字母大写"I",和字母小写"l",以及"+"和"/"符号。
- (1) 避免混淆,在某些字体下,数字0和字母大写O,以及字母大写I和字母小写l会非常相似。
- (2) Base64编码中包含"+"和"/",非字母或数字的字符串作为帐号较难被接受。
- (3) 在邮件系统中,使用字符和数字的组合,不容易换行。
(4) 双击可以选中整个字符串。
因为base58实际就是58进制,因为它不是2的整数倍,所以会有大量的除2运算,因此其效率比base64慢很多。
二进制用到的字符集="01"
八进制用到的字符集="01234567"
十进制用到的字符集="0123456789"
十六进制用到的字符集="0123456789ABCDEF"
58进制用到的字符集="123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"二、Base58Check编码
在钱包的使用过程中,如果直接使用base58编码会出现一个问题,只要你输入的字符是合法的,那么就是一个钱包地址,即便是输错了也会是一个合法的钱包地址。
只是这个钱包地址对应的私钥就是其他私钥了,你永远也推算不出来。因此有了base58Check的钱包地址,这个地址如果输错了就不再是合法的钱包地址。
先看看base58Check怎么对数据进行编码,我们把需要编码的数据成为payload(装载),然后对这个payload进行编码,其格式为:version + payload + checksum
从这个格式中可以看出,我们在编码的时候封装了冗余数据,因此在校验的时候,输错了就能够检测出来
- version:版本号,下面会列出常见的版本号和它编码过后可能出现的前缀
- payload:装载的数据,比特币的钱包地址是钱包公钥经过两次哈希(hash256和ripemd160)得到的
- checksum:这个是两次哈希去前面四字节,(sha256(sha256(version+payload))).sub(0,4);
最后对拼接起来的数据进行base58编码,这样就得到了base58check编码的数据
常见的钱包地址使用的版本号:
type | version | Base58 result prefix |
---|---|---|
Bitcoin Address | 0X00 | 1 |
Pay to Script Hash Address | 0X05 | 3 |
Bitcoin Testnet Address | 0X6F | m, n |
Private Key WIF | 0X80 | 5, K, L |
BIP-38 Encrypted Private Key | 0X0142 | 6P |
BIP-32 Extend Public Key | 0488B21E | xpub |
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。