SCDO 节点奖励规则 · Node Reward Rules
当前状态 / Current status: 真实付款已开启(live,2026-10-03 19:12 北京时间起)——每小时整点结算,累计满 1 SCDO 自动链上付款;页面和钱包里显示的金额为预计值,以链上到账为准。
Real payouts are ON (since 2026-10-03 19:12 UTC+8): hourly settlement, automatic on-chain payout once 1 SCDO is reached; displayed amounts are estimates, the on-chain transfer is final.
规则版本 v1.1(2026-10-03,新增 B 类 Classic 节点)。以下参数均可调,当前值见下表和 /pool-api/api/node/health。
Rules v1.1 (2026-10-03, adds class B Classic nodes). All parameters are adjustable; live values are in the table and at /pool-api/api/node/health.
中文
- 奖励来源:矿池手续费的 50%(
node_reward_share)进入节点奖励池,其余 50% 照旧归矿池/Treasury。不改链共识,不增发。桌面钱包节点(A 类,Shard0)的奖励来自 Shard0 矿池手续费,用 SCDO0 付到 0x 地址。
- 登记:用自己的 0x 地址登记节点(地址 + enode + 时间戳,用该地址私钥签名,私钥不出钱包)。不需要会员。一个地址同时只有一个有效节点,重新登记会替换旧节点。同一个节点不能被两个地址登记。
- 在线判定(每 60 秒一次):节点连到我们的观察节点(Shard0 种子节点),我们在对等节点列表里看到它的 enode、公网 IP 和头块。需同时满足:版本是 SCDO 桌面钱包 2.0.1 内置的标准 core-geth(CoreGeth/v1.12.23);头块在正链上,且落后不超过 30 块;如果节点名里带
scdo-node:0x… 地址,必须和登记地址一致。心跳只作备用同步信号,单独的心跳不计分。
- 开始计分:节点连续有效在线满 1 分钟(
warmup)后开始计分;断线超过约 2.5 分钟要重新等 1 分钟。
- 防刷:同一公网 IP 同时只算 1 个节点(连续在线最久的那个)。
- 结算:每 60 分钟结算一次(
node_settle_interval,整点)。本小时奖励池 = 本小时矿池手续费 × 50% + 上一小时结转。按本小时每个地址的有效在线秒数比例分配。
- 单地址上限:每个地址每天(北京时间自然日)最多分到当天节点奖励池新增额的 10%(
addr_daily_cap_pct)。超出部分和无人在线时的奖励都留在池里,转入下一小时。
- 付款:累计未付达到 1 SCDO 时,在结算后自动链上付款(与矿池同一套防重复付款机制:每笔先记“待确认”,打包后才发下一笔,不自动重发)。显示的金额为预计值,以链上到账为准。
- 规则修改会在本页公布。作弊(伪造节点、多开、攻击观察节点)的地址可被取消资格。
English
- Funding: 50% of pool fees (
node_reward_share) go to the node reward pool; the other 50% stays with the pool/Treasury. No consensus change, no new coins. Desktop-wallet nodes (class A, Shard0) are funded from Shard0 pool fees and paid in SCDO0 to their 0x address.
- Registration: register with your own 0x address (address + enode + timestamp, signed with that address's key inside the wallet). No membership needed. One active node per address; registering again replaces the old node. A node can't be registered by two addresses.
- Online check (every 60 s): your node connects to our observer (the Shard0 seed node) and we see its enode, public IP and head block in our peer list. A sample is valid only if the client is the standard core-geth bundled with SCDO desktop wallet 2.0.1 (CoreGeth/v1.12.23); its head is on the canonical chain and at most 30 blocks behind; and if the node name carries
scdo-node:0x…, that address equals the registered one. The heartbeat is only a backup sync signal; heartbeats alone earn nothing.
- Warm-up: a node starts scoring after 1 minute of continuous valid online time (
warmup); a gap of more than ~2.5 min restarts the warm-up.
- Anti-sybil: only one node per public IP counts at a time (the one online longest).
- Settlement: every 60 minutes on the hour (
node_settle_interval). Hourly pool = this hour's pool fees × 50% + carry-over. It is split by each address's valid online seconds in that hour.
- Per-address cap: an address gets at most 10% (
addr_daily_cap_pct) of that day's new node-pool inflow (calendar day, UTC+8). Anything capped, and the pool of hours with no eligible node, stays in the pool and rolls into the next hour.
- Payout: once an address's unpaid balance reaches 1 SCDO it is paid on chain automatically after settlement, using the pool's anti-double-pay module (each tx is tracked as pending until mined; nothing new is sent while one is pending; no automatic resend). Displayed amounts are estimates; the on-chain transfer is final.
- Rule changes are announced on this page. Addresses that cheat (fake nodes, multi-instance farming, attacking the observer) can be disqualified.
B 类:Classic 节点(go-scdo V2.0.x,Shard1–4)
Classic 状态 / status: 见 /pool-api/api/node/health
- 奖励来源:Shard1 矿池(zpool)每个成熟区块手续费的 50%(
node_reward_share)记入节点奖励池(币留在 Shard1 矿池热钱包,不归集),另外 50% 照旧进 Shard1 Treasury。只计开启之后产生的手续费。
- 登记:
POST /pool-api/api/node/register-classic,用自己的 1S01…(Shard1)地址收款,节点可以在 Shard1–4 任一分片。需要两个签名:收款地址私钥签名 sig,以及节点自己的 P2P 私钥(节点配置里 p2p.privateKey)对同一条消息的签名 nodeSig,证明你真的控制这个节点,防止别人冒领。签名方法见下方 API。
- 必须开放端口:节点的 P2P 端口必须对公网开放 UDP 和 TCP(同一个端口,例如 8057)。我们的探测器从公网主动连接你的节点;家用路由器/内网后面、没做端口转发的节点探测不到,不计分。
- 在线判定(每 60 秒一次):探测器用 go-scdo 自己的 P2P 协议连接节点:UDP 发现 → TCP 握手(对方用节点私钥签名,节点 ID 必须与登记一致)→ 交换链状态(网络 net1、同一创世和分叉块 #2,979,594)→ 向节点要它头块的区块头。有效 = 头块哈希在正链上(与我们的参考节点同高度的块哈希一致)且与正链头相差不超过 20 块。
- 版本说明(如实):Classic 握手里没有客户端版本号,探测器分不出 V2.0.0 和 V2.0.1。“标准版”是靠同步检查来保证的:使用假 scdorand 库的节点会在 2,979,594 高度停住、再也跟不上正链,所以永远通不过上面的同步检查,也就拿不到奖励。我们不声称能识别具体版本号。
- 计分、防刷、结算、上限:与 A 类相同——连续有效满 1 分钟开始计分;同一公网 IP 只算 1 个 Classic 节点;每 60 分钟整点结算,按有效在线秒数分配;每个地址每天最多分到当天 Classic 奖励池新增额的 10%,超出部分结转。
- 付款:未付满 1 SCDO 后,由 Shard1 矿池热钱包链上付到你的 1S 地址(矿池每 10 分钟一轮,使用矿池同一套“待确认”防重复付款机制)。显示金额为预计值,以链上到账为准。
Class B: Classic nodes (go-scdo V2.0.x, shards 1–4)
- Funding: 50% of the pool fee of every matured Shard1 pool (zpool) block goes to the Classic node pool (kept in the Shard1 pool hot wallet, not swept); the other 50% goes to the Shard1 Treasury as before. Only fees accrued after the switch count.
- Registration:
POST /pool-api/api/node/register-classic, paid to your own 1S01… (Shard1) address; the node can be on any of shards 1–4. Two signatures: sig by the payout address key, and nodeSig, the same message signed by the node's own p2p key (p2p.privateKey in the node config), proving you control the node (prevents others claiming it).
- Open port required: the node's P2P port must be reachable from the internet over both UDP and TCP (same port, e.g. 8057). Our prober dials your node; nodes behind NAT without port forwarding can't be probed and don't score.
- Online check (every 60 s): the prober speaks go-scdo's own p2p protocol: UDP discovery → TCP handshake (signed by the node key; node ID must equal the registered one) → status exchange (network net1, same genesis and fork block #2,979,594) → asks the node for its head header. Valid = the head hash is canonical (equals our reference node's block at that height) and within 20 blocks of the canonical head.
- About versions (honestly): the Classic handshake carries no client version, so the prober cannot tell V2.0.0 from V2.0.1. "Standard build" is enforced by the sync check: nodes built with the fake scdorand library stall at height 2,979,594 and never catch up, so they never pass. We do not claim to detect version numbers.
- Scoring, anti-sybil, settlement, cap: same as class A — scores after 1 minute continuously valid; one Classic node per public IP; settled every 60 minutes on the hour by valid online seconds; at most 10% of the day's Classic pool inflow per address, the rest carries over.
- Payout: once unpaid reaches 1 SCDO, the Shard1 pool hot wallet pays your 1S address on chain (pool round every 10 min, same pending-tx anti-double-pay module). Displayed amounts are estimates; the on-chain transfer is final.
白名单合作方(A 类、B 类)可能适用单独约定的条款。 · Whitelisted partners (class A and B) may have custom terms.
当前参数 · Current parameters
| 参数 Parameter | 值 Value |
| node_reward_share | 50% |
| node_settle_interval | 60 min |
| warmup | 1 min |
| one node per public IP | yes |
| addr_daily_cap_pct | 10% / day (UTC+8) |
| min payout | 1 SCDO |
| max lag | 30 blocks |
| client | CoreGeth/v1.12.23 (desktop 2.0.1 geth.exe sha256 f55efd21891e6a3d6ca938a29631c910bbce4f76b2dc00a6323454d60f4db9eb) |
| observer enode | enode://1d2c370db7c419349e2313f20023f6b379f946990042b9b42df45cb56e4c3487df0d36c52cd81308fcdf312450f758a6213fcac21213e94a71af4a3c9392601f@82.223.19.88:30368 |
API
POST /pool-api/api/node/register {addr, enode, nodeVersion, clientVersion, ts, sig} — sig = personal_sign("SCDO-NODE-REG:<addr>:<enode>:<ts>"), ts ±5 min
POST /pool-api/api/node/heartbeat {addr, enode, head, ts, sig} — sig = personal_sign("SCDO-NODE-HB:<addr>:<enode>:<head>:<ts>")
GET /pool-api/api/node/<addr> · GET /pool-api/api/node/rounds (hourly settlements) · GET /pool-api/api/node/health
Classic: POST /pool-api/api/node/register-classic {addr: "1S01…", nodeId, shard: 1–4, ts, sig, nodeSig}
nodeId = 1S01…/2S02…… node ID (endpoint = your public IP : default port 8057/8058/8059/8056 for shard 1/2/3/4), or <nodeId>@host:port, or snode://<40 hex>@host:port[shard].
msg = "SCDO-NODE-REG:" + addr + ":" + nodeId + ":" + ts (strings exactly as sent, ts = unix seconds, ±5 min)
hash = keccak256(RLP(utf8(msg))) — i.e. go-scdo crypto.MustHash([]byte(msg)); RLP of a byte string ≥ 56 bytes = 0xb7+len(L) ‖ L ‖ msg
sig / nodeSig = 65-byte secp256k1 recoverable signature R ‖ S ‖ V (V = 0/1; 27/28 accepted), hex with or without 0x — same as go-scdo crypto.Sign / tool sign -k <key> -m <msg>
GET /pool-api/api/node/<1S01…> (Classic status) · GET /pool-api/api/node/classic/rounds