做者:Alexey Vaninhtml
任何计算机系统都有监控操做,可能会发送心跳信息、校验和查询及哈希请求等。这些操做在本文中都被统称为任务。在中心化系统中,一般会有一个受认证的节点或节点群组来完成任务。而去中心化系统能够将任务下发给各个节点,从而灵活拓展,所以效率也显然更高,但这也就致使了相应的问题——到底如何在所选节点间分配任务。咱们能够经过如下两种方式解决这个问题:node
• 节点随机选择要作的任务
• 节点使用dBFT之类的共识算法分配任务git
本文将探讨第二种方法。github
拜占庭容错任务分配算法
假设有v个任务和n个可随时在系统中工做的节点。每一个任务和节点都有一个独一无二的标识符。所以每一个节点均可以使用HRW [2]选择任务,使用预先设定的算法来执行任务。任务分配共识实际上确认了全部任务都是在未发生技术故障的前提下完成的。网络
使用dBFT算法,即便网络[1]中高达1/3的节点作出妥协也能够达成共识。举个例子,若某系统n=v=3:区块链
该系统有3个任务和3个节点,其中有一个节点有欺诈行为。spa
这些任务统一在各节点中进行分配:若是每一个节点承担一个任务,在最坏的状况下会有一个任务可能没法被执行。所以咱们使用了冗余来确保全部任务都能被执行。v任务须被n/3+1个节点执行。在此状况下,节点任务池的大小可经过如下公式算出。翻译
在此案例中,P(3,3) = 2htm
无论哪一个节点作出了妥协,全部任务都仍能被正确执行。
图1 不一样任务数前提下任务池大小的最大值
图1标明,该公式的值趋向于v/3,意味着在任何状况下各节点任务池中的任务都占全部任务的1/3。在负载增长的状况下系统可能不能正常拓展。
减少任务池大小
若系统的n=3 v=4,任务池大小即为P(3,4) = 2.3 ≈ 3。各节点的任务池大小就可减至2:
所以,各任务被执行的概率就都达到了66%。所以任务池大小能够缩减,只要确保必定的精度就能够了。
出于研究的目的,咱们创建了一个模拟模型进行实验,参数为v=1000。咱们尝试在不一样n的状况下找到能使任务没法执行的可能性小于0.00001的任务池大小。该模型已开源在github[3]。结果如图2所示:
图2 v=1000时的任务池容量实验
上图显示,该模型的实验数据实际上处于任务池容量的最大和最小值的区间里。所以当n增长时,任务池所需容量会减少。任务池容量的最大值与实验值之间的差额可使用R(x)(位于y1轴上,取0-1之间的任意值)公式求得一个近似值。而后任务池容量就可经过如下公式求得。
深刻研究
本文并未考虑网络节点发生故障的可能性,并且全部实验均在最坏假设下进行,作出妥协的节点数也带入了最大值。显然,100个节点中出现33个妥协节点的比例也比3个节点中出现1个妥协节点的概率小。所以能够将“妥协概率”的方程定义为Q(x),然后计算出任务池的大小为P(n,v)⋅R(n)⋅Q(n)。而当妥协节点的数量小于n/3时,R(x)的的行为还须要深刻研究。
参考文献
1.张铮文,区块链拜占庭容错算法:
https://docs.neo.org/en-us/ba...
2.一致性哈希(最高随机权值):
https://en.wikipedia.org/wiki...
3.模拟模型库:
https://github.com/AlexVanin/...