编号:RFC-003
类型:标准
标题:星火链网BID生成规则和地址容量标准
作者:金键,[email protected];谢家贵,[email protected];李志平,[email protected];张波,[email protected];郭健,[email protected]
发布时间:2021-12-07
状态:采纳
更新时间:2021-12-07
讨论地址:#3
依赖RFC:星火链网RFC-002:星火链网分布式标识BID
本文介绍星火链网BID生成规则和地址容量标准。
作为区块链分布式系统,星火链网是如何给每一个节点、账号分配唯一的BID标识,以及详细的产生过程? 这篇RFC就是为了解释这些问题而存在的,同时也将解释星火链网BID地址容量的相关问题。
星火标识BID(Blockchain-based Identifier, BID),是星火·链网的数据载体,也是星火链底层支持的原生地址,同时BID还是分布式身份标识符DID的一个method。
BID的组成结构参见星火链网RFC-002:星火链网分布式标识BID中的BID规范。
具体规范参见BID规范。
下图是BID地址生成流程图:
第一步,生成原始公私钥对
根据加密算法类型生成原始的公私钥对。
第二步,计算原始公钥的哈希
根据第一步生成的原始公私钥对,对原始公钥进行哈希运算,得到一个固定长度的输出摘要(256-bit/32-Byte)。原始公私钥对的生成算法不同,对应的哈希算法也不同,具体如下:
-
SM2对应的哈希算法是SM3
-
ED25519或者Secp256k1对应的哈希算法是SHA-256
第三步,生成编码
根据编码类型得到要截取的哈希长度和编码算法类型,截取上一步生成的哈希,然后进行编码生成相应的字节数组。
第四步,添加编码类型
在上一步编码完成之后的字节数组前面添加编码类型,生成新的字节数组。
第五步,添加加密算法类型前缀
在上一步的字节数组前面添加加密类型,生成新的字节数组。
第六步,添加AC号
若生成的是主链的BID,跳过这一步;若生成的为子链的BID,在上一步的字节数组前面添加相应的AC号 + ‘:’。
第七步,添加Prefix前缀
Prefix是个固定字符串值"did:bid:",上一步的结果加上此前缀后即为BID的最终值。
下图是BID私钥生成流程图:
第一步,生成原始公私钥对
根据加密算法类型生成原始的公私钥对。此步骤没有具体列出,具体请参见BID地址生成流程描述中的第一步
第二步,添加前缀地址编码类型
在原始私钥前添加地址编码类型前缀,目前支持的地址编码类型请参见BID规范中介绍的编码类型。
注意:此地址编码类型为BID地址编码类型,非生成私钥的最后一步Base58编码类型,两者并无直接相关关系。
第三步,添加前缀加密类型
上一步生成的结果基础上添加前缀加密类型,目前支持的加密编码类型请参见BID规范中介绍的加密类型。
第四步,添加前缀Prefix
第三步的结果之上再次添加前缀Prefix。Prefix是三个字节0x18、0x9E、0X99,此固定字符串在Base58编码后生成固定字符串(pri),目的是为了方便用户观察和使用。
第五步,Base58编码
经过前四个步骤后,得到一个新的字符数组。对这个字符数组进行Base58编码后即得到最终的私钥。
下图是BID公钥生成流程图:
第一步,生成原始公私钥对
根据加密算法类型生成原始的公私钥对。此步骤没有具体列出,具体请参见BID地址生成流程描述中的第一步
第二步,添加前缀地址编码类型
在原始公钥前添加地址编码类型前缀,目前支持的地址编码类型请参见BID规范中介绍的编码类型。
注意:此地址编码类型为BID地址编码类型,非生成私钥的最后一步Base16编码类型,两者并无直接相关关系。
第三步,添加前缀加密类型
上一步生成的结果基础上添加前缀加密类型,目前支持的加密编码类型请参见BID规范中介绍的加密类型。
第四步,添加前缀Prefix
第三步的结果之上再次添加前缀Prefix。Prefix是一个字节,值为0xb0,目的是为了方便用户观察和使用。
第五步,Base16编码
经过前四个步骤后,得到一个新的字符数组。对这个字符数组进行Base16编码后即得到最终的公钥。
下面将从地址碰撞、容量分析两方面进行讨论。
下面将从比特币地址碰撞、IPV6地址重复、BID地址碰撞方面进行讨论。
分析如何碰撞比特币地址,拿全零地址:"1111111111111111111114oLvT2"举例。
仅随机碰撞出该地址对应的公钥是没有意义的。因为比特币交易需要私钥签名才有效。所以,如果你想使用这个地址里的比特币,前提是拥有这个地址对应公钥的私钥。需要:
-
随机生成一个私钥。
-
计算该私钥对应的公钥.
-
用公钥算出比特币地址。
-
与目标地址对比,看看是否一致。
-
如果不一致,回到第1步。
根据比特币地址理论总数,容易的看出,单次碰撞成功的理论概率是:
1 / ( 2160 ) //"2160"意思是2的160次方,由于每次碰撞至少需要3次SHA-256运算。当前比特币全网每秒的算力( E =(130 EH/s) 1.3*1020为当前比特币全网算力)进行破解。那么,每秒碰撞该地址成功的概率:
( 1 / ( 2160 ) ) * ( 1.3 * 1020) / 3
= 1 / ( 2.964987 * 1029)
若当前比特币地址为2700万,则碰撞概率为:
= 1 / ( 1.0981433 * 1022)
对于现有2700万的地址破解成功需要3.48 * 1014年
若当前比特币地址为千亿,则碰撞概率为:
= 1 / ( 2.964987 * 1018)
破解成功需要7.28 * 1010年。
IPV6地址容量为128位,总体容量为2的128次方,被碰撞的概率为2的128次方分之一,若用当前比特币全网每秒的算力( E =(130 EH/s) 1.3 * 1020去计算碰撞一亿级别的地址,需4.4 * 1010年,碰撞千亿级别的地址,需4.4*1013年。
BID地址的可变为22字节,则为176位,总体容量为2的176次方,被碰撞的概率为2的176次方分之一,若用当前比特币全网每秒的算力( E =(130 EH/s) 1.3 * 1020去计算碰撞千亿级别的地址,需6.16 * 1015年。
类型 | 长度 | 地址容量 | 位数 | 单个碰撞概率 | 现有地址数量 | 碰撞速度 | 碰撞耗时 |
---|---|---|---|---|---|---|---|
比特币 | 20字节 | 2160 | 160 | 1/2160 | 2700万 | 130EH/s | 3.48*1014年 |
IPV6 | 16字节 | 2128 | 128 | 1/2128 | 1亿 | 130EH/s | 4.4*1010年 |
BID(Old) | 20字节 | 2160 | 160 | 1/2160 | 千亿 | 130EH/s | 9.4*1010年 |
BID(New) | 22字节 | 2176 | 176 | 1/2176 | 千亿 | 130EH/s | 6.16*1015年 |
报告分析:
1、若将BID地址容量扩展到比特币地址的1000倍需要增加10位,由于10位超过了一个字节的长度,则需要增加2个字节的空间即22个字节(176bit),BID地址容量实际增加了65536倍比特币地址的容量。
2、当BID地址长度为22字节时,以碰撞千亿级别容量的BID地址为例,当拥有比特币全网算力(130EH/s)的情况下,能够碰撞成功需要花费 6.16 *1015年,这个年限比地球存在的年限(45亿年)都还要长。
地址的具体生成原理请参照第四章地址生成过程和原理,关于地址碰撞概率计算请参照第四章地址碰撞概率。
主要从BID组成内容的规范进行讨论。
BID由前缀Prefix、共识码(AC号)、加密类型、编码类型、后缀组成。
1)前缀Prefix:
BID的前缀,为固定字符串“did:bid:”,其中did:bid小写。
2)共识域号/共识码(AC号):
自治共识域为边界的跨链互通能力(ACSN,Autonomous Consensus System Number),简称共识域号,即AC号,AC号是由四位小写字母和数字组成,代表子链在星火·链网中唯一合法身份,是星火·链网体系中区分不同子链共识区域的代号,用于子链身份识别及全网寻址功能。
小写字母或数字组成的四位代码,星火链主链上的BID没有AC号,子链上的BID在前缀后缀之间增加子链的AC号,用于区分同一私钥控制的同一账户在不同子链上的地址。
AC号是星火·链网中代表子链合法性的唯一代码,是由骨干节点申请超级节点签发的子链身份代码(简称链码)。链码申请时,骨干节点需要递交子链所属行业、子链名称、slogen、介绍、设备指纹信息、路由地址(包括设备IP、端口)等,超级节点审核通过后向骨干节点签发带有超级节点签名的链码,子链通过AC号生成其BID标识,实现整个链群中的寻址功能。
3)加密类型:
生成BID原始公私钥对的加密算法类型,用一个小写字母表示,目前支持的加密类型有国际密码算法ED25519、Secp256k1和国密算法SM2,具体加密类型和公私钥对加密算法的映射关系如下表:
加密类型 | 公私钥支持算法 |
---|---|
‘e’ | ED25519 |
‘z’ | SM2 |
‘s’ | Secp256k1 |
其他小写字母 | 预留待扩展 |
4)编码类型:
后缀的编码算法和截取公钥哈希的长度,用一个小写字母表示,目前支持Base58、Bech32和Base64三种编码算法,截取公钥哈希的长度为22字节。具体编码方式和公钥哈希长度和编码类型的映射关系见下表:
编码类型 | 编码方式 | 截取公钥哈希长度 |
---|---|---|
‘f’ | Base58 | 22 |
‘s’ | Base64 | 22 |
‘t’ | Bech32 | 22 |
其他小写字母 | 预留待扩展 | 预留待扩展 |
5)后缀:
公钥经过哈希算法之后截取, 然后再进行编码后得到的字符串,不同的编码方式生成的后缀长度和格式不同。编码类型为‘t’生成的后缀字母全为小写,其他两种类型生成的字母区分大小写。
不同类型的编码方式生成的后缀长度不同,以Base58编码方式生成的后缀长度为22-31字节,Base64编码方式生成的后缀长度长度为32字节,Bech32编码方式生成的后缀长度长度为42字节。
星火链BID地址的包括前缀、AC号、加密类型、编码类型、后缀,最终的长度范围为32-57个字节。
示例:
在生成私钥和公钥后可以进一步通过算法生成地址。生成地址包含以下步骤:
1、通过 ED25519 算法对raw private key进行处理生成32位的字节数组,即 raw public key。例如私钥为 privfBrqvDdhNK978UpDpCTtmCX5ymUE7Le2PS1uPxVcubdrM,其raw public key 十六进制如下所示:
0xd308378e6b5ff0c2b4be3da741538004525d6388e5df32deb79e2b0c02f133c7
2、对 raw public key 进行一次 SHA256 运算,并取运算结果的后22个字节,得到字节数组,如下所示:
0xc6fd8f46575a3b142f16691b522e07a3cb1d5c1a16da
3、前缀加上1个字节的加密类型(Version),得到新的字节数组,如下所示:
0x01c6fd8f46575a3b142f16691b522e07a3cb1d5c1a16da
4、对第3步中产生的字节数组进行Base58编码,需要加入前缀did:bid等,如下所示:
did:bid: 38VPR182Y4uTkq32fykXjbKBPdQZutH
至此就完成了地址的生成。
名词/ 链接 | 实现说明 |
---|---|
bif | 星火链网的源代码中,有BID生成规则的实现 |
暂无