Cryptocurrency Pool Server 
This software is an extremely efficient, highly scalable, all-in-one, easy to setup cryptocurrency mining/staking pool written
entirely in Node.js. It contains a stratum poolserver; reward/payment/share processor; and a responsive user-friendly front-end
website featuring mining/staking instructions and in-depth live statistics.
Production Usage Notice
This is beta software. All of the following are things that can change and break an existing server setup: functionality of any feature, structure of configuration files and structure of redis data.
If you use this software in production then DO NOT pull new code straight into production usage because it can and often will break your setup and require you to tweak things like config files or redis data.
Paid Solution
Usage of this software requires abilities with sysadmin, database admin, coin daemons, and sometimes a bit of programming. Running a production pool can literally be more work than a full-time job.
Coin switching & auto-exchanging for payouts in BTC/LTC to miners is a feature that very likely will not be included in this project.
Table of Contents
Features
-
For the pool server it uses the highly efficient cryptocurrency-stratum-pool module which
supports vardiff, PoW, PoS, transaction messages, anti-DDoS, IP banning, and many hashing algorithms.
-
The portal has an MPOS compatibility mode so that it can
function as a drop-in-replacement for python-stratum-mining. This
mode can be enabled in the configuration and will insert shares into a MySQL database in the format which MPOS expects.
-
Multi-pool ability - this software was built from the ground up to run with multiple coins simultaneously (which can
have different properties and hashing algorithms). It can be used to create a pool for a single coin or for multiple
coins at once. The pools use clustering to load balance across multiple CPU cores.
-
For reward/payment processing, shares are inserted into Redis (a fast NoSQL key/value store). The PROP (proportional)
reward system is used with Redis Transactions for secure and super speedy payouts.
There is zero risk to the pool operator. Shares from rounds resulting in orphaned blocks will be merged into shares for the
current round so that each and every share will be rewarded.
-
This portal does not have user accounts/logins/registrations. Instead, miners simply use their coin address for stratum
authentication.
-
Coin-switching ports using coin-networks and crypto-exchange APIs to detect profitability. Miner's connect to these ports
with their public key which the server uses to derive an address for any coin needed to be paid out.
Attack Mitigation
- Detects and thwarts socket flooding (garbage data sent over socket in order to consume system resources).
- Detects and thwarts zombie miners (botnet infected computers connecting to your server to use up sockets but not sending any shares).
- Detects and thwarts invalid share attacks:
- Cryptocurrency Pool Server is not vulnerable to the low difficulty share exploits happening to other pool servers. Other pool server
software has hardcoded guesstimated max difficulties for new hashing algorithms while this software dynamically generates the
max difficulty for each algorithm based on values founds in coin source code.
- IP banning feature which on a configurable threshold will ban an IP for a configurable amount of time if the miner
submits over a configurable threshold of invalid shares.
- This software is written in Node.js which uses a single thread (async) to handle connections rather than the overhead of one
thread per connection, and clustering is also implemented so all CPU cores are taken advantage of.
Security
Cryptocurrency Pool Server has some implicit security advantages for pool operators and miners:
- Without a registration/login system, non-security-oriented miners reusing passwords across pools is no longer a concern.
- Automated payouts by default and pool profits are sent to another address so pool wallets aren't plump with coins -
giving hackers little reward and keeping your pool from being a target.
- Miners can notice lack of automated payments as a possible early warning sign that an operator is about to run off with their coins.
Discord
Having problems getting the portal running due to some module dependency error? It's probably because you
didn't follow the instructions in this README. Please read the usage instructions including requirements and downloading/installing. If you've followed the instructions completely and are still having problems then open an issue here on github or join our #cryptopools-github Discord channel and explain your problem :).
If your pool uses Cryptocurrency Pool Server let us know and we will list your website here.
Some pools using this software:
Usage
Requirements
Seriously
Those are legitimate requirements. If you use old versions of Node.js or Redis that may come with your system package manager then you will have problems. Follow the linked instructions to get the last stable versions.
Redis security warning: be sure firewall access to redis - an easy way is to
include bind 127.0.0.1
in your redis.conf
file. Also it's a good idea to learn about and understand software that
you are using - a good place to start with redis is data persistence.
0) Setting up coin daemon
Follow the build/install instructions for your coin daemon. Your coin.conf file should end up looking something like this:
daemon=1
rpcuser=litecoinrpc
rpcpassword=securepassword
rpcport=19332
For redundancy, its recommended to have at least two daemon instances running in case one drops out-of-sync or offline,
all instances will be polled for block/transaction updates and be used for submitting blocks. Creating a backup daemon
involves spawning a daemon using the -datadir=/backup
command-line argument which creates a new daemon instance with
it's own config directory and coin.conf file. Learn about the daemon, how to use it and how it works if you want to be
a good pool operator. For starters be sure to read:
1) Downloading & Installing
Clone the repository and run npm install
for all the dependencies to be installed:
git clone https://github.com/AoD-Technologies/cryptocurrency-pool-server.git
cd cryptocurrency-pool-server
npm install
2) Configuration
Portal config
Inside the config_example.json
file, ensure the default configuration will work for your environment, then copy the file to config.json
.
Explanation for each field:
{
"logLevel": "debug",
"logColors": true,
"cliPort": 17117,
"clustering": {
"enabled": true,
"forks": "auto"
},
"defaultPoolConfigs": {
"blockRefreshInterval": 1000,
"jobRebroadcastTimeout": 55,
"connectionTimeout": 600,
"emitInvalidBlockHashes": false,
"validateWorkerUsername": true,
"tcpProxyProtocol": false,
"banning": {
"enabled": true,
"time": 600,
"invalidPercent": 50,
"checkThreshold": 500,
"purgeInterval": 300
},
"redis": {
"host": "127.0.0.1",
"port": 6379
}
},
"website": {
"enabled": true,
"host": "0.0.0.0",
"port": 80,
"stratumHost": "cryppit.com",
"stats": {
"updateInterval": 15,
"historicalRetention": 43200,
"hashrateWindow": 300
},
"adminCenter": {
"enabled": true,
"password": "password"
}
},
"redis": {
"host": "127.0.0.1",
"port": 6379
},
"switching": {
"switch1": {
"enabled": false,
"algorithm": "sha256",
"ports": {
"3333": {
"diff": 10,
"varDiff": {
"minDiff": 16,
"maxDiff": 512,
"targetTime": 15,
"retargetTime": 90,
"variancePercent": 30
}
}
}
},
"switch2": {
"enabled": false,
"algorithm": "scrypt",
"ports": {
"4444": {
"diff": 10,
"varDiff": {
"minDiff": 16,
"maxDiff": 512,
"targetTime": 15,
"retargetTime": 90,
"variancePercent": 30
}
}
}
},
"switch3": {
"enabled": false,
"algorithm": "x11",
"ports": {
"5555": {
"diff": 0.001
}
}
}
},
"profitSwitch": {
"enabled": false,
"updateInterval": 600,
"depth": 0.90,
"usePoloniex": true,
"useCryptsy": true,
"useMintpal": true
}
}
Coin config
Inside the coins
directory, ensure a json file exists for your coin. If it does not you will have to create it.
Here is an example of the required fields:
{
"name": "Litecoin",
"symbol": "ltc",
"algorithm": "scrypt",
"coinbase": "Kryptonite",
"peerMagic": "fbc0b6db",
"peerMagicTestnet": "fcc1b7dc"
}
For additional documentation how to configure coins and their different algorithms
see these instructions.
Pool config
Take a look at the example json file inside the pool_configs
directory. Rename it to yourcoin.json
and change the
example fields to fit your setup.
Description of options:
{
"enabled": true,
"coin": "litecoin.json",
"address": "mi4iBXbBsydtcc5yFmsff2zCFVX4XG7qJc",
"rewardRecipients": {
"n37vuNFkXfk15uFnGoVyHZ6PYQxppD3QqK": 1.5,
"mirj3LtZxbSTharhtXvotqtJXUY7ki5qfx": 0.5
},
"paymentProcessing": {
"enabled": true,
"paymentInterval": 30,
"minimumPayment": 0.01,
"daemon": {
"host": "127.0.0.1",
"port": 19332,
"user": "testuser",
"password": "testpass"
}
},
"ports": {
"3032": {
"diff": 32,
"varDiff": {
"minDiff": 8,
"maxDiff": 512,
"targetTime": 15,
"retargetTime": 90,
"variancePercent": 30
}
},
"3256": {
"diff": 256
}
},
"daemons": [
{
"host": "127.0.0.1",
"port": 19332,
"user": "testuser",
"password": "testpass"
}
],
"p2p": {
"enabled": false,
"host": "127.0.0.1",
"port": 19333,
"disableTransactions": true
},
"mposMode": {
"enabled": false,
"host": "127.0.0.1",
"port": 3306,
"user": "me",
"password": "mypass",
"database": "ltc",
"checkPassword": true,
"autoCreateWorker": false
}
}
You can create as many of these pool config files as you want (such as one pool per coin you which to operate).
If you are creating multiple pools, ensure that they have unique stratum ports.
For more information on these configuration options see the pool module documentation
[Optional, recommended] Setting up blocknotify
- In
config.json
set the port and password for blockNotifyListener
- In your daemon conf file set the
blocknotify
command to use:
node [path to cli.js] [coin name in config] [block hash symbol]
Example: inside dogecoin.conf
add the line
blocknotify=node /opt/cryptocurrency-pool-server/scripts/cli.js blocknotify dogecoin %s
Alternatively, you can use a more efficient block notify script written in pure C. Build and usage instructions
are commented in scripts/blocknotify.c.
3) Start the portal
node init.js
Optional enhancements for your awesome new mining pool server setup:
- Use something like forever to keep the node script running
in case the master process crashes.
- Use something like redis-commander to have a nice GUI
for exploring your redis database.
- Use something like logrotator to rotate log
output.
- Use New Relic to monitor your server performance.
Upgrading
When updating Cryptocurrency Pool Server to the latest version it's important to not only git pull
the latest from this repo, but to also update
the cryptocurrency-stratum-pool
and node-multi-hashing
modules, and any config files that may have been changed.
- Inside your server directory (where the init.js script is) do
git pull
to get the latest code. - Remove the dependenices by deleting the
node_modules
directory with rm -r node_modules
. - Run
npm install
to force updating/reinstalling of the dependencies. - Compare your
config.json
and pool_configs/coin.json
configurations to the latest example ones in this repo or the ones in the setup instructions where each config field is explained. You may need to modify or add any new changes.
Donations
To support development of this project feel free to donate :)
- AUR:
AStZjnHVZeeMu6qSefmfFf2hcTrw1D4PTV
- BTC:
1HTNmSPrPzWDXiQKHqGGmwxvWpo92861We
- BCH:
qz37lsgu585sthyvj03wdnylzj697utezs09sqr8s6
- BOOT:
RKrEC2DN85DEAVGnPKFMT2kwBop7W8SgtH
- BSV:
16pw6eWNQ543djFGPFhWTupKn6DAFybsYj
- BTCV:
3Cc2odLwAPMb8in6DtzYcaz7VteMHCdCWS
- DASH:
XptCKDUpStArP6WriH1EqUFkG7X4EB5QVb
- DGB:
DNvszcyDbQbSJ6aFGXCc4adSXoXjtFSXYs
- DOGE:
DEiAhRD6ACGeEHPAhKT4W4WiUN6Q85BK83
- LTC:
LQg8JcRgHUST9D2pD6fXXSCRsF9jD3GdWK
- LCC:
CJRx4ps1B8f3fByneiAg7oycEMtTtbFkG2
- LCNT:
Lfe93Y8mC1ueKpHtWw2Kp6APoLQs3GpGpF
- RVN:
RMTcqUJnzSTMZW825eP77yDxhcCuW3xVyy
- SHND:
SZjpJRp5rmD83NmaStVJpn4NkfmwM52Jnw
- VTC:
3KxFSn2hw7G61QyheKLYR5sffR6ErKJNys
- VRSC:
RRb1GeiDcbAGMJQrckCcFSnKj9rZDUVJ4y
- XVG:
D5Xzq6edmskQBVHUZuzvCbuAg1f8gPU2bo
- ZEN:
znhHi2eiRAQhzekktTqdjDBCeb3L2QkuHjf
- ZER:
t1R3enmEZj8rVsUG19sznLSkCRFFj4vEcVM
Credits
License
Released under the GNU General Public License v3
https://www.gnu.org/licenses/gpl-3.0.html