Dowód rezerw

Dowód na to, że Twoje środki są bezpieczne – w każdej chwili.

Data snapshotu

BTC icon

BTC

Wskaźnik rezerw*

100.3%

ETH icon

ETH

Wskaźnik rezerw*

101.3%

SOL icon

SOL

Wskaźnik rezerw*

101.1%

USDC icon

USDC

Wskaźnik rezerw*

105%+

USDT icon

USDT

Wskaźnik rezerw*

105%+

XRP icon

XRP

Wskaźnik rezerw*

100.6%

ADA icon

ADA

Wskaźnik rezerw*

102.2%

Odpowiedzialność i regularne przeglądy

Kraken nie tylko oferuje możliwość handlu najnowszymi aktywami cyfrowymi, ale też stara się wykorzystać przejrzystość łańcuchów bloków open source, na których one działają.

Nasze regularne przeglądy Proof of Reserves (dowód rezerw) umożliwia klientom sprawdzenie, czy posiadane przez nich salda są zabezpieczone prawdziwymi aktywami. Wystarczy kilka kliknięć na koncie.

Proof of Reserves, zaawansowana kryptograficzna procedura księgowa przeprowadzana regularnie przez zaufanych księgowych, umożliwia weryfikację, czy Kraken spełnia rygorystyczne standardy w zakresie odpowiedzialności i zapewnia przejrzystość przewyższającą tę oferowaną przez starsze firmy finansowe.

Często zadawane pytania

Czym jest Proof of Reserves?

Przegląd Proof of Reserves (PoR, „dowód rezerw”) to procedura przeprowadzana przez niezależnego zewnętrznego księgowego. Ma ona na celu potwierdzenie, że depozytariusz posiada aktywa, do których rości sobie prawo w imieniu swoich klientów. Księgowy wykonuje zanonimizowaną „migawkę” (snapshot) wszystkich posiadanych sald i umieszcza ją w drzewie Merkle – zapewniającej prywatność strukturze danych, która obejmuje wszystkie salda klientów.

Merkle Root Hash

Następnie księgowy tworzy korzeń Merkle: kryptograficzny odcisk palca, który jednoznacznie identyfikuje kombinację tych sald w momencie utworzenia snapshotu.

W kolejnym kroku księgowy zbiera podpisy cyfrowe utworzone przez Kraken, które potwierdzają własność adresów on-chain z publicznie weryfikowalnymi saldami. Na koniec księgowy porównuje i weryfikuje, czy salda te przekraczają salda klientów reprezentowanymi w drzewie Merkle lub są z nimi zgodne, a tym samym, czy aktywa klientów znajdują się pod kontrolą Kraken.

Każdy klient może samodzielnie zweryfikować, czy jego saldo zostało uwzględnione w procedurze Proof of Reserves, porównując wybrane fragmenty danych z korzeniem Merkle. Każda zmiana wprowadzona do pozostałych danych, nawet niewielka, będzie miała wpływ na korzeń, ujawniając manipulację.

Nasz raport Proof of Reserves można znaleźć tutaj.

Co wchodzi w zakres przeglądu Proof of Reserves?

Salda spot

Przegląd obejmuje wszystkie Twoje salda w aktywach objętych zakresem posiadane w momencie wykonania snapshotu. Zakresem ostatniego przeglądu objęte są następujące aktywa: Bitcoin (BTC), Ether (ETH), Solana (SOL), USD Coin (USDC), Tether (USDT) oraz Ripple (XRP).

Salda stakowania

Jeśli w momencie wykonania snapshotu posiadasz salda przydzielone do stakingu on-chain, wartość salda stakowanego zostanie połączona z saldem spot w ramach jednego salda.

Handel z dźwignią

Jeśli w tym czasie miałeś pozycje zlewarowane, Twoje łączne saldo zostanie skorygowane o dodatnie wartości pozycji.

Przykład 1

Jeśli kupiłeś 1 BTC/USD w cenie 30 000 USD z marginem i masz otwartą pozycję, Twoje saldo Proof of Reserves będzie odzwierciedlać dodatnią korektę +1 BTC względem salda BTC. Saldo USD nie zostanie skorygowane ujemnie. Saldo aktywów BTC przechowywanych w usłudze powierniczej Kraken uwzględnia bieżące saldo BTC, powiększone o dodatnią korektę +1 BTC dla pozycji zlewarowanej. Saldo aktywów w USD pozostanie bez zmian.

Przykład 2

Jeśli sprzedałeś 1 BTC/ETH w cenie 15 ETH z marginem i masz otwartą pozycję, Twoje saldo Proof of Reserves będzie odzwierciedlać dodatnią korektę +15 ETH względem salda ETH. Saldo BTC nie zostanie skorygowane ujemnie. Saldo aktywów ETH przechowywanych w usłudze powierniczej Kraken uwzględnia bieżące saldo ETH, powiększone o dodatnią korektę +15 ETH dla pozycji zlewarowanych. Saldo aktywów BTC przechowywanych w usłudze powierniczej Kraken pozostanie takie samo.

Uwaga: Metodologia futures opisana powyżej obowiązuje począwszy od przeglądów Proof of Reserves z maja 2023 roku.

Salda kontraktów futures

Jeśli posiadałeś salda w portfelu futures w czasie przeglądu, zostanie utworzony oddzielny rekord Proof of Reserves dla sald zabezpieczeń futures. Twoje salda są korygowane o niezrealizowane zyski i straty dla transakcji futures z pojedynczym zabezpieczeniem. Zakres obejmuje te same aktywa co dla transakcji spot i margin, w ramach wspólnego drzewa Merkle, z przypisanym indywidualnym identyfikatorem Merkle Leaf. 

Przykład 1

Jeśli w portfelu futures posiadasz 1 BTC i otworzysz w BTC pozycję Perp Single Collateral, która ma -0,1 BTC niezrealizowanego zysku i straty, Twoje saldo BTC przechowywane w usłudze powierniczej Kraken wyniesie 0,9 BTC (Twoje 1 BTC skorygowane o -0,1 BTC dla niezrealizowanego zysku i straty).

Przykład 2

Jeśli w portfelu futures masz 1 BTC i otworzysz w BTC pozycję Perp Multi-Collateral, która ma -100,0 USD niezrealizowanego zysku i straty, Twoje saldo BTC przechowywane w usłudze powierniczej Kraken wyniesie 1 BTC (1 BTC nie jest korygowane o niezrealizowany zysk i stratę, ponieważ jest śledzone w USD, a USD nie wchodzi w zakres przeglądu).

Uwaga: Metodologia futures opisana powyżej obowiązuje począwszy od przeglądów Proof of Reserves z maja 2023 roku. 

Jak mogę sprawdzić, czy moje konto zostało uwzględnione w przeglądzie Proof of Reserves?

Prosta weryfikacja

Wykonaj poniższe kroki, aby kryptograficznie sprawdzić, czy Twoje saldo zostało uwzględnione w ostatnim przeglądzie Proof of Reserves.

Uwaga: ta weryfikacja będzie odzwierciedlać tylko salda konta w aktywach objętych zakresem przeglądu w momencie jego wykonywania. Nie będzie odzwierciedlać późniejszych transakcji ani sald utrzymywanych w aktywach, które nie są objęte zakresem.

1. Zaloguj się na konto Kraken i przejdź do strony Proof of Reserves w interfejsie Kraken Pro (pro.kraken.com) (ikona konta > Dowód rezerw). 

Kraken Proof of Reserves review list

2. Wybierz kartę Dowód rezerw. Obejmuje to nasze najnowsze zweryfikowane wskaźniki rezerw oraz informacje dotyczące Twojego konta. Na koncie zostaną wyświetlone ostatnie raporty Proof of Reserves, w których zweryfikowano saldo konta, w tym data raportu, dostawca i zakres oceny. 

Kraken Proof of Reserves review list

3. Wybierz datę i kliknij Przeprowadź weryfikację samodzielnie . Tutaj znajdziesz potwierdzenie sald posiadanych w momencie przeglądu, a także przewodnik, jak zweryfikować swoje dane.

Kraken audit details

Zweryfikuj u zewnętrznego księgowego

  • Użyj identyfikatora Merkle Leaf – skopiuj pierwsze 16 znaków i wprowadź je do zewnętrznego narzędzia księgowego, aby pobrać swoje salda i sprawdzić identyfikator w ścieżce drzewa Merkle. Zewnętrzne narzędzie księgowe otworzy się w osobnym oknie. 

Uwaga: funkcja ta została udostępniona począwszy od przeglądów z 2023 roku. W przypadku wcześniejszych przeglądów zapoznaj się ze stroną internetową naszego partnera, aby znaleźć narzędzia weryfikacyjne.

Kraken audit details

Przeprowadź weryfikację z Kraken

  • Zweryfikuj swój identyfikator rekordu – postępuj zgodnie z instrukcjami, aby odtworzyć identyfikator rekordu, który jednoznacznie identyfikuje dane konta i identyfikator przeglądu (unikalny dla każdej daty raportu)
  • Zweryfikuj swój identyfikator Merkle Leaf – postępuj zgodnie z instrukcjami, aby odtworzyć swój identyfikator Merkle Leaf, który jednoznacznie identyfikuje Twoje konto wraz z saldami posiadanymi w momencie snapshotu przeglądu 
  • Potwierdź swój identyfikator Merkle Leaf w drzewie Merkle – potwierdź, że Twój identyfikator należy do drzewa Merkle i zweryfikuj ścieżkę do korzenia drzewa Merkle, który jest weryfikowany przez naszego zewnętrznego księgowego i udostępniany wszystkim klientom

Uwaga: funkcja ta została udostępniona począwszy od przeglądów z 2023 roku. W przypadku wcześniejszych przeglądów zapoznaj się ze stroną internetową naszego partnera, aby znaleźć narzędzia weryfikacyjne.

Kraken audit details
Kraken audit details
Kraken audit details

Zaawansowana weryfikacja

Zaawansowani technicznie klienci mogą samodzielnie zrekonstruować swój hash węzła liścia drzewa Merkle Tree i programowo przejrzeć salda w drzewie Merkle Tree, zamiast użyć do tego Krakena lub narzędzi wizualnych dostarczonych przez księgowego. 

W kodzie można wykonać następujące działania weryfikacyjne:

  1. Możesz zweryfikować wygenerowanie identyfikatora Merkle Tree Leaf dla swojego konta, wykonując czynności opisane poniżej.  

  2. Następnie możesz zweryfikować ścieżkę drzewa Merkle dla identyfikatora liścia i zrekonstruować ścieżkę od swojej pozycji do węzła głównego. Zapewniamy pełną przejrzystość i uwzględniamy również identyfikatory liści pokrewnych. 

Wymagane kroki, w pseudokodzie, w celu zrekonstruowania ientyfikatora rekordu i Merkle Leaf z kodu konta, Kraken IIBAN oraz identyfikator przeglądu i sald są opisane poniżej. Należy pamiętać, że wyniki są zależne od formatowania ciągów sald i kolejności sprawdzanych aktywów, jak zostaje wyświetlone na stronie Proof of Reserves.

  • Identyfikator rekordu = SHA256(concatenate(Account Code, Kraken IIBAN, Review ID))
  • Salda = ""
  • Da każdego aktywa:
    • Salda = concatenate(Asset, ":", AssetBalances[asset])
  • Hash Merkle = concatenate(Record ID, “,”, Balances)
  • Merkle Leaf = substring(SHA256(Merkle Hash), 0, 16)

Po zidentyfikowaniu Merkle Leaf możesz za pomocą weryfikacji SHA256 z wartościami HEX zrekonstruować ścieżkę drzewa Merkle.

Konkretne przykłady zostały również przedstawione w poniższych fragmentach kodu. Wynikowy Merkle Leaf jest również wyświetlony w szczegółach przeglądu, aby można było potwierdzić poprawność rekonstrukcji.

python

Python

import hashlib

# Merkle Leaf ID calculation
account_code = "8dc20f34da8cea8dd0f46b001694f5123ecd30d786c5eb92ad1a013703a4f8d1"
iiban = "AB12C34DEFG5KSQI"
review_id = "PR30SEP24"
record_id = hashlib.sha256((account_code + iiban + review_id).encode('utf-8')).hexdigest()

balances = "BTC:0.00093799,ETH:0.0422125592,SOL:0.0,USDC:0.0,USDT:6.72754,XRP:0.0"

print("Record ID: {}".format(record_id))
print("Merkle Hash: {}".format((record_id + "," + balances)))
hash_result = hashlib.sha256((record_id + "," + balances).encode('utf-8')).hexdigest()
print("SHA Result: {}".format(hash_result))
print("Merkle Leaf: {}".format(hash_result[0:16]))

#Merkle Tree Path function 
def mix(x, y):
    a = bytes.fromhex(x)
    b = bytes.fromhex(y)

    d = hashlib.sha256()
    d.update(a)
    d.update(b)
    return d.hexdigest()
rust

Rust

use sha2::{Digest, Sha256};

//Merkle Leaf ID calculation
const ACCOUNT_CODE: &str = "8dc20f34da8cea8dd0f46b001694f5123ecd30d786c5eb92ad1a013703a4f8d1";
const IIBAN: &str = "AB12C34DEFG5KSQI";
const REVIEW_ID: &str = "PR30SEP24";
const BALANCES: &str = "BTC:0.00093799,ETH:0.0422125592,SOL:0.0,USDC:0.0,USDT:6.72754,XRP:0.0";

fn main() {
    let mut record_hasher: Sha256 = Default::default();

    record_hasher.update(ACCOUNT_CODE);
    record_hasher.update(IIBAN);
    record_hasher.update(REVIEW_ID);

    let record_id = format!("{:x}", record_hasher.finalize());
    let merkle_hash = format!("{},{}", record_id, BALANCES);

    let mut merkle_hasher: Sha256 = Default::default();
    merkle_hasher.update(&merkle_hash);
    let merkle_result = format!("{:x}", merkle_hasher.finalize());

    println!("Record ID: {}", record_id);
    println!("Merkle Hash: {}", merkle_hash);
    println!("SHA Result: {}", merkle_result);
    println!("Merkle Leaf: {}", &merkle_result[..16]);
}

//Merkle Tree Path function
fn mix(x: &str, y: &str) -> Result<String, hex::FromHexError> {
    let mut leaves_hasher: Sha256 = Default::default();
    let a = hex::decode(x)?;
    let b = hex::decode(y)?;
    leaves_hasher.update(&a);
    leaves_hasher.update(&b);
    Ok(hex::encode(leaves_hasher.finalize()))
}

fn main() {
    println!("{}", mix("f42372aeb1be7296", "dfcced6ec3235f5e").unwrap());
    assert_eq!(
        mix("f42372aeb1be7296", "dfcced6ec3235f5e").unwrap(),
        "ad86a5ee2f21347403ce07e365530604690454fa76787e76be9d2f6efdceeabf"
    );
}
go

Go

package main

import (
	"crypto/sha256"
	"fmt"
)

//Merkle Leaf ID Calculation
func main() {

	accountCode := "8dc20f34da8cea8dd0f46b001694f5123ecd30d786c5eb92ad1a013703a4f8d1"
	iiban := "AB12C34DEFG5KSQI"
	reviewId := "PR30SEP24"

	secret := accountCode + iiban + reviewId

	data := []byte(secret)
	hash := sha256.Sum256(data)
	recordId := string(hash[:])
	fmt.Printf("Record ID: %x\n", recordId)

	balances := "BTC:0.00093799,ETH:0.0422125592,SOL:0.0,USDC:0.0,USDT:6.72754,XRP:0.0"

	merkleHash := fmt.Sprintf("%x%s%s", recordId, ",", balances)
	fmt.Printf("Merkle Hash: %s\n", merkleHash)

	hashResult := sha256.Sum256([]byte(merkleHash))
	hashResultStr := string(hashResult[:])
	fmt.Printf("SHA Result: %x\n", hashResultStr)
	fmt.Printf("Merkle Leaf: %x\n", hashResultStr[0:8])

}

//Merkle Tree path hashing
func mix(x, y string) (string, error) {
        // Convert the hex strings to bytes
        a, err := hex.DecodeString(x)
        if err != nil {
                return "", err
        }

        b, err := hex.DecodeString(y)
        if err != nil {
                return "", err
        }

        h := sha256.New()

        h.Write(a)
        h.Write(b)

        // Get the final hash value as a byte slice
        hashed := h.Sum(nil)

        // Convert the hash to a hex string and return it
        return hex.EncodeToString(hashed), nil
}

func main() {
        result, _ := mix("f42372aeb1be7296", "dfcced6ec3235f5e")
        fmt.Println(result)
}
bash

Bash

#!/bin/bash

#Merkle Leaf ID calculation
ACCOUNT_CODE="8dc20f34da8cea8dd0f46b001694f5123ecd30d786c5eb92ad1a013703a4f8d1"
IIBAN="AB12C34DEFG5KSQI"
REVIEW_ID="PR30SEP24"
RECORD_ID=$(echo -n "${ACCOUNT_CODE}${IIBAN}${REVIEW_ID}" | sha256sum | head -c 64)
BALANCES="BTC:0.00093799,ETH:0.0422125592,SOL:0.0,USDC:0.0,USDT:6.72754,XRP:0.0"
MERKLE_HASH="${RECORD_ID},${BALANCES}"
HASH_RESULT=$(echo -n ${MERKLE_HASH} | sha256sum | head -c 64)

echo "Record ID: ${RECORD_ID}"
echo "Merkle Hash: ${MERKLE_HASH}"
echo "SHA Result: ${HASH_RESULT}"
echo "Merkle Leaf: $(echo -n ${HASH_RESULT} | head -c 16)"

#Merkle Tree Path function
hex_string1="f42372aeb1be7296"
hex_string2="dfcced6ec3235f5e"

# convert hex strings to binary, concatenate them and then hash
hash_result=$(echo -n "$(echo -n $hex_string1 | xxd -r -p)$(echo -n $hex_string2 | xxd -r -p)" | sha256sum | awk '{ print $1 }')

echo $hash_result

Co jeszcze wymaga ulepszenia

W trosce o przejrzystość chcielibyśmy przedstawić zidentyfikowane niedociągnięcia w procesie Proof of Reserves.

  • Proof of Reserves polega na wykazaniu kontroli nad środkami w łańcuchu w chwili przeglądu, ale nie potwierdza wyłącznego posiadania kluczy prywatnych, które teoretycznie mogły zostać zduplikowane przez atakującego.
  • Procedura ta nie pozwala na wykrycie ukrytych zobowiązań ani na wykazanie, że środki nie zostały pożyczone wyłącznie w celu pozytywnego przejścia przeglądu. Analogicznie, od momentu ostatniego przeglądu mogło dojść do utraty kluczy prywatnych lub kradzieży środków.
  • Księgowy musi wykazywać się odpowiednimi kwalifikacjami i niezależnością, aby ograniczyć ryzyko duplikacji ze strony badanego lub zmowy między zainteresowanymi stronami.
  • W celu ograniczenia niektórych zidentyfikowanych niedociągnięć współpracujemy z renomowaną, niezależną firmą zewnętrzną, realizując procedury Proof of Reserves w regularnych odstępach czasu. Zapewniamy również przejrzystość danych bezpośrednio na naszej platformie klienckiej. 
Utwórz konto

The reserve ratio figures marked with an asterisk (*) above may change materially when comparing Kraken's Proof of Reserves reports due to product changes and enhancements to our custodial infrastructure across time, which may affect the classification of certain of the assets held in these wallets. Consistent with current practice, an explanation of the precise Proof of Reserves methodology is included in all Reports.