在比特币诞生之前,已经有多次的电子加密货币尝试,如戴维的B-Money和尼克萨博的BitGold。大多数尝试都被双重花费问题所困扰。密码学解决了货币私有,哈希解决了大数据的一致性验证,那P2P网络就用公开透明的账本解决了双重花费问题。
介绍P2P网络的文章,一般都把中心化网络C/S架构和P2P架构放在一起对比,方便理解两种网络架构的不同。
事实上,网络通信层本身就是点对点的,去中心化的,任何两台主机理论上都可以握手,建立连接,双向通信。
互联网就是一个扁平化的,可以两两互相通信的点对点网络。
互联网诞生之后,出现了大量的公司,为大众提供某一服务,譬如聊天、邮件、音乐、影视、游戏、购物等等,从活动中获取经济利益。
强调用户体验的互联网产品,降低了用户消费服务的门槛,惠及了更多普罗大众,他们无需了解网络如何通信,甚至不需要知道远端还有服务器在运行。
所以,所谓的中心化网络才是当前的主流。
那P2P的应用价值在哪儿,为什么需要这种形式的网络?
首先,横向看,并非所有的中心化服务机构都是可靠的。阿根廷法币,一个月通胀率10%以上。阿根廷民众的法币存款,在过去两年里快速缩水。
图示为阿根廷通胀率-月环比(2023年7月-2024年7月):
#
#
Peer-to-Peer是一种设计思想,每个加入的节点,即作为客户端获取服务,又作为服务端提供服务,没有专门的服务节点。体现的是“人人为我,我为人人”的价值观念。每个参与者提供带宽、算力和存储,共同组成了一个互相服务的对等网络。
显然这种机制更复杂一些,要解决一些协议的问题:如新节点如何加入网络?怎么让其他所有的节点知晓新节点的加入?有些节点离开了,如何保障服务的继续?
在完全的去中心化和完全的中心化之间,有多种结合,兼顾效率、透明、安全。根据实际使用场景,目前有多种具体的实现协议,如专注于文件高效下载与上传的BitTorrent、具有高效查找算法定位资源的Kademlia、旨在创建一个永久的分布式存储文件系统的IPFS...
下面我们通过一个节点A从加入到离开,在一个完整生命周期中做的事情,直观了解下以太坊在用的Kademlia协议的主要内容。
A启动运行,这个时候它对即将加入的P2P网络一无所知。首先它获取自己的IP和端口,然后通过HASH函数及其他计算,得到一个160Bit的Node ID。这是唯一的节点标识。
执行Kademlia协议定义好的FIND_NODE查询,入参是自己的Node ID。它会得到网络的响应,得到K个节点信息,将节点信息添加到自己的路由表,其中路由表内含有对方IPAddress、 UDP Port等信息 。
将得到的新节点Node ID作为入参,循环FIND_NODE操作,得到更多节点信息完善路由表。
协议里有更多细节,如保障每次查询的节点没有重复,不会循环往复没完没了的查询;协议中将Node ID分解为二叉树,用异或定义节点之间的逻辑距离;将同一距离的节点装入K桶作为一个分组,分组成员有上限管理及更新等等,这里不做详细介绍,可以单开一篇文章了。
到此,新节点已经获取到足够多的节点信息,其他被查询的节点也将新节点的IP和Port等信息添加到自己的路由表,加入网络的过程完成。
运行阶段最主要的当然是“干活”,这跟具体的应用服务有关,可能是上传下载文件,可能是确认交易,跟Kademlia协议无关。
作为网络中的“老”节点,自然要被其他节点和新节点查询。查询信息里有其他节点的信息,如Node ID,Address和Port。节点A响应查询的时候,也会将查询信息里的节点信息跟自己路由表里的对比,不存在则维护更新自己的路由表。
运行阶段,既要完成业务工作,又要维护自己的路由表信息,添加新节点信息进去,删除PING失败的已经不在线的节点。
离开网络关闭即可,什么都不用做。这样的协议是安全的。因为离开有各种被动的因素,可能什么也来不及做。
节点A突然关闭,对网络来说无人知晓。但是其他节点在更新路由表的时候,会PING节点A,期待它的响应。接收不到响应的节点,知道A已离开,将A从自己的路由表内删除。
越来越多的节点发现A节点PING失败,将其从自己的路由表删除。关于A的信息逐步地就完全消失了。
推荐一个把kademlia协议可视化的项目:
https://kelseyc18.github.io/kademlia_vis/basics/1/
如下图是一个FIND_NODE的过程:
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!