Responsabilité, audits réguliers
Chez Kraken, nous ne nous contentons pas de vous offrir la possibilité de trader des actifs numériques de pointe, nous exploitons la transparence des blockchains open source sur lesquelles ils s’échangent.
Nos examens réguliers de Preuve de 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 régulièrement par des comptables 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 sociétés financières traditionnelles.
Qu’est-ce que la preuve de réserves de fonds ?
Un audit de la preuve de réserves de fonds (PoR) est une procédure exécutée par un comptable tiers indépendant. Il vise à confirmer qu’un dépositaire détient les actifs qu’il revendique au nom de ses clients. Ce comptable prend un instantané anonymisé de tous les soldes détenus et les regroupe dans un Arbre de Merkle, autrement dit une structure de données confidentielle qui englobe tous les soldes des clients.
À partir de là, le comptable 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é.
Le comptable recueille 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, le comptable 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 sous le contrôle de Kraken.
Tout client peut vérifier de manière indépendante si son solde a été inclus dans la procédure de preuve de réserves de fonds en comparant certains éléments de données avec la Racine de Merkle. Toute modification apportée au reste des données, même minime, affectera la racine, rendant la falsification évidente.
Quels sont les éléments couverts par la preuve de réserves de fonds ?
Soldes Spot
L’audit portera sur tous vos soldes en actifs relevant de la portée de l’audit détenus au moment de l’aperçu. Les actifs suivants faisaient partie de l’audit le plus récent : Bitcoin (BTC), Ether (ETH), Solana (SOL), USD Coin (USDC), Tether (USDT) et Ripple (XRP).
Soldes de Staking
Si vous aviez des soldes alloués au staking on-chain au moment de l'instantané, la valeur de votre solde staké sera agrégée avec votre solde au comptant en un seul solde.
Trading avec marge
Si vous aviez des positions avec marge à ce moment, vous verriez votre solde total ajusté en fonction des valeurs de position positive.
Exemple 1
Si vous aviez acheté 1 BTC/USD à 30 000 USD avec marge et que votre position est ouverte, votre solde de preuve de réserves de fonds affichera un ajustement de +1 BTC de votre solde BTC. Il n’y aura aucun ajustement négatif de votre solde USD. Votre solde d’actifs BTC déposés auprès de Kraken inclura votre solde BTC à cette date, modifié de l’ajustement positif + 1 BTC pour votre position avec marge. Votre solde d’actifs en USD restera le même.
Exemple 2
Si vous aviez vendu 1 BTC/ETH à 15 ETH avec marge et que votre position est ouverte, votre solde de preuve de réserves de fonds affichera un ajustement de +15 ETH de votre solde ETH. Il n’y aura aucun ajustement négatif de votre solde BTC. Votre solde d’actifs ETH déposés auprès de Kraken inclura votre solde ETH à cette date, modifié de l’ajustement positif de +15 ETH pour vos positions avec marge. Votre solde d’actifs BTC déposés auprès de Kraken restera le même.
Remarque : La méthodologie de contrats à terme décrite ci-dessus prend effet à compter des audits de la preuve de réserves de fonds de mai 2023.
Soldes des contrats à terme
Si vous aviez des soldes dans votre portefeuille de contrats à terme au moment de l’audit, il existera un enregistrement distinct de la preuve de réserves de fonds pour vos soldes de garanties de contrats à terme. Vos soldes sont ajustés en fonction des profits et pertes latents pour les transactions de contrats à terme à garantie unique. Cela inclura les mêmes actifs relevant de l’audit que pour les transactions spot et avec marge et fera partie du même Arbre de Merkle (avec son propre identifiant de Feuille de Merkle).
Exemple 1
Si vous aviez un 1 BTC dans votre portefeuille de contrats à terme et que vous ouvrez une position en contrats à garantie unique Perp en BTC dont les profits et pertes latents sont de -0,1 BTC, votre solde en BTC déposé auprès de Kraken serait de 0,9 BTC (votre 1 BTC ajusté de -0,1 BTC au titre des profits et pertes latents).
Exemple 2
Si vous aviez un 1 BTC dans votre portefeuille de contrats à terme et que vous ouvrez une position en contrats à garanties multiples Perp en BTC dont les profits et pertes latents sont de -100,0 USD, votre solde en BTC déposé auprès de Kraken est de 1 BTC (votre 1 BTC n’est pas ajusté par les profits et pertes latents, car il est suivi en USD et l’USD ne fait pas partie des actifs relevant de cet audit).
Remarque : La méthodologie de contrats à terme décrite ci-dessus prend effet à compter des audits de la preuve de réserves de fonds de mai 2023.
Vérification que votre compte était inclus dans l’audit de la preuve de réserves de fonds
Simple vérification
Suivez les étapes ci-dessous pour vérifier de manière cryptographique l’inclusion du solde de votre compte Kraken dans le dernier audit de la preuve de réserves de fonds.
Remarque : Cette vérification concernera uniquement les soldes de votre compte d’actifs relevant de l’audit au moment où celui-ci se déroule. Elle ne concernera pas les transactions ultérieures ni les soldes détenus dans des actifs ne relevant pas de l’audit.
1. Connectez-vous à votre compte Kraken et naviguez vers la page Preuve de réserves de fonds de l’interface Kraken Pro (pro.kraken.com) (Icône de compte > Preuve de réserves de fonds).
2. Sélectionnez l’onglet Preuve de réserves de fonds. Ceci inclut nos derniers ratios de réserve vérifiés, ainsi que les informations spécifiques à votre compte. Votre compte affichera les récents rapports de preuve de réserves de fonds dans lesquels le solde de votre compte est vérifié, notamment la date du rapport, le prestataire et la portée de l’évaluation.
3. Sélectionnez la date et cliquez sur Vérifiez-vous. Ici, vous trouverez une confirmation des soldes détenus au moment de l’audit, ainsi qu’un guide de vérification de vos informations.
Vérifier auprès du comptable tiers
-
Utilisez votre ID de Feuille de Merkle- copiez les 16 premiers caractères et saisissez-les dans les outils du comptable tiers pour afficher vos soldes et consulter votre ID dans le chemin de l’Arbre de Merkle. L’outil du comptable tiers s’ouvrira dans une autre fenêtre.
Remarque : Ces audits sont mis à disposition depuis l’année 2023. Pour les audits antérieurs, veuillez consulter la page Internet de notre partenaire afin de trouver des outils de vérification.
Vérifier avec Kraken
- Vérifiez votre ID d'enregistrement - suivez les étapes pour recréer votre ID d'enregistrement qui permet d’identifier vos coordonnées de compte et l’ID d’audit (unique pour chaque date de rapport)
- Vérifiez votre ID de Feuille de Merkle - suivez les étapes pour recréer votre ID de Feuille de Merkle, un identifiant unique de votre compte, ainsi que des soldes détenus au moment de l’aperçu de l’audit
- Confirmez votre ID de Feuille de Merkle dans l’Arbre de Merkle - confirmez que votre ID appartient à l’Arbre de Merkle et validez le chemin vers la racine d’Arbre de Merkle, qui est vérifiée par notre comptable tiers et partagée par tous les clients
Remarque : Ces audits sont mis à disposition depuis l’année 2023. Pour les audits antérieurs, veuillez consulter la page Internet de notre partenaire afin de trouver des outils de vérification.
Vérification avancée
Les clients technophiles peuvent préférer reconstruire eux-mêmes leur hachage de nœud de feuille d’Arbre de Merkle et consulter leurs soldes de manière programmatique dans l’Arbre de Merkle plutôt que dans les outils visuels fournis par le comptable Kraken ou tiers.
Vous pouvez exécuter les étapes de vérification suivantes dans le code :
-
Vous pouvez vérifier la génération de votre ID de feuille d’Arbre de Merkle pour votre compte en suivant les étapes décrites ci-dessous.
-
Vous pouvez ensuite vérifier votre chemin d’Arbre de Merkle pour l’ID de feuille et reconstruire le chemin à partir de votre position par rapport au nœud racine. Nous offrons une pleine transparence et incluons également vos ID de feuille frères.
Les étapes requises, en pseudocode, pour reconstruire l’ID d’enregistrement et la Feuille de Merkle à partir de votre Code de compte, de votre IIBAN Kraken, de votre ID d’audit et de vos Soldes sont décrites ci-dessous. Veuillez garder à l’esprit que les résultats sont sensibles au formatage des soldes par chaînes particulières, ainsi qu’à l’ordre des actifs examinés, comme indiqué sur la page Preuve de réserves de fonds.
- ID d’enregistrement = SHA256(concaténation(Code de compte, IIBAN Kraken, ID d’audit))
- Soldes = ""
- Pour chaque actif :
- Soldes = concaténation(Actif, ":", Soldes des Actifs[asset])
- Hachage Merkle = concaténation(ID d’enregistrement, ",", Soldes)
- Feuille de Merkle = sous-chaîne(SHA256(Hachage de Merkle), 0, 16)
Une fois que votre Feuille de Merkle est identifiée, vous pouvez utiliser la vérification SHA256 avec des valeurs HEX pour reconstruire le chemin de l’Arbre de Merkle.
Des exemples spécifiques sont également proposés dans les snippets de code ci-dessous. La Feuille de Merkle qui en résulte s’affiche également sur les détails de l’audit pour vous permettre de confirmer que votre reconstruction est correcte.
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
Points faibles et améliorations futures
Afin de donner l’exemple en matière de transparence, nous aimerions partager certains des défauts que nous avons identifiés dans le processus de preuve de réserves de fonds.
- 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 prouver la possession exclusive de clés privées qui peuvent théoriquement avoir été dupliquées par un agent malveillant.
- La procédure ne permet pas d’identifier des charges éventuelles ni de prouver que des fonds n’ont pas été empruntés dans le but de réussir l’audit. Cependant, le mouvement de fonds se voit sur la blockchain, car nous assurons la transparence des adresses dans lesquelles nos actifs sont situés. De même, il est possible que les clés aient été perdues ou que les fonds aient été volés depuis le dernier audit.
- Le comptable doit être compétent et indépendant afin de minimiser le risque de duplicité de la personne subissant l’audit ou de collusion entre les parties.
- Nous cherchons à atténuer certains de ces points faibles en faisant appel à un cabinet tiers respecté et indépendant pour notre preuve de réserves de fonds et en effectuant ces audits à intervalles réguliers. Nous assurons également la transparence de ces données directement sur notre plateforme client.