|
|
|
/*
|
|
|
|
* Copyright 2014-2018 Con Kolivas
|
|
|
|
*
|
|
|
|
* This program is free software; you can redistribute it and/or modify it
|
|
|
|
* under the terms of the GNU General Public License as published by the Free
|
|
|
|
* Software Foundation; either version 3 of the License, or (at your option)
|
|
|
|
* any later version. See COPYING for more details.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef STRATIFIER_H
|
|
|
|
#define STRATIFIER_H
|
|
|
|
|
|
|
|
/* Generic structure for both workbase in stratifier and gbtbase in generator */
|
|
|
|
struct genwork {
|
|
|
|
/* Hash table data */
|
|
|
|
UT_hash_handle hh;
|
|
|
|
|
|
|
|
/* The next two fields need to be consecutive as both of them are
|
|
|
|
* used as the key for their hashtable entry in remote_workbases */
|
|
|
|
int64_t id;
|
|
|
|
/* The client id this workinfo came from if remote */
|
|
|
|
int64_t client_id;
|
|
|
|
|
|
|
|
char idstring[20];
|
|
|
|
|
|
|
|
/* How many readers we currently have of this workbase, set
|
|
|
|
* under write workbase_lock */
|
|
|
|
int readcount;
|
|
|
|
|
|
|
|
/* The id a remote workinfo is mapped to locally */
|
|
|
|
int64_t mapped_id;
|
|
|
|
|
|
|
|
ts_t gentime;
|
|
|
|
tv_t retired;
|
|
|
|
|
|
|
|
/* GBT/shared variables */
|
|
|
|
char target[68];
|
|
|
|
double diff;
|
|
|
|
double network_diff;
|
|
|
|
uint32_t version;
|
|
|
|
uint32_t curtime;
|
|
|
|
char prevhash[68];
|
|
|
|
char ntime[12];
|
|
|
|
uint32_t ntime32;
|
|
|
|
char bbversion[12];
|
|
|
|
char nbit[12];
|
|
|
|
uint64_t coinbasevalue;
|
|
|
|
int height;
|
|
|
|
char *flags;
|
|
|
|
int txns;
|
|
|
|
char *txn_data;
|
|
|
|
char *txn_hashes;
|
|
|
|
char witnessdata[80]; //null-terminated ascii
|
|
|
|
bool insert_witness;
|
|
|
|
int merkles;
|
|
|
|
char merklehash[16][68];
|
|
|
|
char merklebin[16][32];
|
|
|
|
json_t *merkle_array;
|
|
|
|
|
|
|
|
/* Template variables, lengths are binary lengths! */
|
|
|
|
char *coinb1; // coinbase1
|
|
|
|
uchar *coinb1bin;
|
|
|
|
int coinb1len; // length of above
|
|
|
|
|
|
|
|
char enonce1const[32]; // extranonce1 section that is constant
|
|
|
|
uchar enonce1constbin[16];
|
|
|
|
int enonce1constlen; // length of above - usually zero unless proxying
|
|
|
|
int enonce1varlen; // length of unique extranonce1 string for each worker - usually 8
|
|
|
|
|
|
|
|
int enonce2varlen; // length of space left for extranonce2 - usually 8 unless proxying
|
|
|
|
|
|
|
|
char *coinb2; // coinbase2
|
|
|
|
uchar *coinb2bin;
|
|
|
|
int coinb2len; // length of above
|
|
|
|
|
|
|
|
/* Cached header binary */
|
|
|
|
char headerbin[112];
|
|
|
|
|
|
|
|
char *logdir;
|
|
|
|
|
|
|
|
ckpool_t *ckp;
|
|
|
|
bool proxy; /* This workbase is proxied work */
|
|
|
|
|
|
|
|
bool incomplete; /* This is a remote workinfo without all the txn data */
|
|
|
|
|
|
|
|
json_t *json; /* getblocktemplate json */
|
|
|
|
};
|
|
|
|
|
|
|
|
void stratum_set_proxy_vmask(ckpool_t *ckp, int id, int subid, uint32_t version_mask);
|
|
|
|
void parse_remote_txns(ckpool_t *ckp, const json_t *val);
|
|
|
|
#define parse_upstream_txns(ckp, val) parse_remote_txns(ckp, val)
|
|
|
|
void parse_upstream_auth(ckpool_t *ckp, json_t *val);
|
|
|
|
void parse_upstream_workinfo(ckpool_t *ckp, json_t *val);
|
|
|
|
void parse_upstream_block(ckpool_t *ckp, json_t *val);
|
|
|
|
void parse_upstream_reqtxns(ckpool_t *ckp, json_t *val);
|
|
|
|
char *stratifier_stats(ckpool_t *ckp, void *data);
|
|
|
|
void _stratifier_add_recv(ckpool_t *ckp, json_t *val, const char *file, const char *func, const int line);
|
|
|
|
#define stratifier_add_recv(ckp, val) _stratifier_add_recv(ckp, val, __FILE__, __func__, __LINE__)
|
|
|
|
void *stratifier(void *arg);
|
|
|
|
|
|
|
|
#endif /* STRATIFIER_H */
|