一、简介

  矿机(或挖矿软件)与矿池之间通过stratum协议通讯,它包括订阅、授权、下发难度、下发任务、提交share五种消息。

二、订阅(mining.subscribe)

  矿机启动后,先和矿池建立TCP连接,然后向矿池发送订阅消息,消息内容如下:

  {"id":1,"method":"mining.subscribe","params":[]}

  矿池收到矿机的订阅消息后,响应消息内容如下:

  {"id":1,"result":[[["mining.set_difficulty","01000000"],["mining.notify","01000000"]],"01000000",8],"error":null}

  其中id与订阅消息中id相同。result是一个数组,它包含三部分,第一部分也是个数组其实可以为空,第二部分是extraNonce1(一般是session id),第三部分是extraNonce2的长度,一般为8字节。

三、授权(mining.authorize)

  矿机收到矿池的订阅响应消息后,接着向矿池发送授权消息,消息内容如下:

  {"id":2,"method":"mining.authorize","params":["zsc.1","x"]}

  params包含两部分,第一部分是矿工名,第二部分是矿工密码(随意)。

  矿池收到矿机的授权消息后,先对矿工名进行验证,矿工名的第一部分(“.”左边的部分)为用户名或子账号名,若该用户名不存在,则授权失败,返回error,消息内容如下:

  {"id":2,"result":null,"error":[29,"Invalid username",null]}

  error中第一部分是错误码,第二部分是错误描述。若授权成功,则返回消息内容如下:

  {"id":2,"result":true,"error":null}

四、下发难度(mining.set_difficulty)

  授权成功后,矿池会向矿机下发难度,消息内容如下:

  {"id":null,"method":"mining.set_difficulty","params":[8192]}

  其中id为null,params的值为十六进制的挖矿难度。注:创世块的难度为1。

五、下发任务(mining.notify)

  授权成功后,矿池会先向矿机下发难度,然后下发任务,消息内容如下:

  {"id":null,"method":"mining.notify","params":["0","877be49f81bbe7ae192f869006b2f562ba33693f00170fc70000000000000000","02000000010000000000000000000000000000000000000000000000000000000000000000ffffffff1f03dcbe08044871c15c50616e64614d696e6572","ffffffff022de3974d000000001976a914b525972953d94ab3225446d4a04ac67daaab6d5888ac0000000000000000266a24aa21a9ed0316ab39fb538e1b1397176df57a5138170ad549e2a2a8e39ce0adb4296ca40900000000",["75f1158642ca84dd5c9c1d47505cf573d9abaa9cae570c9487dc7cba5b707987","d68e1776784f3447dfab9a587f3697c9b9d9f42e459c88ec346093c3f1f406f8","88a52d4bfe331b177cf7a7cfb15d3222ef3e2e45e8f4f4fdffff569d8ba6b273","7140153d3d4717bcaec2872cc1dff38ecdaf8264224db639afddf23f62b49d6d","e15068416978ed16dbd744cacc2a61ab136cd9b1a40df8a49407c18616e2d09f","6506431c809f6986e47944cc27f5e1e1cf257bafc524eda4b0051727dfd56097","c1bc2e0f5ee63b2fb50784372ded218e975b45876793ca20431513897d053bb2","0ce74bdfda5b56d9661823853bed7d57cb12958f814ca984dc99f70841bdcf8a","7f4d05180acb38d93cf920eee2c3309417d44641f3623c4ffc19be0fcb65ae2e","9496d9f27076acc8a231cd37695e6747bf5925eecf0b2ae4530d43134a717ebf","50646bd3f3f4aa48b4111de79da154c7031eae0096a3ea114b6a356a518dac71"],"20000000","172c4e11","5cc1713d",true]}

  其中id为null。params内容如下:

  params[0]:任务号;

  params[1]:前一区块hash;

  params[2]:coinbase1;

  params[3]:coinbase2;

  params[4]:merkle branch哈希数组;

  params[5]:version区块版本号;

  params[6]:bits下一区块的压缩目标;

  params[7]:time当前时间戳;

  params[8]:isclean,清空任务,不是所有矿机都支持;

六、提交share(mining.submit)

  矿机计算到符合任务的share之后,向矿池提交该share,消息内容如下:

  {"id":3,"method":"mining.submit","params":["zsc.1","0","b909000000000000","5cc1713f","5a0199e2"]}

  params第一部分是矿工名,第二部分是任务号,第三部分是extraNonce2,第四部分是当前时间戳,第五部分是nonce。第六部分可选(上面没有),是版本掩码。

  矿池收到矿机发送的提交share消息后,验证该share是否有效(超时或没有达到target),若有效,则返回提交有效的结果给矿机:

  {"id":3,"result":true,"error":null}

  若无效,则返回error,消息内容类似授权失败消息,只是错误码和错误描述不同。

btcpool之Stratum协议的更多相关文章

  1. btcpool之StratumServer

    一.简介 StratumServer(简称sserver)接收JobMaker发送的stratumjob消息,从http api获取用户列表,对外部矿机提供服务. 二.处理stratumjob消息 s ...

  2. 详解区块链P2P网络

    根据前一篇文章<从微观到宏观理解区块链>我们已经了解到,微观上,区块链本质就是一种不可篡改且可追踪溯源的哈希链条:宏观上,还具备了另外三个基本特征:分布式存储.P2P 网络和共识机制.分布 ...

  3. BlockTrain网络

    [BlockTrain网络] 1.每个节点都参与全⽹络的路由功能,同时也可能包含其他功能.每个节点都参与验证并传播交易及区块信息,发现并维持与对等节点的连接.在图6-1所⽰的全节点⽤例中,名为“⽹络路 ...

  4. 挖矿程序的工作原理(BTC为例)

    Mining时代进化:CPU挖矿 -> GPU挖矿 -> FPGA挖矿 -> ASIC挖矿CPU挖矿时代:SENGENERATEGPU挖矿时代:GETWORK Miner:挖矿的程序 ...

  5. NOMP矿池搭建

    本文将以dash(x11)和Raven(x16rv2)为例子来说明多算法矿池的搭建过程. 1 环境准备 1.1 准备Ubuntu 准备虚拟机或物理机,操作系统为Ubuntu 16.04 1.2 安装必 ...

  6. 使用NTP协议服务器时间同步

    NTP是用来使系统和一个精确的时间源保持时间同步的协议.建议大家在自己管理的网络中建立至少一台时间服务器来同步本地时间,这样可以使得在不同的系统上处理和收集日志和管理更加容易.我们分别从windows ...

  7. golang ntp协议客户端

    NTP(Network Time Protocol,网络时间协议)是由RFC 1305定义的时间同步协议,用来在分布式时间服务器和客户端之间进行时间同步.NTP基于UDP报文进行传输,使用的UDP端口 ...

  8. 通过NTP协议进行时间同步

    最近发现手机的时间不是很准了,便到网上下了一个同步时间的小程序,简单了看了一下它的原理,是通过NTP协议来实现校时的,就顺便学习了一下NTP协议,用C#写了个简单的实现. NTP(Network Ti ...

  9. c++ 常见网络协议头

    //NTP协议 typedef struct _NTP_HEADER { uint8_t _flags;//Flags 0xdb uint8_t _pcs;//Peer Clock Stratum u ...

随机推荐

  1. lnoi2019游记

    好诡异的省选...... day0: 莫名其妙的订了下午从sy到dl的火车,得五点多才能到,所以.......是不需要试机的吗...... 好吧... 看着停课的jflr们,感觉他们好强啊,像我这种酱 ...

  2. jQuery第七章插件的编写和使用

    1.本章目标 编写jquery插件 2.插件 也称为扩展,是一种按照一定的规范的应用程序接口编写出来的程序 插件的目标是给已有的一系列函数做一个封装,以便在其他的地方复用,方便维护和开发效率 3.jq ...

  3. yagmail 实现发邮件

    yagmail 实现发邮件 yagmail 可以更简单的来实现自动发邮件功能. github项目地址: https://github.com/kootenpv/yagmail 安装 pip insta ...

  4. thinkphp3.2 删除缓存文件

    //删除后台缓存 public function ajaxcleanCache(){ $dir = "./Application/Runtime/Logs/Admin/"; if( ...

  5. thread - 传递引用参数

    当给 thread 的执行函数传递指针参数时,没有任何问题,但是如果想传递引用,按照普通函数的调用方法会遇到编译失败: #include <iostream> #include <t ...

  6. 【Vue】-- 数据双向绑定的原理 --Object.defineProperty()

    Object.defineProperty()方法被许多现代前端框架(如Vue.js,React.js)用于数据双向绑定的实现,当我们在框架Model层设置data时,框架将会通过Object.def ...

  7. WPF:解决数据绑定时不更新数据的问题

    当用户在窗体控件中修改数据时,如果此时用户点击其它窗体会出现数据没有更新的情况. 这是由于数据绑定默认是通过失去焦点来提交数据的.可通过属性变更方法来更新数据: <TextBox.Text> ...

  8. python 函数split()

    函数:split() Python中有split()和os.path.split()两个函数,具体作用如下:split():拆分字符串.通过指定分隔符对字符串进行切片,并返回分割后的字符串列表(lis ...

  9. 2017-11-4—LTspice

    LTspice这个软件基本上上手就能用,没什么好说的. ADI的一些器件下载的spice文件可能是.cir的需要使用cadence的pspice软件打开后另存为.dir文件使用.(比如ad4096) ...

  10. sybase central 报 NullPointerException 解决

    准备发布版本,但是要创建数据库的时候遇到了问题,发现之前可以正常打开的sybase Central 现在无法打开了.苦恼一段时间后找到如下解决方法. 报错如下: 解决如下: 正常打开: