initusercoin

package
v0.0.0-...-7258307 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Oct 26, 2020 License: MIT Imports: 13 Imported by: 4

README

Init User Coin

通过拉取每个币种的子账户名/puid列表来增量的初始化zookeeper里的用户币种记录。

该程序是可选的,取决于矿池的用户系统架构。如果你的子账户列表根本不区分币种,就不需要部署该程序,直接使用Switcher API Server的定时任务初始化币种记录即可。

子账户名/puid列表接口

本程序所要求的子账户名/puid列表与 BTCPool 里 sserver 要求的相同,具体说明如下:

接口约定

假设配置文件为

{
    "UserListAPI": {
        "btc": "http://127.0.0.1:8000/btc-userlist.php",
        "bcc": "http://127.0.0.1:8000/bcc-userlist.php"
    },
    "IntervalSeconds": 10,
    ...
}

则程序会启动两个goroutine(线程),同时访问 btcbcc 的子账户名/puid列表接口。

btc的子账户名/puid列表接口为例,首次访问的实际URL为:

http://127.0.0.1:8000/btc-userlist.php?last_id=0

接口返回完整的用户/puid列表,如:

{
    "err_no": 0,
    "err_msg": null,
    "data": {
        "aaa": 1,
        "bbb": 2,
        "mmm_btc": 4,
        "vvv": 5,
        "ddd": 6
    }
}

程序将遍历该列表并将用户aaabbbvvvddd的所挖币种设置为btc。该程序只负责初始化,不负责后续的币种切换,因此它简单的认为出现在btc列表中的用户所挖币种就是btc,出现在bcc列表中的用户所挖币种就是bcc

此外,带有下划线的子账户名将被跳过,因此程序不会设置mmm_btc子账户的所挖币种。

等待 IntervalSeconds 秒后,程序将再次访问如下URL:

http://127.0.0.1:8000/btc-userlist.php?last_id=6

其中6为上次得到的最大puid。

如果没有puid大于6的用户被注册,接口返回空data对象:

{
    "err_no": 0,
    "err_msg": null,
    "data": {
    }
}

否则,接口返回puid大于6的用户,如:

{
    "err_no": 0,
    "err_msg": null,
    "data": {
        "xxx": 7
    }
}

此后,用户xxx的所挖币种会被设置为btc,并且last_id变为7

备注
  1. 重启该程序是安全的。虽然程序会重新开始遍历子账户列表,但是对于zookeeper中已经存在的子账户,该程序不会再写入记录。因此,该程序的重启不会影响用户后续的币种切换。

  2. 该程序可以一直运行,这样它就可以增量的初始化刚注册的新用户的币种了。

  3. 同一个子账户在btcbcc列表中同时出现的话,该程序将其初始化为btcbcc取决于它先处理了哪边的记录。如果你的所有子账户都会在两边同时出现,并且puid也相同,或者你的子账户列表根本不区分币种,就不需要部署该程序,直接使用Switcher API Server的定时任务初始化币种记录即可。

关于带有下划线的子账户名

带有下划线的子账户名可以用于“用户其实在btcbcc币种下各有一个子账户,但是想让用户感觉自己只有一个子账户”的情况。具体的做法是:

  1. 假设用户在btc币种下已经有了一个子账户,为mmm
  2. 用户操作币种切换功能,欲切换到bcc。此时,系统自动为用户在bcc币种下创建子账户,名为mmm_bcc。该子账户可能具有和mmm子账户不同的puid
  3. 系统同时调用币种切换API,将用户mmm的币种切换为bcc,如http://10.0.0.12:8082/switch?puname=mmm&coin=bcc
  4. 与此同时,要保证UserCoinMapURL 返回的用户mmm的币种也为bcc。此外,UserCoinMapURL的返回结果中不应该出现带有下划线的子账户名(因为从逻辑上来说带有下划线和不带下划线的子账户为同一个子账户)。
  5. 用户依然使用子账户名mmm连接矿池。此时,stratumSwitcher将会把连接转发到bccsserver。但是bcc处没有名为mmm的子账户,所以矿机认证会失败。此时,stratumSwitcher会自动将子账户名转换为mmm_bcc重试,此时便会成功。用户已有的矿机也会这样被切换到bcc币种的mmm_bcc子账户。
参考实现

这里有一个实现UserListAPI的例子:https://github.com/btccom/btcpool/issues/16#issuecomment-278245381

构建 & 运行

安装golang

mkdir ~/source
cd ~/source
wget http://storage.googleapis.com/golang/go1.10.3.linux-amd64.tar.gz
cd /usr/local
tar zxf ~/source/go1.10.3.linux-amd64.tar.gz
ln -s /usr/local/go/bin/go /usr/local/bin/go

构建

mkdir -p /work/golang
export GOPATH=/work/golang
GIT_TERMINAL_PROMPT=1 go get github.com/btccom/btcpool-go-modules/initUserCoin

编辑配置文件

mkdir /work/golang/initUserCoin
mkdir /work/golang/initUserCoin/log
cp /work/golang/src/github.com/btccom/btcpool-go-modules/initUserCoin/config.default.json /work/golang/initUserCoin/config.json
vim /work/golang/initUserCoin/config.json

创建supervisor条目

vim /etc/supervisor/conf.d/switcher-inituser.conf
[program:switcher-inituser]
directory=/work/golang/initUserCoin
command=/work/golang/bin/initUserCoin -config=/work/golang/initUserCoin/config.json -log_dir=/work/golang/initUserCoin/log -v 2
autostart=true
autorestart=true
startsecs=6
startretries=20

redirect_stderr=true
stdout_logfile_backups=5
stdout_logfile=/work/golang/initUserCoin/log/stdout.log

运行

supervisorctl reread
supervisorctl update
supervisorctl status
更新
export GOPATH=/work/golang
GIT_TERMINAL_PROMPT=1 go get -u github.com/btccom/btcpool-go-modules/initUserCoin
diff /work/golang/src/github.com/btccom/btcpool-go-modules/initUserCoin/config.default.json /work/golang/initUserCoin/config.json

Documentation

Index

Constants

This section is empty.

Variables

View Source
var (
	// APIErrPunameIsEmpty puname为空
	APIErrPunameIsEmpty = NewAPIError(101, "puname is empty")
	// APIErrPunameInvalid puname不合法
	APIErrPunameInvalid = NewAPIError(102, "puname invalid")
	// APIErrCoinIsEmpty coin为空
	APIErrCoinIsEmpty = NewAPIError(103, "coin is empty")
	// APIErrCoinIsInexistent coin为空
	APIErrCoinIsInexistent = NewAPIError(104, "coin is inexistent")
	// APIErrReadRecordFailed 读取记录失败
	APIErrReadRecordFailed = NewAPIError(105, "read record failed")

	// APIErrWriteRecordFailed 写入记录失败
	APIErrWriteRecordFailed = NewAPIError(107, "write record failed")

	// APIErrRecordExists 记录已存在
	APIErrRecordExists = NewAPIError(108, "record exists, skip")
)

Functions

func GetSafetyPeriod

func GetSafetyPeriod() int64

GetSafetyPeriod 获取用户更新的安全期(在安全期内,子账户可能尚未进入sserver的缓存)

func GetUserUpdateTime

func GetUserUpdateTime(puname string, coin string) int64

GetUserUpdateTime 获取用户的更新时间(即进入列表的时间)

func HTTPPost

func HTTPPost(api AutoRegAPIConfig, data interface{}) (response []byte, err error)

HTTPPost 调用HTTP Post方法

func InitUserCoin

func InitUserCoin(coin string, url string)

InitUserCoin 拉取用户id列表来初始化用户币种记录

func Main

func Main(configFilePath string)

Main function

func RunUserAutoReg

func RunUserAutoReg(config *ConfigData)

RunUserAutoReg 运行自动注册任务

Types

type APIError

type APIError struct {
	// 错误号
	ErrNo int
	// 错误信息
	ErrMsg string
}

APIError API错误结构

func NewAPIError

func NewAPIError(errNo int, errMsg string) *APIError

NewAPIError 新建一个APIError

func (*APIError) Error

func (apiErr *APIError) Error() string

type AutoRegAPIConfig

type AutoRegAPIConfig struct {
	IntervalSeconds time.Duration
	URL             string
	User            string
	Password        string
	DefaultCoin     string
	PostData        map[string]string
}

AutoRegAPIConfig 用户自动注册API定义

type ConfigData

type ConfigData struct {
	// UserListAPI 币种对应的用户列表,形如{"btc":"url", "bcc":"url"}
	UserListAPI map[string]string
	// IntervalSeconds 每次拉取的间隔时间
	IntervalSeconds uint

	// Zookeeper集群的IP:端口列表
	ZKBroker []string
	// ZKSwitcherWatchDir Switcher监控的Zookeeper路径,以斜杠结尾
	ZKSwitcherWatchDir string

	// EnableUserAutoReg 启用用户自动注册
	EnableUserAutoReg bool
	// ZKAutoRegWatchDir 用户自动注册的zookeeper监控地址,以斜杠结尾
	ZKAutoRegWatchDir string
	// UserAutoRegAPI 用户自动注册API
	UserAutoRegAPI AutoRegAPIConfig
	// StratumServerCaseInsensitive 挖矿服务器对子账户名大小写不敏感,此时将总是写入小写的子账户名
	StratumServerCaseInsensitive bool
	// ZKUserCaseInsensitiveIndex 大小写不敏感的子账户索引
	//(可空,仅在 StratumServerCaseInsensitive == false 时用到)
	ZKUserCaseInsensitiveIndex string

	// 是否启用 API Server
	EnableAPIServer bool
	// API Server 的监听IP:端口
	ListenAddr string
}

ConfigData 配置数据

type HTTPRequestHandle

type HTTPRequestHandle func(http.ResponseWriter, *http.Request)

HTTPRequestHandle HTTP请求处理函数

type UserIDMapEmptyResponse

type UserIDMapEmptyResponse struct {
	ErrNo  int           `json:"err_no"`
	ErrMsg string        `json:"err_msg"`
	Data   []interface{} `json:"data"`
}

UserIDMapEmptyResponse 用户id列表接口在用户数为0时候的响应

type UserIDMapResponse

type UserIDMapResponse struct {
	ErrNo  int            `json:"err_no"`
	ErrMsg string         `json:"err_msg"`
	Data   map[string]int `json:"data"`
}

UserIDMapResponse 用户id列表接口响应的数据结构

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL