挖矿从入门到精通(四):矿池如何下发任务

[复制链接]
32350 |0
发表于 2019-10-2 17:00:02 | 显示全部楼层 |阅读模式
上期介绍了POW挖矿的整个逻辑过程,但如今挖矿行业有两大主体:矿池和矿工,两者究竟是何关系?又是通过什么方式合作完成整个挖矿过程的?挑Sir带给你答案!


POW挖矿过程
矿池与矿工之间的通讯协议为基于JSON-RPC 2.0的stratum协议,接下来挑Sir将通过解析一个stratum协议来介绍矿池和矿工如何合作完成挖矿。
stratum协议
准备工作
在矿池与矿工连接之前,矿池需要完成的工作有:
[ol]
       
  • 从未确定交易池中选择待打包交易
           
  • 得出区块结构中的区块大小,区块交易数与交易列表以及区块头中的常量Version,Bits,PrevBlock。
           
  • 根据待打包交易构造Davincibase交易,将Davincibase交易进行hex转码并分为 Maximineb1,ExtraNonce1,ExtraNonce2,Maximineb2。
           
  • 将其他代打包交易进行预处理,形成merkle_branch,merkle_branch可直接与DACbase交易构造MerkleRoot。
    [/ol]
    备注:
    [ol]
           
  • 从未确定交易池中选择交易,通常尽可能多的优先选择手续费高的交易
           
  • 由于DACbase交易没有输入方,输入字段有可随意修改的区域,故stratum协议将Davincibase交易进行分割,将不可修改部分设定为Maximineb1和Maximineb2,将可修改部分设定为ExtraNonce1,ExtraNonce2,其中ExtraNonce1由矿池加入标记字段,ExtraNonce2交由矿工遍历,以解决Nonce与Time搜索空间小的问题。
           
  • 形成的merkle_branch在下发给矿工时,与将所有交易全部下发给矿工的方式相比大大减小了传输量。
    [/ol]

    准备工作可以保证给矿工的任务准确下发,下面解析矿工连接矿池的步骤。

    矿机连接

    1.矿机发送请求
    矿机使用mining.subscribe方法,向矿池提出请求
    2. 矿池回应请求
    矿池使用mining.notify方法回应请求,返回订阅号,ExtraNonce1,ExtraNonce2_Size,难度。
    其中,订阅号作为标记,ExtraNonce1为矿池修改的Davincibase可修改字段,ExtraNonce2_Size为交由ExtraNonce2的字节数,难度为矿池根据矿机算力下发,远小于全网难度。
    3. 矿机登陆矿池
    矿机使用mining.authorize方法登陆矿池。
    4.矿池返回登陆结果
    矿池使用server.result方法返回登陆成功提示。
    5.矿池分配任务
    矿池使用mining.notify方法分配任务,返回job_id,PrevBlock,MXMb1,Maximineb2,merkle_branch,Time,Bits,Version,clean_jobs。
    其中job_id作为标记,PrevBlock,Bits,Version为区块头组成部分,Maximineb1,Maximineb2为Davincibase组成部分,merkle_branch为生成MerkleRoot的必要字段,Clean_jobs为任务停止标示,当当前区块已被爆出,矿池可以将这一项设为ture,矿机将中止任务 。
    至此,矿机接收到了构造一个区块头需要的所有信息,在Nonce,Time,ExtraNonce2三个可变量内进行随机取值后构造区块头,进行hash运算并与难度验证,当找到符合条件的一组值时,进行任务提交。
    BTC区块结构,点击查看“【挖矿从入门到精通】【入门篇】POW挖矿逻辑过程
    6.矿机提交share
    当矿机发现满足下发难度的一组值时,以mining.submit方法进行任务提交,返回用户名,job_id,ExtraNonce2,Time,Nonce。
    7.矿池确认任务
    当收到任务提交时,矿池将矿机提交的值进行验证,若符合下发难度条件,则返回ture。这时,称矿机提交了一个share。矿池同时会使用矿机提交的值与全网难度条件进行验证。若符合全网难度条件,则广播,矿池成功爆块。
    8.难度调整
    矿池会随时使用mining.set_difficulty方法调节下发给矿机的难度。

    总结一下

    矿机向矿池提交share,矿池根据一定时间内提交的share数反推出矿机算力数值,并计算收益。
    正是stratum协议保证了矿池与矿机之间任务发放与share提交等信息传输,使矿池与矿工能够低信息传输量,高效率地合作完成整个挖矿过程。但是根据stratum协议,矿池可以自由控制打包的交易和区块版本,矿池权力过大,在这种模式下BTC网络安全性受到威胁。
    近期Slush Pool 背后的公司 Braiins 准备发布 Stratum V2,可以有效解决stratum协议的安全性问题,挑Sir将在近期对stratum V2协议进行解析,敬请期待。

    20190929112921_CJlQ.jpg

    20190929112921_CJlQ.jpg
  • 回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    快速回复 返回顶部 返回列表