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太少时,难度控制器会减半降低难度。
最新文章
- SpringMVC常用配置-文件上传-基于Servlet 3.0
- freemarker
- mysqli常用错误处理函数
- HTML+CSS学习笔记 (10) - CSS格式化排版
- objectC时间用法
- WinForm聊天室
- 关于AVL实现的代码记录
- 使用devstack搭建openstack Newton 版本的坑
- 201521123057 《Java程序设计》 第6周学习总结
- salesforce lightning零基础学习(一) lightning简单介绍以及org开启lightning
- Java反射异常:java.lang.NoSuchFieldException
- ==运算符和equals()方法的区别
- Thymeleaf的一些操作
- ERP承接新后台优惠规则问题
- 下载神器(vip下载速度)
- Linux命令:readonly
- JS高级 - 面向对象5(继承,引用)
- spring学习 八 面向切面编程(AOP)概述
- hdu 5826 physics 物理题
- 用python解析pdf中的文本与表格【pdfplumber的安装与使用】
热门文章
- Dapper结合Repository模式的应用
- sklearn标准化-【老鱼学sklearn】
- Codeforces 1109D. Sasha and Interesting Fact from Graph Theory 排列组合,Prufer编码
- Python中append()与extend()的区别
- 自己总结的C#编码规范--7.文档下载 &; 总结
- [C#] 動的にアセンブリをロードする
- http连接基础类,负责底层的http通信
- 2019-2-21.NET中异常类(Exception)
- Elasticsearch学习笔记二
- BZOJ 4763