巴比特论坛

锐火 | 船员 | 发表于 2015-3-5 15:08:46 | 显示全部楼层
比特币地址是由公钥转换而来,公钥是由私钥转换而来,而私钥必须有足够的长度(足够的数量),不然攻击者就能通过穷举私钥的方式,期望正好猜到某个倒霉蛋的私钥,然后转走他的币,所以比特币地址需要有一定的长度。
比特币地址一般都是直接复制粘贴的,没人用人脑去记地址。
至于以1开头,这是中本聪开发时就是这么设置的,用1和m区分正式和测试网络,后来莱特,狗币等山寨币也陆续用首位来区别地址,避免操作时不小心发错地址。
oninixi | 副船长 | 发表于 2015-3-5 14:52:30 | 显示全部楼层
嗯,开发者随意搞得
cinbit | 船长 | 发表于 2015-3-7 14:08:00 | 显示全部楼层
给你转个文章自己琢磨吧,我是没时间整理了。
-------------------------------------------------------------
比特币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位了。
Angel | 队长 | 发表于 2015-3-5 15:16:52 | 显示全部楼层
Angel 发表于 2015-3-5 15:14
比特币地址也有不是1开头的,,,,巴比特的似乎就不是

http://www.blockmeta.com/data/addresses还有几个最富有地址前几个也不是1,是3
satoshi | 版主 | 发表于 2015-3-5 14:42:47 | 显示全部楼层
这么长时间了,希望给这个问题一个完结。
下图来自btc官方维基文档,解释了比特币地址如何从椭圆曲线公钥一步步转换而来的。

在第四个步骤:附加网络ID,其中主网络ID为1,这就是为什么大家看到的地址是1开头的原因

PubKeyToAddr1.png




The revolution will be Decentralized.
chehw_1 | 副船长 | 发表于 2015-3-5 15:12:19 | 显示全部楼层
本帖最后由 chehw_1 于 2015-3-5 15:22 编辑

Bitcoin地址的生成:
base58([prefix] + [hash160(pubkey)] + [checksum])

其中,[prefix]1个字节,用于区分不同的网络,如0代表bitcoin的主网络main, 111代表testnet等。
base58编码实际上就是对一个大整数反复除以58,依次记录余数所对应的base58字符,最后将这些字符逆序,生成一个字符串。

不同网络的[prefix]不同,所以地址首位不同:
主网络中,[prefix]为0时,除至最后的余数必为0, 对应的base58编码为'1',  所以常规地址的首位一定是'1'.
testnet中,[prefix]为111, 除至最后的余数为44或45, 对应的base58编码为'm'或'n', 因此testnet网络的地址首位是‘m'或'n'。
补充:
多重签名地址用的是script hash, [prefix]为5,base58编码后,地址首位为'3'。




高级模式
您需要登录后才可以发帖 登录 | 立即注册 | 用新浪微博登录

本版积分规则

搜索

0关注 4粉丝 52主题

作者的其他主题

返回顶部 返回列表

登录

分享 发帖