Skip to content

Bug: get_time_aged_multiplier() in Whitepaper §5.3 forces sub-1.0 multipliers to 1.0 — defeats ARM anti-farm penalty #7892

Description

@lequangsang01

Bug Report

File: docs/WHITEPAPER.md — Section 5.3, get_time_aged_multiplier() pseudocode

The Bug

The get_time_aged_multiplier() function in Whitepaper §5.3 contains a logic error that forces any hardware with a base multiplier ≤ 1.0 to return exactly 1.0, completely defeating sub-baseline rewards including the critical ARM anti-farm penalty.

def get_time_aged_multiplier(device_arch: str, chain_age_years: float) -> float:
    base_multiplier = ANTIQUITY_MULTIPLIERS.get(device_arch.lower(), 1.0)

    # Modern hardware doesn't decay
    if base_multiplier <= 1.0:
        return 1.0    # <-- BUG: returns 1.0 for ALL sub-1.0 hardware

Why It's Wrong

The Whitepaper's own multiplier table (§5.2) defines hardware with base multipliers below 1.0:

Architecture Base Multiplier
Coffee Lake+ 0.8×
AMD Zen 2/3/4/5 0.8×
ARM SBC (Raspberry Pi) 0.0005×

When base_multiplier <= 1.0, the function returns 1.0 instead of preserving the original value. This causes:

  1. ARM SBC anti-farm penalty completely defeated — Raspberry Pi / cheap SBCs should get 0.0005× (a 2000× penalty) but would receive 1.0× — a 2,000,000% reward increase. This is the single most critical consequence: the entire anti-farm design is nullified.

  2. Modern x86 rewards inflated by 25% — Coffee Lake+ and Zen 2/3/4/5 should get 0.8× but would receive 1.0×.

  3. Contradicts the live API — The live node at rustchain.org/api/miners returns antiquity_multiplier: 0.8 for modern x86 and 0.0005 for ARM, proving the actual implementation handles sub-1.0 multipliers correctly, but the Whitepaper pseudocode does not.

Evidence

Live API data confirms the correct behavior exists in the running node:

GET https://rustchain.org/api/miners
→ modern x86:   antiquity_multiplier: 0.8
→ ARM aarch64:  antiquity_multiplier: 0.0005

Whitepaper §5.1 Base Multiplier Table lists sub-1.0 tiers:

  • "Common" tier: 0.8× for Modern x86_64
  • "Penalized" tier: 0.0005× for ARM SBCs

But the §5.3 code returns 1.0 for both, contradicting the same document.

Suggested Fix

def get_time_aged_multiplier(device_arch: str, chain_age_years: float) -> float:
    base_multiplier = ANTIQUITY_MULTIPLIERS.get(device_arch.lower(), 1.0)

    # Sub-baseline hardware (modern x86, ARM penalty) doesn't decay
    # — it stays at its fixed sub-1.0 rate
    if base_multiplier < 1.0:
        return base_multiplier

    # Baseline hardware stays at 1.0
    if base_multiplier == 1.0:
        return 1.0

    # Vintage hardware decays toward 1.0
    vintage_bonus = base_multiplier - 1.0
    aged_bonus = max(0, vintage_bonus * (1 - DECAY_RATE_PER_YEAR * chain_age_years))
    return 1.0 + aged_bonus

Impact

If anyone implements this pseudocode as written (e.g., alternative node implementations, test harnesses, or developer onboarding), ARM farms would receive full baseline rewards instead of the intended near-zero penalty, completely undermining RustChain's anti-farm security model.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions