p2p网络协议
主要思想是网络通信中的所有节点都是平等的,没有服务器,也没有客户端,或者说既是服务器又是服务端。迅雷用的就是p2p
软件架构的发展
1. 中心化:一个服务端,多个客户端,服务端和客户端分工明确,服务器故障,服务就不可达。
2. 分布式:传统的中心化无法满足业务复杂度激增等需求,就开启了横向拆分,拓展,微服务模式,系统的可靠性依赖于分布式系统的故障恢复能力。
但服务的提供方只依赖于某一服务方,服务端数据作假,就会对整个系统的其他用户造成利益损失。
3. 去中心化:p2p网络提供了另一种选择,所有人既是服务端,又是客户端,既是消费者,也是生产者。
p2p网络实现
Hyperledger Fabric利用gRPC对等服务,这个服务虽然满足p2p的对等概念,但不适用于公有链,公有链的节点太多,连接量太大,无法满足需要。
Ethereum使用了Kad DHT技术,用一种密码学或者数学的方法,将两个节点间的距离表示出来
密码学
哈希(HASH):把不定长度的数据转换成固定长度的哈希值
常见的哈希算法:MD5,SHA1,SHA2(SHA2-256)
MD5和SHA1已经被证明是不安全的,可以通过生成的哈希值去反推真实的值,随着计算机运算能力的提升,这些算法都有可能被暴力破解。推荐使用SHA2以上的算法,最常用的是SHA2-256。
一个好的哈希算法需要具有以下特点:
1. 正向快速,逆向困难
能够很快的将一段数据转换为固定长度的哈希值,但是很难将哈希值还原成真实的数据。
2. 输入敏感
两段数据即使是很小的差异,也会因此产生差距很大的哈希值,这样才可以防止通过变化差异反推真实数据的情况。
3.抗碰撞
很难找到两段哈希值一样的真实的数据,如果很容易,这样的算法会变得毫无意义。
哈希算法通常用于数据摘要,用固定长度的数据代替原始数据,确保数据的真实性。
加解密算法:为了防止数据的泄密
银行用的U盾就是其中的一种应用
对称加密:密钥相同,加解密速度快,但是容易泄露。密钥丢失就会泄密。(AES,DES等)
非对称加密:公钥/私钥,公钥公开,任何人都可以查看,私钥自己保存,不在网络中流传,相对安全,但是效率比对称加密低得多(RSA,椭圆曲线算法)
区块链中就运用了椭圆曲线算法
区块链账本:可以说是一系列有序的不可篡改的状态转移记录日志,也就是交易。
每个区块包含n个有序交易,区块之间也是有序存储的,一个区块的记录被篡改,就会导致后面区块的哈希值和其他节点的哈希值不一样,就会引发共识机制去排除错误节点。
共识算法(分布式一致性算法)
强一致性:强一致性需要进行大量的通信,所以对效率有很大影响,不太容易实现,并且实现之后夜性能很差。
最终一致性:再确定的时间范围内达成一致就成为达成共识。
共识算法相关原理:
CAP原理:一个分布式系统不可能同时满足
一致性(Consistency)在同一时刻,所有节点的数据应该是一样的,如果有用户对数据更新,所有节点都会获得这个数据更新后的数据
可用性(Availablity)当用户发起请求时,系统能够在有限时间内做出响应
分区容忍性(Partition Tolerance) 分布式系统遇到网络分区的情况下,部分节点之间无法进行通信,但仍然能够正常工作。
这三个特性只能三者取其二
ACID原理:
原子性 每次操作都是原子的,要么成功,要么失败,不会成功一半
隔离性 数据库的各种操作时隔离的,不会互相影响
一致性 数据库中的状态时一致的
持久性 数据状态改变后,就是持久改变了,而不是临时改变
共识算法是基于前面的原理去设计的
共识算法现主要分为两个系列。Paxos和拜占庭容错系列。
Paxos相关算法假设分布式系统中只有故障节点而没有恶意节点。
故障节点是电脑宕机,网络中断引起错误的节点
恶意节点是故意制造错误信息的节点
而拜占庭容错相关算法既能容纳故障节点也能容纳恶意节点。
一般的共识问题只需要Paxos算法就可以,而区块链共识则需要拜占庭容错算法。
而联盟链因为有准入控制,进行拜占庭容错的必要性就没有公有链那么高。
PBFT和Raft算法是适用于联盟链的算法,不是完全去中心,可以说是多中心。
共识算法的选择是要在特定的使用场景进行不同的侧重和妥协来确定的,符合所有场景的完美共识算法是不存在的。