UniqueSessionIdManager: Support for delaying releases of session ids, and picking...
[bitcoin:eloipool.git] / config.py.example
1 ### Settings relating to server identity
2
3 # Name of the server
4 ServerName = 'Private Eloipool'
5
6 ### Settings relating to server scaling/load
7
8 # Share hashes must be below this to be valid shares
9 # If dynamic targetting is enabled, this is a minimum
10 ShareTarget = 0x00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff
11
12 # Automatically adjust targets per username
13 # 0 = disabled
14 # 1 = arbitrary targets
15 # 2 = power of two difficulties (zero bit counts)
16 DynamicTargetting = 0
17
18 # How many shares per minute to try to achieve on average
19 DynamicTargetGoal = 8
20
21 # Number of seconds hashrate is measured over
22 DynamicTargetWindow = 120
23
24 # Minimum and maximum of merkle roots to keep queued
25 WorkQueueSizeRegular = (0x100, 0x1000)
26
27 # Minimum and maximum of BLANK merkle roots to keep queued
28 # (used if we run out of populated ones)
29 WorkQueueSizeClear = (0x1000, 0x2000)
30
31 # Minimum and maximum of BLANK merkle roots to keep queued, one height up
32 # (used for longpolls)
33 WorkQueueSizeLongpoll = (0x1000, 0x2000)
34
35 # How long to wait between getmemorypool updates normally
36 MinimumTxnUpdateWait = 5
37
38 # How long to wait between retries if getmemorypool fails
39 TxnUpdateRetryWait = 1
40
41 # How long to sleep in idle loops (temporary!)
42 IdleSleepTime = 0.1
43
44 ### Settings relating to reward generation
45
46 # Address to generate rewards to
47 TrackerAddr = 'mrsP7M31efGkQHXb7nRiWLDjfV2M8oakf2'  # testnet
48
49 # Coinbaser command to control reward delegation
50 # NOTE: This example donates 1% of block rewards to Luke-Jr for Eloipool development
51 CoinbaserCmd = 'echo -e "1\\n$((%d / 100))\\n1579aXhdwvKZEMrAKoCZhzGuqMa8EonuXU"'
52
53 ### Settings relating to upstream data providers
54
55 # JSON-RPC servers to get block templates from
56 # See https://en.bitcoin.it/wiki/BIP_0023#Logical_Services for key details
57 TemplateSources = (
58         {
59                 'name': 'primary',
60                 'uri': 'http://user:pass@localhost:8332',
61                 'priority': 0,
62                 'weight': 1,
63         },
64         {
65                 'name': 'secondary',
66                 'uri': 'http://user:pass@localhost:18332',
67                 'priority': 1,
68                 'weight': 1,
69         },
70 )
71
72 # JSON-RPC servers to check block proposals with
73 # If none provided, and selected source supports proposals, it alone will also
74 # be used for checking
75 TemplateChecks = (
76         {
77                 'name': 'primary',
78                 'uri': 'http://user:pass@localhost:8332',
79                 
80                 # If 'unanimous' is true, no template will be used if this node
81                 # rejects it
82                 'unanimous': False,
83                 
84                 # If check servers disagree on all templates, they will be scored and
85                 # the highest score will be used; 'weight' can be used to control the
86                 # scoring per-server
87                 'weight': 1.1,
88         },
89         {
90                 'name': 'secondary',
91                 'uri': 'http://user:pass@localhost:18332',
92                 'unanimous': False,
93                 'weight': 1,
94         },
95 )
96
97 # JSON-RPC servers to submit found blocks to (when they meet the full target)
98 # The specific TemplateSource that the block was based on will always be sent
99 # the block first.
100 # If setting is not specified, or None, full TemplateSources list will be used.
101 # If an empty list, no extra submissions will be attempted.
102 # If an empty list, and the block was found on a "clear" merkle root (not based
103 # on any TemplateSource), the full TemplateSources list will be used.
104 BlockSubmissions = (
105         {
106                 'name': 'primary',
107                 'uri': 'http://user:pass@localhost:8332',
108         },
109         {
110                 'name': 'secondary',
111                 'uri': 'http://user:pass@localhost:18332',
112         }
113 )
114
115 # Templates will not be used unless they have an acceptance ratio above this
116 # Range: 0.00 - 1.00
117 MinimumTemplateAcceptanceRatio = 0
118
119 # No template with a combined total score below this will be used
120 MinimumTemplateScore = 1
121
122 # Set to True if you want shares meeting the upstream target to wait for a
123 # response from an upstream server before logging them. Otherwise, for such
124 # shares, upstreamResult will always be True and upstreamRejectReason will
125 # always be None. Note that enabling this may cause shares to be logged out of
126 # order, or with the wrong timestamp (if your share logger uses the log-time
127 # rather than share-time).
128 DelayLogForUpstream = False
129
130 # Bitcoin p2p server for announcing blocks found
131 UpstreamBitcoindNode = ('127.0.0.1', 18333)  # testnet
132
133 # Network ID for the primary blockchain
134 # Other known network IDs can be found at:
135 #     https://en.bitcoin.it/wiki/Protocol_specification#Message_structure
136 UpstreamNetworkId = b'\xFA\xBF\xB5\xDA'  # testnet
137
138 # Secret username allowed to use setworkaux
139 #SecretUser = ""
140
141 # URI to send gotwork with info for every share submission
142 #GotWorkURI = ''
143
144 # Share hashes must be below this to be submitted to gotwork
145 GotWorkTarget = 0x00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff
146
147 # Aim to produce blocks with transaction counts that are a power of two
148 # This helps avoid any chance of someone abusing CVE-2012-2459 with them
149 # 1 = cut out feeless transactions; 2 = cut out even fee-included transactions (if possible)
150 POT = 2
151
152 # Avoid mining feeless transactions except to satisfy POT
153 # Note this only works if POT is in fact enabled in the first place
154 Greedy = False
155
156 ### Settings relating to network services
157 # Note that Eloipool only supports IPv6 sockets, and if you want to bind to an
158 # IPv4 address you will need to prepend it with ::ffff: eg ::ffff:192.168.1.2
159
160 # Addresses to listen on for JSON-RPC GBT/getwork server
161 JSONRPCAddresses = (
162         ('', 8337),
163 )
164
165 # Addresses to listen on for Stratum mining server
166 StratumAddresses = (
167         ('', 3334),
168 )
169
170 # Addresses to listen on for Bitcoin node
171 # Note this will only be used to distribute blocks the pool finds, nothing else
172 BitcoinNodeAddresses = (
173         ('', 8338),
174 )
175
176 # Addresses that are allowed to "spoof" from address with the X-Forwarded-For header
177 TrustedForwarders = ('::ffff:127.0.0.1',)
178
179
180 # Logging of shares:
181 ShareLogging = (
182         {
183                 'type': 'logfile',
184                 'filename': 'share-logfile',
185                 'format': "{time} {Q(remoteHost)} {username} {YN(not(rejectReason))} {dash(YN(upstreamResult))} {dash(rejectReason)} {solution}\n",
186         },
187         {
188                 'type': 'sql',
189                 'engine': 'postgres',
190                 'dbopts': {
191                         'host': 'localhost',
192                         'database': 'pooldb',
193                         'user': 'eloipool',
194                         'password': 'somethingsecret',
195                 },
196                 'statement': "insert into shares (rem_host, username, our_result, upstream_result, reason, solution) values ({Q(remoteHost)}, {username}, {YN(not(rejectReason))}, {YN(upstreamResult)}, {rejectReason}, decode({solution}, 'hex'))",
197         },
198         {
199                 'type': 'sql',
200                 'engine': 'mysql',
201                 'dbopts': {
202                         'host': 'localhost',
203                         'db': 'pooldb',
204                         'user': 'eloipool',
205                         'password': 'somethingsecret',
206                 },
207                 'statement': "insert into shares (rem_host, username, our_result, upstream_result, reason, solution) values ({Q(remoteHost)}, {username}, {YN(not(rejectReason))}, {YN(upstreamResult)}, {rejectReason}, unhex({solution}))",
208         },
209         {
210                 'type': 'sql',
211                 'engine': 'sqlite',
212                 'dbopts': {
213                         'database': 'share.db',
214                 },
215                 'statement': "insert into shares (remoteHost, username, rejectReason, upstreamResult, solution) values ({remoteHost}, {username}, {rejectReason}, {upstreamResult}, {solution})",
216         },
217 )
218
219 ### Settings related to poolserver logging
220
221 # By default, significant events will be printed to the interactive console
222 # You can customize your logging using either simple parameters, or Python's advanced logging framework
223 # Note that using Python's logging framework will override the default console logging!
224
225 # To simply log everything to the system log (syslog) as well:
226 # LogToSysLog = True
227
228 # To make a log file:
229 # LogFile = 'filename.log'
230
231 # For a rotating log file:
232 LogFile = {
233         'filename': 'filename.log',
234         'when': 'midnight',
235         'backupCount': 7,
236 }
237 # For details, see:
238 # http://docs.python.org/3/library/logging.handlers.html#logging.handlers.TimedRotatingFileHandler