一、简介

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

二、处理stratumjob消息

  sserver从kafka消息队列中接收JobMaker发送的StratumJob消息。先判断该Job是否超时或重复,若是则不进行后续处理。保存该Job。接着判断该Job的prevBlockHash(上一区块哈希)是否与最近一次广播的Job的prevBlockHash是否相同,若不同,则将之前所有Job都设置为stale并将该Job广播给所有矿机;若相同且最近一次广播的Job是空块block(poolwatcher会发送空块block),若不同否则将该Job广播给所有矿机。

三、获取userlist

  btcpool没有提供账号模块,所以最简单的方式是另外实现一个账号模块并提供http api接口,然后sserver通过http api没隔一段时间取获取一批账号。 

四、与矿机通讯

  矿机与sserver建立连接后(每台矿机对应一个session),通过stratum协议通讯,具体细节见《btcpool之stratum协议》。矿机先向矿池订。然后请求授权,矿池对矿机的请求授权进行验证--判断账号(或用户名)是否有效,若无效则返回错误。授权通过后,保存用户id及矿工名,并将默认挖矿难度及最新的Job下发给矿机。矿机计算到符合目标的share后,提交给矿池,然后矿池对该share进行处理。当有新Job并需要广播时,sserver将新Job广播给所有矿机。但某个矿机的挖矿难度需要调整时,sserver给矿机下发新难度。

五、处理share

  矿池收到矿机提交的share(包含任务号、时间戳、nonce及extraNonce2)后,先判断该share是否无效(重复、对应的Job已stale或时间无效、share不符合Job的target),若无效则返回error给矿机并增加该矿机的无效share数量,若该矿机最近提交的无效share数量没有超过上限,则将该share发送到kafka消息队列(为了统计拒绝率)。否则将share发送到kafka消息队列,并返回成功给矿机。另外判断其是否符合块的target,若是则将该块及coinbase交易发送到kafka消息队列并将所有的Job设置为stale。

六、调整挖矿难度

  sserver会为每个session维护一个难度控制器,当矿机提交的share太频繁时,难度控制会翻倍增加难度,当矿机提交的share太少时,难度控制器会减半降低难度。

btcpool之StratumServer的更多相关文章

  1. btcpool之总架构

    一.架构图 二.模块划分 整个btcpool分成GbtMaker.BlockMaker.JobMaker.StratumServer.PoolWatcher.statshttpd.sharelogge ...

  2. btcpool之BlockMaker

    一.简介 BlockServer将StratumServer发送的solvedshare数据(块头和coinbase交易)与GbtMaker发送的rawgbt数据(其他交易)一起组装成一个块,然后通过 ...

  3. btcpool之JobMaker

    一.简介 JobMaker从kafka消息队列接收rawgbt消息,然后解码该消息中的gbt数据,生成Job,发送到kafka消息队列. 二.StratumJob结构 StratumJob结构是Job ...

  4. btcpool之Stratum协议

    一.简介 矿机(或挖矿软件)与矿池之间通过stratum协议通讯,它包括订阅.授权.下发难度.下发任务.提交share五种消息. 二.订阅(mining.subscribe) 矿机启动后,先和矿池建立 ...

  5. btcpool之GbtMaker

    一.简介 GbtMaker全称getblocktemplate maker,它通过getblocktemplate rpc接口从bitcoind获得挖矿所需数据,然后把该数据发送到kafka消息队列. ...

随机推荐

  1. django 第四天

    简单的一对多的页面 实现的页面结果如下 利用正则匹配 1.x系列和2.x系列django的用法不同,....他x的. 关于正则匹配 我一直没能实现,再试试吧 路由分发,尤其是在多个页面的时候 app0 ...

  2. 如何利用docker 构建golang线上部署环境

    公司最近开发了一个项目是用golang 写的,现在要部署到线上环境去,又不想在服务器上装单独的golang,决定用docker 封装下,直接打到镜像里面,然后就直接在hub.docker.com上面搜 ...

  3. python之MySQL MySQLdb 推荐使用姿势,解决中文乱码

    0.目录 2.setup(1) 安装步骤,可以顺带安装mysql administrator和mysql query browser(2) 安装完毕,修改 my.ini(3) 重启 mysql 服务: ...

  4. pandas合并merge-【老鱼学pandas】

    本节讲述对于两个数据集按照相同列的值进行合并. 首先定义原始数据: import pandas as pd import numpy as np data0 = pd.DataFrame({'key' ...

  5. debian安装redis

    添加rc.local文件cat </etc/rc.local#!/bin/sh -eexit 0EOF cd /opt wget http://download.redis.io/release ...

  6. docker+fastdfs+nginx 实现分布式大文件存储系统以及视频缓存播放

    废话不多说,直接开撸 首先是一些准备工作: 1.关闭防火墙 service iptables stop --- fastdfs虽然在docker部署,但是使用的是主机网络,所以关闭防火墙. 2  下载 ...

  7. python3 使用代理

    #代理使用 >>> proxy_handler=urllib.request.ProxyHandler({'http':'211.81.31.18:8081'}) >>& ...

  8. MongoDB 组合多个条件查询($and、$in、$gte、$lte)

    一,问题描述 数据格式: id, timeStamp,count 条件1:查询 某个时间段 内的数据: timeStamp BETWEEN startTime AND endTime.比如 timeS ...

  9. Mybatis_3.基于注解的增删改查

    1.实体类User.java public class User { private int id; private String name; private int age; //getter.se ...

  10. vee-validate的使用

    官网地址:http://vee-validate.logaretm.com/ 这是一个插件Vue.js可以验证输入字段,显示错误,在一个简单而强大的方法.学习vee-validate,首先可以去阅读官 ...