SPECTRE-Coding

本文最后更新于:2023年6月19日 晚上

虽然这个 paper 可能不是个能 work 的(有很多地方比较牵强,不稳定,且无任何项目声明实现了它),但既然老师要求了,只好硬着头皮上了。

借鉴

根据经验,我决定先学习一下现有项目中各种共识协议的编写。
pow-原理很简单,就是工作量证明,故不用看。
pos-选举人制度,具体原理还是可以了解一下的。

pos–账本共识

切记,PoS 不是一种确定的定义(算法),而是一种概念,因此对于不同的平台来说,可以有不同的 PoS 实现。
以太坊使用 GHOST,贪婪最重可观察子树协议,作为其分叉选择规则。在 GHOST 协议中,获得投票数最高的分叉将被选为链头(将每个分叉区块及其各自子区块的所有票数计入考虑)。
与最长链规则相比, GHOST 的优点在于能够在网络延迟较高时降低攻击效率,同时最小化链重组的深度。原因是即使攻击者能够高效地在其分叉链上继续产生区块,尝试使该链成为最长链,GHOST 也会选择另一条票数更高的分叉链。

pow–挖矿共识

https://www.yuque.com/docs/share/f47edbdb-8ca4-411b-b78c-1f0ea772ac2c#O7vbh
挖矿可以设计一个动态调整难度的函数

SPECTRE

根据它的伪代码我写了一个 demo,看起来还不错。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
func Vote(node1 *dag.Blocknode, node2 *dag.Blocknode, graph *Graph) (int, int) {
voteOfnode1 := 0
voteOfnode2 := 0

//遍历全局图
Graph := graph
//这里graph一开始要传dag.Graph这个全局图,之后可以传past集或者future集
for k, z := range Graph.nodes {
_, ok1 := Graph.getFuture(node1)[k]
_, ok2 := Graph.getFuture(node2)[k]
if ok1 && !ok2 {
voteOfnode1 += 1
} else if !ok1 && ok2 {
voteOfnode2 += 1
} else if ok1 && ok2 {
//取决于past(z)的投票结果
tem1, tem2 := Vote(node1, node2, Graph.getPast(z))
if tem1 > tem2 {
voteOfnode1 += 1
} else {
voteOfnode2 += 1
}
} else if !ok1 && !ok2 {
//z的投票结果取决于future(z)的投票结果
tem1, tem2 := Vote(node1, node2, getFutureToGraph(Graph.getFuture(z)))
if tem1 > tem2 {
voteOfnode1 += 1
} else {
voteOfnode2 += 1
}

} else if z == node1 {
voteOfnode1 += 1
} else if z == node2 {
voteOfnode2 += 1
}

}

return voteOfnode1, voteOfnode2
}