اضغط على ESC للإغلاق

Shadow Governance في DeFi: كشف شراء الأصوات على البلوكشين

اختراق الحوكمة في الـ DeFi ما بقى يقتصر على النقاشات العادية في المنتديات العامة زي Discourse؛ اللعبة انتقلت كلياً لـ Liquidity Pools المجهولة وغرف التليجرام المغلقة، وين تتحدد مصائر مليارات الدولارات في ثوانٍ ومعدودات على مستوى البلوكات.

هجوم الـ 51% المباشر على بروتوكول الحوكمة عبر شراء التوكينات الأساسية مباشرة من السوق (زي UNI أو AAVE) يعتبر غباء اقتصادي؛ لأن الـ Slippage ونماذج الـ Staking بترفّع سعر التوكين للسماء فوراً. الحل الأرخص والأذكى هو استئجار أصوات الآخرين عبر آليات الـ Voter Bribes (رشاوي المصوتين). ولما تطلع هالميكانيكية برا المنصات الشفافة زي Votium أو Hidden Hand وتروح لصفقات الـ OTC الخاصة أو العقود الذكية المغلقة، نطيح في ظاهرة الـ Shadow Governance (الحوكمة الخفية) - وهي السيطرة الخفية القادرة على تفريغ خزينة المشروع (Treasury) أو تغيير معايير المخاطرة بدون ما يدري أي فرد في الكوميونيتي.

تشريح الحوكمة الخفية: من الـ Curve Wars إلى البولات المجهولة

شرارة الـ Bribes الأولى بدأت مع معمارية الـ veTokenomics (vote-escrowed) اللي ابتكرتها Curve Finance. بمجرد ما تقفل الـ CRV لمدة توصل لـ 4 سنين، تاخد veCRV اللي يحدد وين تتوجه انبعاثات التوكينات في الـ Liquidity Pools. المشاريع استوعبت الفكرة بسرعة: بدال ما نشتري CRV من السوق ونجمد السيولة 4 سنين، أرخص لنا ندفع عمولة أسبوعية لأصحاب الـ veCRV عشان يصوتون للبول حقنا.

ومن هنا ظهرت أسواق الرشاوي العلنية:

  • Votium (الخاصة بإيكوسيستم Convex/Curve)
  • Hidden Hand من Redacted Cartel (تغطي Balancer و Frax و Aura)

بس الرشاوي الرسمية فيها عيب قاتل بالنسبة للحيتان واللاعبين الكبار — إنها مكشوفة عيني عينك. أي محلل يقدر يفتح الـ Dashboard ويفكك مين جالس يدفع ولأي بول.

عشان كذا، الـ Shadow Governance تعتمد على ميكانيكيات مختلفة تماماً:

  • Flashloans Governance Interception: استغلال الـ Flashloans للسيطرة اللحظية على البروتوكولات اللي ما فيها نظام ve-locking. المهاجم ياخذ القرض، يمرر المقترح بقوة التصويت اللحظية، ويسدد القرض بنفس البلوك.
  • Off-Chain / OTC Bribe Matching: صفقات تحت الطاولة، يتلقى فيها كبار حاملي الـ ve-tokens عملات مستقرة (Stablecoins) أو التوكينات البديلة أو حصص في عقود SAFT مستقبيلة على محافظ كاستودي، مقابل التنازل عن الصوت عبر الـ Delegation.
  • Private Dark Pools (Wrapped Voting Power): تغليف (Wrapping) توكينات الحوكمة داخل عقود ذكية تفصل القيمة الاقتصادية للتوكين عن قوة التصويت حقته. وتصير حقوق الحوكمة متوفرة للبيع والمزايدة عبر المزاد المظلم (Dutch Auctions).

حالات واقعية: كيف طاحت بروتوكولات بسبب الرشاوي الخفية

الحالة الأولى: هجوم Beanstalk Farms (أبريل 2022) - 182 مليون دولار

رغم إن العملية تتصنف تقنياً كـ Flashloan exploit، إلا إن الوصف الأدق لها هو "استحواذ خاطف وخفي على الحوكمة". المهاجم أخذ Flashloan بقيمة مليار دولار من Lido stETH و Bean وأصول ثانية عبر Aave، واستحوذ على أكثر من 70% من قوة التصويت (Voting Power) في مقترح BIP-18 وفوراً حول كل أموال الخزينة لمصلحته.

وين تكمن ميكانيكية الـ Shadow Governance: البروتوكول كان يحسب الأصوات بشكل لحظي بناءً على رصيد التوكينات في البلوك الحالي بدون وجود مهلة زمنية (Timelock) وبدون اشتراط Staking مسبق.

الحالة الثانية: الاستحواذ على حوكمة Tornado Cash (مايو 2023)

المهاجم نشر مقترح (Proposal) ظاهره يتبع نفس منطق مقترح سابق معتمد وموثوق. لكن داخل المقترح كان فيه الكود الخبيث مزروع بدقة. بعد ما أخذ موافقة الكوميونيتي، استخدم الجاني دالة selfdestruct لتغيير منطق العقد بنفس العنوان (عبر CREATE2)، وزرع لنفسه 1.2 مليون صوت وهمي من TORN، وبكذا سيطر بالكامل على الـ DAO وسحب 2.1 مليون دولار من الخزينة.

وين تكمن ميكانيكية الـ Shadow Governance: المهاجم استخدم آليات تنفيذ كود مخفية (Metamorphic Contracts)، سمحت له بتجاوز الـ Visual Audit للمقترحات وتبديل الكود البرمجي قبل لحظات من التصويت.

كيف تكتشف الـ Shadow Governance على مستوى البلوكشين

تتبع صفقات الـ OTC لشراء الأصوات معقد، لكن الترتيبات اللي تصير خارج السلسلة دائماً تترك أثر واضح On-Chain وقت التنفيذ. التحليل يعتمد بشكل أساسي على كشف الشذوذ (Anomalies) في سلوك المحافظ الكبيرة (الحيتان) وعقود الـ Delegation.

مقارنة تحليلية بين الرشاوي المشروعة والحوكمة الخفية

المعيارالرشاوي العلنية (Votium / Hidden Hand)الحوكمة الخفية (OTC / Private)
شفافية المدفوعاتتوزيع On-chain مكشوف عبر Merkle Treeمعاملات عبر Tornado/Railgun/CEX أو محافظ جديدة
مصدر التوزيععقود ذكية عامة في السوقMultisigs مغلقة، EOAs، أو MEV Bots
التفويض (Delegation)مؤتمت عبر مستودعات الـ Metaتغييرات مفاجئة وغير معتادة للمفوضين قبل التصويت مباشرة
العائد الاقتصاديمحدد حسب ROI السوق من الانبعاثاتمكافآت ضخمة وغير متناسبة مقابل بند معين
المهلة الزمنية (Timelock)ملتزم بها حسب القواعد الأساسية للـ DAOيتم الالتفاف عليها بإنشاء Multisigs طوارئ

خوارزمية عملية لتتبع الآثار على البلوكشين

عشان نحدد مواقع الحوكمة الخفية، مهندسو الـ Backend والمحللون يضبطون أنظمة التتبع لرصد الشذوذ التالي:

  • تتبع أنماط التفويض (Delegate Tracking): مراقبة حدث DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate). إذا قام عنوان كبير (من قائمة أكبر 20 حامل للتوكين) بتحويل قوة التصويت لمحافظ فارغة قبل 2-3 بلوكات من إغلاق نافذة التصويت، فهذا مؤشر مباشر لصفقة OTC.
  • حركة الأموال من عقود الـ Flash-Mixers: إذا المحفظة اللي تفوضت لها الأصوات استلمت عملات مستقرة أو توكينات أصلية من الخلاطات المجهولة قبل ساعات من التصويت، فبنسبة كبيرة هذي عملية دفع مقابل تنفيذ رغبة جهة معينة.
  • الـ Mempool ورشوة الـ MEV (MEV-driven Voting): خطف المقترح في آخر بلوك ممكن. المهاجمين يرسلون معاملات خاصة (Private Transactions) مباشرة للـ Builder (عبر Flashbots) عشان يخفون تجمع الأصوات الناقدة لين يتم ختم البلوك.

تحليل الشذوذ: سكريبت Python لمراقبة التفويض

أدناه سكريبت خفيف بلغة Python باستخدام مكتبة web3.py يتتبع نقل كميات ضخمة ومفاجئة من الـ Voting Power في عقود ERC20Votes (معمارية Compound/OpenZeppelin) قبل عمليات التصويت.

import time
import logging
from collections import defaultdict
from web3 import Web3

# Configure logging
logging.basicConfig(level=logging.INFO, format="%(asctime)s [%(levelname)s] %(message)s")

RPC_URL = "https://eth-mainnet.g.alchemy.com/v2/YOUR_API_KEY"
RAW_TOKEN_ADDRESS = "0x1f9840a85d5aF5bf1D1762F925BDADdC4201F984"  # UNI

# Protection against chain reorgs (12 blocks ~= 2.5 minutes)
SAFE_CONFIRMATIONS = 12
BATCH_STEP = 1000

ABI = [
    {
        "inputs": [],
        "name": "decimals",
        "outputs": [{"type": "uint8"}],
        "stateMutability": "view",
        "type": "function"
    },
    {
        "inputs": [],
        "name": "totalSupply",
        "outputs": [{"type": "uint256"}],
        "stateMutability": "view",
        "type": "function"
    },
    {
        "anonymous": False,
        "inputs": [
            {"indexed": True, "name": "delegate", "type": "address"},
            {"indexed": False, "name": "previousBalance", "type": "uint256"},
            {"indexed": False, "name": "newBalance", "type": "uint256"}
        ],
        "name": "DelegateVotesChanged",
        "type": "event"
    },
    {
        "anonymous": False,
        "inputs": [
            {"indexed": True, "name": "delegator", "type": "address"},
            {"indexed": True, "name": "fromDelegate", "type": "address"},
            {"indexed": True, "name": "toDelegate", "type": "address"}
        ],
        "name": "DelegateChanged",
        "type": "event"
    }
]

# 1. Check RPC connection
w3 = Web3(Web3.HTTPProvider(RPC_URL))
if not w3.is_connected():
    raise ConnectionError("RPC node unreachable. Check API key or node connectivity.")

# 2. Checksum address & Load contract
token_address = w3.to_checksum_address(RAW_TOKEN_ADDRESS)
contract = w3.eth.contract(address=token_address, abi=ABI)

# 3. Dynamic token parameters
try:
    TOKEN_DECIMALS = contract.functions.decimals().call()
    TOTAL_SUPPLY = contract.functions.totalSupply().call()
    logging.info(f"Token initialized. Decimals: {TOKEN_DECIMALS} | Total Supply: {TOTAL_SUPPLY / (10 ** TOKEN_DECIMALS):,.0f}")
except Exception as e:
    logging.warning(f"Failed to fetch token metadata, using fallback defaults: {e}")
    TOKEN_DECIMALS = 18
    TOTAL_SUPPLY = 1000000000 * (10 ** 18)  # Default fallback 1B

# Anomaly Threshold: 100,000 tokens
VOTE_THRESHOLD = 100000 * (10 ** TOKEN_DECIMALS)

def get_logs_batched(event_obj, from_block, to_block):
    """Safely fetch event logs in batches. Returns (logs, is_success)."""
    all_events = []
    for start in range(from_block, to_block + 1, BATCH_STEP):
        end = min(start + BATCH_STEP - 1, to_block)
        try:
            logs = event_obj.get_logs(fromBlock=start, toBlock=end)
            all_events.extend(logs)
        except Exception as e:
            logging.error(f"RPC Log fetch failed for blocks {start}-{end}: {e}")
            return [], False
    return all_events, True

def analyze_governance_shifts(from_block, to_block):
    """Analyze vote delegation flows and track supply impact percentage."""
    vote_changes, ok1 = get_logs_batched(contract.events.DelegateVotesChanged, from_block, to_block)
    delegations, ok2 = get_logs_batched(contract.events.DelegateChanged, from_block, to_block)
    
    if not (ok1 and ok2):
        return False  # Execution failed, keep block height intact for retry

    # Map delegation events by transaction hash
    delegation_map = defaultdict(list)
    for d in delegations:
        tx_hash = d.transactionHash.hex()
        delegation_map[tx_hash].append({
            "delegator": d.args.delegator,
            "from": d.args.fromDelegate,
            "to": d.args.toDelegate
        })

    for event in vote_changes:
        prev_bal = event.args.previousBalance
        new_bal = event.args.newBalance
        delta = new_bal - prev_bal
        
        if abs(delta) >= VOTE_THRESHOLD:
            tx_hash = event.transactionHash.hex()
            delegate = event.args.delegate
            
            # Metrics relative to Total Supply
            fmt_delta = delta / (10 ** TOKEN_DECIMALS)
            fmt_new = new_bal / (10 ** TOKEN_DECIMALS)
            share_of_supply = (new_bal / TOTAL_SUPPLY) * 100
            delta_share_of_supply = (abs(delta) / TOTAL_SUPPLY) * 100
            
            # Severity grading
            severity = "CRITICAL SPIKE" if share_of_supply >= 1.0 else "WARNING"
            logging.warning(f"[{severity}] Voting Power Shift: {fmt_delta:+,.0f} tokens ({delta_share_of_supply:.3f}% of Total Supply)")
            logging.info(f"    Delegate: {delegate}")
            logging.info(f"    Current Impact: {fmt_new:,.0f} votes ({share_of_supply:.3f}% of Total Supply)")
            logging.info(f"    Tx Hash: {tx_hash}")
            
            contexts = delegation_map.get(tx_hash, [])
            if contexts:
                logging.info(f"    Cause: DIRECT DELEGATE CHANGE ({len(contexts)} events in Tx)")
                for ctx in contexts:
                    logging.info(f"      • Delegator: {ctx['delegator']} | {ctx['from']} -> {ctx['to']}")
            else:
                logging.info("    Cause: Balance Adjustment on Existing Delegate (Transfer / Claim / Mint / Burn)")
            
            print("-" * 75)
            
    return True

def start_realtime_monitoring(poll_interval=12):
    """Real-time monitoring daemon maintaining confirmation depth."""
    latest_block = w3.eth.block_number
    last_processed_block = latest_block - SAFE_CONFIRMATIONS - 1
    logging.info(f"Daemon started. Safe target block: #{last_processed_block} (Confirmations = {SAFE_CONFIRMATIONS})")
    
    while True:
        try:
            current_block = w3.eth.block_number
            safe_block = current_block - SAFE_CONFIRMATIONS
            
            if safe_block > last_processed_block:
                success = analyze_governance_shifts(last_processed_block + 1, safe_block)
                if success:
                    last_processed_block = safe_block
                else:
                    logging.warning("Block range processing incomplete due to RPC error. Retrying in next cycle.")
        except Exception as e:
            logging.error(f"Critical exception in runtime loop: {e}")
            
        time.sleep(poll_interval)

if __name__ == "__main__":
    start_realtime_monitoring(poll_interval=12)

طرق الحماية من الـ Shadow Governance

السوق بدا يتكيف تدريجياً مع هجمات الحوكمة. التدقيق السطحي لكود العقد الذكي ما بقى يكفي، الحين نحتاج معمارية حماية شاملة لنفس نموذج الـ DAO.

  • تطبيق الـ Timelocks مع خاصية الـ Veto: التغيرات البرمجية لازم ما تتنفذ فوراً. وجود مهلة زمنية بحد أدنى 48–72 ساعة يعطي مجلس الأمان (Security Council) فرصة لتجميد المقترحات الخبيثة.
  • الانتقال لنماذج ve-models المتقدمة مع تأخير الفك: لما تكون التوكينات مقفلة بدون إمكانية للتلاعب السريع، تكلفة الهجوم الخفي الخاطف تتضاعف أضعاف مجهزة.
  • الحوكمة التفاؤلية (Optimistic Governance): النموذج اللي طبقوه Moonwell و Lido، وين تنقبل المقترحات افتراضياً، وما يتطلب التصويت إلا إذا الكوميونيتي قرر يفرض الفيتو.

الحوكمة الخفية تعتبر نتيجة طبيعية لتحول حق التصويت إلى أصل مالي. ومهمتنا كمحللين ومهندسين بلوكشين في EXMON هي رصد هالأمور غير الطبيعية في الـ Mempool وعلى مستوى العقود الذكية في وقتها المناسب، عشان نضمن أعلى معايير الأمان والشفافية لكل مستخدمي الإيكوسيستم حقنا.

تلخيص هذه التدوينة باستخدام:

FAQ

يُقصد بـ Shadow Governance الاستحواذ الخفي على القوة التصويتية للبروتوكول عبر حوافز مالية خاصة خارج السوق المفتوح (OTC) أو عبر Dark Pools دون الحاجة لشراء رموز الحوكمة المباشرة. يلجأ المهاجمون للصفقات الخارجية لدفع المكافآت لكبار كفلاء الرموز (veToken holders) أو المفوضين بأصول خارجية لتأمين النصاب القانوني دون التسبب في انزلاق سعري أو إثارة شكوك مجتمع DAO.

يتم الاكتشاف عبر تحليل سجلات الأحداث DelegateChanged و DelegateVotesChanged في العقود الذكية لرصد التحركات غير الطبيعية في ثقل الأصوات وربط التجزئة (Transaction Hashes) بعناوين المفوضين الأصليين. يتيح مطابقة التغيرات المفاجئة مع استخدام حزم Flashbots الخاصة وتدفقات الأموال من الخلاطات الرقمية للسكربتات البرمجية تحديد التجميع الخفي للأصوات قبل تنفيذ المقترح.

تحمي البروتوكولات أنظمتها عبر اعتماد اللقطات التاريخية (Historical Snapshots) للكتل لحساب القوة التصويتية، وفرض فترات تأخير تنفيذ إجبارية (Timelocks) مع صلاحيات الفيتو لمجلس الأمان، بالإضافة إلى تطبيق نصاب قانوني ديناميكي. يساهم دمج الحوكمة التفاؤلية (Optimistic Governance) وهياكل التحقق ثنائية الرموز في تحييد تلاعب الـ Flashloan في الكتلة الواحدة وجعل استئجار الأصوات قصير الأجل غير مجدٍ اقتصادياً.
Astra EXMON

Astra is the official voice of EXMON and the editorial collective dedicated to bringing you the most timely and accurate information from the crypto market. Astra represents the combined expertise of our internal analysts, product managers, and blockchain engineers.

...

شاركنا برأيك

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها *