Kraken

Proof of Reserves

Kraken Proof of Reserves

Il nostro impegno per la trasparenza

In Kraken, non ti permettiamo semplicemente di fare trading con asset digitali all'avanguardia, stiamo lavorando per sfruttare al massimo la trasparenza delle blockchain open source su cui operano.

I nostri regolari audit Proof of Reserves consentono ai clienti di verificare facilmente che i saldi in loro possesso siano supportati da asset reali, il tutto con pochi semplici clic sul proprio account.

Proof of Reserves, una procedura di contabilità crittografica avanzata condotta semestralmente da revisori di fiducia, ti consente di verificare che Kraken soddisfi standard rigorosi in materia di responsabilità e superi la trasparenza offerta dalle società finanziarie legacy.

Cos'è il Proof of Reserves?

Una Proof of Reserves (PoR) è un audit indipendente condotto da una terza parte che cerca di garantire che un depositario detenga gli asset che rivendica per conto dei suoi clienti. Questo revisore acquisisce un'istantanea anonima di tutti i saldi detenuti e li aggrega in un Merkle Tree — una struttura di dati rispettosa della privacy che incapsula tutti i saldi dei clienti.

Da lì, l'auditor ottiene una Merkle root: un'impronta digitale crittografica che identifica in modo univoco la combinazione di questi saldi al momento della creazione dello snapshot.

Merkle Root Hash

L'auditor raccoglie quindi le firme digitali prodotte da Kraken, che dimostrano la proprietà degli indirizzi on-chain con saldi verificabili pubblicamente. Infine, l'auditor confronta e verifica che questi saldi superino o corrispondano ai saldi dei clienti rappresentati nel Merkle Tree e quindi che le attività del cliente siano detenute con riserva integrale.

Ogni cliente può verificare in modo indipendente che il proprio saldo sia stato incluso nell'audit Proof of Reserves confrontando dati selezionati con la Merkle root. Qualsiasi modifica apportata al resto dei dati, per quanto piccola, influirà sulla root hash; rendendo evidente la manomissione.

Stiamo verificando che il tuo account sia stato sottoposto ad audit

Segui questi passaggi per la verifica crittografica dell'inclusione del saldo del tuo conto Kraken nella più recente Proof of Reserves.

Nota: Questa verifica rifletterà solo i saldi del tuo account nelle risorse supportate al momento dell'audit. Non rifletterà transazioni o operazioni di trading successive, né rifletterà saldi detenuti in attività che non sono coperte dall'audit.

1. Accedi al tuo account Kraken e vai alle impostazioni del tuo account (Impostazioni > Account).

Kraken Audits

2. Seleziona la scheda Audit. Il tuo account visualizzerà gli audit recenti in cui è stato verificato il saldo del tuo account, l'ID dell' audit associato, la data dell'audit, il nome dell'azienda che ha condotto l'audit e il tipo di audit che è stato condotto. L'Audit ID è la stringa identificativa associata a un particolare audit; poiché Kraken prevede di condurre regolari audit Proof of Reserves, è importante che ciascuno sia identificabile in modo univoco.

Kraken audit list

3. Seleziona la data di audit che vuoi verificare. Qui troverai la conferma del tipo di audit, il tuo ID record (specifico per il tuo account e questo particolare audit), le risorse coperte e i saldi dei tuoi asset al momento dell'audit.

L'ID record ti consente di confermare in modo indipendente che il saldo del tuo account sia stato incluso, tramite l'auditor di terze parti.

Kraken audit details

Verifica il tuo registro con l'auditor


Semplice:

Il modo più rapido per verificare il registro del tuo account è utilizzare il portale dell'auditor dei conti di terze parti con il tuo Record ID:

1. Copia il Record ID corrispondente al tuo account e all'audit specificato (consulta la sezione precedente per individuarlo).

2. Visita il sito web dell'auditor di terze parti responsabile dell'audit Proof of Reserves.

3. Inserisci il tuo Record ID nel portale dell'auditor di terze parti. Il sito Web dell'auditor utilizzerà questo ID per trovare il registro della criptovaluta detenuta nel tuo account on-chain al momento della verifica.

4. Verifica i tuoi saldi.

Avanzato:

I clienti esperti di tecnologia potrebbero voler ricostruire in modo indipendente il proprio Merkle Tree leaf node hash e cercare i propri saldi nello strumento di controllo di terze parti utilizzando questo hash, anziché solo il Record ID .

Ciò consente ai clienti di verificare che il loro Record ID (così come i saldi associati del loro conto al momento dell'audit) fossero inclusi nella struttura del Merkle Tree, che ha portato al Root Hash pubblicato dall'auditor:

1. I dettagli dell'audit su kraken.com includono anche un "Codice account", un altro codice unico per il tuo account e questa verifica particolare, che evita che qualsiasi codice identificativo venga riutilizzato durante gli audit.

2. Vedrai anche un Merkle Hash che puoi utilizzare direttamente o ricostruire (come di seguito) utilizzando i dettagli del tuo account e il particular audit. La Merkle Leaf che utilizzerai per la ricerca sullo strumento auditor sono i primi 16 caratteri dello SHA256 di questo Merkle Hash.

3. I passaggi necessari, in pseudocodice, per ricostruire il Record ID e il Merkle Leaf dal tuo codice account, Kraken IIBAN, l'Audit ID e i saldi sono descritti di seguito. Tieni presente che i risultati sono sensibili alla particolare formattazione della stringa dei saldi, come visualizzato nella pagina degli Audit.

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

Nei frammenti di codice di seguito vengono illustrati anche esempi specifici. L' albero di Merkle risultante è visibile anche sui dettagli dell'audit per confermare che l'hai ricostruito correttamente.

python

Python

import hashlib

account_code = "3a3699228240e9cda84074d3a73c9913bc591c66a431e4df7b78fbd78171a5db"
iiban = "AA45N84GGNZ6ZZAA"
audit_id = "PR30SEP21"
record_id = hashlib.sha256(
    (account_code + iiban + audit_id).encode('utf-8')).hexdigest()

balances = "BTC:1.2342525178,BTC.M:0.0,ETH:10.98200001,ETH2.S:5.4"

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 = "3a3699228240e9cda84074d3a73c9913bc591c66a431e4df7b78fbd78171a5db";
const IIBAN: &str = "AA45N84GGNZ6ZZAA";
const AUDIT_ID: &str = "PR30SEP21";
const BALANCES: &str = "BTC:1.2342525178,BTC.M:0.0,ETH:10.98200001,ETH2.S:5.4";

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 := "3a3699228240e9cda84074d3a73c9913bc591c66a431e4df7b78fbd78171a5db"
	iiban := "AA45N84GGNZ6ZZAA"
	auditId := "PR30SEP21"

	secret := accountCode + iiban + auditId

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

	balances := "BTC:1.2342525178,BTC.M:0.0,ETH:10.98200001,ETH2.S:5.4"

	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="3a3699228240e9cda84074d3a73c9913bc591c66a431e4df7b78fbd78171a5db"
IIBAN="AA45N84GGNZ6ZZAA"
AUDIT_ID="PR30SEP21"
RECORD_ID=$(echo -n "${ACCOUNT_CODE}${IIBAN}${AUDIT_ID}" | sha256sum | head -c 64)
BALANCES="BTC:1.2342525178,BTC.M:0.0,ETH:10.98200001,ETH2.S:5.4"
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)"

Imperfezioni e miglioramenti futuri

Nell'interesse di agire con trasparenza, vorremmo condividere alcune delle mancanze del Proof of Reserves che abbiamo identificato.

  • Una Proof of Reserves prevede di dimostrare il controllo sui fondi on-chain al momento dell'audit, ma non può dimostrare il possesso esclusivo di chiavi private che potrebbero essere state teoricamente duplicate da un hacker.
  • La procedura non può identificare eventuali ostruzioni nascoste o provare che i fondi non siano stati presi in prestito ai fini del superamento dell'audit. Allo stesso modo, le chiavi potrebbero essere state perse o i fondi rubati dall'ultimo audit.
  • L'auditor deve essere competente e indipendente per ridurre al minimo il rischio di doppio gioco da parte del soggetto sottoposto ad audit o di collusione tra le parti.

Cerchiamo di mitigare alcune di queste imperfezioni impegnandoci con società di terze parti rispettate e indipendenti per la nostra Proof of Reserves e conducendo questi audit a una cadenza regolare e frequente.

*Nota: non esistono regole procedurali formalmente accettate che definiscano un audit proof of reserves. Per il nostro, abbiamo incaricato una società di contabilità indipendente di svolgere un incarico di attestazione secondo gli standard stabiliti dall'American Institute for Certified Public Accountants e di emettere un rapporto di un contabile indipendente sulle procedure concordate. Questi rapporti includono procedure specifiche eseguite da quell'azienda, nonché i relativi risultati.

Proof of Reserves