100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > DHT应用于区块链

DHT应用于区块链

时间:2019-12-05 00:44:36

相关推荐

DHT应用于区块链

DHT应用于区块链

DHT网络的概述

DHT网络的基本思想如下:

1. 每一份资源都由一组关键字进行标识。

2. 系统对其中的每一个关键字进行Hash,根据Hash的结果决定此关键字对应的那条信息(即资源索引中的一项)由哪个用户负责储存。

3. 用户搜索的时候,用同样的算法计算每个关键字的Hash,从而获得该关键字对应的信息存储位置,并迅速定位资源。

DHT关键字定位:

1. DHT通过分布式散列函数,将输入的关键字唯一映射到某个节点上,然后通过某些路由算法同该节点建立连接。

2. 每个节点并不需要保存整个系统的节点视图信息,只在节点中存储其邻近的几个后继节点信息,当一个节点收到一个查询操作时,如果它发现所查询的标识不在自己关联的区间内,那么该节点将会把该查询发送给其存储节点信息表中它认为最靠近目标的邻居。

3. 每次转发都能更进一步地接近数据源。因此较少的路由信息就可以有效地实现到达目标节点。

DHT的具体算法实现过程:

(1) 对每个节点的一定特征(如IP地址)进行Hash,使得到的每个节点的节点值唯一。将节点按照节点值的从小到大构成一个环(Chord环)。(此处节点值可以看作是新环中的IP地址)

(2) 通过节点值,获取每个节点与下一个临近节点之间的距离,从而获得每个节点所需负责的值区间。(此过程类似于建立路由表)

(3) 对每个节点上的资源提取关键字,并对关键字进行Hash,得到的Hash值按照(2)中的每个节点负责的区间进行分配,从而使每一项资源的存储信息都被存储在一个节点上。(此步骤获得了资源的索引列表)

(4) 当搜索一项资源时,对其关键字进行Hash,得到的值与当前节点的值区间表相比较,从而获得资源的索引信息最有可能存在的节点。查询该节点,获取资源的索引,根据索引,即可找到资源所在的节点,并建立通信。

具体构造过程如下:

创建由10个节点组成的DHT网络。网络的hash范围为1到70,对每个节点做hash值。

图一,

节点hash结果为1、8、14、2、32、42、48、51、56,由此想象存在一个分部在hash区间为1到70的虚拟环上的DHT网络。

图二,

建立“路由表”——Finger Table,节点值为8的N8节点,与其距离为1,2,4这些Hash值对应的索引都被存储在节点N14上,距离为8的Hash值对应的索引存储在节点N21上,依次类推。对于节点N8而言,只需要存储相邻的几个后继节点(N14,N21,N32,N42)对应的“路由表”就可以,而不需要并且也很难存储全部网络节点。

在建立完“路由表”后,对每个节点的资源关键字进行Hash,所得的关键值k被存储在一个节点值等于k的节点上,如果不存在这样的节点则存储在节点值大于k的第一个节点上。如图一中,K10对应的关键字存储在N14节点。

图三,

当需要搜索资源时,对待搜索的资源关键字进行Hash,如图三所示,Hash结果为54,则从当前节点N8的“路由表”中查找,因为N8的路由表,最多只保存到了N42节点的值,所以路由到N42节点,再从N42节点的“路由表”中查询,以此类推,直到最终找到54所存储的节点N56,则关键字54所对应的资源的索引信息就存储在N56节点上,在该节点上查询到此索引信息,就可以根据索引信息中指示的资源所在节点去进行通讯传输了。

区块链的概述

基本原理

区块链的基本原理理解起来并不难。基本概念包括:

交易(Transaction) :一次操作,导致账本状态的一次改变,如添加一条记录;

区块(Block) :记录一段时间内发生的交易和状态结果,是对当前账本状态的一次共识;

链(Chain) :由一个个区块按照发生顺序串联而成,是整个状态变化的日志记录。

如果把区块链作为一个状态机,则每次交易就是试图改变一次状态,而每次共识生成的区块,就是参与者对于区块中所有交易内容导致状态改变的结果进行确认。

在实现上,首先假设存在一个分布式的数据记录本(这方面的技术相对成熟) ,这个记录本只允许添加、不允许删除。其结构是一个线性的链表,由一个个“区块”串联组成,这也是其名字“区块链”的来源。新的数据要加入,必须放到一个新的区块中。而这个块(以及块里的交易) 是否合法,可以通过一些手段快速检验出来。维护节点都可以提议一个新的区块,然而必须经过一定的共识机制来对最终选择的区块达成一致。

具体以比特币为例来看如何使用了区块链技术?客户端发起一项交易后,会广播到网络中并等待确认。网络中的节点会将一些等待确认的交易记录打包在一起(此外还要包括此前区块的哈希值等信息) ,组成一个候选区块。然后,试图找到一个 nonce 串放到区块里,使得候选区块的 hash 结果满足一定条件(比如小于某个值) 。一旦算出来这个区块在格式上就合法了,就可以进行全网广播。大家拿到提案区块,进行验证,发现确实符合约定条件了,就承认这个区块是一个合法的新区块,被添加到链上。当然,在实现上还会有很多的细节。比特币的这种基于算力的共识机制被称为 Proof of Work(PoW) 。目前,要让 hash 结果满足一定条件并无已知的启发式算法,只能进行暴力尝试。尝试的次数越多,算出来的概率越大。通过调节对 hash 结果的限制,比特币网络控制约 10 分钟平均算出来一个合法区块。算出来的节点将得到区块中所有交易的管理费和协议固定发放的奖励费(目前是 12.5 比特币,每四年减半) 。也即俗称的挖矿。

很自然会有人问,能否进行恶意操作来破坏整个区块链系统或者获取非法利益。比如不承认别人的结果,拒绝别人的交易等。实际上,因为系统中存在大量的用户,而且用户默认都只承认他看到的最长的链。只要不超过一半(概率意义上越少肯定越难) 的用户协商,最终最长的链将很大概率上是合法的链,而且随着时间增加,这个概率会越大。例如,经过 6 个块后,即便有一半的节点联合起来想颠覆被确认的结果,其概率将为 $$\frac{1}{2}^6 = 1.6%$$,即低于 $$\frac{1}{60}$$ 的可能性。

区块链是一个完整了数据链条,这个链条的无数备份被完整地存储在P2P网络的各个节点。所以区块链的缺点非常明显,对这个数据链条的修改需要汇总一定时间内的所有交易到获得出块权的节点。获得出块权的节点把交易汇总之后进行验证打包出块。出好的块交给其他节点确权验证。整个流程耗时时间长挖矿的计算浪费严重。用户的交易会被延迟很久才会被确认。

在DHT网络构建交易系统

传统的区块链的交易存在耗时长计算量大的问题。汇总所有交易到一个节点出块本身就是一个伪中心的交易算法,加上确权认证等流程短时间会出现网络拥堵现象。从微观看任何交易只要A用户发起交易,B用户接收交易,计算机集群确认并储存交易记录。整个交易过程只有三方参于,那么减少参与计算的节点是减少不必要通讯和提高交易速度的方法。将传统的区块链数据拆分按每用户一个区块链每条交易一个区块。那么把每个交易按算法分担到任意节点就可以初步实现区块链的分布式运行。最终要实现一个分布式运行的,可以快速结算交易,去掉挖矿机制,并能够保障数据安全的全新的区块链体系。

传统的区块链所有交易汇总到出块节点:

我们将每个用户的帐本独立处理分别放在不同的节点内。当用户产生交易的时候就分别在双方的帐本上进行记录,这样两个服务器就可以分别处理两个用户的信息。

因为DHT网络的特性,我们可以使用帐户的hash名称作为KEY,帐户的每条交易记录作为Value值。当有新的交易记录产生就找到用户KEY将交易添加到交易链的末尾。

整理基本的交易流程,用户a发起扣款交易-〉节点C确权并记录a的交易-〉节点D确权并记录b的交易-〉交易完成。

在这个交易流程中a与b的交易记录经过a私钥签名后连同公钥一起交给节点C进行写入数据和发布到DHT网络上的操作。这里使用签名的方法保证了ab任意一方不会和C串通发布假冒的交易。例如b发布一个不存在的交易给C,当C把这个交易发布到其他的DHT节点就不会被其他节点接受并且会因为发布虚假消息进入黑名单。

因为我们的数据是按每个用户单独存储的,那么就要保证每个用户帐户数据符合ACID原则。也就是对帐户数据的操作要是原子的。因为帐户ab的公钥的存在所以hash环上的任何节点处理数据都是可信的。但如何保障写入的帐本数据是原子的,也就是如果a帐户同时发起两笔交易,分别由C节点和E节点负责写入。假设当前用户a下有5条交易记录,C和E同时向其他节点宣告写入第5条数据。那么其他n个节点在收到这个消息的时候就产生了冲突。这个可能会产生冲突的过程就叫做确权。

如果用广播的方式会产生确权矛盾的问题(paxos方式)?双方同时广播会有概率会产生一半一半的结果。并且需要和被广播的节点反复确认反复确认反复广播。当有恶意节点发布恶意广播时就会出现无法确认的情况。

我们可以根据DHT的特点发起一个由距离hash信息点最近的节点开始,依次确认的方法来进行节点确权。

假设帐户a信息保存在N4的右边,NC和NE都想发起一个对帐户a的追加交易记录的操做。假设NC比NE稍快的发起了确权操作,并把消息发送到了N4。N4收到对帐户a确权操作之后检查当前没有冲突操作如果没有生成一个临时的记录。之后N4将这个确权请求外带加上自己的签名发送给N3节点进行确权操作,当这个请求发送到N1时,N1发现已经收集了足够多的节点确认,就对所有签名的节点以及NC节点发送确权成功的消息。

如果在这期间NE也发送了确权操作,因为N4已经有了记录就会拒绝NE的请求并返回NE。当发现确权被拒绝后可需要重新同步最新的帐户数据并发起新的数据确权请求。N4在传递确权封包到N3时要带着自己的节点信息和签名同样N3传递给N2时也要带着N4和N3的信息。如果N1确权成功就要给所有节点发送通知,如果确权失败也要发送通知,并且每个节点的确权纪录保存的时间是有限,超过时间就会被丢弃掉。例如发起一个确权时如果在最迟3点没有返还确权成功的记录,所有节点都会丢弃记录。这里又会引发如果部分节点丢弃部分节点没有丢弃.....所以节点成功的消息也应该是可以退回的。这里N1可以发送广播预确权成功,其他所有24个节点返回成功,之后再发送确认成功,节点确认写入数据。

上述流程也要保证的是在确权过程中NC的数据要与N4保持一致,并且这期间不会突然出现最少24个或最多5%的 节点出现在N4的前面,并且这时NE发起确权。

考虑计算节点小于N4大于a的hash生成的难度和故意生成的节点在节点密度上也会与正常节点存在极大的差异。如果再把节点id和帐户绑定在一起生成一个节点的上下线时间和节点的信用数据。那么将进一步的减少节点突然集中大量出现导致重复确权的问题?重复确权也就是双花或者叫硬分叉。假设a帐户有10块钱,两次交易每次减少10块钱。如果两次交易都成功a帐户就变成了-10块钱。

这个问题和人体被入侵很相似。识别有问题的和突然加入的肌体并给周围节点发出警报。也可以使用认证方式和节点历史数据的方式建立每个节点的信誉档案和黑名单制度。节点和用户帐户也要帮定在一起,通过检测用户帐户的余额和交易历史可以确定更高的信誉度。比如一些更加极端的情况有大量的节点被仿冒。那么以每条交易有24个节点做为验证,每个节点又有24个节点确认节点的历史安全数据。那么更改一条交易就要至少仿冒576个节点,这576个节点加入或更改,p2p网络又要更改大量其他服务器数据。这样就导致任何违规的数据操纵都要波及整个网络。就安全角度来说这种复杂的关系和无处不在的分布式和互相认证的机制保证了整个p2p网络的数据安全。

单个节点加入p2p网络如果和其他的节点数据不一致,那么至多只要2到3个节点做拜占庭就可以发现这个节点有问题。这里就要提到交易数据的历史和延续性。当一个交易得到最少24个节点做确认之后。这24个节点在线记录公网ip也被作为节点的信誉记录到p2p网络的其他节点。那么一个节点数据要么是完全空白,要么是与在线节点完全一致,否则他的数据就会被其他节点甄别拉黑。在节点请求加入p2p网络时就可以避免大部分的攻击。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。