-
解决的问题:给出N个节点(奇偶两行)和M个边,在M个边中寻找一个闭环(即找到一个路径使得一个节点是起点也是终点)如图中的0-5-4-1-0:
8个节点6个边 一个解决方案
- 特点:即时验证,内存需求可扩展(可抵抗asic)
grin中计算过程
- hash1=black2b(header+nonce) 其中参与计算的header未包含pow字段
- solution,find=cuckoo(hash1)
cuckoo 把hash1当作SIPHAS0H的种子,然后随机生成M个边,再找出一个环 - 如果find,就返回一个solution,然后对该solution 计算hash并对比难度值是否符合要求
- 如果符合难度值,则广播区块
- 如果不符合难度值,重新组装header,继续步骤1
- 如果没有find,重新组装header,继续步骤1
The Mining Loop
得到链的最新状态,并在其头部创建一个块,包括以下东西
- 用evolving network difficulty 算法计算的最新的难度
- 从交易池获取的一系列经过验证的交易
- 一个coinbase交易
- 时间戳
- 一个随机生成的nonce,以便为区块头hash增加更多的随机性
- UTXO(fee)的merkle根。(fee还没有实现)
然后运行一个子循环一段时间(目前配置是2秒),会发生下面的事情
- 对区块头进行hash创建了一个hash值
- cuckoo 图生成器会被初始化,它需要以下的参数
- 潜在区块头的hash,它将作为SIPHASH 函数的关键字(key),该函数将为图中的一组nonce 0..N中的每个元素生成一对位置。
- 图的大小(这是一个共识参数)
- 一个简单的值(也是共识参数),代表着M\N的比率,这个比率表示的是图中找到解决方案的的可能性
- 然后cuckoo Cycle 检测算法试图在这个生成的图中找到一个解决方案(比如循环length是42),这其实就是挖矿。
- 如果解决方案找到(其实就是在这个cuckoo 图中找到那个满足条件的循环),证明的Blake2b hash将被创建,并且和当前的target difficulty进行比较。就是Additional Difficulty Control所描述的https://github.com/mimblewimble/grin/blob/master/doc/pow/pow.md#evolving-network-difficulty
- 如果Blake2b hash的难度比target difficulty大,或者相等。那这个区块将会被发送到block pool,然后再peer之间广播,验证。矿工开始挖下一个区块。
- 如果Blake2b哈希难度小于目标难度,则证明被抛出并且定时循环继续。
- 如果没有找到解决方案,请将标头中的nonce递增1,然后更新区块头的时间戳。以便在下一个循环中,会为cuckoo 图形生成器发送一个不同的hash值。
- 如果循环超时但未找到解决方案,请从顶部重新开始,收集新交易并完全创建新块。
两个难度
Additional Difficulty Control
这个难度是先在cuckoo 图中找到解决方案,这个方案的的最终呈现就是一个nonces。然后将这个hash和另外一个难度(evolving NetWork Difficulty)比较,[其实就是一个hash比大小的过程],如果成立,这个挖矿就是有效的。
所有,在cuckoo图中找到图了,其实还不一定成功,还需要进一步的验证
Evolving NetWork Difficlty
就是一个动态变化的难度值,目的是保证出块时间在60s。
这和hcd一样,也是进过一定的块之后,就会进行一次调整。
网友评论