PyOpenCL bitcoin miner (with auto-pool hopping functionality)
Python C
Switch branches/tags
Nothing to show
Clone or download
Pull request Compare This branch is 84 commits ahead, 85 commits behind m0mchil:master.
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Failed to load latest commit information.




This modified version of poclbm is designed to automatically hop among mining pools, constantly seeking the highest expected value per submitted share.

Due to the recent trend to mask statistics from users, it no longer uses round stats provided by the pool operators. Instead, it utilizes a service I am currently providing which lists the most recent blocks a pool could have found along with the probability that the block was found by the given pool. Using this information, along with the estimated hash rate of hte pool, the program is able to compute an expected value for each share.

Note, however, that this new method of hopping is not as efficient as the old method, but it will still provide a return of greater than 1.0 for the user. Exactly how much higher is an unknown question. Most important, however, it is immune from round stats hiding.

There are still two primary methods a pool operator could use to disable this method of hopping (without changing reward system):

  • Block Hiding: If a pool reports neither its round stats, nor any of its solved blocks, it should be impossible for the average user to hop the pool. However, a pool going to such drastic obfuscation measures will likely drive away miners, as well as make auditing the pool difficult.
  • Banning: A pool operator could choose to identify and ban potential hoppers.

Of course, both of these are inferior to simply changing to another reward system.


The primary motivation for writing this program is to encourage pool operators to transition away from the proportional reward system to a hopping-proof system. There are several potential alternatives, and three are listed below:


This system is similar to proportional, but it always pays the last N shares that have been submitted. Some shares will be never paid, and some will be paid multiple times. In the end, the expected value of a share is fair for all miners, and with a suitable large N (such as the difficulty), variance is relatively low, even for intermittent miners.


This system is fair to all miners, but has a rather high variance for intermittent miners, unless the pool operator absorbs some of that variance by appropriately adjusting its parameters.

SMPPS (and variants)

This system is similar to pay per share, but protects the pool operator by limiting payouts to the pool's actual earnings. There are various ways to implement this limit, some better than others. In any case, it is fair to all miners, and variance is very low. However, an unlucky streak poses a greater risk of ultimately killing the pool.


Using this modified client is very similar to using the unmodified client. Most options remain the same. The one exception is configuring the servers. There is no longer a way to specify servers via the command line. Instead, you must create a pools.conf file which contains lines of the following format:

Example: arsbitcoin username password 1.0

Pools are listed in order of priority in pools.conf. In other words, if two pools have the same utility, the pool listed first in the configuration file will be selected. In addition, any pool that is not listed in the file will not be used at all. This allows users to choose which pools they wish to use.

The donation field is optional. It specifies your current donation percentage to the given pool. This allows the miner to calculate a more accurate utility for the pool.

The fields can be separated by any whitespace, but tabs are recommended. The currently supported pools are listed below:

Fair Pools

The following pools all use payout systems that should be immune to pool hopping. They are used as backups in case none of the proportional pools has an appealing expected value per share.

arsbitcoin ( (SMPPS)

bitminter ( (PPLNS)

bitpit ( (ESMPPS)

btcguild ( (PPS - 5% fee)

eclipsemc ( (Geometric)

eligius ( (SMPPS) ( (PPLNS)

nofeemining ( (RSMPPS)

Proportional Pools (

mtred ( (

triplemining (

Intentionally Unsupported Pools

bitclockers ( This pool currently hides its solved blocks along with round stats, making hopping more or less impossible for anyone but the operators.

deepbit ( I have chosen not to provide Deepbit support due to its potential ability to reach the critical 50% mark. If this threat is diminished, it may be added.

Command-line Parameters

Usage: [OPTION]...

Options: --version show program's version number and exit -h, --help show this help message and exit --verbose verbose output, suitable for redirection to log file -q, --quiet suppress all output except hash rate display --no-server-failbacks disable using failback hosts provided by server

Miner Options: -r RATE, --rate=RATE hash rate display interval in seconds, default=1 -e ESTIMATE, --estimate=ESTIMATE estimated rate time window in seconds, default 900 (15 minutes) -a ASKRATE, --askrate=ASKRATE how many seconds between getwork requests, default 5, max 10 -t TOLERANCE, --tolerance=TOLERANCE use fallback pool only after N consecutive connection errors, default 2 -b FAILBACK, --failback=FAILBACK attempt to fail back to the primary pool every N getworks, default 10

Kernel Options: -p PLATFORM, --platform=PLATFORM use platform by id -d DEVICE, --device=DEVICE use device by id, by default asks for device -w WORKSIZE, --worksize=WORKSIZE work group size, default is maximum returned by opencl -f FRAMES, --frames=FRAMES will try to bring single kernel execution to 1/frames seconds, default=30, increase this for less desktop lag -s FRAMESLEEP, --sleep=FRAMESLEEP sleep per frame in seconds, default 0 -v, --vectors use vectors