Conclusiones principales

  • En noviembre de 2022, Binance lanzó su sistema de Prueba de Reservas utilizando criptografía de árbol Merkle para permitir a los usuarios verificar sus tenencias.

  • Binance ahora ha mejorado su solución implementando zk-SNARK, una forma de prueba de conocimiento cero.

  • Los usuarios ahora pueden verificar que el saldo neto total de cada cuenta no sea negativo y que todos los activos de los usuarios sean parte del saldo neto total de activos de los usuarios reclamado por Binance, de manera privada y segura.

Eche un vistazo al interior de la nueva solución de prueba de reservas de Binance. Al combinar zk-SNARK y la información del árbol Merkle, brinda a los usuarios una forma nueva y mejorada de verificar el estado de las reservas de Binance.

Durante los últimos meses, el equipo de desarrollo de Binance ha trabajado arduamente para crear soluciones avanzadas de prueba de solvencia. Estas herramientas se han vuelto fundamentales para los intercambios de cifrado centralizados en medio de la crisis de confianza que afectó a la industria tras el colapso de FTX. Los fondos de los usuarios almacenados en Binance están respaldados en una proporción de 1:1, más reservas, y encontrar una manera de demostrarlo al público sin problemas se ha convertido en una parte importante del plan de Binance para restaurar la confianza de la industria.

En noviembre de 2022, lanzamos nuestro sistema de prueba de reservas utilizando una técnica criptográfica de árbol Merkle para permitir a los usuarios verificar sus tenencias en Binance. Aunque es un avance en el impulso de transparencia de los fondos de usuarios de Binance, el diseño inicial de esta solución tenía dos deficiencias:

  1. Para proteger la privacidad del usuario, los nodos hoja en la prueba de Merkle representaban el hash de las tenencias de los usuarios; por lo tanto, la raíz de Merkle no podía reflejar la suma de la información del saldo de sus nodos hoja.

  1. La entidad cuyas reservas se estaban verificando podría potencialmente agregar un saldo negativo en una cuenta falsa en algún lugar del árbol para que las reservas totales requeridas parezcan más pequeñas. El siguiente diagrama del blog de Vitalik Buterin muestra un ejemplo de un árbol Merkle malicioso (aunque, en este caso, la raíz refleja la suma de los saldos de todos los nodos hoja, lo que puede introducir problemas de privacidad).

Ahora tenemos una solución que puede remediar estas deficiencias y así fortalecer el sistema de prueba de reservas de Binance. Basándonos en protocolos de prueba de conocimiento cero, zk-SNARK, podemos demostrar que:

  1. Todos los nodos hoja del árbol Merkle han contribuido al saldo total de usuarios de cada activo reclamado por Binance.

  2. No hay ningún usuario con un saldo neto total negativo (un valor general en USD de todos los activos que posee el usuario) incluido en el árbol Merkle.

Unas palabras sobre saldos negativos y desempeño

Dado que Binance ofrece margen, préstamos criptográficos y productos de negociación de futuros, el saldo de cada usuario de cada criptoactivo puede estar compuesto por activos y pasivos. El saldo de un usuario de un criptoactivo en particular puede ser negativo, pero su saldo neto total en todos los criptoactivos no debería ser negativo (ya que todos los préstamos están totalmente garantizados).

En este escenario hipotético, digamos que Alice había depositado 10,000 BUSD en Binance, luego usó 4,000 BUSD como garantía para pedir prestados 2 BNB (a una tasa de 1 BNB = 1,000 BUSD, asumiendo que Binance siempre está sobregarantizando). La siguiente tabla muestra el balance de Alice.

BNB (precio: 1000 BUSD)

BUSD (precio: 1 BUSD)

Saldo neto total (BUSD)

Activos

Pasivo

Activos

Pasivo

Alicia

2

2

10000

0

10000

Si luego Alice intercambia 1 BNB por 1000 BUSD con Bob (quien también había depositado 10 000 BUSD), su balance se vería así después de igualar la operación:

BNB (precio: 1000 BUSD)

BUSD (precio: 1 BUSD)

Saldo neto total (BUSD)

Activos

Pasivo

Activos

Pasivo

Alicia

1

2

11000

0

10000

Beto

1

0

9000

0

10000

En este caso, el saldo de BNB de Alice ascenderá a -1, que no es un nodo válido en un árbol Merkle y que solo cubre un activo: BNB. Sin embargo, si nos fijamos en los saldos netos totales, Alice todavía está en 10.000.

Otro desafío proviene de la enorme escala de la base de usuarios de Binance. Una solución viable tiene que generar pruebas de usuario y pruebas de zk-SNARK para decenas de millones de usuarios, algunos de los cuales pueden tener más de 300 criptoactivos en nuestra plataforma.

En definitiva, queremos aportar pruebas de los siguientes hechos en un plazo razonable:

  1. Los activos de cada usuario de Binance son parte de nuestro saldo total de usuario reclamado que se muestra en la instantánea. Los usuarios pueden verificar nuestro saldo total de usuario reclamado con los activos mantenidos en direcciones controladas por Binance utilizando un explorador de blockchain (como Etherscan para billeteras Ethereum o BscScan para billeteras BNB Chain).

  2. El saldo neto total de cada usuario no es negativo, lo que significa que Binance no creó cuentas ficticias con un saldo negativo para reducir artificialmente el tamaño de nuestras reservas verificadas.

¿Qué son los zk-SNARK?

Antes de profundizar en los detalles de nuestra solución, conviene hacer una breve descripción general del mecanismo de prueba de conocimiento cero. Los protocolos de conocimiento cero como zk-SNARK permiten que una parte, el probador, demuestre a otra parte, el verificador, que el probador había ejecutado ciertos cálculos con precisión con ciertas entradas bajo ciertas restricciones, todo sin revelar las entradas. El cálculo puede llevar mucho tiempo, pero el mecanismo matemático subyacente puede ayudar al verificador a evaluar la prueba de forma rápida y segura.

El probador (Binance) comienza definiendo un conjunto de restricciones del cálculo que quiere probar. Las restricciones se definen en circuitos que se pueden expresar en un lenguaje de programación de nivel superior (en nuestro caso, una versión bifurcada de gnark).

Luego, el probador ejecuta el cálculo pesado, aplicando hash a los identificadores y balances de todos los usuarios, y genera pruebas de que el cálculo cumple con las restricciones establecidas anteriormente. Para ello utiliza la traza de cómputo (testigo) y inputs públicos o privados.

El verificador (usuario) obtiene la prueba y la verifica con la entrada pública del circuito para asegurarse de que el cálculo se ha ejecutado con precisión cumpliendo todas las restricciones. El cálculo de la verificación lleva un tiempo extremadamente corto en comparación con el tiempo de prueba. Si el probador no genera la prueba en los circuitos predefinidos, no puede producir una prueba válida para pasar la verificación.

Para profundizar más bajo el capó de zk-SNARK, puede consultar esta serie de artículos.

Nuestra solución

El componente fundamental de la solución mejorada de prueba de reservas sigue siendo un árbol Merkle. Para el ejemplo anterior, se vería así:

Además del árbol Merkle, también mantenemos un estado global que representa una lista de los saldos netos totales de cada activo que posee cada cliente de Binance.

Para probar nuestras reservas, generaremos pruebas zk-SNARK para la construcción del árbol Merkle. Para el conjunto de equilibrio de cada usuario (un nodo hoja del árbol Merkle), nuestro circuito se aseguraría de que:

  1. El saldo de cada activo de este usuario se incluye en la lista de estado global mencionada anteriormente.

  2. El saldo neto total del usuario no es negativo.

  3. El cambio de la raíz del árbol Merkle es válido después de actualizar la información de este usuario al hash del nodo hoja.

Consulte esta especificación técnica y nuestro código fuente del circuito (restricciones) para obtener detalles de implementación.

En cada caso de acreditación de nuestras reservas, publicaremos:

1. La prueba de Merkle: los hashes de cada usuario (para Alice, representados por nodos azules en la imagen de arriba).

2. Pruebas de zk-SNARK y entrada pública (un hash de la lista de saldos netos totales de cada activo y la raíz de Merkle) del circuito para todos los usuarios.

Al verificar la prueba de Merkle, los usuarios pueden asegurarse de que su balance esté incluido en la raíz del árbol de Merkle. Al verificar la prueba de zk-SNARK, los usuarios pueden asegurarse de que la construcción del árbol Merkle cumpla con las restricciones definidas en el circuito.

La seguridad de esta solución depende en gran medida de la configuración de la clave de prueba y la clave de verificación. Estamos trabajando en una configuración descentralizada de las claves. Cuando se trata de ceremonias de establecimiento de confianza descentralizadas existentes, la ceremonia de Ethereum ofrece un buen ejemplo. Estamos muy cerca de tener una solución MPC para que la configuración no sea confiable.

Actuación

Dada la cantidad de usuarios de Binance cuyos saldos deben incluirse, no hay forma de obtener una prueba única de la construcción del árbol Merkle que cubra a todos los usuarios a la vez. Una solución a esto es dividir a los usuarios en lotes de 864 cada uno para tener un circuito de menor escala y procedimientos de prueba paralelos.

Para un lote que contiene 864 usuarios donde cada usuario posee 350 activos diferentes, supongamos que el saldo de cada activo está en el rango [0, 2^64-1]. Con un servidor de 32 núcleos y 128 GB, el tiempo de generación de la prueba zk es de aproximadamente 110 segundos y el tiempo de verificación de la prueba es de menos de 1 milisegundo.

Binance iniciará 1000 probadores al mismo tiempo para generar pruebas para todas las cuentas en 2 horas. El costo de este servidor de prueba por una hora es de aproximadamente 0,56 USD, por lo que el costo total de generar todas las pruebas de zk que abarquen a todos los usuarios sería de aproximadamente 1000 USD.

Conclusión

Proporcionaremos la primera iteración de prueba para los usuarios generada por esta nueva solución en un anuncio de prueba de reservas posterior. Además, hemos abierto nuestro procesador de datos de usuario, probador, circuito y verificador, de modo que cada intercambio centralizado que dependa del mismo modelo que nosotros pueda generar pruebas para sus usuarios y activos fácilmente.

Esperamos que esto sea fundamental para llevar la transparencia de la industria de activos digitales a un nuevo nivel. También estamos trabajando en implementar la solución mencionada en el blog de Vitalik para lograr un mejor rendimiento, lo que nos permitirá proporcionar las pruebas con mayor frecuencia a un menor costo.

Como esta es la primera versión de nuestro zk-SNARK, esperamos recibir comentarios de la comunidad para poder continuar mejorando el sistema.

Código y lecturas adicionales

  • Nuestro código fuente

  • Prueba de reservas de Binance: ¿Qué es un árbol Merkle?

  • Binance Academy: mejora de la transparencia criptográfica con prueba de conocimiento cero

  • Blog de Vitalik: Tener un CEX seguro: prueba de solvencia y más allá