酸饼博客
关注区块链技术应用与数字货币

区块链入门100问(25):如何理解比特币矿池的网络协议?

比特币系统采用的是工作量证明(Proof of Work)机制来达成共识,即是通过大量的计算找到随机数,跟其他字段一起取哈希,得到的哈希值小于目标值。这个工作就是我们所说的“挖矿”。其主要流程包括:
1. 构造新区块
2. 打包交易
3. 填充区块字段
4. 循环寻找随机数,直到计算出小于目标值的哈希值
5. 执行验证区块

由于挖矿难度太高,单个矿工能挖到区块的几率越小越小,用顶配的矿机,自己单独挖个几年都未必能挖到一个区块。为了降低风险,保证收益的稳定,矿工就加入矿池一起挖矿,按照工作量证明分配挖矿的收益。

矿工、矿池一起组成挖矿网络,成为比特币网络的一部分。在挖矿网络中,矿池通过专用的挖矿协议来协调数量庞大的矿工。

早期矿池用getwork协议来与矿工通讯与协同工作。getwork协议的最大意义是使挖矿的数据与计算彻底分离。在getwork协议之前,那时主要是CPU挖矿。挖矿节点都运行比特币的守护进程bitcoind。getwork普及之后,促使矿池诞生,这之后矿池的矿工只负责挖矿工作证明的计算。

在ASIC(Application Specific Integrated Circuit)矿机出现之后,挖矿速度得到极大提高,getwork给外部挖矿程序提供的搜索空间有限,矿机需要频繁调用节点客户端的RPC接口,这显然是不可行的。因此在ASIC矿机的时代来临之后,比特币矿池都不再使用getwork协议,但矿机内部仍然采用类似getWork的数据协议。

目前矿池采用的矿池协议是getblocktemplate和Stratum。其中getblocktemplate协议用于矿池与比特币节点客户端的通讯,Stratum用于矿池与矿机之间的通讯。

Stratum协议采用主动分配任务的方式,给矿工分配新的任务。矿工和矿池交互的接口数据结构和交互逻辑,Stratum协议对此进行了严格的规定:
1. 任务订阅。矿机启动,以mining.subscribe方法向矿池连接,用来订阅工作。矿池以mining.notify返回订阅结果与相关信息。
2. 任务分配。矿池定期以mining.notify方式将任务发给矿机。当矿机以mining.subscribe方法登记后,矿池也马上以mining.notify返回该任务。
3. 矿机登录。矿机在初始化连接之后,以mining.authorize方法,用某个帐号和密码登录到矿池,密码可空,矿池返回true登录成功。
4. 结果提交。矿机找到合法的任务结果时,就以“mining.submit”方式向矿池提交。
5. 难度调整。挖矿难度发生变化之后,矿池将难度调整通知下发给矿机,以mining.set_difficulty方法调整难度。
6.

总结一下。getwork实现了数据与挖矿分离,并且促进来矿池的产生。getblocktemplate主要用于矿池与网络节点对接,它给外部挖矿程序提供了最大自由度,彻底解决了外部挖矿程序与节点交互的可扩展性问题(scalability problems)。stratum解决了搜索空间不足的问题,同时也解决了矿池与矿机大量数据交互的问题。getblocktemplate和stratum这两个协议使大型矿池、矿场和大算力矿机成为可能。

未经允许不得转载:酸饼 » 区块链入门100问(25):如何理解比特币矿池的网络协议?
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

留言联系关于酸饼