P2Block
⌕
Height —Network —Difficulty —Tip —

Run your own gateway

1.0%

You build the block. The pool only dictates the coinbase split. Needs a Bitcoin Knots BLAKE2b node; the full walkthrough is below.

datum.pool_host = "(set DATUM_HOST)"
datum.pool_port = 28915
datum.pool_pubkey = "(set PRIME_PUBKEY)"
  1. Node: Bitcoin Knots v29.4.2 (BLAKE2b build), bootstrapped from our snapshot in minutes instead of a day. Not 29.4.1: it does not enforce the long-maturity rule active since height 973,440 and can build invalid blocks.
  2. Gateway: ratum-gateway, or a CONVOY gateway built past PR #15. Older builds truncate payouts to about 15 outputs.
  3. ASICs: stratum+tcp://<your-gateway>:3333, username = a worker name (paid to your gateway's address) or address.worker to pay a different one.
  4. Your gateway appears on the Gateways tab within one job.

Point a rig at us

2.0%

Same coinbase payouts, no node to run. Use the region with the lowest ping.

stratum+tcp://(set STRATUM_HOSTS)
measuring…

Ping is measured from this browser to each region's front door over HTTPS; your ASICs on the same network will see about the same.

user: bc1q…yourpayoutaddress.myrigpass: x

Use a wallet that speaks the BLAKE2b chain (Knots or Shrike). Never import a seed phrase anywhere to "claim" BTCB2.

Bootstrap your own node and gateway

Fill in two fields and every snippet below is ready to paste. 1.0% tier; your box builds the blocks.
  1. A Linux box with Docker, 40 GB free disk and an open port 3333 on your LAN

    Any x86-64 or arm64 machine works: a NUC, an old laptop, a Raspberry Pi 5 with an SSD. Install Docker from docs.docker.com.

  2. Save this as docker-compose.yml

    Replace the two CHANGE-ME passwords with anything random. The node bootstraps itself from our snapshot (refreshed nightly) on first start and verifies the checksum.

    docker-compose.yml
    services:
      knots:
        image: ghcr.io/p2block/pool-knots:latest
        restart: unless-stopped
        environment:
          BTC_NETWORK: main
          PRUNE_MB: "20000"
          RPC_PASSWORD: CHANGE-ME-rpc
          BLOCKNOTIFY_URLS: http://gateway:7152/NOTIFY
          SEED_URL: 
        volumes: ["knots-data:/data"]
        ports: ["8333:8333"]
    
      gateway:
        image: ghcr.io/p2block/pool-gateway:latest
        restart: unless-stopped
        depends_on: [knots]
        environment:
          NODE_RPC_URL: http://knots:8332
          NODE_RPC_PASSWORD: CHANGE-ME-rpc
          POOL_ADDRESS: bc1q…yourpayoutaddress
          COINBASE_TAG_PRIMARY: P2BLOCK
          COINBASE_TAG_SECONDARY: myrig
          PRIME_HOST: (set DATUM_HOST)
          PRIME_PORT: "28915"
          PRIME_PUBKEY: (set PRIME_PUBKEY)
          STRATUM_PORT: "3333"
          VARDIFF_MIN: "32768"
          REQUIRE_ADDRESS_USERNAME: "false"   # your gateway: workers send just a name and are paid to POOL_ADDRESS
          API_ADMIN_PASSWORD: CHANGE-ME-admin
        ports: ["3333:3333"]
    
    volumes:
      knots-data: {}
    
  3. Start it and watch the node catch up
    shell
    docker compose up -d
    docker compose logs -f knots

    First start downloads the snapshot, then Knots syncs the last few blocks. Done when the log shows initialblockdownload=false or UpdateTip lines with today's date.

  4. Point your ASICs at the gateway
    stratum+tcp://<gateway-lan-ip>:3333
    user: myrig-1pass: x

    On your own gateway a plain worker name is enough: everything is paid to POOL_ADDRESS. Use address.worker only if a rig should pay a different address.

  5. Verify

    Your gateway shows on the Gateways tab as myrig within one job, and your address on My miner after the first share. Your share of the next block, and the 1.0% fee, are visible on Next block before it is found.

Which port for your ASIC

Ports differ only in starting difficulty; vardiff adjusts from there. Stock Sia firmware, no reflash.
ModelHashratePowerPortStart diffLoginFirst shareNotes
Goldshell SC6 SE17 TH/s3,300 W333332,768admin / 123456789~10 sSia mode; vardiff climbs within a minute
Goldshell SC5 Pro11 TH/s2,820 W333332,768admin / 123456789~15 sSia mode; vardiff climbs within a minute
Goldshell HS5 (Sia)5.4 TH/s1,500 W333332,768admin / 123456789~1 minTurn Handshake mode off
Innosilicon S114.3 TH/s1,380 W333332,768admin / dragonadmin~1 minNeeds stratum+tcp:// prefix
iBeLink BM-S3+25 TH/s4,000 W3335262,144admin / ibelink~30 sHigh-difficulty port
Antminer A3815 GH/s1,275 W33348,192root / root~90 sLow-difficulty port
Obelisk SC1550 GH/s500 W33348,192admin / admin~2 minLow-difficulty port

If something looks wrong

Symptom first, then the fix.
SymptomCauseFix
Connected, 0 H/s, rejects with code 23Starting difficulty too high for the unitUse the lower-difficulty port for your model
Pool shows "Dead" on the ASICMissing port or missing stratum+tcp://Copy the full URL from above
Every share rejected, code 24Username is not a BLAKE2b-chain addressUse a bech32 address from Knots or Shrike
Gateway connected, nothing on the poolNode still syncing, or gateway build too oldCheck the Gateways tab for template height and version
Snapshot checksum mismatchDownload interrupted mid-file or a stale mirrorRe-run the curl line; -C - resumes and the .sha256 is re-checked
Paid less on one blockYour window share was lower at that momentThe miner page shows your share per block