数据层处于区块链层次结构中的最底层,它是基于Merkle
树,采用区块的方式和链式的结构来进行数据的存储,并通过哈希算法和非对称加密等密码学几乎是来保证账户和交易的安全
1. 哈希函数
1.1 定义
Hash
函数,也叫做散列函数、杂凑函数或者哈希函数,是把任意长度的输入变换成固定长度的输入的一种算法,该固定长度的输出就是输入数据时的Hash
值,也叫做消息摘要、散列值。
h=H(x)
:其中h就是哈希值,H是哈希函数,而x是原像
对于哈希函数h=H(x)
,x是h的原像,把数据块x作为输入,通过哈希函数H得到h。
理想的哈希函数对于不同的输入可以获得不同的哈希值。如果是两个不同的消息,如果找到了这样一个等式
H(x) = H(x')
,那么就说找到了一个哈希碰撞 ,所谓的哈希碰撞就是相同的输入值经过哈希函数后却产生了相同的哈希值结果
哈希函数的特性:
- 易压缩:对于任意大小的输入x,哈希值的
H(x)
的长度很小。 - 易计算:对于任意给定的消息,计算其哈希值比较容易
- 单向性:对于给定的哈希值,要找到x’,使得
H(x')=h
在计算上是不可行的,求逆困难 - 抗碰撞性:在理想的情况下,不同的输入得到的哈希值不同
(强抗碰撞/弱碰撞性)
弱碰撞性:对于给定的消息,要发现另外一个消息,使得H(x)=H(y)
在计算上是不可行的
强碰撞性:对于任意一对不同的消息(x,y)
使得H(x)=H(y)
在计算上也不是可行的
- 高灵敏性:只要有1个比特微的输入变化,都会造成哈希值的变化
1.2 常见的哈希函数
- MD5:其输出为128位,已经被攻破
- SHA-1:其输出为160,已经被攻破
- SHA-2:包括SHA-224/256/384/ 512/224 /512/256,目前是安全的,SHA-后面的数字代表的是输出的位数有224/256/384/512位
- SHA-3:包括有224/256/384/512位目前是周年庆的
- PIPEMD-160:输出是160位,目前依然是安全的
- SM3:输出是256位,目前依然是安全的
2. 非对称加密算法与数字签名
在密码学中,加密算法主要可以分为对称加密算法和非对称加密算法
对称加密算法
单钥加密算法,也就是在加密和解密过程中所使用的密钥是相同的,具有加密速度快,效率高,占空间小的特点
非对称加密算法
非对称加密算法中有公钥私钥两种密钥,公钥是公开的,不需要保密而且他人可以获取。
私钥则是一般通过随机数算法生成,由个人持有,必须严格注意保密,公钥和私钥通常是成对出现的。一个公钥对应一个私钥, 如果用其中一个密钥加密数据,则只有对应的密钥才可以解密。
非对称(公钥)体制如图:
特点
- 公钥私钥成对,公钥是公开的,而私钥是保密的
- 新随机生成私钥,再通过算法计算出公钥
- 配对的公钥和私钥之间存在着紧密的数学联系
- 私钥计算公钥容易,但是由公钥计算出私钥在计算上不可行(可以理解为哈希函数的原象和哈希值)
2.1 RSA密码体制
RSA
密码是目前使用最为广泛的公钥密码,RSA算法由三部分构成密钥生成算法
、加密算法
、解密算法
其依据是数论中的论断:大数的质因子分解问题
要求得到两个大素数(100位)的乘积在计算机上很容易实现,但是要分解为两个大素数的成绩在计算机上几乎不可能实现。
2.2 椭圆曲线密码体制
椭圆曲线密码机制的安全性是建立在求解椭圆曲线离散对数问题困难性的基础上
,在同等密码长度的情况下,安全强度要高于RSA等其他密码体制。密钥长度的最低安全要求是160位
2.3 SM2椭圆曲线公钥密码算法
SM2算法
是一种椭圆曲线密码机制,但在签名、密钥交换等方面不同于ECDSA、ECDH等国际标准。而是采用了更为安全的机制。其依赖的理论基础也是椭圆曲线上的离散对数问题。
2.4 密码学的应用
- 群/环签名:实现对交易签名的同时保护用户的身份隐私
- 同态加密:在密文上计算的输出与直接对名文的计算结果一致
- 差分隐私:在源数据或者计算结果上添加特定分布的噪音
- 密文检索:在密态数据中进行数据检索和等值测试等数据分析
- 零知识证明:在不泄漏信息的情况下向对方证明我持有某一信息
- 安全多方计算:多个数据所有者在互不信任的情况进行协同计算
3. Merkle树
3.1 定义与性质
Merkle(默克尔树)
:默克尔树是一种典型的二叉树结构,它由一个根节点、一组中间节点和一组叶子节点组成。
叶子节点包括存储数据或其哈希值,中间节点是它的两个孩子节点内容的哈希值,根节点也是由它的两个子节点的内容的哈希值组成的。
从上面可以看出,父节点的哈希值,是由其子节点的哈希值计算得出的。
void traverse(TreeNode root){
if(root == null){
return ;
}
if(root.left != null && root.right !=null){
root.val = hash(root.left,root.right);
}
//继续递归计算
traverse(root.left);
traverse(root.right);
}
Markle
树的作用
- 快速检验:用作快速归纳和检验大规模数据的完整性,生成整个交易集合的数字指纹,而且提供了一种校验区块是否存在某交易的高效途径
- 防篡改:在一个完整的
Markle
中,底层叶子节点
数据的任何变动,都会逐层向上传递到其父节点,一直到Markle
树的根节点使得根节点的哈希发生变化。
3.2 在区块链中的作用
简单支付认证(SPV)
:仅需下载区块头80字节/区块
,然后通过从一个满节点回溯一条小的Merkle
路径就能够认证一笔交易的存在,而不需要存储或者传输大量区块链区块中的所有交易。
4. 区块链网络拓扑结构
4.1 P2P网络拓扑结构
拓扑结构:是指分布式系统中各个计算单元之间的物理或者逻辑的互联关系,节点之间拓扑结构一致是确定系统类型的重要依据。
4.2 P2P网络拓扑结构
种类 | 方式 | 特点 | 区块链中的应用 |
---|---|---|---|
中心化 | 使用目录服务器为对等节点提供索引目录服务 | 增强网络的可管理性,对资源的发现和查询过程简单,但是存在单点故障,无法支持更大规模网络、泛洪将会消耗大量资源的问题 | / |
去中心化无结构 | 完全随机图的组织方式,没有结构化的统一地址,采用泛洪或者随机转发的方式对节点位置和网络资源进行查询 | 不存在单点故障,适合节点随时加入、退出的情况,但是难以保证较高的节点和资源管理效率、泛洪消耗大量资源、限制网络的扩展性 | 比特币 |
去中心化结构化 | 分布式哈希表DHT 技术将关键值节点分散存储到众多节点上,收到针对一个特定键值的查询请求后可以有效准确地定位节点 |
适合在大规模P2P网络节点中进行节点以及网络资源的管理,高效处理节点动态的加入或者离开 | 以太坊 |
半中心化 | 结合了中心化和去中心化网络拓扑的优点,节点分为超级节点和普通节点 | 兼具中心化拓扑的可管理性和去中心化拓扑的扩展性 | Fabric |
4.3 去中心化无结构的P2P网络
方式:完全随机图的组织方式,没有结构化的统一地址,采用泛洪或者随机转发的方式对节点的位置和网络资源进行查询,特点:不存在单点故障,适合节点随时的加入和退出,但是难以保证较高的节点和资源管理效率、泛洪将会消耗大量资源,限制网络的拓展性。
它在区块链中的应用范例是比特币。
比特币节点的四项基本功能
- 钱包:管理公私钥与转账的功能
- 挖矿:运行工作量证明
pow
算法,以相互竞争的方式进行交易的确认,创建新的区块,获得比特币奖励 - 区块链数据库:存储完整的、最新的区块链账本副本
- 区块链路由器:负责比特币节点的发现、链路维持、数据转发等网络功能
比特币网络
节点发现
- 节点推送:节点将自身信息主动发送到每一个邻居节点,邻居节点接收后保存到自己的列表当中
- 节点拉取:为了获取更远范围的节点信息,节点可以向邻居节点发起查询,请求对方的邻居节点的列表,从获得两跳邻居节点的信息
连接维护
- 定时发送ping消息
8比特的随机数
,对方收到的后回复一个pong
响应消息,则说明连接正常- 如果对方持续若干分钟都没有回应,那么就认为节点已经退出了当前网络
4.4去中心结构化P2P网络
方式:DHT技术将关键值集合分散存储到众多节点上,收到针对一个特定键值的查询请求后可以有效地定位到节点
特点:适合在大规模P2P网络
中进行节点以及网络资源管理,高效处理节点与动态加入或离开
区块链中的应用范例是以太坊。
使用基于分布式哈希表
DHT
技术的Kademlia协议
实现网络结构化,进行节点和资源的精确查找。
4.5 半中心化P2P网络
方式:结合了中心化与去中心化网络网络拓扑的优点,分为超级节点和普通节点
特点:兼具中心化拓扑的可管理性和去中心化拓扑的扩展性
在区块链中的应用范例:超级账本Hyperledger Fabric
Fabric
在网络中设置了特殊功能的节点,负责认证、提交、背书和排序等功能。