从区块链到DAG(三)--DAG共识之SPECTRE协议

承接上一篇结尾提出的问题,接下来的文章会着重介绍DAG的账本共识SPECTRE协议。从上一篇(《从区块链到DAG(二)--DAG的基本结构》)可以看出,DAG的整个网络并不是线性的。SPECTRE协议顺应了这种结构所以并没有提出选择主链的概念,而是着眼于解决冲突交易和防止恶意攻击。这里需要声明一下,所有讨论账本共识有效有个大前提:网络中大多数节点都是诚实的。我们不考虑集中超过51%算力的这种恶意攻击,因为无论用什么账本共识这样的攻击都会奏效。

 

 1.  SPECTRE如何解决冲突交易

SPECTRE通过区块间的投票来排除冲突的交易,如图1。

图片1 一个简单的DAG网络的投票过程

来源:Yonatan Sompolinsky, Yoad Lewenberg, and Aviv Zohar,《SPECTRE:Serialization of Proof-of-work Events: Confifirming Transactions viaRecursive Elections》

 

区块X里记录的交易信息是交易x先于交易y发生,记为x<y ;区块Y里记录的交易信息是交易y先于交易x发生,记为y<x,这两个交易相互冲突。

投票过程:

区块X和区块Y分别投票给自己。

区块X之后产生的区块我们称之为X的未来区块,回溯这些未来区块发现6,7,8只能回溯到X,所以这三个区块都投票给X,标记为蓝色。同理,回溯区块Y的未来区块发现9,10,11只能投票给Y,标记为红色。

未来区块12既回溯到X又能回溯到Y,它会投出与上一轮投票一样的结果X。图中虚线部分是上一轮的投票,按少数服从多数的原则可知,投票的结果是X。

X或Y之前产生的区块我们称为X或Y的过去区块,这些区块会分别统计自己对应的未来区块的投票,然后跟投给得票较多的那个选项。由此,区块1~5都投给X,交易x<y认定有效,y<x被丢弃。

 

 2.  “最长链共识”与SPECTRE的关系

图片2展示了当SPECTRE应用在区块链结构上的情况。

<think>嗯,用户的问题是关于DAG调度中关键路径的求解方法和算法。首先,我需要回忆一下关键路径的相关知识。关键路径通常是在项目管理或任务调度中用来确定项目最短完成时间的路径,对吧?关键路径上的任务如果延迟,整个项目就会延迟。在DAG(有向无环图)中,关键路径应该是最长的路径,因为完成所有任务的最早时间取决于最长路径的长度。不过用户提到了“顶点排序”和“最长路径”,可能需要结合拓扑排序和最长路径算法。 根据引用内容,关键路径在AOE网中讨论,而拓扑排序用于处理有向无环图的顶点排序。引用[3]提到,DAG最长路问题,虽然名字叫最长路,但实际上是求最短时间,因为关键路径决定了整个项目的最早完成时间。这里可能需要用拓扑排序来确定顶点的处理顺序,然后计算每个顶点的最早开始时间和最晚开始时间,从而找到关键路径。 那具体步骤应该是怎样的呢?首先,拓扑排序可以确定顶点的线性序列,确保在处理每个顶点时,所有前驱顶点都已经处理过。然后,按照拓扑顺序计算每个顶点的最早开始时间,这需要遍历每个顶点的出边,并更新后继顶点的最早时间。同样,逆拓扑排序可以用来计算最晚开始时间,从终点倒推。关键路径上的顶点满足最早时间等于最晚时间,边上的时间余量为零。 另外,引用[2]提到拓扑排序的时间复杂度是O(n+e),这应该是可行的。用户可能想知道具体的算法实现步骤,比如如何结合拓扑排序和动态规划来计算最长路径。在DAG中,最长路径可以通过拓扑排序加上动态规划的方法,按顺序计算每个顶点的最长路径值,同时记录路径信息。 用户可能还会关心算法的实际应用,比如在任务调度中如何利用关键路径来优化资源分配。需要确保每一步都解释清楚,特别是如何从拓扑排序到关键路径的计算,以及如何识别关键活动。可能需要举例说明,比如一个简单的DAG图,逐步展示计算过程,这样用户更容易理解。 还有,用户的问题中提到DAG调度,可能涉及到并行任务调度,这时候关键路径决定了最短可能完成时间,因为关键路径上的任务必须顺序执行,而其他任务可能可以并行处理。所以关键路径算法在这里的作用是找出影响整体时间的任务链,帮助优化调度策略。 总结一下,回答需要包括以下几个部分:关键路径的定义,拓扑排序的作用,计算最早和最晚时间的步骤,如何确定关键活动和关键路径,以及可能的算法实现和复杂度分析。同时,引用相关的资料来支持每个步骤的正确性,比如引用[4]和[5]关于拓扑排序的定义,引用[3]关于最长路径的解释,引用[2]关于逆拓扑排序的应用。</think>### DAG调度中的关键路径求解方法 #### 一、关键路径定义与核心思想 关键路径是**有向无环图(DAG)中权重和最长的路径**,决定了任务调度的最短完成时间。其核心思想是通过拓扑排序确定顶点处理顺序,结合动态规划计算最长路径[^3][^4]。 #### 二、求解步骤与算法 1. **拓扑排序** - 目标:生成顶点线性序列,保证所有边从前驱指向后继 - 算法实现: ```python def topological_sort(graph): in_degree = {u:0 for u in graph} for u in graph: for v in graph[u]: in_degree[v] += 1 queue = deque([u for u in in_degree if in_degree[u] == 0]) result = [] while queue: u = queue.popleft() result.append(u) for v in graph[u]: in_degree[v] -= 1 if in_degree[v] == 0: queue.append(v) return result ``` *时间复杂度:$O(n+e)$*[^2][^5] 2. **正向计算最早开始时间** - 初始化:$ve[start] = 0$ - 递推公式:$$ve[v] = \max_{(u,v) \in E}\{ve[u] + w(u,v)\}$$ - 按拓扑序依次计算所有顶点的最早时间 3. **逆向计算最晚开始时间** - 初始化:$vl[end] = ve[end]$ - 递推公式:$$vl[u] = \min_{(u,v) \in E}\{vl[v] - w(u,v)\}$$ - 按逆拓扑序依次计算 4. **关键活动判定** - 边$(u,v)$是关键活动当且仅当: $$ve[u] = vl[v] - w(u,v)$$ $$ve[u] + w(u,v) = ve[v]$$ #### 、应用场景 1. 并行计算任务调度 2. 集成电路设计中的时序分析 3. 项目管理中的关键路径法(CPM) #### 四、算法优化 1. **并行计算**:在拓扑排序阶段采用多线程处理 2. **增量更新**:动态调整部分路径权重时局部重计算 3. **路径压缩**:合并连续无分支的关键路径段 $$示例公式:关键路径总时长 = \max_{v \in V}\{ve[v]\}$$
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值