Prueba de reservas
Nuestro compromiso con la transparencia
En Kraken, no solo le permitimos operar con activos de vanguardia, estamos trabajando para apalancar al máximo la transparencia de las blockchains de fuente abierta en las que operan.
Nuestras auditorias regulares de Prueba de reservas, hacen más fácil para los clientes verificar que los balances que poseen están respaldados por activos reales, todo en unos clics desde su cuenta.
Un procedimiento avanzado de contabilidad criptográfico, realizado con una frecuencia semi-anual por auditores confiables, Prueba de reservas, le permite comprobar que Kraken cumple con rigurosos estándares de contabilidad excediendo la transparencia ofrecida por firmas financieras tradicionales.
¿Qué es la Prueba de Reservas?
Una prueba de reservas (PoR) es una auditoría independiente realizada por un tercero que busca garantizar que un custodio tenga los activos que reclama en nombre de sus clientes. Este auditor toma un registro instantáneo anónimo de todos los balances mantenidos y los agrega en un Árbol de Merkle — una estructura de datos que favorece la privacidad y encapsula todos los balances de los clientes.
A partir de ahí, el auditor obtiene una Raíz de Merkle: una huella digital criptográfica que identifica de forma única la combinación de estos balances en el momento en que se creó el registro instantáneo.
El auditor colecta firmas digitales producidas por Kraken, que prueban la propiedad sobre las direcciones on-chain con balances públicamente verificables. Por último, el auditor compara y verifica que estos balances excedan o coincidan los balances del cliente representados en el Merkle tree, y que por lo consecuente los activos del cliente estén mantenidos sobre la base de una reserva completa.
Cualquier cliente puede verificar de forma independiente que su balance haya sido incluido en la auditoría de Prueba de reserva, comparando fragmentos de datos seleccionados con la raíz de Merkle. Cualquier cambio realizado al resto de los datos, sin importar su tamaño, afectará la raíz haciendo obvia su manipulación
Verificando que su cuenta fue auditada
Siga los pasos a continuación para verificar criptográficamente la inclusión del balance de su cuenta Kraken en la más reciente Prueba de reservas.
Nota: Esta verificación solo reflejará los balances de su cuenta con activos admitidos en el momento de la auditoría. No reflejará ninguna operación o transacción posterior, y tampoco mostrará los balances mantenidos con activos que no estén cubiertos por la auditoría.
1. Inicie sesión en su cuenta de Kraken y vaya a la configuración de su cuenta (Configuración > Cuenta).
2. Seleccione la pestaña Auditorías. Su cuenta mostrará auditorías recientes en las que se verificó el balance de su cuenta, el ID de auditoría asociado, la fecha de la auditoría, el nombre de la empresa que realizó la auditoría y el tipo de auditoría que se realizó. El ID de auditoría es la cadena de identificación asociada con una auditoría en particular; dado que Kraken espera realizar auditorías periódicas de prueba de reservas, es importante que cada una sea identificable de forma única.
3. Seleccione la fecha de auditoría que desea verificar. Aquí encontrará la confirmación del tipo de auditoría, su ID de registro (específico de su cuenta y de esta auditoría en particular), los activos cubiertos y los saldos de sus activos en el momento de la auditoría.
El ID de registro le permite confirmar de forma independiente que se incluyó el balance de su cuenta, a través del auditor externo.
Verificación de su registro con el auditor
Simple:
La forma más rápida de verificar el registro de su cuenta es mediante el portal del auditor externo con su ID de registro:
1. Copie el ID de registro correspondiente a su cuenta y la auditoría especificada (consulte la sección anterior para ubicarlo).
2. Visite el sitio web del auditor externo responsable de la auditoría de Prueba de Reservas.
3. Ingrese su ID de registro en el portal del auditor externo. El sitio web del auditor utilizará este ID para encontrar el registro de la criptomoneda que se encuentra en su cuenta on-chain en el momento de la auditoría.
4. Verifica sus balances.
Avanzado:
Los clientes expertos en tecnología pueden desear reconstruir de forma independiente el hash de nodo de su hoja particular del Árbol de Merkle y buscar sus balances en la herramienta de auditoría de terceros utilizando este hash, en lugar de solo el ID de registro.
Esto permite a los clientes verificar que su ID de registro (así como los balances asociados de su cuenta en el momento de la auditoría) se incluyen en la estructura del Árbol de Merkle, lo que resultó en el Hash Raíz publicado por el auditor:
1. Los detalles de la auditoría en kraken.com también incluyen un "Código de cuenta", otro código único para su cuenta y esta auditoría en particular, que evita que cualquier código de identificación se reutilice en las auditorías.
2. También verá un Hash de Markle que puede usar directamente o reconstruir (como se indica a continuación) usando los detalles de su cuenta y la auditoría en particular. La hoja de Merkle que usará para buscar en la herramienta de auditoría son los primeros 16 caracteres del SHA256 de este Hash de Merkle.
3. Los pasos necesarios, en pseudocódigo, para reconstruir el ID de registro y la hoja de Merkle a partir de su código de cuenta, el IIBAN de Kraken, ID de auditoría y balances se describe a continuación. Tenga en cuenta que los resultados son sensibles al formato de cadena particular de los balances, como se muestra en la página de Auditorías.
- 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)
También ejemplos específicos son demostrados en los fragmentos de código en la parte inferior. El Merkle Leaf resultante también es visible en los resultados de auditoría para ayudarlo a confirmar que usted haya reconstruido esto correctamente .
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)"
Limitaciones y Mejoras Futuras
Con el interés de abogar por la transparencia, nos gustaría compartir algunas de las limitaciones en el proceso de Pruebas de reserva que hemos identificado.
- Una prueba de reservas incluye probar control sobre fondos en la cadena (on-chain) en el momento de la auditoría, pero no puede probar posesión exclusiva de las claves privadas que hayan podido ser teóricamente duplicadas por un atacante.
- El procedimiento puede no identificar algunos gravámenes ocultos o probar que fondos no han sido tomados prestados con el propósito de pasar la auditoría. Igualmente, algunas claves pudieron ser extraviadas o robadas desde la última auditoría.
- El auditor debe ser competente e independiente para minimizar el riesgo de duplicidad por la parte del auditado o conspiración entre las partes.
Buscamos mitigar algunas de estas limitaciones, contratando firmas de terceros respetables e independientes para nuestra Prueba de reservas, y de igual forma llevamos acabo estas auditorías con una cadencia regular y frecuente.
*Nota: No hay reglas formalmente aceptadas de procedimientos que definan una auditoría de Prueba de reservas. Para la nuestra, contratamos una firma contable independiente para que lleve a cabo y certifique un compromiso de calidad bajo estándares estipulados por el Instituto americano para contadores públicos certificados y que emita un reporte contable independiente sobre procedimientos acordados. Estos reportes incluyen procedimientos específicos realizados por esa firma al igual que sus hallazgos.