共计 1022 个字符,预计需要花费 3 分钟才能阅读完成。
矿工通过 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。