Configuration - nortonlifelock/miningcore GitHub Wiki

There are 2 ways to configure the pool:

The most common is with a json file, passed in at runtime. The second is by having the entire json configuration stored in an Azure Application Config instance.

To Make this work, we need an environment variable "ConnectionString" that provides connectivity to Azure AppConfig.

Then, in AppConfig, we need the following keys. The credentials can be Azure KeyVault references.

persistence.postgres.user persistence.postgres.password paymentProcessing.coinbasePassword config.json-> the entire json config, minus the above credentials, which can be left blank

Below is the expected Json Configuration

+ + {

    "ClusterName": "",									   
    "logging": {
        // Logging level "info" or "debug"
        "level": "info",
        "enableConsoleLog": true,
        "enableConsoleColors": true,
        // Log file name (full log) - can be null in which case log events are written to console (stdout)
        "logFile": "miningcore.log",
        // Log file name for API-requests - can be null in which case log events are written to either main logFile or console (stdout)
        "apiLogFile": "miningcoreapi.log",
        // Folder to store log file(s)
        "logBaseDirectory": "/path/to/logs", // or c:\path\to\logs on Windows
        // If enabled, separate log file will be stored for each pool as <pool id>.log
        // in the above specific folder.
        "perPoolLogFile": true
    "banning": {
        // "integrated" or "iptables" (linux only - not yet implemented)
        "manager": "integrated",
        "banOnJunkReceive": true,
        "banOnInvalidShares": false
    "notifications": {
        "enabled": true,
        "email": {
            "host": "",
            "port": 587,
            "user": "user",
            "password": "password",
            "fromAddress": "[email protected]",
            "fromName": "pool support"
        "admin": {
            "enabled": false,
            "emailAddress": "[email protected]",
            "notifyBlockFound": true
    // Database connection
    "persistence": {
        // Persist to postgresql database
        "postgres": {
            "host": "",
            "port": 5432,
            "user": "miningcore",
            "password": "some-secure-password",
            "database": "miningcore"
    // Generate payouts for recorded shares and blocks
    "paymentProcessing": {
        "enabled": true,
        // How often to process payouts, in milliseconds
        "interval": 600,
        // Path to a file used to backup shares under emergency conditions, such as
        // database outage
        "shareRecoveryFile": "miningcore-recovered-shares.txt"
    // API Settings
    "api": {
        "enabled": true,
        // Binding address (Default:
        "listenAddress": "",
        // Binding port (Default: 4000)
        "port": 4000,
        // IP address whitelist for requests to Prometheus Metrics (default
        "metricsIpWhitelist": [],
        // Limit rate of requests to API on a per-IP basis
        "rateLimiting": {
            // disable rate-limiting all-together, be careful, do not disable in production
            "disabled": false, 
            // override default rate-limit rules, refer to 
            "rules": [
                    "Endpoint": "*",
                    "Period": "1s",
                    "Limit": 10
            // List of IP addresses excluded from rate-limiting (default: none)
            // localhost is always excluded even not mentioned here.
            "ipWhitelist": []
    // Pool & Miner performance Statistics
    "statistics": {
        // Interval to calculate the statistics (seconds)
        "statsUpdateInterval": 60, 
        // Stats calculation window (minutes)
        "hashrateCalculationWindow": 5,
        // Stats DB cleanup interval (hours)
        "statsCleanupInterval": 48, 
        // Stats history to cleanup is DB. older then x (days)
        "statsDBCleanupHistory": 365 
    "pools": [
            // DON'T change the id after a production pool has begun collecting shares!
            "id": "dash1",
            "enabled": true,
            "coin": "dash",
            // Address to where block rewards are given (pool wallet)
            "address": "Xc2vm9SfRn8t1hyQgqi8Zrt3oFeGcQtw",
            // Block rewards go to the configured pool wallet address to later be paid out
            // to miners, except for a percentage that can go to, for examples,
            // pool operator(s) as pool fees or or to donations address. Addresses or hashed
            // public keys can be used. Here is an example of rewards going to the main pool
            // "op"
            "rewardRecipients": [
                    // Pool wallet
                    "address": "Xc2vm9SfRn8t1hyQgqi8Zrt3oFeGcQtw",
                    "percentage": 0.1
            // How often to poll RPC daemons for new blocks, in milliseconds
            "blockRefreshInterval": 400,
            // Some miner apps will consider the pool dead/offline if it doesn't receive
            // anything new jobs for around a minute, so every time we broadcast jobs,
            // set a timeout to rebroadcast in this many seconds unless we find a new job.
            // Set to zero to disable. (Default: 0)
            "jobRebroadcastTimeout": 10,
            // Remove workers that haven't been in contact for this many seconds.
            // Some attackers will create thousands of workers that use up all available
            // socket connections, usually the workers are zombies and don't submit shares
            // after connecting. This features detects those and disconnects them.
            "clientConnectionTimeout": 600,
            // If a worker is submitting a high threshold of invalid shares, we can
            // temporarily ban their IP to reduce system/network load.
            "banning": {
                "enabled": true,
                // How many seconds to ban worker for
                "time": 600,
                // What percent of invalid shares triggers ban
                "invalidPercent": 50,
                // Check invalid percent when this many shares have been submitted
                "checkThreshold": 50
            // Each pool can have as many ports for your miners to connect to as you wish.
            // Each port can be configured to use its own pool difficulty and variable
            // difficulty settings. 'varDiff' is optional and will only be used for the ports
            // you configure it for.
            "ports": {
                // Binding port for your miners to connect to
                "3052": {
                    // Binding address (Default:
                    "listenAddress": "",
                    // Pool difficulty
                    "difficulty": 0.02,
                    // TLS/SSL configuration
                    "tls": false,
                    "tlsPfxFile": "/var/lib/certs/mycert.pfx",
                    // Variable difficulty is a feature that will automatically adjust difficulty
                    // for individual miners based on their hash rate in order to lower
                    // networking overhead
                    "varDiff": {
                        // Minimum difficulty
                        "minDiff": 1,
                        // Maximum difficulty. Network difficulty will be used if it is lower than
                        // this. Set to null to disable.
                        "maxDiff": null,
                        // Try to get 1 share per this many seconds
                        "targetTime": 15,
                        // Check to see if we should retarget every this many seconds
                        "retargetTime": 90,
                        // Allow time to very this % from target without retargeting
                        "variancePercent": 10,
                        // Do not alter difficulty by more than this during a single retarget in
                        // either direction
                        "maxDelta": 500
            // Recommended to have at least two daemon instances running in case one drops
            // out-of-sync or offline. For redundancy, 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" argument which
            // creates a new daemon instance with it's own RPC config. For more info on this,
            // visit: https:// and
            // https://
            "daemons": [
                    "host": "",
                    "port": 15001,
                    "user": "rpc-user",
                    "password": "rpc-pass",
                    // Enable streaming Block Notifications via ZeroMQ messaging from Bitcoin
                    // Family daemons. Using this is highly recommended. The value of this option
                    // is a string that should match the value of the -zmqpubhashblock parameter
                    // passed to the coin daemon. If you enable this, you should lower
                    // 'blockRefreshInterval' to 1000 or 0 to disable polling entirely.
                    "zmqBlockNotifySocket": "tcp://",
                    // Enable streaming Block Notifications via WebSocket messaging from Ethereum
                    // family Parity daemons. Using this is highly recommended. The value of this
                    // option is a string that should  match the value of the --ws-port parameter
                    // passed to the parity coin daemon. When using --ws-port, you should also
                    // specify --ws-interface all and
                    // --jsonrpc-apis "eth,net,web3,personal,parity,parity_pubsub,rpc"
                    // If you enable this, you should lower 'blockRefreshInterval' to 1000 or 0
                    // to disable polling entirely.
                    "portWs": 18545,
            // Generate payouts for recorded shares
            "paymentProcessing": {
                "enabled": true,
                // Minimum payment in pool-base-currency (ie. Bitcoin, NOT Satoshis)
                "minimumPayment": 0.01,
                "payoutScheme": "PPLNS",
                "payoutSchemeConfig": {
                    "factor": 0.5
⚠️ ** Fallback** ⚠️