Validating node
Run a Shear node
The node is the book. It syncs height 1, 2, 3, … to the tip and answers Continuum with the notes sealed to one dest. Clone shear-testnet, build RandomX + crypto/native, or unzip Shear Sentinel v17. No automatic bootstrap. Optional --solo stratum after ibd=false. Continuum downloads are on WALLET. Published node pin is 17.0.
Prebuilt node (unzip and run)
Node release v17. Shear Sentinel v17 (product 17.0) is the portable node cut. Windows, Linux, Arch, Fedora, openSUSE, and macOS zips are on the Shear Sentinel v17 release. Git tag v16 stays on the same commit as tag 0.66. Follow-only nodes may lag. Mining, --solo, and a self-pool need this v17 pack. Unzip, run shear-node.cmd or shear-node.bat (Windows — the window stays open) or ./shear-node.sh (Linux family and macOS). It syncs height 1, 2, 3, … to the tip and keeps serving. Loopback RPC is 127.0.0.1:18332. Continuum on this machine uses that port. Connect Bare uses it when it answers, which is how Android receives without a phone node. A new tip is advised on /events. The wallet then reads every note for its dest. No automatic bootstrap. Pass --solo only after ibd=false if you want local stratum at 127.0.0.1:1111, then point ShearK 2.8 at that port with Copy dest. The node verifies every transaction (ADMITv2) and the mining mint (DINS-DAG pot plus hash bonus). Continuum wallet is 0.70.
shear-node-v17-windows.zip shear-node-v17-linux.zip shear-node-v17-archlinux.zip shear-node-v17-fedora.zip shear-node-v17-opensuse.zip shear-node-v17-macos.zip
Optional snapshot: boot.shear.digital (latest.json + latest.bin), empty datadir only, --bootstrap.
0 · OS dependencies
Build from source
Full validating node for shear-testnet-v10. Prefer the prebuilt zip above. To build it yourself, clone rgsneddon/shear-testnet main (node pin 17.0; node lives at node/ in that tree).
Beginner path (from tip site): OS deps → clone → RandomX + crypto/native → validating node → optional npm run solo (thin stratum on 127.0.0.1:1111). Continuum GUI is optional for RPC. Never npm run pool unless you are operating the public pool.
Commands below are lifted from tip site/index.html #solo-mine — do not invent alternate package lines.
Debian / Ubuntu x86_64. Node 20 from NodeSource; rustup for native ADMITv2.
sudo apt-get update sudo apt-get install -y git curl build-essential cmake python3 pkg-config libssl-dev # Node 20+ curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash - sudo apt-get install -y nodejs # Rust (native ADMITv2 / BP+) curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y . "$HOME/.cargo/env"
Headers check — runtime Node is not enough; ls must show node_api.h. If it fails, install Node with headers (NodeSource / nodejs-devel), not a headerless binary.
node -v # need 20+
node -e "console.log(require('path').join(process.config.variables.node_prefix||'/usr','include/node'))"
ls "$(node -e "process.stdout.write(require('path').join(process.config.variables.node_prefix||'/usr','include/node'))")/node_api.h"
NODE_INC recovery — do not find /usr only if empty (that sets NODE_INC=. and fails again with bare -I.):
# Prefer Node's own prefix; fall back to find near the node binary
export NODE_INC="$(node -e "const fs=require('fs');const p=require('path');const base=process.config.variables.node_prefix||'/usr';const d=p.join(base,'include/node');if(fs.existsSync(p.join(d,'node_api.h'))){process.stdout.write(d);process.exit(0)}process.exit(1)" 2>/dev/null || dirname "$(find "$(dirname "$(dirname "$(readlink -f "$(which node)")")")" /usr/local /usr -name node_api.h 2>/dev/null | head -1)")"
echo "NODE_INC=$NODE_INC" # must be a real directory, NOT . or empty
test -f "$NODE_INC/node_api.h" || { echo "Still missing headers — reinstall Node with devel/include"; exit 1; }
make -C crypto/native
Then continue with clone / RandomX / crypto/native below.
Fedora / RHEL. Development Tools, cmake, openssl-devel, NodeSource 20 rpm, rustup.
sudo dnf groupinstall -y "Development Tools" sudo dnf install -y git curl cmake python3 pkgconf-pkg-config openssl-devel # Node 20+ curl -fsSL https://rpm.nodesource.com/setup_20.x | sudo bash - sudo dnf install -y nodejs # Rust (native ADMITv2 / BP+) curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y . "$HOME/.cargo/env"
Headers check — runtime Node is not enough; ls must show node_api.h. If it fails, install Node with headers (NodeSource / nodejs-devel), not a headerless binary.
node -v # need 20+
node -e "console.log(require('path').join(process.config.variables.node_prefix||'/usr','include/node'))"
ls "$(node -e "process.stdout.write(require('path').join(process.config.variables.node_prefix||'/usr','include/node'))")/node_api.h"
NODE_INC recovery — do not find /usr only if empty (that sets NODE_INC=. and fails again with bare -I.):
# Prefer Node's own prefix; fall back to find near the node binary
export NODE_INC="$(node -e "const fs=require('fs');const p=require('path');const base=process.config.variables.node_prefix||'/usr';const d=p.join(base,'include/node');if(fs.existsSync(p.join(d,'node_api.h'))){process.stdout.write(d);process.exit(0)}process.exit(1)" 2>/dev/null || dirname "$(find "$(dirname "$(dirname "$(readlink -f "$(which node)")")")" /usr/local /usr -name node_api.h 2>/dev/null | head -1)")"
echo "NODE_INC=$NODE_INC" # must be a real directory, NOT . or empty
test -f "$NODE_INC/node_api.h" || { echo "Still missing headers — reinstall Node with devel/include"; exit 1; }
make -C crypto/native
Then continue with clone / RandomX / crypto/native below. Build crypto/native on this Fedora machine. A shearhash.node copied from Ubuntu will not load.
Deploy with the unit in the repo. It dials any and all seeds and listens for Continuum on 127.0.0.1:18332. Do not npm run pool.
sudo mkdir -p /opt/shear-v4 /var/lib/shear/testnet-v10
sudo chown "$USER":"$USER" /opt/shear-v4 /var/lib/shear/testnet-v10
git clone https://github.com/rgsneddon/shear-testnet.git /opt/shear-v4
cd /opt/shear-v4
npm ci
cmake -S crypto/randomx -B crypto/randomx/build -DARCH=native
cmake --build crypto/randomx/build -j"$(nproc)"
export NODE_INC="$(node -e "const fs=require('fs');const p=require('path');const base=process.config.variables.node_prefix||'/usr';const d=p.join(base,'include/node');if(fs.existsSync(p.join(d,'node_api.h'))){process.stdout.write(d);process.exit(0)}process.exit(1)")"
test -f "$NODE_INC/node_api.h"
make -C crypto/native
node node/src/node.js --print-config
sudo cp deploy/shear-node.service /etc/systemd/system/shear-node.service
sudo systemctl daemon-reload
sudo systemctl enable --now shear-node
journalctl -u shear-node -n 20 --no-pager
You are done when a status line shows hashBackend=native, peers at least 1, and ibd=false with the height holding still. While the height is still climbing, ibd=true is catch-up, not a failure. The number on pool.shear.digital is the pool’s own book. Your node follows the public peers. Those two heights are not the same reading. Do not wipe /var/lib/shear/testnet-v10 because the pool page is taller. Add every seed you have; the node is not limited to one host.
Arch Linux. base-devel plus nodejs, npm, cmake, openssl. Repo rust is enough; rustup is optional.
sudo pacman -Syu --needed base-devel git curl cmake python pkgconf openssl nodejs npm rust # optional rustup instead of repo rust: # curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y # . "$HOME/.cargo/env"
Headers check — runtime Node is not enough; ls must show node_api.h. If it fails, install Node with headers (NodeSource / nodejs-devel), not a headerless binary.
node -v # need 20+
node -e "console.log(require('path').join(process.config.variables.node_prefix||'/usr','include/node'))"
ls "$(node -e "process.stdout.write(require('path').join(process.config.variables.node_prefix||'/usr','include/node'))")/node_api.h"
NODE_INC recovery — do not find /usr only if empty (that sets NODE_INC=. and fails again with bare -I.):
# Prefer Node's own prefix; fall back to find near the node binary
export NODE_INC="$(node -e "const fs=require('fs');const p=require('path');const base=process.config.variables.node_prefix||'/usr';const d=p.join(base,'include/node');if(fs.existsSync(p.join(d,'node_api.h'))){process.stdout.write(d);process.exit(0)}process.exit(1)" 2>/dev/null || dirname "$(find "$(dirname "$(dirname "$(readlink -f "$(which node)")")")" /usr/local /usr -name node_api.h 2>/dev/null | head -1)")"
echo "NODE_INC=$NODE_INC" # must be a real directory, NOT . or empty
test -f "$NODE_INC/node_api.h" || { echo "Still missing headers — reinstall Node with devel/include"; exit 1; }
make -C crypto/native
Then continue with clone / RandomX / crypto/native below.
openSUSE. C/C++ devel pattern, cmake, openssl-devel, Node 20, rustup.
sudo zypper install -t pattern devel_C_C++ sudo zypper install -y git curl cmake gcc gcc-c++ openssl-devel python3 pkg-config # Node 20+ curl -fsSL https://rpm.nodesource.com/setup_20.x | sudo bash - sudo zypper install -y nodejs # Rust (native ADMITv2 / BP+) curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y . "$HOME/.cargo/env"
Headers check — runtime Node is not enough; ls must show node_api.h. If it fails, install Node with headers (NodeSource / nodejs-devel), not a headerless binary.
node -v # need 20+
node -e "console.log(require('path').join(process.config.variables.node_prefix||'/usr','include/node'))"
ls "$(node -e "process.stdout.write(require('path').join(process.config.variables.node_prefix||'/usr','include/node'))")/node_api.h"
NODE_INC recovery — do not find /usr only if empty (that sets NODE_INC=. and fails again with bare -I.):
# Prefer Node's own prefix; fall back to find near the node binary
export NODE_INC="$(node -e "const fs=require('fs');const p=require('path');const base=process.config.variables.node_prefix||'/usr';const d=p.join(base,'include/node');if(fs.existsSync(p.join(d,'node_api.h'))){process.stdout.write(d);process.exit(0)}process.exit(1)" 2>/dev/null || dirname "$(find "$(dirname "$(dirname "$(readlink -f "$(which node)")")")" /usr/local /usr -name node_api.h 2>/dev/null | head -1)")"
echo "NODE_INC=$NODE_INC" # must be a real directory, NOT . or empty
test -f "$NODE_INC/node_api.h" || { echo "Still missing headers — reinstall Node with devel/include"; exit 1; }
make -C crypto/native
Then continue with clone / RandomX / crypto/native below.
macOS with Homebrew. Build RandomX and crypto/native on this Mac. Never copy a Darwin .node onto Linux.
xcode-select --install brew install git cmake python pkg-config openssl node rust export NODE_INC="$(brew --prefix node)/include/node"
Headers check — runtime Node is not enough; ls must show node_api.h. If it fails, install Node with headers (Homebrew node includes them). On cmake below, use -j"$(sysctl -n hw.ncpu)" instead of nproc.
node -v # need 20+
node -e "console.log(require('path').join(process.config.variables.node_prefix||'/usr','include/node'))"
ls "$(node -e "process.stdout.write(require('path').join(process.config.variables.node_prefix||'/usr','include/node'))")/node_api.h"
NODE_INC recovery — do not find /usr only if empty (that sets NODE_INC=. and fails again with bare -I.):
# Prefer Node's own prefix; fall back to find near the node binary
export NODE_INC="$(node -e "const fs=require('fs');const p=require('path');const base=process.config.variables.node_prefix||'/usr';const d=p.join(base,'include/node');if(fs.existsSync(p.join(d,'node_api.h'))){process.stdout.write(d);process.exit(0)}process.exit(1)" 2>/dev/null || dirname "$(find "$(dirname "$(dirname "$(readlink -f "$(which node)")")")" /usr/local /usr -name node_api.h 2>/dev/null | head -1)")"
echo "NODE_INC=$NODE_INC" # must be a real directory, NOT . or empty
test -f "$NODE_INC/node_api.h" || { echo "Still missing headers — reinstall Node with devel/include"; exit 1; }
make -C crypto/native
Then continue with clone / RandomX / crypto/native below. Miner unzip + ./ShearK-Miner is the macOS / Linux login block in step 3.
Build the node in WSL2 Ubuntu (or on a Linux box). Run ShearK-Miner.exe on Windows against 127.0.0.1:1111 (WSL localhost / port forward) or the public pool. SmartScreen may warn — More info → Run anyway, or unblock the zip. Never copy a Darwin .node onto Linux or into WSL.
wsl --install -d Ubuntu wsl -d Ubuntu # inside Ubuntu, paste the Debian / Ubuntu deps block, then clone / RandomX / native below sudo apt-get update sudo apt-get install -y git curl build-essential cmake python3 pkg-config libssl-dev curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash - sudo apt-get install -y nodejs curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y . "$HOME/.cargo/env"
Headers check (inside WSL) — runtime Node is not enough; ls must show node_api.h. If it fails, install Node with headers (NodeSource), not a headerless binary.
node -v # need 20+
node -e "console.log(require('path').join(process.config.variables.node_prefix||'/usr','include/node'))"
ls "$(node -e "process.stdout.write(require('path').join(process.config.variables.node_prefix||'/usr','include/node'))")/node_api.h"
NODE_INC recovery (inside WSL) — do not find /usr only if empty (that sets NODE_INC=. and fails again with bare -I.):
# Prefer Node's own prefix; fall back to find near the node binary
export NODE_INC="$(node -e "const fs=require('fs');const p=require('path');const base=process.config.variables.node_prefix||'/usr';const d=p.join(base,'include/node');if(fs.existsSync(p.join(d,'node_api.h'))){process.stdout.write(d);process.exit(0)}process.exit(1)" 2>/dev/null || dirname "$(find "$(dirname "$(dirname "$(readlink -f "$(which node)")")")" /usr/local /usr -name node_api.h 2>/dev/null | head -1)")"
echo "NODE_INC=$NODE_INC" # must be a real directory, NOT . or empty
test -f "$NODE_INC/node_api.h" || { echo "Still missing headers — reinstall Node with devel/include"; exit 1; }
make -C crypto/native
After npm run solo in WSL, on Windows:
ShearK-Miner.exe --selftest ShearK-Miner.exe --pool 127.0.0.1:1111 --user YOUR_SSA1 --threads 8
Public pool instead: ShearK-Miner.exe --pool stratum+ssl://pool.shear.digital:443 --user YOUR_SSA1 --threads 8. A typed YOUR_SSA1.suffix is optional. Then continue with clone / RandomX / crypto/native below (in WSL).
1. Clone, RandomX, crypto/native
Same as README “Build your own node”. Run the Headers check in your OS tab first. If make still fails on node_api.h, use that tab’s NODE_INC recovery (do not find /usr into an empty NODE_INC=.).
git clone https://github.com/rgsneddon/shear-testnet.git cd shear-testnet npm ci cmake -S crypto/randomx -B crypto/randomx/build -DARCH=native cmake --build crypto/randomx/build -j"$(nproc)" make -C crypto/native node node/src/node.js --print-config
--print-config must show "version":"17.0", "magic":"shear-testnet-v10", "admit":"ADMITv2", "mainnet":false.
2. Validating node (not the full pool)
Node pin 17.0 (v17). Bare node node/src/node.js is validator-only (P2P + loopback RPC). It does not pull a bootstrap. An empty book starts at genesis and requests height 1, 2, 3, … until the tip; a recorded tip resumes. Put SHEAR_SEEDS in the same shell. Outbound TCP to those seeds is required. Optional snapshot: download latest.json + latest.bin from boot.shear.digital and pass --bootstrap on an empty datadir. Do not npm run pool.
export SHEAR_DATA="$HOME/.shear/testnet-v10" export SHEAR_NETWORK=shear-testnet-v10 export SHEAR_P2P_PORT=30303 export SHEAR_P2P_BIND=0.0.0.0 export SHEAR_RPC_PORT=18332 export SHEAR_RPC_BIND=127.0.0.1 export SHEAR_SEEDS=p2p.shear.digital:30303,r2r.shear.digital:30303,b2b.shear.digital:30303 node node/src/node.js
3. Thin solo stratum
Same shell, only after status shows ibd=false at the public tip. npm run solo is node node/src/node.js --solo: validator + stratum on 127.0.0.1:1111. While the node is still catching up, miner login is refused (syncing) and no job that can seal is issued. A bare ssa1 is the login. A typed ssa1.suffix is optional and pays the same address.
export SHEAR_STRATUM=1111 export SHEAR_STRATUM_BIND=127.0.0.1 npm run solo
Next
For CLI Copy dest / ShearK solo login, see tip docs or the miner hub. Pool operators use a different stack — do not npm run pool for a personal node.