Qimeer 挖矿技术原理解析

Cuckoo Cycle

Cuckoo Cycle算法概述

  1. 在一个N个节点M个边的二分图中搜索指定长度的环(cycle);
  2. 二分图使用Cuckoo hashtable存储,一边是奇数索引的节点,一边是偶数索引的节点;
  3. 两个重要特性:
    (1)当图变大时,找到符合要求的环将越来越困难;
    (2)在图中找到指定长度的环的概率随着M/N的增加而增加。
  4. 边是通过哈希函数SIPHASH产生的,SIPHASH函数的种子(seed或者称为key)是区块头的哈希值;
  5. ‘Proof‘ 是一组nonces,这组nonces是用来产生一个长度为42的环,PoW的结果很容易被其他节点验证。

产生边

1

  1. 假定有一个64个节点的图
  2. 随机生成32个边;
  3. U = SIPHASH(headerHash, 2nonce) mod 31
    V = SIPHASH(headerHash, 2
    nonce+1) mod 31

裁剪边

2

  1. 有一类特殊的边, 叶子边, 它是度为1的节点;
  2. 叶子边永远不可能是环的一部分;
  3. 通过消除叶子节点,降低找环的复杂性。

找环

3

  1. 完成裁边运算后,就是找特定长度的环,如果找到,就完成本次cuckoo cycle运算
  2. 完成PoW了吗?

难度控制

4

  1. 通过M/N的比率控制难度,但由于对于加密货币需要精确的调整难度,所以通过调整边(M)的数量控制难度并不合。因此在实际使用中设置了M/N = ½, 平均找到解的概率为2.2%。
  2. 所以在实际使用中还加入了类似比特币的hash难度。通过哈希函数获取cycle nonces的hash,再通过和目标难度进行比较。

Miner

POW挖矿原理

    工作量证明( PoW )通过计算一个数值( nonce ),使得拼揍上交易数据后内容进行一定的 Hash 值满足规定的上限。在节点成功找到满足的Hash值之后,会马上对全网进行广播打包区块,网络的节点收到广播打包区块,会立刻对其进行验证。

目标hash
0001fd98b388e77e9c6f042ac6b497cec46660deef75a55ebc7cfdf65cc0b965
header 头数据
hello qitmeer + nonce (从0,1<<32变化)
找到nonce 使得blake2b(头数据) 小于目标hash


所有散列函数都有如下一个基本特性:输入不同,hash值不同。

0001fd98b388e77e9c6f042ac6b497cec46660deef75a55ebc7cfdf65cc0b965

理论需要计算的hash的次数 ,16进制长度64,每个数字都是从(0-f)变化,因为计算hash值要小于目标hash值,所以前三位都必须是0,因为散列函数的随机性,每个数字都可看成独立事件,第一位出现0的概率是1/2^4,第二位是1/2^4,第三位也是,前三位同时出现的概率就是1/2^41/2^41/2^4 = 1/2^12 假设第四位可出现0 就符合答案标准,再乘以1/2^4 = 1/2^16

也就是挖矿设备需要计算2^16次 不同nonce的hash 可能获取到答案,因为这是概率,所以计算的次数越多,也越能提现出概率准确性。

每种挖矿设备的不同,每秒hash的速度不同,也就能知道每台设备对当前难度,需要挖多久挖到答案。

难度也会根据出块时间自适应调整。

技术角度讲为什么是显卡友好型,而不是CPU挖矿

首先不是CPU不能挖矿,二是显卡更适合挖矿。

刚刚原理的例子来看,nonce值是从0计算到1<<32次方,CPU计算可以开很多线程,分别从计算不同的nonce段,但是开的线程有限,并且开线程耗费资源,同步计算性没那么好。
而显卡设计就是为并行流计算设计,例:目前一般显卡就有256个工作组,每个工作组都有近2^27次方的计算单元,那么相当于每次可同时计算2^27 * 256 次nonce,得出答案的时间也大大减少。

因此说CPU不能挖矿只是表现形式上来说,CPU挖也能挖到,只是概率非常之小,当然和当前显卡投入成本均等的条件下来讲。

Cuckoo挖矿则是显卡和CPU都有利用,显卡则快速生成非常多的边,和快速进行去除干扰边。而CPU则进行将剩余有效边,通过深度优先算法找出环,最终对环nonce进行hash 是否符合一定难度。

因此想产出asic矿机也要耗费不小的成本,同时需要显卡并行计算能力和CPU计算能力,而这些正是显卡矿机所具备的。

Qitmeer Miner的实现原理


根据之前讲的输入不同,hash不同,有些矿工不在意的配置,可设置自定义备注,保持每个矿工不做重复劳动,一定程度增强公平性。防止大家用一样的软件,header头部都一样,那么在算力强的机器面前完全没机会。为什么说是一定程度,因为最终概率还是看hash次数越多,概率越准。

Qitmeer 基本实现原理是

1.找出当前可挖矿的GPU设备。
2.启动监听最新任务的协程,GBT。
3.启动监听提交任务的协程。
4.启动统计矿工提交情况的协程。
5.每个可挖矿的设备进行不停的挖矿尝试。
6.调用显卡并行计算,使用opencl sdk 通用接口,传输数据和计算逻辑,进行并行计算。

Double blake2b kernel 代码实现
https://github.com/HalalChain/qitmeer-miner/blob/master/kernel/blake2bdkernel.go
Cuckaroo kernel 代码实现
https://github.com/HalalChain/qitmeer-miner/blob/master/kernel/blake2bdkernel.go
Cuckaroo kernel 找环实现
https://github.com/HalalChain/qitmeer-miner/blob/master/cuckoo/graph.go
Docker-test-qitmeer

Qitmeer挖矿技术原理解析线上分享视频地址腾讯视频

1 Like