Skip to content

Latest commit

 

History

History
296 lines (159 loc) · 13.5 KB

星火链网RFC-003:星火链网BID生成规则和地址容量标准.md

File metadata and controls

296 lines (159 loc) · 13.5 KB

星火链网RFC-003:星火链网BID生成规则和地址容量标准

1. 序言

编号:RFC-003

类型:标准

标题:星火链网BID生成规则和地址容量标准

作者:金键,[email protected];谢家贵,[email protected];李志平,[email protected];张波,[email protected];郭健,[email protected]

发布时间:2021-12-07

状态:采纳

更新时间:2021-12-07

讨论地址:#3

依赖RFC:星火链网RFC-002:星火链网分布式标识BID

2. 摘要

本文介绍星火链网BID生成规则和地址容量标准。

3. 动机

作为区块链分布式系统,星火链网是如何给每一个节点、账号分配唯一的BID标识,以及详细的产生过程? 这篇RFC就是为了解释这些问题而存在的,同时也将解释星火链网BID地址容量的相关问题。

4. 原理

星火标识BID(Blockchain-based Identifier, BID),是星火·链网的数据载体,也是星火链底层支持的原生地址,同时BID还是分布式身份标识符DID的一个method。

4.1. BID生成规则

BID的组成结构参见星火链网RFC-002:星火链网分布式标识BID中的BID规范。

具体规范参见BID规范

4.1.1 BID地址生成流程描述

下图是BID地址生成流程图:

666

第一步,生成原始公私钥对

根据加密算法类型生成原始的公私钥对。

第二步,计算原始公钥的哈希

根据第一步生成的原始公私钥对,对原始公钥进行哈希运算,得到一个固定长度的输出摘要(256-bit/32-Byte)。原始公私钥对的生成算法不同,对应的哈希算法也不同,具体如下:

  1. SM2对应的哈希算法是SM3

  2. ED25519或者Secp256k1对应的哈希算法是SHA-256

第三步,生成编码

根据编码类型得到要截取的哈希长度和编码算法类型,截取上一步生成的哈希,然后进行编码生成相应的字节数组。

第四步,添加编码类型

在上一步编码完成之后的字节数组前面添加编码类型,生成新的字节数组。

第五步,添加加密算法类型前缀

在上一步的字节数组前面添加加密类型,生成新的字节数组。

第六步,添加AC号

若生成的是主链的BID,跳过这一步;若生成的为子链的BID,在上一步的字节数组前面添加相应的AC号 + ‘:’。

第七步,添加Prefix前缀

Prefix是个固定字符串值"did:bid:",上一步的结果加上此前缀后即为BID的最终值。

4.1.2 BID私钥生成流程描述

下图是BID私钥生成流程图:

7777

第一步,生成原始公私钥对

根据加密算法类型生成原始的公私钥对。此步骤没有具体列出,具体请参见BID地址生成流程描述中的第一步

第二步,添加前缀地址编码类型

在原始私钥前添加地址编码类型前缀,目前支持的地址编码类型请参见BID规范中介绍的编码类型。

注意:此地址编码类型为BID地址编码类型,非生成私钥的最后一步Base58编码类型,两者并无直接相关关系。

第三步,添加前缀加密类型

上一步生成的结果基础上添加前缀加密类型,目前支持的加密编码类型请参见BID规范中介绍的加密类型。

第四步,添加前缀Prefix

第三步的结果之上再次添加前缀Prefix。Prefix是三个字节0x18、0x9E、0X99,此固定字符串在Base58编码后生成固定字符串(pri),目的是为了方便用户观察和使用。

第五步,Base58编码

经过前四个步骤后,得到一个新的字符数组。对这个字符数组进行Base58编码后即得到最终的私钥。

4.1.3 BID公钥生成流程描述

下图是BID公钥生成流程图:

4334

第一步,生成原始公私钥对

根据加密算法类型生成原始的公私钥对。此步骤没有具体列出,具体请参见BID地址生成流程描述中的第一步

第二步,添加前缀地址编码类型

在原始公钥前添加地址编码类型前缀,目前支持的地址编码类型请参见BID规范中介绍的编码类型。

注意:此地址编码类型为BID地址编码类型,非生成私钥的最后一步Base16编码类型,两者并无直接相关关系。

第三步,添加前缀加密类型

上一步生成的结果基础上添加前缀加密类型,目前支持的加密编码类型请参见BID规范中介绍的加密类型。

第四步,添加前缀Prefix

第三步的结果之上再次添加前缀Prefix。Prefix是一个字节,值为0xb0,目的是为了方便用户观察和使用。

第五步,Base16编码

经过前四个步骤后,得到一个新的字符数组。对这个字符数组进行Base16编码后即得到最终的公钥。

4.2 BID地址容量分析

下面将从地址碰撞、容量分析两方面进行讨论。

4.2.1 BID关于地址碰撞

下面将从比特币地址碰撞、IPV6地址重复、BID地址碰撞方面进行讨论。

4.2.1.1 比特币地址碰撞

分析如何碰撞比特币地址,拿全零地址:"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年。

4.2.1.2 IPV6地址重复度问题

IPV6地址容量为128位,总体容量为2的128次方,被碰撞的概率为2的128次方分之一,若用当前比特币全网每秒的算力( E =(130 EH/s) 1.3 * 1020去计算碰撞一亿级别的地址,需4.4 * 1010年,碰撞千亿级别的地址,需4.4*1013年。

4.2.1.3 BID地址碰撞

BID地址的可变为22字节,则为176位,总体容量为2的176次方,被碰撞的概率为2的176次方分之一,若用当前比特币全网每秒的算力( E =(130 EH/s) 1.3 * 1020去计算碰撞千亿级别的地址,需6.16 * 1015年。

4.2.2 BID地址容量分析报告

类型 长度 地址容量 位数 单个碰撞概率 现有地址数量 碰撞速度 碰撞耗时
比特币 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亿年)都还要长。

地址的具体生成原理请参照第四章地址生成过程和原理,关于地址碰撞概率计算请参照第四章地址碰撞概率

5. 规范

主要从BID组成内容的规范进行讨论。

5.1 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个字节。

示例:

image-20211206165623575

在生成私钥和公钥后可以进一步通过算法生成地址。生成地址包含以下步骤:

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

至此就完成了地址的生成。

6. 实现

名词/ 链接 实现说明
bif 星火链网的源代码中,有BID生成规则的实现

7. 缺陷

暂无