读《区块链第一课》笔记及心得

P2P网络协议

P2P网络协议是计算机之间进行数据通信的一种常见协议,其应用的场景从流媒体到点对点通信,从文件共享打破协同处理,在多个领域都有它的身影出现。网络协议就是计算机之间约定俗成的一种数据交换协议,就好像你在淘宝上买东西,淘宝作为交易平台,提供和撮合了买方和买方的交易达成,而交易过程中出现的任何问题都有相应的协议来解决,在区块链的世界里,这种协议构成了交易的信任基础。

区块链的网络连接与拓扑结构

1. 网络连接

除去少数支持 UDP 协议的区块链项目外,绝大部分的区块链项目所使用的底层网络协议依然是 TCP/IP 协议。

所以从网络协议的角度来看,区块链其实是基于 TCP/IP 网络协议的,这与 HTTP 协议、SMTP 协议是处在同一层,也就是应用层。

在“区块链的常见误区”这篇文章中,我们提到了“区块链是否会颠覆互联网”这一说法,如果要是认真分析的话,它颠覆的层面其实最多只到 HTTP 协议,不能再多了。

以 HTTP 协议为代表的、与服务端的交互模式在区块链上被彻底打破了,变更为完全的点对点拓扑结构,这也是以太坊提出的 Web3.0 的由来。

比特币的 P2P 网络是一个非常复杂的结构,考虑到矿池内部的挖矿交互协议与轻节点。我们仅仅讨论全节点这种场景下的 P2P 网络发现与路由。

比特币的 P2P 网络基于 TCP 构建,主网默认通信端口为 8333。

以太坊的 P2P 网络则与比特币不太相同,以太坊 P2P 网络是一个完全加密的网络,提供 UDP 和 TCP 两种连接方式,主网默认 TCP 通信端口是 30303,推荐的 UDP 发现端口为 30301。

1. 拓扑结构

P2P 网络拓扑结构有很多种,有些是中心化拓扑,有些是半中心化拓扑,有些是全分布式拓扑结构。

比特币全节点组成的网络是一种全分布式的拓扑结构,节点与节点之间的传输过程更接近“泛洪算法”,即:交易从某个节点产生,接着广播到临近节点,临近节点一传十十传百,直至传播到全网。
全节点与 SPV 简化支付验证客户端之间的交互模式,更接近半中心化的拓扑结构,也就是 SPV 节点可以随机选择一个全节点进行连接,这个全节点会成为 SPV 节点的代理,帮助 SPV 节点广播交易。

节点发现

节点发现是任何区块链节点接入区块链P2P网络的第一步。这与你孤身一人去陌生的地方旅游一样,如果没有地图和导航,你就只能向附近的人问路,“向附近的人问路”这个动作就可以理解成节点发现。节点发现可分为初始节点发现和启动后节点发现。

1. 初始节点发现

在比特币网络中,初始节点发现一共有两种方式。

第一种叫做 DNS-seed,又称 DNS 种子节点,DNS 就是中心化域名查询服务,比特币的社区维护者会维护一些域名。

我们通过 nc 命令尝试连接域名下的某个主机的 8333 端口会发现连接成功,运行结构如下。

第二种方式就是,代码中硬编码( hard-code )了一些地址,这些地址我们称之为种子节点(seed-node),当所有的种子节点全部失效时,全节点会尝试连接这些种子节点。

用在以太坊中,思路也大致相同,也是在代码中硬编码(hard-code)了一些种子节点做类似的工作。

2. 启动后节点发现

在 Bitcoin 的网络中,一个节点可以将自己维护的对等节点列表 (peer list) 发送给临近节点,所以在初始节点发现之后,你的节点要做的第一件事情就是向对方要列表:“快把你的节点列表给我复制一份。”

所以在每次需要发送协议消息的时候,它会花费固定的时间尝试和已存的节点列表中的节点建立链接,如果有任何一个节点在超时之前可以连接上,就不用去 DNS seed 获取地址,一般来说,这种可能性很小,尤其是全节点数目非常多的情况下。

而在以太坊网络中,也会维护类似的一个节点列表 (NodeTable),但是这个节点列表与比特币的简单维护不同,它采用了 P2P 网络协议中一个成熟的算法,叫做 Kademlia 网络,简称 KAD 网络。

它使用了 DHT 来定位资源,全称 Distributed Hash Table,中文名为分布式哈希表。KAD 网络会维护一个路由表,用于快速定位目标节点。由于 KAD 网络基于 UDP 通信协议,所以以太坊节点的节点发现是基于 UDP 的,如果找到节点以后,数据交互又会切换到 TCP 协议上。

3. 黑名单与长连接

公有区块链面临的网络环境是非常开放的,任何人只要下载好钱包,打开运行就进入了这个 P2P 网络,这也会带来被攻击的可能。

所以在比特币的代码中,会有一段去控制逻辑,你可以手动将你认为可疑的节点移除并加入禁止列表,同时去配置可信的节点。当然,以上并不属于客户端的标准协议的一部分,任何人都可以实现属于自己的 P2P 网络层。

以太坊上有针对账户进行的黑名单处理,但是这属于业务层。我没有找到很详尽的资料,所以你有兴趣的话,可以自己尝试一下。

不过总的来说,黑名单我们也可以通过操作系统的防火墙去处理,这并不算一个特别棘手的问题。

局域网穿透

区块链的P2P网络是一种全分布式的拓扑结构。如今的网络环境是由局域网和广域网组成的,也就是说,当你在局域网上运行一个区块链节点时,在广域网上是发现不了的,广域网上的节点只能被动接受连接,并不能主动发起连接。你可以在局域网上通过VPC配置路由,将公网IP和端口映射到局域网中你的IP和端口即可。比特币和以太坊均使用了UPnp协议作为局域网穿透工具,只要局域网中的路由设备支持NAT网关功能及UPnp协议,即可将你的区块链节点自动映射到广域网上。

节点交互协议

一旦节点建立连接,节点之间的交互便会遵循一些特定的命令,这些命令写在消息的头部,消息体中写的是消息内容。命令分为两种:一种是请求命令,一种是数据交互命令。也就是说建立连接后,就可以发送一系列的命令。比如发送心跳命令、发送区块同步命令等。

分布式一致性算法与共识机制

还记得我上次说的一个村子举办相亲大会的故事吗?分布式系统面临几个问题:一致性问题、可终止性问题、合法性问题。一致性是指在某个分布式系统中,任何节点的提案能够在约定的协议下被其他所有节点所认可。这里说的认可是指任意节点对外呈现的信息必须一致。可终止性可以理解为系统必须在有限的时间内给出一致性的结果。合法性是指提案必须是系统内的节点提出的,当然最重要的也是最基础的问题就是我们常说的一致性问题。那么对于上述故事中村子之间的投票会体现在什么地方呢?

  • 非人为恶意篡改投票过程;
  • 人为恶意篡改投票过程;

在介绍具体的分布式一致性算法之前,我们先介绍两个定理做一下铺垫。

  • FLP不可能性。简单来说,即使网络通信完全可靠,只要产生拜占庭错误,也就不存在一个确定性的共识机制能够为异步分布式系统提供一致性了。换句话说就是,不存在一个通用的共识机制可以解决所有的拜占庭错误。
  • CAP定理。一致性、可用性和分区容忍性三者中,我们只能选择两个作为主要的强化点,另外一个必然被弱化。

经典的分布式一致性算法有Raft算法和Paxos算法。Raft算法是一种强Leader型的一致性算法,它的吞吐量基本就是Leader的吞吐量,它无法抵御节点恶意篡改数据的攻击。Paxos算法提供适用于不同场合的一致性算法。所以Paxos算法有很多变种,经典的Paxos算法是Leaderless型的,有的变种则是强Leader型的,叫做Fast Paxos。PBFT的全称是实用拜占庭容错算法。PBFT是一种状态机制,要求所有节点共同维护一个状态,并采取一致的行动。PBFT非常适用于联盟链等对性能具有较高要求的场合,超级账本项目中的Fabric框架默认采用的就是PBFT的修改版本。
对于区块链的共识机制,是基于经济学的博弈算法,以区别于经典的分布式一致性算法。该算法的整体思路就是让攻击者的成本远远大于收益,也就是从成本的角度设计的分布式算法。目前具有工业成熟度的是POW,比较成熟的还有PoS和DPoS。

PoW共识机制

Pow算法也就是工作量证明,它最初被应用于邮箱服务,为了防止垃圾信息泛滥,发送者需要计算一个按照规则约定的难题的答案,将消息发送给接收者的同时需要附带验证这个答案,当这个答案被验证有效时,接收者才会接收这个消息。可以看出,PoW的核心设计思路就是提出一个计算难题,让人们通过计算机设备“解题”,而验证答案的过程则非常简单,“解题”的过程却不是那么容易。具体的解题规则和验证原则请参考《精通比特币》一书。

PoS共识机制

Pos也称为权益证明,也就是你所持有的数字货币的价值与你持有的时间长短有关,也就是根据币龄来获取相应的权益。节点所拥有的币龄越多,获得记账权的概率越大。这个类似于公司的股权结构股权占比的合伙人,其话语权越重(公司的收益权和投票权不同,具体内容请阅读相关资料)。

DPoS共识机制

DPOS共识机制就是将PoS共识机制的记账者转换为由指定节点组成的小圈子,只有这个圈子中的节点才能获得记账权,而不是所有人都可以参与记账。这个圈子中可能有21个节点,也可能有101个节点。

个人感想

通过学习,我了解分布式系统中的一致性算法,区块链中使用的点对点网络,还有就是目前最常用的三种共识算法,我相信这些基础知识构建了区块链技术的地基,也是区块链技术落地具体场景的关键,没有这些基础技术的加成,也不会出现运行接近十年的比特币网络,更不会出现Dapp,当然也没有基于区块链技术的信任网络的诞生。虽然这些技术还不是很成熟,但是我坚信越来越多的企业和组织正在积极探索具体的落地场景,对于传统行业也有一定的借鉴意义,更坚信基于信任构建的美好社会会很快的到来,我更是充满期待,希望和大家一起去见证这无比激动和开心的时刻,更更希望它早一点儿到来。

猜你喜欢

转载自blog.csdn.net/weixin_34066347/article/details/86834539