讲到矿池肯定得先说挖矿,那么离不开比特币的挖矿
作为数字货币的始祖比特币,有必要去调研下比特币挖矿的源码,主要在miner.cpp、miner.h部分;
大致流程为(可能不正确):
构建新区块,整合交易,字段填充,while循环在缓存区计算双SHA256结果nNounceFound,判断是否小于hashTarget,不断增加随机数nNounce,符合条件就是工作量证明,执行区块验证checkWork,验证的过程也是复杂的。
-----------------------------------------------------------------------------
矿池就是通过专用的挖矿协议来协调数量庞大的矿工,所以其系统也需要高并发-分布式,并且做好性能优化。
(可以看 http://licstar.net/archives/category/程序设计/矿池 构建山寨币矿池的故事)
发展趋势: CPU挖矿→GPU挖矿→FPGA挖矿→ASIC挖矿→大规模集群挖矿;
算力:拥有的矿机每秒能做多少次hash碰撞。 ASIC(3.5THash/s),所以集群的话在此基础上乘X;
挖矿收益:产生的比特币*币价-矿机成本-电费-维护费及人工成本-矿场折旧费等
挖到多少个区块的概率符合泊松分布,对于个体矿工投入很多资源成本最后收益仍为负数,需要矿池保证稳定收益;
矿池是一个全自动的开采平台,即矿机接入矿池——提供算力——获得收益。
share:设置一些低难度目标的工作量来量化矿工的贡献。
分配方式是关键:
- PPLNS( Pay Per Last N Shares ):运气成分重要、收益忽高忽低,分配的滞后性
- PPS( Pay-Per-Share ):支持立即取现,减少矿工的风险,估算每天固定的收益,矿池会收取较高的手续费
- RBPPS:和PPS 一样的原理,但是排除了死块的奖励
- PROP:和实际SOLO挖矿一模一样。但是是等真正区块被确认了才结算各自share对应的收益。
开源情况:
- btcpool(比特大陆):https://github.com/btccom/btcpool
- PHP-MPOS:https://github.com/MPOS/php-mpos
- node-open-mining-portal:https://github.com/zone117x/node-open-mining-portal
- Powerpool:https://github.com/sigwo/powerpool
---------------------------------------------------------------------------
以下来自于 http://www.51dev.com/qukuailian/763
矿池挖矿原理
矿工通过getblocktemplate协议与节点交互,或矿池采用stratum协议与矿工交互,即为矿池的两种典型搭建模式。
与getwork相比,getblocktemplate协议让矿工自行构造区块,因此使得节点与挖矿完全分离。矿工拿到一系列数据后,开始挖矿:
1、构建coinbase交易。
2、coinbase交易放在交易列表之前,构建hashMerkleRoot。因coinbase、以及交易次序均可调整,因此hashMerkleRoot空间可以认为无限大。因此getblocktemplate协议也使矿工获得了巨大的搜索空间。
3、构建区块头。
4、挖矿,即矿工可以在nNonce、nTime、hashMerkleRoot提供的搜索空间中涉及任意的挖矿策略。
5、上交数据,如果挖矿成功即提交给节点,由节点验证并广播。
getblocktemplate协议的问题:
1、矿工通过HTTP方式调用RPC接口向节点申请挖矿数据,因此网络中最新区块变动无法告知矿工,造成算力浪费。
2、每次调用getblocktemplate,节点都会返回1.5M左右数据,因频繁交互将因此增加大量成本。
Stratum协议将解决上述问题。
Stratum协议
Stratum协议,采用主动分配任务的方式,也即矿池任何时候都可以给矿工分派任务。对于矿工,如收到新任务,将无条件转向新任务。另外矿工也可以向矿池申请新任务。
最核心问题为,如何使得矿工获得更大的搜索空间。如果仅矿工仅可改变nNonce和nTime,交互数据少但搜索空间不足。如果允许矿工构造coinbase,搜索空间大但代价是需要将所有交易交给矿工,因此对矿池带宽要求较高。
Stratum协议巧妙解决了这个问题。即:基于Merkler树的原理,无需将全部交易发给矿工,只需将构造hashMerkleroot所需的少数几个节点交给矿工即可。同时将构造coinbase所需信息交给矿工,矿工可基于少数信息构造hashMerkleroot。照此方式,如果包含N笔交易,仅需将log2(N)个hash值交给矿工。因此可大大降低交互的数据量。
矿池的核心即给矿工分派任务,统计工作量并分发收益。矿池可以将区块难度分成更小的任务发给矿工,矿工完成任务提交矿池。如果全网区块难度要求前70位为0,那么矿池可以给矿工分派难度为前30位0的任务,矿池再判断是否碰巧前70位都为0。
------------------------
理解:
自行构建区块是很重要的,可以提升矿工的搜索空间,比如getblocktemplate协议,但是存在获取传输的数据量大,需要区块交易数据。
Stratum协议的好处就是修改为主动分配,快速告知矿工。同时保证矿工自己构建块,可以修改nNonce、nTime、hashMerkleRoot(只需给logN的hash值就可以构建root,因此最主要的只是修改了coinbase而已,而其它交易不用修改)。