Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
jackma-cloud opened this issue Dec 7, 2021 · 4 comments

Comments

@jackma-cloud
Copy link
Contributor

jackma-cloud commented Dec 7, 2021

什么是星火链网的BID?
BID是如何生成的?公私钥的展示模型是什么样的?
BID地址的碰撞几率有多大?在星火链网中,地址的容量是多少;

生命周期

提出:2021-12-07
演示:2021-12-07
接受:2021-12-07
通过:2021-12-07

@maruolong
Copy link
Contributor

提出通过,进入演示阶段。

@jackma-cloud
Copy link
Contributor Author

jackma-cloud commented Dec 7, 2021

1. 序言

编号:RFC-003

类型:RFC

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

作者:魏星,[email protected]

发布时间:2021-12-07

状态:接受

更新时间:2021-12-07

讨论地址:#3

依赖RFC:无

2. 摘要

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

3. 动机

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

4. 原理

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

1. BID生成规则

BID的组成结构如下:
image-20211206163837375

由前缀Prefix、ACSN(Autonomous Consensus System Number)-简称AC号、加密类型、编码类型、后缀组成。具体规范参见BID规范

1. BID地址生成流程描述

666

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

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

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

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

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

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

第三步,生成编码

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

第四步,添加编码类型

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

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

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

第六步,添加AC号

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

第七步,添加Prefix前缀

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

2. BID私钥生成流程描述

7777

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

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

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

在原始私钥前添加地址编码类型前缀,目前支持的地址编码类型请参见什么是BID标题正文中介绍的编码类型。

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

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

上一步生成的结果基础上添加前缀加密类型,目前支持的加密编码类型请参见什么是BID标题正文中介绍的加密类型。

第四步,添加前缀Prefix

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

第五步,Base58编码

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

3. BID公钥生成流程描述

4334

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

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

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

在原始公钥前添加地址编码类型前缀,目前支持的地址编码类型请参见什么是BID标题正文中介绍的编码类型。

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

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

上一步生成的结果基础上添加前缀加密类型,目前支持的加密编码类型请参见什么是BID标题正文中介绍的加密类型。

第四步,添加前缀Prefix

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

第五步,Base16编码

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

2 BID地址容量分析

BID关于地址碰撞

比特币地址碰撞

分析如何碰撞比特币地址

拿全零地址:"1111111111111111111114oLvT2"举例。

仅随机碰撞出该地址对应的公钥是没有意义的。因为比特币交易需要私钥签名才有效。所以,如果你想使用这个地址里的比特币,前提是拥有这个地址对应公钥的私钥。需要:

· 随机生成一个私钥。

· 计算该私钥对应的公钥.

· 用公钥算出比特币地址。

· 与目标地址对比,看看是否一致。

· 如果不一致,回到第1步。

根据比特币地址理论总数,容易的看出,单次碰撞成功的理论概率是:

1 / ( 2160 ) //"2160"意思是2的160次方,由于每次碰撞至少需要3次SHA-256运算。当前比特币全网每秒的算力( E =(130 EH/s) 1.3*1020为当前比特币全网算力,比特币算力统计链接https://btc.com/)进行破解。那么,每秒碰撞该地址成功的概率:

( 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地址重复度问题

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

BID地址碰撞

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

BID地址容量分析报告

类型 长度 地址容量 位数 单个碰撞概率 现有地址数量 碰撞速度 碰撞耗时
比特币 20字节 2160 160 1/2160 2700万 130EH/s 3.48*1014
IPV6 16字节 2160 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规范

  • 前缀Prefix

BID的前缀,为固定字符串“did:bid:”,其中bid:did小写。

  • ACSN(Autonomous Consensus System Number),简称AC号

小写字母或数字组成的四位代码,星火链主链上的BID没有AC号,子链上的BID在前缀后缀之间增加子链的AC号,用于区分同一私钥控制的同一账户在不同子链上的地址。

AC号是星火·链网中代表子链合法性的唯一代码,是由骨干节点申请超级节点签发的子链身份代码(简称链码)。链码申请时,骨干节点需要递交子链所属行业、子链名称、slogen、介绍、设备指纹信息、路由地址(包括设备IP、端口)等,超级节点审核通过后向骨干节点签发带有超级节点签名的链码,子链通过AC号生成其BID标识,实现整个链群中的寻址功能。

  • 加密类型

生成BID原始公私钥对的加密算法类型,用一个小写字母表示,目前支持的加密类型有国际密码算法ED25519、Secp256k1和国密算法SM2,具体加密类型和公私钥对加密算法的映射关系如下表:

加密类型 公私钥支持算法
‘e’ ED25519
‘z’ SM2
‘s’ Secp256k1
其他小写字母 预留待扩展
  • 编码类型

后缀的编码算法和截取公钥哈希的长度,用一个小写字母表示,目前支持Base58、Bech32和Base64三种编码算法,截取公钥哈希的长度为22字节。具体编码方式和公钥哈希长度和编码类型的映射关系见下表:

编码类型 编码方式 截取公钥哈希长度
‘f’ Base58 22
‘s’ Base64 22
‘t’ Bech32 22
其他小写字母 预留待扩展 预留待扩展
  • 后缀

公钥经过哈希算法之后截取, 然后再进行编码后得到的字符串,不同的编码方式生成的后缀长度和格式不同。编码类型为‘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. 缺陷

暂无

@maruolong
Copy link
Contributor

演示通过,进入接受阶段。
状态变更日期:2021-12-07
为此RFC分配编号003.

修改意见

  1. 动机描述不明确
    应描述为何要提出此生成规则,为何要设计地址容量
  2. 缺少内容
    实现和缺陷部分缺失

@maruolong
Copy link
Contributor

接受通过,进入通过阶段。
状态变更日期:2021-12-07

@maruolong maruolong changed the title 星火链网中BID生成规则和地址容量 星火链网RFC-003:星火链网BID生成规则和地址容量 Dec 7, 2021
@maruolong maruolong changed the title 星火链网RFC-003:星火链网BID生成规则和地址容量 星火链网RFC-003:星火链网BID生成规则和地址容量标准 Dec 7, 2021
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants