矿工通过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。