High performance Stratum poolserver in Node.js. One instance of this software can startup and manage multiple coin
pools, each with their own daemon and stratum port :)
Notice
This is a module for Node.js that will do nothing on its own. Unless you're a Node.js developer who would like to
handle stratum authentication and raw share data then this module will not be of use to you. For a full featured portal
that uses this module, see Cryptocurrency Pool Server. It
handles payments, website front-end, database layer, mutli-coin/pool support, auto-switching miners between coins/pools,
etc.. The portal also has an MPOS compatibility mode so that the it can function as
a drop-in-replacement for python-stratum-mining.
Why
This server was built to be more efficient and easier to setup, maintain and scale than existing stratum poolservers
which are written in python. Compared to the spaghetti state of the latest
stratum-mining python server, this software should also have a
lower barrier to entry for other developers to fork and add features or fix bugs.
Features
- Daemon RPC interface
- Stratum TCP socket server
- Block template / job manager
- P2P to get block notifications as peer node
- Optimized generation transaction building
- Connecting to multiple daemons for redundancy
- Process share submissions
- Session managing for purging DDoS/flood initiated zombie workers
- Auto ban IPs that are flooding with invalid shares
- PoW (proof-of-work) & PoS (proof-of-stake) support
- Transaction messages support
- Vardiff (variable difficulty / share limiter)
- When started with a coin deamon that hasn't finished syncing to the network it shows the blockchain download progress and initializes once synced
Hashing algorithms supported:
- ✓ SHA256 (Bitcoin, Freicoin, Peercoin/PPCoin, Terracoin, etc..)
- ✓ Scrypt (Litecoin, Dogecoin, Feathercoin, etc..)
- ✓ Scrypt-Jane (YaCoin, CopperBars, Pennies, Tickets, etc..)
- ✓ Scrypt-N (Vertcoin [VTC])
- ✓ Quark (Quarkcoin [QRK])
- ✓ X11 (Darkcoin [DRK], Hirocoin, Limecoin)
- ✓ X13 (MaruCoin, BoostCoin)
- ✓ NIST5 (Talkcoin)
- ✓ Keccak (Maxcoin [MAX], HelixCoin, CryptoMeth, Galleon, 365coin, Slothcoin, BitcointalkCoin)
- ✓ Skein (Skeincoin [SKC])
- ✓ Groestl (Groestlcoin [GRS])
- ✓ Blake (Blakecoin [BLC])
- ✓ Fugue (Fuguecoin [FC])
- ✓ Qubit (Qubitcoin [Q2C], Myriadcoin [MYR])
- ✓ SHAvite-3 (INKcoin [INK])
- ✓ Sha1 (Sha1coin [SHA], Yaycoin [YAY])
Requirements
- node v12.10.3+
- coin daemon (preferably one with a relatively updated API and not some crapcoin :p)
Example Usage
Install as a node module by cloning repository
git clone https://github.com/AoD-Technologies/cryptocurrency-stratum-pool node_modules/cryptocurrency-stratum-pool
npm update
Module usage
Create the configuration for your coin:
Possible options for algorithm
: sha256, scrypt, scrypt-jane, scrypt-n, quark, x11, keccak, blake,
skein, groestl, fugue, shavite3, hefty1, qubit, or sha1.
var myCoin = {
"name": "Dogecoin",
"symbol": "DOGE",
"algorithm": "scrypt",
"nValue": 1024,
"rValue": 1,
"txMessages": false,
"coinbase": "MyFunPool",
"peerMagic": "fbc0b6db"
"peerMagicTestnet": "fcc1b7dc"
};
If you are using the scrypt-jane
algorithm there are additional configurations:
var myCoin = {
"name": "Freecoin",
"symbol": "FEC",
"algorithm": "scrypt-jane",
"chainStartTime": 1375801200,
"nMin": 6,
"nMax": 32
};
If you are using the scrypt-n
algorithm there is an additional configuration:
var myCoin = {
"name": "Execoin",
"symbol": "EXE",
"algorithm": "scrypt-n",
"timeTable": {
"2048": 1390959880,
"4096": 1438295269,
"8192": 1485630658,
"16384": 1532966047,
"32768": 1580301436,
"65536": 1627636825,
"131072": 1674972214,
"262144": 1722307603
}
};
If you are using the keccak
algorithm there are additional configurations (The rare normalHashing
keccak coins
such as Copperlark and eCoin don't appear to work yet - only the popular ones like Maxcoin are):
var myCoin = {
"name": "eCoin",
"symbol": "ECN",
"algorithm": "keccak",
"normalHashing": true
};
Create and start new pool with configuration options and authentication function
var Stratum = require('cryptocurrency-stratum-pool');
var pool = Stratum.createPool({
"coin": myCoin,
"address": "mi4iBXbBsydtcc5yFmsff2zCFVX4XG7qJc",
"rewardRecipients": {
"n37vuNFkXfk15uFnGoVyHZ6PYQxppD3QqK": 1.5,
"mirj3LtZxbSTharhtXvotqtJXUY7ki5qfx": 0.5,
"22851477d63a085dbc2398c8430af1c09e7343f6": 0.1
},
"blockRefreshInterval": 1000,
"jobRebroadcastTimeout": 55,
"connectionTimeout": 600,
"emitInvalidBlockHashes": false,
"tcpProxyProtocol": false,
"banning": {
"enabled": true,
"time": 600,
"invalidPercent": 50,
"checkThreshold": 500,
"purgeInterval": 300
},
"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": "litecoinrpc",
"password": "testnet"
},
{
"host": "127.0.0.1",
"port": 19344,
"user": "litecoinrpc",
"password": "testnet"
}
],
"p2p": {
"enabled": false,
"host": "127.0.0.1",
"port": 19333,
"disableTransactions": true
}
}, function(ip, port , workerName, password, callback){
console.log("Authorize " + workerName + ":" + password + "@" + ip);
callback({
error: null,
authorized: true,
disconnect: false
});
});
Listen to pool events
pool.on('share', function(isValidShare, isValidBlock, data){
if (isValidBlock)
console.log('Block found');
else if (isValidShare)
console.log('Valid share submitted');
else if (data.blockHash)
console.log('We thought a block was found but it was rejected by the daemon');
else
console.log('Invalid share submitted')
console.log('share data: ' + JSON.stringify(data));
});
pool.on('log', function(severity, logKey, logText){
console.log(severity + ': ' + '[' + logKey + '] ' + logText);
});
Start pool
pool.start();
Credits
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
License
Released under the GNU General Public License v3
https://www.gnu.org/licenses/gpl-3.0.html