FlareWatch gán cho mỗi trình xác thực P-Chain một điểm tổng hợp 0–100 trên 9 chiều. Toán học là xác định, các đầu vào là dữ liệu chuỗi công khai [Flare Explorer] [FSE] [Flaremetrics], và cùng một thuật toán áp dụng cho mọi trình xác thực trên mạng — bao gồm nút trình xác thực của chính FlareWatch, được tính bởi chính hàm này mà không có xử lý đặc biệt nào. Trang này ghi lại mọi chiều và ngưỡng để các nhà khai thác và những người staking có thể thấy chính xác cách tính điểm và tại sao mỗi giá trị được chọn. Mọi yêu cầu ở đây liên kết trở lại nguồn gốc trên chuỗi hoặc nguồn cấp trên của nó — xem Nguồn & tham khảo ở cuối.
staking mode trên trang trình xác thực (ủy quyền FLR cho trình xác thực P-Chain để nhận phần thưởng VRM + MIRROR). Điểm nhà cung cấp FTSO hiển thị trong delegation mode (ủy quyền WFLR cho các nhà cung cấp dữ liệu FTSO) sử dụng một thuật toán 13 chiều riêng biệt tập trung vào hiệu suất nhà cung cấp dữ liệu — độ chính xác, tham gia giao thức V2, v.v. Đây là các vai trò on-chain riêng biệt có phần thưởng riêng biệt, được tính điểm riêng biệt. Xem Phương pháp Tính Điểm Nhà Cung Cấp FTSO cho phía ủy quyền.APY trên bảng staking là tỷ lệ toàn bộ mà một người ủy thác nhận được — một con số, không cần tính toán tinh thần. Nó được đo từ các script phần thưởng của Flare (payout thực tế, không phải công thức), sau khi trừ phí của validator, và nó thay đổi mỗi epoch theo phần thưởng thực tế. Ở mọi nơi trên FlareWatch, APY có nghĩa là sau khi trừ phí và APY có nghĩa là trước nó.
So sánh với Flare Systems Explorer? FSE và các trình khám phá khác hiển thị tỷ lệ ủy thác duy nhất — họ không cộng MIRROR — vì vậy APY tổng của chúng tôi đọc cao hơn trên bất kỳ validator MIRROR-active nào (khoảng cách chính xác là dòng MIRROR ở trên). Cả hai con số đều là ~8-epoch trailing averages từ cùng dữ liệu reward-scripts, vì vậy thay đổi phí mid-window của validator lạm vào một ảnh chụp phí hiện tại trên trang web bất kỳ cho đến khi nó lão hóa qua cửa sổ.
Hai con số khác xuất hiện trong tooltip APY và không phải là tỷ lệ của người ủy thác: đường cơ sở lý thuyết (APY tổng của mạng × (1 − phí), chỉ staking — được sử dụng làm fallback trước khi có đủ lịch sử đo được), và lợi suất tự ràng buộc của nhà điều hành (lợi suất stake riêng của validator, được khuếch đại bởi việc thu phí — một số liệu nhà điều hành, không phải những gì bạn kiếm).
Để tính điểm: chiều Net Yield tính điểm chỉ tỷ lệ ủy thác VRM và MIRROR được tính điểm trong chiều riêng của nó — vì vậy MIRROR không bao giờ được tính điểm kép, ngay cả khi nó được bao gồm trong APY tổng được hiển thị.
| 90+ | Tầng hàng đầu — hàng đầu ~10–20% các nhà khai thác. Hồ sơ điển hình: trình xác thực full-stack + FTSO + FDC, phí ở mức thấp, hoạt động MIRROR, độ tin cậy FIP-10 nhất quán, cơ sở người ủy quyền lành mạnh, self-bond có ý nghĩa. Không yêu cầu chiều nào đơn lẻ — các nhà khai thác đạt tầng hàng đầu bằng cách xếp chồng sức mạnh trên hầu hết các loại. |
| 80–89 | Mạnh — đáp ứng hầu hết các tiêu chuẩn chính; thiếu một hoặc hai chiều so với tầng hàng đầu. |
| 70–79 | Tốt — đáp ứng tất cả các tiêu chí cơ sở; không có khoảng trống lớn. |
| 60–69 | Chấp nhận được — có thể sử dụng nhưng không phân biệt. |
| <60 | Dưới trung bình — khoảng trống đáng kể trong một hoặc nhiều chiều. Sự thật toán học, không phải đánh giá chất lượng. |
if (uptime >= 99.5) raw = 17 + (uptime - 99.5) * 6
else if (uptime >= 99) raw = 13 + (uptime - 99) * 8
else if (uptime >= 95) raw = 4 + (uptime - 95) * 2.25 // v3.9: was (u - 95) * 3.25 starting at 0
else raw = max(0, uptime - 90) * 0.8 // 90 → 0, 95 → 4 (continuity)
raw = clamp(raw, 0, 20)
reliability = epochsIncluded / epochsObserved // last ~8 epochs · v4.2: the
// FULL FIP-10 minimums set
// (uptime + FSP + FTSO + FDC),
// not RPC-uptime alone
score = raw * clamp(reliability, 0, 1) // dimension max 20scoreAPR = delegationAPY > 0 ? delegationAPY : baseAPR // VRM, net of fee medianAPR = median(scoreAPR across all validators) cappedAPR = min(scoreAPR, 25) // APY_DISPLAY_CAP if (medianAPR > 0): ratio = cappedAPR / medianAPR score = clamp(((ratio - 0.6) / 0.6) * 18, 0, 18) else: score = min(18, (cappedAPR / 8) * 18) // fallback: BASE_APY = 8
// anchor = max(observed minimum active fee, 20% protocol floor) d = fee - anchor // distance above market best if (d <= 0) score = 7 // at/below best available else if (d <= 5) score = 7 - d * 0.2 // 0 → 5 over: 7 → 6 else if (d <= 10) score = 6 - (d - 5) * 0.3 // 5 → 10 over: 6 → 4.5 else if (d <= 15) score = 4.5 - (d - 10) * 0.4 // 10 → 15 over: 4.5 → 2.5 else if (d <= 20) score = 2.5 - (d - 15) * 0.5 // 15 → 20 over: 2.5 → 0 else score = 0 // fees > anchor+20 saturate at 0/7 — the v4.5 extreme-fee // penalty below takes over from there
// Verification baseline (v3.10 hybrid) isCurated = (in KNOWN_VALIDATORS) OR ( daysObserved >= 90 AND operatorDelegatorCount >= 25 AND retention30d >= -15% AND selfBondFLR >= 1_000_000 ) if (isCurated) verification = 7 else if (name auto-discovered) verification = 3 else verification = 0 // FTSO-derived (only when ftsoOperatorScore is a number) clamped = clamp(ftsoOperatorScore, 50, 100) ftsoDerived = 4 + (clamped - 50) * (8/50) // FTSO 50 → 4, FTSO 100 → 12 // Final score score = max(verification, ftsoDerived)
passthrough = max(0, 1 - fee / 100) if (mirrorStatus == "active") base = 10 * passthrough else if (mirrorStatus == "paused") base = 5 * passthrough else if (mirrorStatus == "inactive") base = 0 else base = 5 * passthrough // no data yet // v4.6 — capped, median-anchored bonus for delivered MIRROR yield. // Only mirror-active validators paying ABOVE 1.2x the network median // delivered rate (mirrorAPY, net of fee) earn it; size-neutral. ratio = mirrorAPY / networkMedianMirrorAPY bonus = clamp((ratio - 1.2) * 5, 0, 2) // active only, else 0 score = base + bonus // dimension max 12
utilization = clamp(1 - freeSpaceFLR / maxDelegationFLR, 0, 1) if (utilization <= 0.70): score = 1.75 + (utilization / 0.70) * 5.25 // 1.75 → 7 ramp else: score = 7 - ((utilization - 0.70) / 0.30) * 1.75 // 7 → 5.25 ramp
// Count signal (max 6)
if (delegatorCount <= 5) countScore = 0
else if (delegatorCount >= 500) countScore = 6
else countScore = clamp(log(delegatorCount / 5) / log(100) * 6, 0, 6)
// Concentration adjustment (-1 to +1) — skip if <3 delegators
avgFLR = delegatedFLR / delegatorCount
if (avgFLR < 500_000) concentrationAdj = +1
else if (avgFLR < 5_000_000) concentrationAdj = +0.5
else if (avgFLR > 50_000_000) concentrationAdj = -1
else if (avgFLR > 20_000_000) concentrationAdj = -0.5
else concentrationAdj = 0
// Longevity bonus (0 to +1)
daysObserved = (now - firstObservedAtMs) / 86400000
if (daysObserved >= 90) longevityBonus = +1
else if (daysObserved >= 30) longevityBonus = +0.5
else longevityBonus = 0
// Self-bond alignment (-1 to +2, two-axis since v4.7)
if (selfBondFLR < 1_000_000) selfBondAdj = -1 // hollow-operator floor
else:
ratio = selfBondFLR / totalStake // totalStake = selfBond + delegated
proportional = ratio >= 0.10 ? +2 : ratio >= 0.05 ? +1 : 0
absolute = min(1, selfBondFLR / 20_000_000) * 2 // saturates at top-decile bond
selfBondAdj = max(proportional, absolute) // the better of the two axes
// Retention (-0.5 to +0.5, v3.7) — skip if no 30-day baseline yet
delta = (delegatedFLR - delegatedFLR30dAgo) / delegatedFLR30dAgo
if (delta >= +0.10) retentionAdj = +0.5
else if (delta <= -0.15) retentionAdj = -0.5
else retentionAdj = 0
// Self-bond trajectory (-0.5 to +0.5, v3.7) — skip if no baseline
sbDelta = (selfBondFLR - selfBondFLR30dAgo) / selfBondFLR30dAgo
if (sbDelta >= +0.20) selfBondTrajectoryAdj = +0.5
else if (sbDelta <= -0.10) selfBondTrajectoryAdj = -0.5
else selfBondTrajectoryAdj = 0
score = clamp(countScore + concentrationAdj + longevityBonus + selfBondAdj
+ retentionAdj + selfBondTrajectoryAdj, 0, 11)// Time-weighted rate is computed upstream from per-epoch // reward-scripts data with decay = 0.85 per epoch back. r = deliveryRatio // capped at 1.0 if (r >= 1.00) base = 10 else if (r >= 0.97) base = 9 + (r - 0.97) * (1 / 0.03) // 0.97 → 9, 1.00 → 10 else if (r >= 0.95) base = 8 + (r - 0.95) * (1 / 0.02) // 0.95 → 8, 0.97 → 9 else if (r >= 0.90) base = 6 + (r - 0.90) * (2 / 0.05) // 0.90 → 6, 0.95 → 8 else if (r >= 0.85) base = 4 + (r - 0.85) * (2 / 0.05) // 0.85 → 4, 0.90 → 6 else if (r >= 0.80) base = 2 + (r - 0.80) * (2 / 0.05) // 0.80 → 2, 0.85 → 4 else base = max(0, r * 2.5) // 0 → 0, 0.80 → 2 // Variance penalty (CoV = std-dev / mean across per-epoch rates) variancePenalty = min(0.30, coefficientOfVariation * 0.5) score = base * (1 - variancePenalty) // Sample-size confidence dampener for < 3 epochs if (totalStakesCompleted < 3): confidence = totalStakesCompleted / 3 score = 5 + (score - 5) * confidence
daysLeft = (endTimeMs - now) / 86_400_000 if (daysLeft < 14) score = 0 else if (daysLeft < 30) score = 0 + (daysLeft - 14) * (2 / 16) // 14 → 0, 30 → 2 else if (daysLeft < 60) score = 2 + (daysLeft - 30) * (1 / 30) // 30 → 2, 60 → 3 else if (daysLeft < 120) score = 3 + (daysLeft - 60) * (2 / 60) // 60 → 3, 120 → 5 else score = 5
consecutiveMisses = 0 for entry in participation.recent (newest-first): if entry.eligible: break consecutiveMisses++ if consecutiveMisses < 2: penalty = 0 elif consecutiveMisses == 2: penalty = 3 elif consecutiveMisses == 3: penalty = 6 else: penalty = 10 // 4+ score = max(0, positiveDimensionsSum - penalty)
// v4.5 — fees beyond the Fee dimension's range (anchor+20)
if fee <= 50: penalty = 0
else: fraction = min(1, (fee - 50) / 50) * 0.75
penalty = positiveDimensionsSum * fraction
// fee 50% → no change · 75% → −37.5% of score · 100% → −75%
score = max(0, positiveDimensionsSum - outagePenalty - penalty)delegationFee, selfBond, delegatedStake, và FTSO score (nếu bạn cũng là data provider).generated-files/reward-epoch-N/nodes-data.json. Đếm có bao nhiêu epochs nodeID của bạn có uptimeEligible: true. Tỷ lệ đó xác định multiplier Uptime dimension của bạn.RewardClaimed events với claimType=3 referencing nodeID của bạn. Nếu không có gần đây, bạn sẽ hiển thị là MIRROR-inactive.GET /api/validators/{nodeID}/score-breakdown để retrieve persisted breakdown — mọi dimension's value, algorithm version đã tạo ra nó, và recent score history — dưới dạng JSON. Panel score-breakdown trong UI đọc từ cùng một nguồn.// Step 1 — Raw composite (sum of dimensions, minus the two penalties)
positive = uptime + netYield + fee + operatorQuality
+ mirror + capacity + trust + delivery + timeRemaining
// Penalties (see the two penalty cards above):
// v4.3 active-outage streak — 0-1 missed epochs → 0, 2 → 3, 3 → 6, 4+ → 10
// v4.5 extreme fee (>50%) — positive × min(1, (fee - 50) / 50) × 0.75
raw = clamp(positive - streakPenalty - extremeFeePenalty, 0, 100)
// Step 2 — Smooth across recent cron snapshots (v3.5)
// Weights: current 0.5, prev1 0.3, prev2 0.15, prev3 0.05
smoothed = 0.5*raw + 0.3*prev1 + 0.15*prev2 + 0.05*prev3
// Step 3 — Apply sudden-change penalty if flagged this run
// Triggers: fee +50% or +5pt jump, self-bond -20% drop, uptime -5% crash
// Magnitude: -10 pts on detection, decays -7, -4, -1 over 3 runs
suddenPenalty = -10 if any flag triggered else (decaying remainder)
// Step 4 — Final score
score = clamp(smoothed + suddenPenalty, 0, 100)services/validators/scoring.ts trong codebase FlareWatch. Các nhà khai thác hoặc nhà nghiên cứu muốn kiểm tra việc triển khai trực tiếp (thay vì đọc phần mô tả + công thức ở trên) — hoặc những người muốn fork nó để sử dụng riêng — có thể gửi email tới [email protected] để yêu cầu truy cập. Chúng tôi sẽ công bố tệp dưới dạng gói open-source độc lập nếu có nhu cầu thực sự./api/cron/refresh-validators tính toán lại điểm số của mọi validator hoạt động mỗi 5 phút. Các đầu vào (P-Chain RPC reads, Flaremetrics, FSE, reward-scripts) được lấy lại mới trên mỗi lần chạy.Flare không slash stake của validator. Toàn bộ cơ chế penalty cho hành vi sai trái của validator là forfeiture reward cộng với hệ thống các pass FIP-10. Không có double-signing slash, không có equivocation slash, không có sự kiện phá hủy stake mà chúng tôi cần theo dõi. Các validator không đáp ứng các điều kiện tối thiểu FIP-10 sẽ mất reward của epoch đó (forfeiture đầy đủ nếu không có pass, nếu không thì mất một pass trên mỗi giao thức mà họ không thỏa mãn); số stake chính của họ vẫn không được thay đổi.
Điều đó có nghĩa là điểm số không có thứ nguyên "lịch sử slashing" — không có lịch sử như vậy để theo dõi. Những gì chúng TÔI THEO DÕI là hệ quả của mỗi lỗi tối thiểu: validator kiếm được không có gì trong epoch đó, được nắm bắt trong epochsIncluded / epochsObserved. Bản cập nhật v4.2 vào ngày 2026-05-14 đã mở rộng bộ nhân độ tin cậy của điểm số để sử dụng tỷ lệ đó trên toàn bộ bộ tối thiểu FIP-10 (uptime, FSP signing, FTSO submission rate, FDC participation) để validator không thỏa mãn bất kỳ tối thiểu nào bị phạt tương ứng trong thứ nguyên Uptime bất kể trục nào bị hỏng.
Ngưỡng tối thiểu FIP-10, lấy từ dev.flare.network/network/fsp/rewarding: staking yêu cầu 80% uptime + 1M FLR active self-bond; FTSO anchor feeds yêu cầu ước tính trong 0.5% của trung bình đồng thuận trong 80% vòng; FTSO block-latency feeds yêu cầu submit 80% cập nhật dự kiến; FDC yêu cầu tham gia 60% vòng bỏ phiếu. Các validator đáp ứng sàn 80% uptime + 1M self-bond nhưng dưới ngưỡng kiếm 3M / 15M vẫn nhận reward nhưng không thể tích lũy pass — vùng xám được hiển thị qua phân loại passEligibility: "at-risk" của thẻ này.