Kryptocenter – miejsce, gdzie znajdziesz wszystko, czego potrzebujesz, by zrozumieć kryptowaluty

Krypto Center
Giełdy & Kantory

Dowód Rezerw 2.0 dla małych giełd i kantorów: projekt wdrożenia w 30 dni (BTC UTXO, ERC‑20, L2, Merkle + ZK)

Dowód Rezerw 2.0 dla małych giełd i kantorów: projekt wdrożenia w 30 dni (BTC UTXO, ERC‑20, L2, Merkle + ZK)

Czy Twój kantor lub mała giełda potrafi udowodnić rezerwy 1:1 o każdej porze dnia? Rynek premiuje transparentnych operatorów, a jednocześnie kary za błąd reputacyjny są dziś bezlitosne. Poniżej znajdziesz techniczny, ale praktyczny przewodnik, jak zaprojektować i uruchomić Dowód Rezerw (PoR) obejmujący BTC (UTXO), ETH/ERC‑20 (account-based), rollupy L2 oraz stablecoiny – bez zbędnej teorii i z gotowymi listami kontrolnymi.

Dlaczego „mali” mają trudniej – i jak to obejść

Duże giełdy mają zespoły audytowe i własne node’y dla kilkudziesięciu łańcuchów. Mniejsi operatorzy działają często na 5–10 kluczowych aktywach, mają gorące portfele w multisigu i zewnętrzny monitoring. Problemem nie jest sama technologia, lecz spójne zebranie dowodów aktywów i zobowiązań oraz ich cykliczna, publiczna publikacja w sposób odporny na manipulację.

  • Aktywa (Assets): Salda na łańcuchach (BTC, ETH, L2, ERC‑20, stablecoiny), depozyty w custody/multisig, rezerwy w CEX (jeśli występują).
  • Zobowiązania (Liabilities): Sumaryczne salda klientów (w tym ujemne), naliczone odsetki, bonusy, niezaksięgowane depozyty/wypłaty w toku.
  • Spójność: Dowód, że Assets ≥ Liabilities dla każdego aktywa oraz ogółem.

Architektura referencyjna PoR dla małego operatora

Warstwa węzłów i danych

  • BTC: Pełny węzeł Bitcoin Core (txindex=1), okresowy gettxoutsetinfo dla walidacji sum UTXO i skryptów multisig.
  • ETH / ERC‑20: Lekki własny węzeł (pruned) + zaufany dostawca RPC jako fallback; snapshot bloków N-koordynowanych czasowo.
  • L2 (np. Arbitrum/Optimism/Polygon PoS): Własny indexer dla adresów gorących/zimnych + eventy transferów tokenów.
  • Stablecoiny: Te same zasady co ERC‑20; dodatkowo monitoruj blacklisty/freeze eventy emitenta.

Warstwa dowodów

  • Assets Proof: Lista publicznych adresów custody (gorące/zimne) + podpisane komunikaty „Proof of Control” (np. wiadomość Bitcoin/Ethereum) i on-chain zdarzenie sygnujące snapshot.
  • Liabilities Proof: Drzewo Merkle z zanonimizowanymi identyfikatorami klientów i saldami; opcjonalnie ZK‑dowód prawidłowej sumy i braku ujemnych pozycji.
  • Anchor: Hash pakietu dowodów publikowany jako transakcja OP_RETURN (BTC) i/lub event w smart-kontrakcie (ETH/L2).

Krok po kroku: jak policzyć aktywa na różnych łańcuchach

1) Bitcoin (model UTXO)

  • Zbierz listę adresów kontrolowanych (w tym zmianę) z etykietami: HOT, WARM, COLD.
  • Utwórz transakcję message-sign lub krótki spend test (np. dust) z multisiga, aby potwierdzić kontrolę.
  • Na bloku referencyjnym B pobierz salda UTXO tych adresów i zsumuj nominalnie i wg rodzajów skryptów (P2WSH/P2TR).

2) Ethereum i ERC‑20 (model kontowy)

  • Na bloku B weź eth_getBalance dla adresów oraz balanceOf(addr) dla tokenów.
  • Zapewnij atomowy snapshot – wszystkie odczyty z tego samego numeru bloku; archiwizuj ID zapytania i odpowiedzi.

3) Rollupy L2

  • Zsynchronizuj numer bloku L2 z timestampem i, jeśli to możliwe, z odpowiednim zakotwiczeniem w L1.
  • Ustal politykę ryzyka na wypadek reorgów L2 (krótkie okna potwierdzeń dla PoR są akceptowalne, jeśli anchor publikujesz po N blokach).

4) Rezerwy w CEX (jeśli używasz)

  • Wymagaj od instytucji custody podpisanego oświadczenia + API do sald w punkcie czasu; minimalizuj ten element, bo osłabia PoR.

Zobowiązania: Merkle i warianty z ZK

Po stronie zobowiązań nie chcesz ujawniać pełnej listy klientów, ale chcesz, aby każdy mógł zweryfikować, że jego saldo jest ujęte, a suma wszystkich pozycji zgadza się z aktywami.

Merkle Liabilities (minimum produkcyjne)

  • Dla każdego klienta generujesz węzeł: hash(salt || user_id_mask || asset_symbol || balance_atomic).
  • Budujesz drzewo Merkle oddzielnie dla każdego aktywa (BTC, ETH, USDT, itp.).
  • Publikujesz root + metodę, jak klient pobierze swój proof path (API lub plik do pobrania).
  • Dodajesz dowód sumy: publikujesz sumę wszystkich balance_atomic (zaokrągloną w dół do jednostki atomowej) oraz hash listy wag/zaokrągleń, by uniemożliwić „kosmetykę” centów.

ZK‑Liabilities (prywatność + spójność)

  • Dowód, że każda pozycja w drzewie spełnia balance ≥ 0 bez ujawniania konkretnych wartości (np. Bulletproofs zakresu lub PLONK z constraints).
  • Dowód, że suma pozycji w drzewie = S (opublikowana) – bez ujawniania składu listy.
  • Stack narzędzi: gnark / halo2 / Bulletproofs (biblioteki powszechnie stosowane w 2024 r.).

Publiczny „anchor” i harmonogram publikacji

  • Okno publikacji: np. co 7 dni, w stałym dniu i godzinie UTC.
  • Anchor BTC: transakcja z OP_RETURN zawierającym hash pakietu PoR (SHA‑256) i numer snapshotu.
  • Anchor ETH/L2: event w prostym kontrakcie PorRegistry z polami: chainId, asset, blockNumber, merkleRoot, assetsSum.
  • Repozytorium: spakowany artefakt (assets.json, liabilities.json, merkle_roots.txt, proofs/) z podpisem GPG i timelockiem publikacyjnym (np. 24 h po snapshotcie).

Tabela: Metody PoR – co wybrać na start

Metoda Co dowodzi Zalety Ryzyka/Ograniczenia Koszt wdrożenia
Adresy + podpisy Kontrolę aktywów on-chain Proste, weryfikowalne publicznie Nie dowodzi zobowiązań Niski
Merkle Liabilities Ujęcie sald klientów Każdy klient weryfikuje swój węzeł Potencjalny wyciek metadanych, brak dowodu „≥ 0” Niski/Średni
Merkle + Range ZK Brak ujemnych sald, spójna suma Silniejsza prywatność i integralność Większa złożoność, generacja dowodów Średni
Audit on-chain (anchor) Niezmienialność pakietu PoR Odporność na „window dressing” Koszty transakcyjne, potrzeba dyscypliny Niski

Bezpieczeństwo: jak uniknąć „window dressing” i innych sztuczek

  • Okno snapshotu T publikuj z 24 h opóźnieniem i zakotwicz hash pakietu w dwóch łańcuchach (BTC + ETH) – trudniej zsynchronizować manipulację.
  • Zakaz pożyczek krótkoterminowych w polityce ryzyka na 48 h przed snapshotem; log audytowy z podpisami zarządu.
  • Oddzielenie skarbca firmowego (operacyjnego) od rezerw klientów na poziomie adresów i księgi.
  • Multisig z różnymi HSM (np. 2 dostawców) i co najmniej jednym kluczem w air‑gap.
  • Monitor opóźnień – jeżeli PoR nie pojawi się w oknie, system automatycznie publikuje alarm na stronie statusowej i mediach społecznościowych.

Regulacje & Prawo (UE/PL – wysokopoziomowo)

  • RODO/priv: Hashuj i solisz identyfikatory, nie publikuj surowych danych klientów; przechowuj salta oddzielnie.
  • KYC/AML: PoR nie zwalnia z obowiązków AML; transakcje kotwiczące PoR nie mogą naruszać polityk sankcyjnych.
  • Sprawozdawczość: PoR to dowód techniczny, nie zastępuje formalnego audytu finansowego, ale go uzupełnia.

Case study (hipotetyczny): kantor „ZetX” – 5 200 klientów, 7 aktywów

  • Aktywa:
    • BTC: 96.42 BTC (P2WSH 2/3, 3 adresy COLD, 1 HOT)
    • ETH: 2 140.7 ETH (2 adresy HOT, 1 COLD)
    • USDT (ETH): 3.2 mln
    • USDC (ETH): 1.1 mln
    • ARB (Arbitrum): 820k
    • OP (Optimism): 410k
    • MATIC (Polygon PoS): 3.9 mln
  • Zobowiązania (suma klientów): odpowiednio: 95.77 BTC; 2 102.9 ETH; 3.12 mln USDT; 1.08 mln USDC; 801k ARB; 392k OP; 3.81 mln MATIC.
  • Marża bezpieczeństwa: 0.5–2.5% na aktywo; polityka utrzymania ≥1% bufora.
  • Publikacja: co piątek 18:00 UTC; hash pakietu w BTC i event w kontrakcie PorRegistry na Ethereum i Arbitrum.
  • Weryfikacja klienta: front generuje ścieżkę Merkle po zalogowaniu; opcjonalny proof-of-inclusion przez skrypt CLI.

Plan 30 dni: od zera do PoR 2.0

Dni 1–7: Inwentaryzacja i węzły

  • Lista adresów HOT/WARM/COLD per łańcuch, etykiety i polityki sweep.
  • Uruchom BTC Core (txindex), lekki węzeł ETH i indexery L2.
  • Procedura podpisu wiadomości z każdego custody.

Dni 8–14: Liabilities & Merkle

  • Eksport sald per klient/aktywo z księgi.
  • Maskowanie ID, generacja saltów, konstrukcja drzew Merkle.
  • API do pobierania ścieżek Merkle przez klientów.

Dni 15–21: Anchor i automatyzacja

  • Skrypt publikacji hash pakietu (BTC OP_RETURN + event ETH).
  • Podpis GPG artefaktów, retention w S3/Archiwum.
  • Publiczna strona „Status PoR” + RSS/JSON feed.

Dni 22–30: ZK i polityki

  • Range proof dla braku sald ujemnych (Bulletproofs/halo2).
  • Procedura „no window dressing” i log aprobacyjny zarządu.
  • Testy katastroficzne: reorg L2, brak węzła, opóźniony anchor.

Najczęstsze błędy i jak je naprawić

  • „Znikające centy”: Zaokrąglasz w dół? Opublikuj sumę zaokrągleń i hash listy korekt.
  • Adresy mieszane firmowe/klienckie: Natychmiast rozdziel na osobne pule i migruj środki.
  • Snapshot z różnych bloków: Użyj block tag we wszystkich zapytaniach; archiwizuj numer bloku.
  • Brak prywatności: Sól per użytkownik + rotacja; nie używaj przewidywalnych maskowań ID.

Narzędzia & procedury (praktyczne)

  • Bitcoin: bitcoin-cli gettxoutsetinfo; parser UTXO dla listy adresów; podpis wiadomości z multisiga (PSBT).
  • Ethereum/L2: eth_getBalance i balanceOf z parametrem blockNumber; własny mały indexer transferów.
  • Merkle: biblioteka drzew (np. z weryfikacją ścieżek), ważne: stałe sortowanie i kanoniczny encoding.
  • ZK: gotowe przykłady range proof (gnark/halo2); pipeline do generacji dowodów per snapshot.
  • Anchoring: prosty kontrakt „PorRegistry” + skrypt do emisji eventu; transakcja BTC z OP_RETURN.

Checklist wdrożeniowy (skrót)

  • Adresy custody z podpisem kontroli – gotowe
  • Snapshot aktywów na bloku B – gotowe
  • Drzewa Merkle zobowiązań per aktywo – gotowe
  • Range proof „balance ≥ 0” – gotowe/opcjonalnie
  • Publiczny anchor (BTC + ETH/L2) – gotowe
  • API weryfikacji dla klientów – gotowe
  • Polityka antysztuczek + logi – gotowe

Wnioski i następny krok

Dowód Rezerw nie musi być ciężkim projektem korporacyjnym. Z architekturą opisaną wyżej mały operator jest w stanie dostarczyć realną, publiczną gwarancję 1:1 w mniej niż miesiąc – obejmując BTC, ETH, stablecoiny i popularne L2. Klucz do sukcesu to spójny snapshot, publiczny anchor i prosty interfejs dla klientów do samodzielnej weryfikacji.

CTA: Zacznij od Minimum Viable PoR: adresy + podpisy, drzewo Merkle zobowiązań i anchor on-chain. Po stabilizacji dołóż ZK‑range proof. Twoi klienci zauważą różnicę – i wynagrodzą ją zaufaniem.