Kapatmak için ESC'ye basın

Shadow Governance ve DeFi Oy Manipülasyonu: On-Chain

DeFi'da yönetişim (governance) istismarları çoktan Discourse üzerindeki halka açık tartışmalardan çıkıp, milyarlarca doların kaderinin birkaç blok içinde belirlendiği anonim likidite havuzlarına ve gizli Telegram gruplarına kaydı.

Spot piyasadan yerel tokenları (örneğin UNI veya AAVE) toplayarak bir governance protokolüne doğrudan %51 saldırısı düzenlemek ekonomik açıdan tam bir intihardır: Kayma (slippage) ve staking mekanizmaları token fiyatını anında uzaya çıkarır. Bunun yerine Voter Bribes (oy rüşvetleri) mekanizması üzerinden başkalarının oy gücünü kiralamak katbekat daha ucuzdur. Bu dinamik, Votium veya Hidden Hand gibi şeffaf platformların dışına çıkıp tezgah üstü (OTC) anlaşmalara veya kapalı smart contract'lara kaydığında ise ortaya Shadow Governance (Gölge Yönetişim) çıkar. Bu durum, sıradan topluluğun ruhu bile duymadan projenin hazinesini boşaltabilecek veya risk parametrelerini değiştirebilecek gizli bir yönetim tehdididir.

Gölge Yönetişimin Anatomisi: Curve Wars'tan Anonim Havuzlara

Sektördeki rüşvet mekanizmasının kökeni, Curve Finance tarafınca geliştirilen veTokenomics (vote-escrowed) mimarisine dayanır. CRV tokenlarını 4 yıla kadar kilitleyen kullanıcılar, likidite havuzlarına aktarılacak token emisyonlarının yönünü belirleyen veCRV elde eder. Protokoller olayı hızlıca çözdü: Spot piyasadan CRV toplayıp sermayeyi 4 yıllığına kitlemek yerine, istediği havuza oy vermeleri için veCRV sahiplerine haftalık rüşvet/pay ödemek çok daha maaliyet etkindir.

Böylece şeffaf rüşvet pazarları doğdu:

  • Votium (Convex/Curve ekosistemi için)
  • Redacted Cartel imzalı Hidden Hand (Balancer, Frax, Aura destekli)

Ancak bu resmi rüşvet pazarlarının balinalar için kritik bir dezavantajı var: Her şey kabak gibi ortada. Herhangi bir zincir üstü analist bir Dashboard açıp kimin hangi havuz için ne kadar ödediğini şak diye görebilir.

Shadow Governance tarafında ise tamamen farklı mekanizmalar çalışır:

  • Flashloans Governance Interception: ve-kilitleme mekanizması bulunmayan protokolleri tek bir işlemde (tx) ele geçirmek için flaş kredilerin kullanılması. Saldırgan flaş kredi çeker, anlık teminatla teklifi onaylatır ve borcu hemen kapatır.
  • Off-Chain / OTC Bribe Matching: Kurumsal ve-token sahiplerinin, delegasyon yoluyla oy vermeleri karşılığında saklama (custodial) cüzdanlarına stablecoin, altcoin veya müstakbel SAFT sözleşmelerinden tahsisat aldığı kapalı kapılar ardındaki anlaşmalar.
  • Private Dark Pools (Wrapped Voting Power): Yönetişim tokenlarının, finansal değer ile oy hakkını birbirinden ayıran smart contract'lar içine sarmalanması (wrapping). Oy hakları tokenize edilir ve kapalı zarf usulü açık artırmalarda (Dutch Auctions) satılır.

Saha Vakalari: Gizli Rüşvet Yüzünden Çöken Protokoller

Vaka 1: Beanstalk Farms Saldırısı (Nisan 2022) - 182 Milyon Dolar

Kağıt üzerinde bu bir Flashloan exploit'i gibi görünse de aslında tipik bir "anlık gölge yönetim gaspı"dır. Saldırgan, Aave üzerinden Lido stETH, Bean ve diğer varlıklarda 1 milyar dolarlık flaş kredi çekti. BIP-18 (Beanstalk Improvement Proposal) teklifinde anında %70'in üzerinde oy gücü (Voting Power) elde etti ve hazinedeki tüm fonları kendi cüzdanına boşalttı.

Shadow Governance Dinamiği Neredeydi: Protokol, zaman kilidi (Timelock) ve önceden staking zorunluluğu olmaksızın, mevcut bloktaki token bakiyesine dayalı anlık oy sayımı kullanıyordu.

Vaka 2: Tornado Cash Governance'ının Ele Geçirilmesi (Mayıs 2023)

Saldırgan, daha önce toplulukça kabul edilmiş bir teklifle güya aynı mantığı taşıyan bir proposal yayınladı. Ancak teklifin içine zararlı kod gizlenmişti. Topluluk onayını aldıktan sonra saldırgan, selfdestruct fonksiyonunu kullanarak aynı adresteki (CREATE2 vasıtasıyla) teklif sözleşmesinin mantığını değiştirdi. Kendisine 1.2 milyon sahte TORN oyu basarak DAO'nun kontrolünü tamamen eline geçirdi ve hazineden 2.1 milyon dolar çekti.

Shadow Governance Dinamiği Neredeydi: Hacker, kodun görsel denetimini (audit) baypas etmesine ve tam oylama öncesinde mantığı değiştirmesine olanak tanıyan gizli kod yürütme mekanizmalarından (metamorphic contracts) faydalandı.

Blockchain Seviyesinde Shadow Governance Nasıl Tespit Edilir?

Tezgah üstü (OTC) oy alımlarını izlemek zordur ancak off-chain anlaşmalar yürütmeye girdiğinde mutlaka zincir üzerinde bir ayak izi bırakır. Analiz, balina cüzdanlarının ve delegasyon sözleşmelerinin davranışlarındaki anormallikleri tespit etmeye dayanır.

Yasal Rüşvet ile Gölge Yönetişimin Karşılaştırılması

ParametreŞeffaf Rüşvet (Votium / Hidden Hand)Shadow Governance (OTC / Özel)
Ödeme ŞeffaflığıMerkle Tree tabanlı on-chain dağıtımTornado/Railgun/CEX veya taze cüzdanlar üzerinden tx transferleri
Dağıtım KaynağıPazar yerinin public smart contract'larıGizli multisig'ler, EOA cüzdanları, MEV botları
DelegasyonMeta-repository'ler üzerinden otomatize edilmişOylama öncesinde ani ve olağandışı delege değişimleri
Ekonomik GetiriEmisyondan elde edilen piyasa ROI'si ile sınırlıBelirli bir madde için orantısız derecede yüksek teşvik
Timelock (Zaman Kilidi)Temel DAO kurallarınca harfiyen uygulanırAcil durum multisig'leri oluşturularak baypas edilir

On-Chain İz Sürme Algoritması

Gölge yönetişimi lokalize edip yakalamak için backend mühendisleri ve analistler şu anormallikleri izleyen mimariler kurar:

  • Delegasyon Kalıplarının Analizi (Delegate Tracking): DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate) event'lerinin takibi. Eğer büyük bir cüzdan (top-20 holder) oy hakkını oylama penceresinin kapanmasına 2-3 blok kala sıfır geçmişi olan boş bir cüzdana devrederse, bu net bir OTC anlaşması işaretidir.
  • Flash-Mixer Kontratlarından Gelen Fon Hareketleri: Oyların delege edildiği cüzdan, oylamadan birkaç saat önce anonim mikserlerden stablecoin veya native token alıyorsa, burada ısmarlama bir oylama hizmetinin finansmanı dönüyor demektir.
  • Mempool ve MEV Tabanlı Oylama (MEV-driven Voting): Teklifi tam son blokta kapatmak. Saldırganlar, blok mühürlenene kadar kritik oy çoğunluğunun ortaya çıktığını gizlemek için özel işlemleri (private tx) doğrudan blok üreticisine (builder/Flashbots üzerinden) iletir.

Anomali Parsing: Delegasyon Takibi İçin Python Betiği

Aşağıda, oylamalar öncesinde ERC20Votes (Compound/OpenZeppelin mimarisi) üzerindeki ani ve devasa oy gücü değişimlerini izleyen web3.py tabanlı hafif bir Python script'i yer almaktadır.

import time
import logging
from collections import defaultdict
from web3 import Web3
# Log yapılandırması
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
# Ağ reorganizasyonlarına karşı koruma gecikmesi (12 blok ~= 2.5 dakika)
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. RPC Kontrolü
w3 = Web3(Web3.HTTPProvider(RPC_URL))
if not w3.is_connected():
   raise ConnectionError("RPC bağlantısı başarısız. API anahtarınızı veya node durumunu kontrol edin.")
# 2. Checksum ve Kontrat Yükleme
token_address = w3.to_checksum_address(RAW_TOKEN_ADDRESS)
contract = w3.eth.contract(address=token_address, abi=ABI)
# 3. Dinamik Parametreler
try:
   TOKEN_DECIMALS = contract.functions.decimals().call()
   TOTAL_SUPPLY = contract.functions.totalSupply().call()
   logging.info(f"Token yüklendi. Decimals: {TOKEN_DECIMALS} | Toplam Arz: {TOTAL_SUPPLY / (10 ** TOKEN_DECIMALS):,.0f}")
except Exception as e:
   logging.warning(f"Token parametreleri okunamadı, varsayılan değerler atandı: {e}")
   TOKEN_DECIMALS = 18
   TOTAL_SUPPLY = 1000000000 * (10 ** 18) # Varsayılan 1B
# Anomali Eşiği: 100,000 token
VOTE_THRESHOLD = 100000 * (10 ** TOKEN_DECIMALS)
def get_logs_batched(event_obj, from_block, to_block):
   """Logları güvenli bir şekilde batch'ler halinde okur. (logs, is_success) döndürür."""
   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"{start}-{end} blok aralığında log okuma hatası: {e}")
           return [], False
   return all_events, True
def analyze_governance_shifts(from_block, to_block):
   """Toplam Arza oranla oy hareketlerinin analizi."""
   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  # Okuma hatası, blok ilerletilmeyecek!
   # Tek bir işlemdeki çoklu DelegateChanged olaylarını gruplama
   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
           
           # Toplam Arza göre metrik hesaplama
           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
           # Kritiklik seviyesi belirleme
           severity = "KRİTİK SIÇRAMA" if share_of_supply >= 1.0 else "DİKKAT"
           logging.warning(f"[{severity}] Voting Power Değişimi: {fmt_delta:+,.0f} token (Arzın %{delta_share_of_supply:.3f}'i)")
           logging.info(f"    Delege: {delegate}")
           logging.info(f"    Adresin Toplam Etkisi: {fmt_new:,.0f} oy (Toplam Arzın %{share_of_supply:.3f}'i)")
           logging.info(f"    Tx Hash: {tx_hash}")
           contexts = delegation_map.get(tx_hash, [])
           if contexts:
               logging.info(f"    Neden: DOĞRUDAN DELEGE DEĞİŞİMİ (Tx içinde {len(contexts)} event)")
               for ctx in contexts:
                   logging.info(f"      • Delegator: {ctx['delegator']} | {ctx['from']} -> {ctx['to']}")
           else:
               logging.info("    Neden: Mevcut delegenin bakiye değişimi (Transfer / Claim / Mint / Burn)")
           
           print("-" * 75)
   return True
def start_realtime_monitoring(poll_interval=12):
   """Onay derinliğini koruyarak çalışan gerçek zamanlı daemon."""
   latest_block = w3.eth.block_number
   last_processed_block = latest_block - SAFE_CONFIRMATIONS - 1
   logging.info(f"Daemon başlatıldı. Başlangıç güvenli blok: #{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("RPC hatası nedeniyle aralık tam işlenemedi. Sonraki döngüde tekrar denenecek.")
       except Exception as e:
           logging.error(f"Ana döngüde kritik hata: {e}")
       time.sleep(poll_interval)
if __name__ == "__main__":
   start_realtime_monitoring(poll_interval=12)

Shadow Governance'tan Korunma Yolları

Piyasa, yönetişim katmanına yapılan bu saldırılara karşı yavaş yavaş bağışıklık kazanıyor. Artık sadece smart contract kodunu audit etmek yetmiyor; DAO modelinin mimarisini de savunma odaklı tasarlamak gerekiyor.

  • Veto Yetkisine Sahip Timelock Kullanımı: Kod değişiklikleri anında yürürlüğe girmemelidir. Minimum 48-72 saatlik bir gecikme, Güvenlik Konseyi'nin (Security Council) zararlı bir teklifi durdurmasına fırsat tanır.
  • Unstaking Gecikmeli ve-Modeline Geçiş: Tokenlar hızlı manipülasyonlara kapalı şekilde kilitlendiğinde, anlık bir gölge saldırısının maaliyeti astronomik seviyelere çıkar.
  • Optimistic Governance (İyimser Yönetişim): Moonwell ve Lido gibi projelerin uyguladığı bu yapıda, teklifler varsayılan olarak kabul edilir; oylama sadece topluluk veto etmek istediğinde tetiklenir.
  • Dual-Token Governance (Çift Tokenlı Yönetişim): Yönetişim haklarının utility token sahipleri ile likidite sağlayıcıları/kullanıcılar arasında bölünmesi (Lido'daki Dual Governance modelinde stETH sahiplerinin LDO kararlarını veto edebilmesi gibi).

Shadow governance, oy hakkının finansal bir varlığa dönüşmesinin kaçınılmaz bir sonucudur. EXMON analistleri ve blockchain mühendisleri olarak temel görevimiz, bu tür anormallikleri henüz mempool aşamasında ve smart contract seviyesinde tespit ederek ekosistemimizdeki tüm paydaşlar için eksiksiz bir güvenlik ve şeffaflık sağlamaktır.

Bu blog yazısını şununla özetleyin:

FAQ

Shadow governance, açık piyasadan yönetişim tokenı satın almadan, özel OTC anlaşmaları, dark pool'lar veya off-chain finansal teşvikler aracılığıyla protokol oy gücünü gizlice ele geçirme sürecidir. Saldırganlar, halka açık rüşvet pazarlarından kaçınarak büyük veToken sahiplerine veya delege adreslerine harici varlıklarla ödeme yapar; böylece piyasada kaymaya (slippage) veya topluluk şüphesine yol açmadan yetersiz çoğunluğu (quorum) sağlarlar.

Akıllı sözleşmelerdeki DelegateChanged ve DelegateVotesChanged olay günlükleri (event logs) taranarak anormal oy ağırlığı değişimleri izlenir ve işlem karmaları (transaction hash) üzerinden delegasyonun kökeni haritalandırılır. Oy gücündeki ani artışlar, özel Flashbots demetleri (bundles) ve gizlilik mikserlerinden gelen fon akışlarıyla eşleştirilerek teklif yürütülmeden önce gizli oy birikimleri tespit edilir.

Protokoller, oy ağırlığı hesaplamalarında geçmiş blok anlık görüntülerini (historical snapshots), güvenlik konseyi veto yetkisine sahip zorunlu yürütme gecikmelerini (timelocks) ve dinamik yetersiz çoğunluk eşiklerini uygulayarak korunur. İyimser yönetişim (optimistic governance) ve çift tokenlı doğrulama mimarilerinin entegrasyonu, tek blokluk flashloan manipülasyonlarını etkisiz hale getirir ve kısa vadeli oy kiralamayı ekonomik olarak verimsiz kılar.
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.

...

Yorumunuzu paylaşın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar işaretlendi *