btcpool之StratumServer
一、简介
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的更多相关文章
- btcpool之总架构
一.架构图 二.模块划分 整个btcpool分成GbtMaker.BlockMaker.JobMaker.StratumServer.PoolWatcher.statshttpd.sharelogge ...
- btcpool之BlockMaker
一.简介 BlockServer将StratumServer发送的solvedshare数据(块头和coinbase交易)与GbtMaker发送的rawgbt数据(其他交易)一起组装成一个块,然后通过 ...
- btcpool之JobMaker
一.简介 JobMaker从kafka消息队列接收rawgbt消息,然后解码该消息中的gbt数据,生成Job,发送到kafka消息队列. 二.StratumJob结构 StratumJob结构是Job ...
- btcpool之Stratum协议
一.简介 矿机(或挖矿软件)与矿池之间通过stratum协议通讯,它包括订阅.授权.下发难度.下发任务.提交share五种消息. 二.订阅(mining.subscribe) 矿机启动后,先和矿池建立 ...
- btcpool之GbtMaker
一.简介 GbtMaker全称getblocktemplate maker,它通过getblocktemplate rpc接口从bitcoind获得挖矿所需数据,然后把该数据发送到kafka消息队列. ...
随机推荐
- pl/sql学习(4): 包package
本文简单介绍包, 目前来看我用的不多, 除了之前 为了实现 一个procedure 的输出参数是结果集的时候用到过 package. 概念: 包是一组相关过程.函数.变量.常量和游标等PL/SQL程序 ...
- phpstorm对laravel的一些使用技巧
安装laravel插件,设置ctrl+alt+s 二 安装智能提示插件 composer require barryvdh/laravel-ide-helper 在config/app.php的pro ...
- ExpandableListView
ExpandableListView 1.界面 Item_Group_layout 就一个TextView <?xml version="1.0" encoding=&quo ...
- WinForm 水晶报表的简单使用
今天需要做出一个水晶报表, 以前在学校的时候就看过一点点,有些印象, 但没有具体的了解过,今天百度了一下,发现这个东西相当的方便简单. 还很完美. 开发工具是VS2010,水晶报表没有内置.需要自己下 ...
- selenium基础实例学习
在这里我们通过selenium官方文档做给的实例以及翻译,做出如果代码注释 from selenium import webdriverfrom selenium.webdriver.common ...
- php实现根据字符串生成对应数组的方法
先看看如下示例: <?php $config = array( 'project|page|index' => 'content', 'project|page|nav' => ar ...
- angular.js使用ui-router注入报错,这里是版本问题导致的
报错如下: common.ts:604Uncaught SyntaxError: Unexpected token ) stateEvents.ts:211Uncaught SyntaxError: ...
- 201771010126 王燕《面向对象程序设计(Java)》第七周实验总结
实验七 继承附加实验 实验时间 2018-10-11 1.实验目的与要求 (1)进一步理解4个成员访问权限修饰符的用途: private--私有域或私有方法:只能在定义它的类中使用 public--公 ...
- (78)Wangdao.com第十五天_JavaScript 面向对象
面向对象编程(Object Oriented Programming,缩写为 OOP) 是目前主流的编程范式. 是单个实物的抽象, 是一个容器,封装了属性(property)和方法(method),属 ...
- nginx/php的redis模块扩展
redis模块介绍 redis2-nginx-module 可以实现 Nginx 以非阻塞方式直接防问远方的 Redis 服务,可以启用强大的 Redis 连接池功能,进而实现更多的连接与更快速的访问 ...