比特币和山寨币地址规律

撕烤者

参考
618.io/blog/2013/07/30/bitcoin-basic/


打赏 1BfXayW2vrj6uRpoZg3nR8rMEckLpGmaiL
软妹币打赏 SKZkDHNBZbo8VU8d3Rcb9TcmUPsE5B5Dix

比特币btc地址开头总是1,长度27位到34位。
域名币nmc地址开头是M或者N,长度34位。
莱特币ltc地址开头总是L,长度34位。
软妹币ssc地址开头是R或者S,长度34位。

其实它们都是一套算法生成的,最后一步:
25个字节的二进制地址被转换为base58形式表示,即我们最后看见的地址。
25字节组成:1字节的Network ID,20字节的公钥哈希,4字节的验证。
后24字节都是公钥推导出来的,第1字节是开发者设定的。
btc:0x00=0,nmc:0x34=52,ltc:0x30=48,ssc:0x3e=62


根据btc的源代码,我发现可以这样理解“base58转换”:
将256进制的数字转化为58进制的数字。
(每一个字节在计算机内部由8位二进制数字表示,相当于是1位256进制的数字。)

用base58编码表示0-57:
123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz

用这个算数会非常别扭,因为58进制的1是10进制的0。
1->0
9->8
z->57
21->58
杀了我吧。

生活中没听说过谁用58进制数字的,理解起来可能会有麻烦,但是我们很容易写出一个公式来。

电子表格公式大概是这样的:
A1 123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz
A2 NetworkID
A3 =(256^(25-1))/(58^(34-1))
地址开头最大值 =MID($A$1,(MOD(INT($A2*$A$3),58)+1),1)
地址开头最小值 =MID($A$1,(MOD(INT(($A2+1)*$A$3),58)+1),1)

A3约等于0.4023790676
NetworkID可以按需要改变,从0到255

会用电子表格的自行修改就好。


A3这个值每乘一次58就可以计算下一位的地址,除以58可以计算上一位(35位时)的地址。
networkID大于等于144时,就能产生35位的地址了。
1在base58里面表示其他进制的“0”,算出结果之后要把前面的1都去掉,btc除外,见后文。

这个公式不是十分准确,因为输入字符串的最后四个字节是哈希值,不是我们可以决定的,幸好它们在最后,不会影响到高位。


————公式的推导过程很没技术含量,可跳过————

用十进制打比方,一个5位的十进制任意数,第一位是7,
那么它的最小值是70000=7*10^(5-1)
最大值是79999=80000-1=(7+1)*10^(5-1)-1


25位256进制数,第一位是由作者决定的networkID,设为m
可能的最小值,m后面跟着的都是0,表示为m*256^(25-1)
可能的最大值,m后面跟着的都是255,表示为(m+1)*256^(25-1)-1


34位58进制数,第一位是我们要求的解n,表示为n*58^(34-1)
最小n*58^(34-1)=m*256^(25-1)
化简,最小n=m*(256^(25-1))/(58^(34-1))

最小n=0.4023790676m
最大n=n=0.4023790676(m+1)
结果要截断小数部分。

m=62 十进制
n最小=24 即58进制的R
n最大=25 即58进制的S 

————————


根据这个公式我们来推导比特币和一些山寨币地址空间的上限和下限
btc有一点特殊,其它几个山寨币规律是相同的。

ssc networkID 62 
RwxQ3
SMJ12
作者说,R代表软,S代表Soft

ltc networkID 48
LKDxG
LiZZF
所以有人抱怨,没有Love开头的ltc地址,没有,除非ltc的id改成49

nmc networkID 52
MvaNC
NKuyB
之前我也很惊讶,为什么我竟然弄到了My开头的nmc地址

接下来我们来研究btc的地址。
btc networkID 0
11111
1QLbz
难道btc地址没有1QLc开头的?不,有的,听我慢慢解释。

理论上最小的btc合法地址是1111111111111111111114oLvT2,27位
转换到16进制是00000000000000000000000000000000000000000094a00911,
其实就是十六进制的94a00911嘛!用常规意义上的“转换为58进制”转换结果是4oLvT2,而这些1是故意加上去的。

1在base58里面表示平时的“0”,正常的数字怎么可能是0开头的,即使是本来就很奇怪的58进制数字也不应该。
这就是btc地址的特殊之处,或者说是base58算法的特殊之处。

不知道有什么特殊目的,base58算法会在结果前面加上1,这不是为了凑齐34位地址,所以不是无脑补充到34位。
base58算法计算之后,结果是这样的(过程请自己看代码)
25个输入字节(256进制),每一个开头的0会被转换成1,放在最终结果前面。
用16进制的眼光看就是,每2个开头的0会被转换成1,放在最终结果前面。
00000000000000000000000000000000000000000094a00911,42个开头的0,所以最终结果有21个1开头。加上后面六位一共27位。(27位只是合法地址而已。我算不出它的私钥)
而比特币地址的最大可能输入00ffffffff……转换为base58结果是33位的,又因为有2个开头的0,结果还要加上一个1,一共是34位。
所以人们说,btc地址的长度是27位到34位。


00ffffffff……转换为base58的结果是1QLbz开头,那么我想得到1QLc开头的地址,可能吗?
用十进制来打比方。我想要一个1982开头的数字,要求这个数字不大于189400。
198200不满足要求,但是,
19820就满足。
也就是说,我们找不到合适的34位地址,但是总能找到一个合适的33位的地址。
这里又巧妙利用了base58算法的特性。34位地址和33位地址的开头都是1。

前面说过,合法的btc地址是27位到34位。但是我们看见的地址大多数是34位,少数是33位,能不能弄到更短的地址啊?
能。
这是我算出来的: 1111z1CipvSdUAhjGMjmQ8hnECqd93dN
求打赏!


最后,说几个特殊情况。
networkID 1
QLbz7
ogCyD
总是33位,因为它的networkID是1,0x01,开头没有任何0,所以开头不必加1,比通常的btc地址都短。
这个networkID获得的取值范围很大,可以是QPQRSTUVWXYZabcdefghijkmno。一般的地址最多有两个相邻字母开头的情况。

networkID 2
ogCy
2D1ox
33位到34位,不可能有1开头,z开头之后就是2开头。范围也很大。

networkID 144
zwfr
21M1T
34位到35位,不可能有1开头,之后的networkID所有的地址都是2开头35位了。