Kraken

Preuve des réserves de fonds

Kraken Proof of Reserves

Notre engagement pour la transparence

Chez Kraken, nous ne vous laissons pas simplement trader des actifs digitaux de pointe, nous nous efforçons de tirer le meilleur parti de la transparence des blockchains open source sur lesquelles ils opèrent.

Nos audits réguliers de preuve des réserves de fonds permettent aux clients de vérifier facilement que les soldes qu'ils détiennent sont adossés à des actifs réels, le tout en quelques clics sur leur compte.

Procédure de comptabilité cryptographique avancée, menée semestriellement par des auditeurs de confiance, la preuve de réserves de fonds vous permet de vérifier que Kraken respecte des normes rigoureuses de responsabilité et va au-delà de la transparence offerte par les anciennes sociétés financières.

Qu'est-ce que la preuve des réserves de fonds?

Une preuve des réserves de fonds (PoR) est un audit indépendant effectué par un tiers qui vise à s'assurer qu'un dépositaire détient les actifs qu'il revendique pour le compte de ses clients. Cet auditeur prend un instantané anonymisé de tous les soldes détenus et les agrège dans un arbre de Merkle — une structure de données respectueuse de la vie privée qui encapsule tous les soldes des clients.

À partir de là, l'auditeur obtient une racine de Merkle: une empreinte cryptographique qui identifie de manière unique la combinaison de ces soldes au moment de la création de l'instantané.

Merkle Root Hash

L'auditeur collecte ensuite les signatures numériques produites par Kraken, qui prouvent la propriété des adresses on-chain avec des soldes vérifiables par tous. Enfin, l'auditeur compare et vérifie que ces soldes dépassent ou correspondent aux soldes des clients représentés dans l'arbre de Merkle, et donc que les actifs des clients sont détenus intégralement.

Tout client peut vérifier de manière indépendante que son solde a été inclus dans l'audit de preuve des réserves de fonds en comparant des éléments de données sélectionnés avec la racine Merkle. Toute modification apportée au reste des données, même minime, affectera la racine – rendant la falsification évidente.

Vérification que votre compte a été audité

Suivez les étapes ci-dessous pour vérifier de manière cryptographique l'inclusion du solde de votre compte Kraken dans la preuve des réserves de fonds la plus récente.

Remarque: Cette vérification ne reflétera que les soldes de votre compte dans les actifs pris en charge au moment de l'audit. Il ne reflétera pas les opérations ou transactions ultérieures, ni les soldes détenus dans des actifs qui ne sont pas couverts par l'audit.

1. Connectez-vous à votre compte Kraken et accédez aux paramètres de votre compte (Paramètres > Compte).

Kraken Audits

2. Sélectionnez l'onglet Audits. Votre compte affichera les audits récents au cours desquels le solde de votre compte a été vérifié, l'identifiant d'audit associé, la date de l'audit, le nom de la société effectuant l'audit et le type d'audit qui a été effectué. L'identifiant d'audit est la chaîne d'identification associée à un audit particulier; comme Kraken s'attend à effectuer régulièrement des audits de preuve des réserves de fonds, il est important que chacun soit identifiable de manière unique.

Kraken audit list

3. Sélectionnez la date d'audit que vous souhaitez vérifier. Ici, vous trouverez la confirmation du type d'audit, votre identifiant d'enregistrement (spécifique à votre compte et à cet audit particulier), les actifs couverts et les soldes de vos actifs au moment de l'audit.

L'identifiant d'enregistrement vous permet de confirmer de manière indépendante que le solde de votre compte a été inclus, via l'auditeur tiers.

Kraken audit details

Vérification de votre dossier avec l'auditeur


Simple:

Le moyen le plus rapide de vérifier l'enregistrement de votre compte consiste à utiliser le portail de l'auditeur tiers avec votre identifiant d'enregistrement:

1. Copiez l'identifiant d'enregistrement correspondant à votre compte et à l'audit spécifié (reportez-vous à la section précédente pour le localiser).

2. Visitez le site Web de l'auditeur tiers responsable de l'audit de preuve de réserves de fonds.

3. Saisissez votre identifiant d'enregistrement dans le portail de l'auditeur tiers. Le site Web de l'auditeur utilisera cet identifiant pour trouver l'enregistrement de la crypto-monnaie détenue dans votre compte "on-chain" au moment de l'audit.

4. Vérifiez vos soldes.

Avancé:

Les clients férus de technologie peuvent souhaiter reconstruire indépendamment leur hachage de nœud feuille d'arbre de Merkle particulier et consulter leurs soldes dans l'outil d'audit tiers en utilisant ce hachage, plutôt que simplement l'identifiant d'enregistrement.

Cela permet aux clients de vérifier que leur identifiant d'enregistrement (ainsi que les soldes associés de leur compte au moment de l'audit) ont été inclus dans la structure de l'arbre de Merkle, ce qui a abouti au hachage racine publié par l'auditeur:

1. Les détails de l'audit sur kraken.com incluent également un "code de compte", un autre code unique pour votre compte et cet audit particulier, qui évite la réutilisation de tout code d'identification dans les audits.

2. Vous verrez également un hachage de Merkle que vous pouvez utiliser directement ou reconstruire (voir ci-dessous) en utilisant les détails de votre compte et l'audit particulier. La feuille de Merkle que vous utiliserez pour la recherche sur l'outil d'audit correspond aux 16 premiers caractères du SHA256 de ce hachage de Merkle.

3. Les étapes requises, en pseudocode, pour reconstruire l'identifiant d'enregistrement et la feuille de Merkle à partir de votre code de compte, de l'IIBAN Kraken, de l'identifiant d'audit et des soldes sont décrits ci-dessous. Notez que les résultats sont sensibles au format de chaîne particulier des soldes, tel qu'affiché sur la page Audits.

  • Record ID = SHA256(concatenate(Account Code, Kraken IIBAN, Audit ID))
  • Balances = concatenate(“BTC:”, balBTC)
  • Balances = concatenate(Balances, “,BTC.M:”, balBTCM)
  • Balances = concatenate(Balances, “,ETH:”, balETH)
  • Balances = concatenate(Balances, “,ETH2.S:”, balETH2S)
  • Merkle Hash = concatenate(Record ID, “,”, Balances)
  • Merkle Leaf = substring(SHA256(Merkle Hash), 0, 16)

Des exemples spécifiques sont également illustrés dans les extraits de code ci-dessous. La feuille de Merkle qui en résulte est également visible sur les détails de l'audit pour aider à confirmer que vous avez correctement reconstruit ceci.

python

Python

import hashlib

account_code = "8dc20f34da8cea8dd0f46b001694f5123ecd30d786c5eb92ad1a013703a4f8d1"
iiban = "AB12C34DEFG5KSQI"
audit_id = "PR30JUN22"
record_id = hashlib.sha256((account_code + iiban + audit_id).encode('utf-8')).hexdigest()

balances = "ADA:15129.4,ADA.S:0.0,BTC:0.2600852178,BTC.M:1.25,DOT:50.0,DOT.S:20.5,DOT.P:0.0,ETH:5.27518778,ETH2.S:10.123,USDC:50000.0,USDT:0.0,XRP:0.000002"

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]))
rust

Rust

use sha2::{Digest, Sha256};

const ACCOUNT_CODE: &str = "8dc20f34da8cea8dd0f46b001694f5123ecd30d786c5eb92ad1a013703a4f8d1";
const IIBAN: &str = "AB12C34DEFG5KSQI";
const AUDIT_ID: &str = "PR30JUN22";
const BALANCES: &str = "ADA:15129.4,ADA.S:0.0,BTC:0.2600852178,BTC.M:1.25,DOT:50.0,DOT.S:20.5,DOT.P:0.0,ETH:5.27518778,ETH2.S:10.123,USDC:50000.0,USDT:0.0,XRP:0.000002";

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

    record_hasher.update(ACCOUNT_CODE);
    record_hasher.update(IIBAN);
    record_hasher.update(AUDIT_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]);
}
go

Go

package main

import (
	"crypto/sha256"
	"fmt"
)

func main() {

	accountCode := "8dc20f34da8cea8dd0f46b001694f5123ecd30d786c5eb92ad1a013703a4f8d1"
	iiban := "AB12C34DEFG5KSQI"
	auditId := "PR30JUN22"

	secret := accountCode + iiban + auditId

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

	balances := "ADA:15129.4,ADA.S:0.0,BTC:0.2600852178,BTC.M:1.25,DOT:50.0,DOT.S:20.5,DOT.P:0.0,ETH:5.27518778,ETH2.S:10.123,USDC:50000.0,USDT:0.0,XRP:0.000002"

	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])

}
bash

Bash

#!/bin/bash

ACCOUNT_CODE="8dc20f34da8cea8dd0f46b001694f5123ecd30d786c5eb92ad1a013703a4f8d1"
IIBAN="AB12C34DEFG5KSQI"
AUDIT_ID="PR30JUN22"
RECORD_ID=$(echo -n "${ACCOUNT_CODE}${IIBAN}${AUDIT_ID}" | sha256sum | head -c 64)
BALANCES="ADA:15129.4,ADA.S:0.0,BTC:0.2600852178,BTC.M:1.25,DOT:50.0,DOT.S:20.5,DOT.P:0.0,ETH:5.27518778,ETH2.S:10.123,USDC:50000.0,USDT:0.0,XRP:0.000002"
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)"

Défauts et améliorations futures

Dans l'intérêt de défendre la transparence, nous aimerions partager certaines des lacunes du processus de preuve des réserves de fonds que nous avons identifiées.

  • Une preuve de réserves de fonds implique de prouver le contrôle des fonds "on-chain" au moment de l'audit, mais ne peut pas prouver la possession exclusive de clés privées qui peuvent théoriquement avoir été dupliquées par un attaquant.
  • La procédure ne peut pas identifier les charges cachées ou prouver que les fonds n'ont pas été empruntés aux fins de la réussite de l'audit. De même, des clés peuvent avoir été perdues ou des fonds volés depuis le dernier audit.
  • L'auditeur doit être compétent et indépendant afin de minimiser le risque de duplicité de la part de l'audité ou de collusion entre les parties.

Nous cherchons à atténuer certaines de ces lacunes en nous engageant avec des sociétés tierces indépendantes et respectées pour notre preuve de réserves de fonds, et en effectuant ces audits à une cadence régulière et fréquente.

*Remarque: Il n'y a pas de règles de procédures formellement acceptées qui définissent un audit de preuve des réserves de fonds. Pour le nôtre, nous avons engagé un cabinet comptable indépendant pour effectuer une mission d'attestation selon les normes établies par l'American Institute for Certified Public Accountants et pour publier un rapport du comptable indépendant sur les procédures convenues. Ces rapports comprennent des procédures spécifiques effectuées par cette entreprise ainsi que leurs conclusions.

Preuve des réserves de fonds