虽然这个 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 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 { tem1, tem2 := Vote(node1, node2, Graph.getPast(z)) if tem1 > tem2 { voteOfnode1 += 1 } else { voteOfnode2 += 1 } } else if !ok1 && !ok2 { 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 }
|