Prova de Reservas
Nosso compromisso com a transparência
Na Kraken, não apenas permitimos que você negocie ativos digitais de ponta, estamos trabalhando para aproveitar ao máximo a transparência das blockchains de código aberto em que operam.
Nossas auditorias regulares de Prova de Reservas facilitam para os clientes verificarem se os saldos que possuem são garantidos por ativos reais, tudo com apenas alguns cliques na conta.
Um procedimento avançado de contabilidade criptográfica realizado semi-anualmente por auditores confiáveis, a Prova de Reservas permite verificar se a Kraken está atendendo a padrões rigorosos de responsabilidade e excedendo a transparência oferecida por empresas financeiras tradicionais.
O que é a Prova de Reservas?
Uma Prova de Reservas (PoR) é uma auditoria independente conduzida por um terceiro que procura garantir que um custodiante detenha os ativos que reivindica em nome de seus clientes. Este auditor faz um registro instantâneo anônimo de todos os saldos mantidos e os adiciona em uma Merkle tree — uma estrutura de dados amigável à privacidade que encapsula todos os saldos do cliente.
A partir daí, o auditor obtém uma Merkle root: uma impressão digital criptográfica que identifica exclusivamente a combinação desses saldos no momento em que o registro instantâneo foi criado.
O auditor coleta então as assinaturas digitais produzidas pela Kraken, que comprovam a propriedade dos endereços na cadeia com saldos publicamente verificáveis. Por fim, o auditor compara e verifica se esses saldos excedem ou correspondem aos saldos de clientes representados na Merkle tree, e, portanto, se os ativos do cliente são mantidos em regime de reserva total.
Qualquer cliente pode verificar de forma independente se seu saldo foi incluído na auditoria de Prova de Reservas comparando dados selecionados com a raiz Merkle. Quaisquer alterações feitas no restante dos dados, por menores que sejam, afetarão a raiz – tornando a adulteração óbvia.
Verificando que sua conta foi auditada
Siga as etapas abaixo para verificar criptograficamente a inclusão do saldo da sua conta Kraken na Prova de Reservas mais recente.
Nota: Essa verificação refletirá apenas os saldos de sua conta nos recursos suportados no momento da auditoria. Não refletirá quaisquer negócios ou transações subsequentes, nem refletirá saldos mantidos em ativos que não são cobertos pela auditoria.
1. Faça login na sua conta Kraken e navegue até as configurações da sua conta (Configurações > Conta).
2. Selecione a guia Auditorias. Sua conta exibirá auditorias recentes nas quais o saldo de sua conta foi verificado, o ID de auditoria associado, a data da auditoria, o nome da empresa que realizou a auditoria e o tipo de auditoria realizada. O ID de auditoria é a cadeia de identificação associada a uma auditoria específica; como a Kraken espera realizar auditorias regulares de Prova de Reservas, é importante que cada uma seja exclusivamente identificável.
3. Selecione a data de auditoria que você deseja verificar. Aqui você encontrará a confirmação do tipo de auditoria, seu ID de Registro (específico para sua conta e essa auditoria específica), os ativos que foram cobertos e seus saldos de ativos no momento da auditoria.
O ID do Registro permite que você confirme de forma independente se o saldo da sua conta foi incluído por meio do auditor terceirizado.
Verificação do seu registro com o auditor
Simples:
A maneira mais rápida de verificar o registro de sua conta é usar o portal do auditor terceirizado com seu ID de registro:
1. Copie o ID do registro correspondente à sua conta e à auditoria especificada (consulte a seção anterior para localizá-lo).
2. Visite o site do auditor terceirizado responsável pela auditoria da Prova de Reservas.
3. Insira seu ID de registro no portal do auditor terceirizado. O site do auditor usará esse ID para encontrar o registro da criptomoeda mantida em sua conta on-chain no momento da auditoria.
4. Verifique seus saldos.
Avançado:
Os clientes com experiência em tecnologia podem querer reconstruir independentemente seu Merkle Tree leaf node específico e procurar seus saldos na ferramenta de auditoria de terceiros usando esse hash, em vez de apenas o ID do Registro.
Isso permite que os clientes verifiquem se seu ID de Registro (assim como os saldos associados de sua conta no momento da auditoria) foram incluídos na estrutura Merkle Tree, o que resultou no Root Hash publicado pelo auditor:
p>1. Os detalhes da auditoria em kraken.com também incluem um "Código de conta", outro código exclusivo para sua conta e essa auditoria específica, que evita que qualquer código de identificação seja reutilizado em auditorias.
2. Você também verá um Merkle Hash que você pode usar diretamente ou reconstruir (conforme abaixo) usando os detalhes de sua conta e a auditoria específica. O Merkle Leaf que você usará para pesquisar na ferramenta de auditoria são os primeiros 16 caracteres do SHA256 deste Merkle Hash.
3. As etapas necessárias, em pseudocódigo, para reconstruir o ID do registro e o Merkle Leaf do seu código de conta, o IIBAN da Kraken, ID de auditoria e saldos são descritos abaixo. Observe que os resultados são sensíveis à formatação de string específica dos saldos, conforme exibido na página de Auditorias.
- 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)
Exemplos específicos também são demonstrados nos trechos de código abaixo. O Merkle Leaf resultante também é visível nos detalhes da auditoria para ajudar a confirmar que você reconstruiu isso corretamente.
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
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
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
#!/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)"
Limitações e melhorias futuras
Com o interesse de defender a transparência, gostaríamos de compartilhar algumas das deficiências no processo de Prova de Reservas que identificamos.
- Uma Prova de Reservas envolve provar o controle sobre os fundos da cadeia (on-chain) no momento da auditoria, mas não pode provar a posse exclusiva de chaves privadas que podem ter sido teoricamente duplicadas por um invasor.
- O procedimento não pode identificar quaisquer ônus ocultos ou provar que os fundos não foram emprestados para fins de aprovação na auditoria. Da mesma forma, chaves podem ter sido perdidas ou fundos roubados desde a última auditoria.
- O auditor deve ser competente e independente para minimizar o risco de duplicidade por parte do auditado ou conluio entre as partes.
Procuramos mitigar algumas dessas deficiências envolvendo empresas terceirizadas independentes e respeitadas para nossa Prova de Reservas e conduzindo essas auditorias em uma cadência regular e frequente.
*Observação: Não há regras de procedimentos formalmente aceitas que definam uma auditoria de prova de reservas. Para a nossa, contratamos uma firma de contabilidade independente para realizar um trabalho de atestado de acordo com os padrões estabelecidos pelo Instituto Americano de Contadores Públicos Certificados e para emitir um Relatório do Contador Independente sobre Procedimentos Acordados. Esses relatórios incluem procedimentos específicos realizados por essa empresa, bem como suas conclusões.