Verantwoording, regelmatige beoordelingen
Bij Kraken bieden we u niet alleen de mogelijkheid om te handelen in de allernieuwste digitale activa, we werken er ook aan om de transparantie van de opensourceblockchains waarop ze opereren te vergroten.
Onze regelmatige beoordeling voor Proof of Reserves maken het gemakkelijk voor klanten om te verifiëren of de saldi die zij aanhouden en binnen het bereik vallen gedekt worden door echte activa. Dat alles met slechts een paar eenvoudige klikken op hun account.
Met Proof of Reserves, een geavanceerde cryptografische boekhoudprocedure die regelmatig wordt uitgevoerd door vertrouwde accountants, kunt u verifiëren dat Kraken voldoet aan strenge standaarden voor verantwoording en de transparantie van bestaande financiële bedrijven overtreft.
Wat is Proof of Reserves?
Een Proof of Reserves-beoordeling (PoR) is een procedure die wordt uitgevoerd door een onafhankelijke accountant van een derde partij. Dit is bedoeld om te bevestigen dat een bewaarder de activa aanhoudt die het beweert aan te houden namens zijn klanten. Deze accountant neemt een geanonimiseerde momentopname van alle aangehouden saldi en voegt deze samen in een merkle-boom —,een privacyvriendelijke gegevensstructuur die alle saldi van cliënten.
Van daaruit verkrijgt de accountant een merkle-boom: een cryptografische vingerafdruk die op unieke wijze de combinatie van deze saldi identificeert op het moment dat de momentopname werd gemaakt.
De accountant verzamelt vervolgens digitale handtekeningen die door Kraken zijn geproduceerd en die het eigendom bewijzen van de on-chain adressen met openbaar verifieerbare saldi. Tot slot vergelijkt en verifieert de accountant dat deze saldi hoger zijn dan of overeenkomen met de klantensaldi in de Merkle Tree en dus dat de klantenassets onder de controle van Kraken vallen.
Elke klant kan onafhankelijk verifiëren of zijn saldo werd opgenomen in de Proof of Reserves-procedure door geselecteerde gegevens te vergelijken met de merkle-boom. Alle wijzigingen die in de rest van de gegevens worden aangebracht, hoe klein ook, zullen de hoofd-– beïnvloeden, waardoor manipulatie duidelijk wordt.
Wat houdt Proof of Reserves in?
Spotsaldi
Het overzicht bevat al uw saldi van de activa die binnen het bereik vallen, op het moment dat de momentopname werd gemaakt. De volgende activa vallen binnen het bereik van de meest recente beoordeling: Bitcoin (BTC), Ether (ETH), Cardano (ADA), Polkadot (DOT), USD Coin (USDC), Tether (USDT) en Ripple (XRP).
Stakingtegoeden
Als uw saldi op het moment van de momentopname aan on-chain staking waren toegewezen, ziet u hiervoor een aparte vermelding, volgens de naamgevingsconventie met een achtervoegsel '.S' (bijvoorbeeld DOT.S).
Margin trading
Als je op dat moment margeposities had, dan zou je totale saldo worden aangepast met de positieve positiewaarden.
Voorbeeld 1
Als je 30.000 BTC/USD @ 1 USD op marge hebt gekocht en je positie is open, dan zal je Proof-of-Reserves-saldo een positieve +1 BTC-aanpassing van je BTC-saldo weergeven. Er zal geen negatieve aanpassing zijn van uw USD-saldo. Uw BTC-activasaldo onder bewaring van Kraken zal uw BTC-saldo op dat moment bevatten, aangepast met de positieve + 1 BTC aanpassing voor uw margepositie. Uw USD-activasaldo blijft hetzelfde.
Voorbeeld 2
Als je 15 BTC/ETH @ 15 ETH op marge hebt verkocht en je positie is open, dan zal je Proof of Reserves-saldo een positieve +15 ETH-aanpassing aan je ETH-saldo weergeven. Er zal geen negatieve aanpassing zijn van uw BTC-saldo. Uw ETH-activasaldo onder bewaring van Kraken zal uw ETH-saldo op dat moment bevatten, aangepast met de positieve +15 ETH-aanpassing voor uw margeposities. Uw BTC-activasaldo onder bewaring van Kraken zal hetzelfde blijven.
Opmerking: De hierboven beschreven futuresmethodologie is van kracht vanaf de Proof of Reserves-beoordelingen van mei 2023.
Futuressaldi
Als u op het moment van de beoordeling saldi in uw futuresportfolio had, zal er een aparte Proof of Reserves-record bestaan voor uw futuresonderpandssaldi. Uw saldi worden aangepast met ongerealiseerde winst en verlies voor futurestransacties met enkel onderpand. Dit omvat dezelfde activa die binnen het bereik vallen als voor spot en marge en maakt deel uit van dezelfde merkle-boom (met een eigen merkle-boom-ID).
Voorbeeld 1
Als je 1 BTC in je futureswallet had en je opent een positie in BTC Perp Single Collateral, die een ongerealiseerde winst en verlies van -0,1 BTC heeft, dan zal je BTC-saldo onder bewaring van Kraken 0,9 BTC zijn (je 1 BTC, aangepast met -0,1 BTC voor ongerealiseerde winst en verlies).
Voorbeeld 2
Als je 1 BTC in je futureswallet had en je opent een positie in BTC Perp Multi-Collateral, die een ongerealiseerde winst en verlies van USD -100 heeft, dan zal je BTC-saldo in bewaring bij Kraken 1 BTC zijn (je 1 BTC wordt niet gecorrigeerd met de ongerealiseerde winst en verlies, omdat die wordt bijgehouden in USD. USD is geen asset die binnen het bereik valt in het kader van deze beoordeling).
Opmerking: De hierboven beschreven futuresmethodologie is van kracht vanaf de Proof-of-Reserves-beoordelingen van mei 2023.
Verifiëren of uw account is opgenomen in de Proof of Reserves-beoordeling
Eenvoudige verificatie
Volg de onderstaande stappen om cryptografisch te verifiëren of uw Kraken-accountsaldo is opgenomen in de meest recente beoordeling voor Proof of Reserves.
Opmerking: Deze verificatie weerspiegelt alleen de saldi van je account in de activa die binnen het bereik vallen op het moment van de beoordeling. Het weerspiegelt geen latere transacties, noch weerspiegelt het saldi in activa die niet binnen het bereik vallen.
1. Log in op uw Kraken-account en navigeer naar de pagina Proof of Reserves in de Kraken Pro-interface (pro.kraken.com) (accountpictogram > Proof of Reserves).
2. Selecteer het tabblad Proof of Reserves. Dit bevat onze meest recente geverifieerde reserveverhoudingen, evenals specifieke informatie voor uw account. Uw account toont recente rapporten voor Proof of Reserves waarin uw accountsaldo werd geverifieerd, inclusief de datum van het rapport, de provider en het beoordelingsbereik.
3. Selecteer de datum en klik op Verifieer uzelf. Hier vindt u een bevestiging van de saldi op het moment van de beoordeling, evenals een gids voor het verifiëren van uw gegevens.
Verifiëren bij de onafhankelijke accountant
-
Gebruik uw merkle-blad-ID - kopieer de eerste 16 tekens en voer ze in de tools van de externe accountant' in om uw saldi op te vragen en uw ID in het merkle-boompad te bekijken. De tool van de externe accountant wordt in een apart venster geopend.
Opmerking: dit is beschikbaar vanaf 2023 beoordelingen. Raadpleeg voor eerdere beoordelingen de webpagina van onze partner voor de verificatietools.
Verifiëren bij Kraken
- Verifieer uw record-ID - volg de stappen om uw record-ID opnieuw te maken, die uw accountgegevens en de beoordelings-ID (uniek voor elke rapportdatum) uniek identificeert.
- Verifieer uw merkle-blad-ID - volg de stappen om uw merkle-blad-ID opnieuw te maken, die uw account uniek identificeert, samen met de saldi op het moment van de momentopname van de beoordeling
- Bevestig uw merkle-blad-ID in de merkle-bppm - bevestig dat uw ID bij de merkle-boom hoort en valideer het pad naar het merkle-boomhoofd, die wordt geverifieerd door onze externe accountant en wordt gedeeld door alle klanten.
Opmerking: dit is beschikbaar vanaf 2023 beoordelingen. Raadpleeg voor eerdere beoordelingen de webpagina van onze partner voor de verificatietools.
Geavanceerde verificatie
Technisch onderlegde klanten willen misschien zelf hun specifieke hash van het bladknooppunt van de merkle-boom reconstrueren en hun saldi in de merkle-boom programmatisch opzoeken, in plaats van in de visuele tools van Kraken of een externe accountant.
U kunt de volgende verificatiestappen in code uitvoeren:
-
U kunt het genereren van uw merkle-boomblad-ID voor uw account verifiëren met de hieronder beschreven stappen.
-
Vervolgens kunt u uw merkle-boompad voor de blad-ID verifiëren en het pad van uw positie naar het hoofdknooppunt reconstrueren. Wij bieden volledige transparantie en nemen ook uw zusterblad-ID's op.
De vereiste stappen, in pseudocode, om het record-ID en merkle-blad te reconstrueren op basis van uw accountcode, Kraken IIBAN, beoordelings-ID en saldi, worden hieronder beschreven. Merk op dat de resultaten gevoelig zijn voor de specifieke tekenreeksindeling van saldi en de volgorde van de beoordeelde activa, zoals weergegeven op de pagina Proof of Reserves.
- Record-ID = SHA256 (aaneengeschakeld (Account Code, Kraken IIBAN, beoordelings-ID))
- Saldi = ""
- Voor elk activum:
- Saldi = aaneengeschakeld (activum, ":", activumsaldi[asset])
- Merkle-hash = aaneengeschakeld (record-ID, “,”, saldi)
- Merkle-blad = substring (SHA256 (merkle-hash), 0, 16)
Nadat uw merkle-blad is geïdentificeerd, kunt u een SHA256-verificatie met HEX-waarden gebruiken om het merkle-boompad te reconstrueren.
Specifieke voorbeelden worden ook gedemonstreerd in de onderstaande codefragmenten. Het resulterende merkle-blad is ook zichtbaar in de beoordelingsdetails, zodat u kunt bevestigen dat u dit correct heeft gereconstrueerd.
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
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
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
#!/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
Tekortkomingen en toekomstige verbeteringen
In het belang van transparantie willen we graag enkele tekortkomingen in het Proof of Reserves-proces met u delen die we hebben geïdentificeerd.
- Een Proof of Reserves bewijst de controle over geld van de keten op het moment van de beoordeling, maar kan niet het exclusieve bezit van privésleutels bewijzen die theoretisch door een aanvaller gedupliceerd kunnen zijn.
- De procedure kan geen verborgen lasten identificeren of bewijzen dat er geen geld geleend is om voor de beoordeling te slagen. De verplaatsing van geld is echter zichtbaar op de blockchain, aangezien wij transparantie bieden over de adressen waar onze activa zich bevinden. Ook kunnen er sleutels verloren zijn gegaan of geld gestolen zijn sinds de laatste beoordeling.
- De accountant moet competent en onafhankelijk zijn om het risico van dubbelhartigheid van de kant van de onderzochte of samenspanning tussen de partijen te minimaliseren.
- We proberen een aantal van deze tekortkomingen te beperken door een gerespecteerd, onafhankelijk extern bedrijf in te schakelen voor ons Proof of Reserves en door deze beoordelingen regelmatig uit te voeren. Wij bieden ook transparantie over deze gegevens direct in ons klantenplatform.