Básico
Spot
Opera con criptomonedas libremente
Margen
Multiplica tus beneficios con el apalancamiento
Convertir e Inversión automática
0 Fees
Opera cualquier volumen sin tarifas ni deslizamiento
ETF
Obtén exposición a posiciones apalancadas de forma sencilla
Trading premercado
Opera nuevos tokens antes de su listado
Contrato
Accede a cientos de contratos perpetuos
TradFi
Oro
Plataforma global de activos tradicionales
Opciones
Hot
Opera con opciones estándar al estilo europeo
Cuenta unificada
Maximiza la eficacia de tu capital
Trading de prueba
Introducción al trading de futuros
Prepárate para operar con futuros
Eventos de futuros
Únete a eventos para ganar recompensas
Trading de prueba
Usa fondos virtuales para probar el trading sin asumir riesgos
Lanzamiento
CandyDrop
Acumula golosinas para ganar airdrops
Launchpool
Staking rápido, ¡gana nuevos tokens con potencial!
HODLer Airdrop
Holdea GT y consigue airdrops enormes gratis
Launchpad
Anticípate a los demás en el próximo gran proyecto de tokens
Puntos Alpha
Opera activos on-chain y recibe airdrops
Puntos de futuros
Gana puntos de futuros y reclama recompensas de airdrop
Inversión
Simple Earn
Genera intereses con los tokens inactivos
Inversión automática
Invierte automáticamente de forma regular
Inversión dual
Aprovecha la volatilidad del mercado
Staking flexible
Gana recompensas con el staking flexible
Préstamo de criptomonedas
0 Fees
Usa tu cripto como garantía y pide otra en préstamo
Centro de préstamos
Centro de préstamos integral
Centro de patrimonio VIP
Planes de aumento patrimonial prémium
Gestión patrimonial privada
Asignación de activos prémium
Quant Fund
Estrategias cuantitativas de alto nivel
Staking
Haz staking de criptomonedas para ganar en productos PoS
Apalancamiento inteligente
Apalancamiento sin liquidación
Acuñación de GUSD
Acuña GUSD y gana rentabilidad de RWA
Recuperación social integral: ¿Cómo logra zk-SNARKs la separación de la lógica de las transacciones de billetera y los activos?
Autor original: @Toni Wahrstätter
Fecha de lanzamiento: 12 de septiembre de 2023
Traducción: Instituto de Investigación DeBox
Prefacio
Vitalik recomienda utilizar zk-SNARK para separar las cuentas de lógica comercial de las cuentas que contienen activos. Esto mejora la privacidad, la experiencia del usuario y la recuperación social con un solo clic. El investigador de Ethereum, Toni Wahrstätter, proporciona un análisis detallado de este prototipo de billetera, que cubre el flujo de trabajo y las ventajas.
Administrar varias cuentas puede resultar un desafío por diversos motivos, incluidos problemas de recuperación social, privacidad, L2 y experiencia general del usuario. El uso de una dirección oculta complica las cosas porque cada interacción requiere una nueva cuenta. Vitalik recomienda utilizar zk-SNARK para separar las cuentas de lógica comercial de las cuentas que contienen activos. Esto mejora la privacidad, la experiencia del usuario y la recuperación social con un solo clic.
En pocas palabras, lo que intentamos lograr es:
**Recuperación social integral sin comprometer la privacidad. **
1. Método tradicional
Una implementación simple pero que compromete la privacidad se ve así:
La desventaja es que esto vincula públicamente cuentas lógicas y cuentas de tenencia de activos, comprometiendo así la privacidad.
2. Utilice ZK-SNARK
Al utilizar zk-SNARK, los usuarios pueden demostrar que están autorizados a gastar sin revelar la conexión entre la cuenta de haberes lógica y la cuenta de haberes de activos.
El flujo de trabajo es el siguiente:
1.1. Un árbol Merkle básicamente contiene los valores de slot0 y slot1 de cada contrato existente ordenados por fecha o nombre.
1.2 Cada usuario puede crear un árbol Merkle localmente según el estado más reciente.
El usuario construye una prueba zk para demostrar que conoce el secreto en la cuenta de haberes lógica. Prueba en detalle más adelante.
El usuario envía zk-proof a la cuenta de haberes de activos.
Certificado de verificación de cuenta de tenencia de activos, que acredite lo siguiente:
4.1 Los usuarios saben dónde está la lógica.
4.2 El usuario conoce un valor secreto que se codifica y se asigna al valor almacenado en la cuenta de haberes lógica.
4.3 Los usuarios pueden reconstruir el estado de la cuenta, la raíz del árbol Merkle mantenida en la cadena canónica (por ejemplo, precompilada)
4.4 Utilice números aleatorios correctos (utilizados para cambiar claves en cuentas de haberes lógicas).
Básicamente, un usuario puede decir: “Tengo permiso demostrable de la cuenta lógica para realizar esta acción y conozco la ubicación de esa cuenta lógica”.
ventaja
Además, al agregar otro contrato (agregador) entre la lógica y el contrato de tenencia de activos, se pueden proporcionar múltiples pruebas de diferentes cuentas de tenencia de activos en una sola transacción, lo que permite que la cuenta se trate casi como una UTXO. Los agregadores podrán obtener múltiples certificados zk y enviarlos a sus respectivas cuentas de activos para su verificación. Por supuesto, un agregador de este tipo podría crear vínculos (incluida la privacidad) entre cuentas de activos individuales.
detalles técnicos
La configuración de zk-SNARK incluye elementos privados:
1. Cuenta de haberes lógica
Un prototipo de una cuenta de haberes lógica podría verse así:
solidez pragma >=0.7.0 <0.9.0;
el contrato LogicHoldingAccount es de propiedad { uint256 public slot0 = 0x1234; // secreto hash uint256 public nonce = 0; // realizar un seguimiento de los cambios clave dirección pública propietario;
función updateOwner(uint256 newValue) public onlyOwner { nonce += 1; ranura0 = nuevoValor;
Este contrato rastrea la lógica de gasto actual del propietario (slot0) y permite actualizaciones a través de la función updateOwner.
2. Cuenta de haberes
solidez pragma >=0.7.0 <0.9.0;
contrato AssetHoldingAccount { uint256 public logicHoldingAccountHash = 1234…;
// Tamaño de campo escalar, tamaño de campo base, datos de clave de verificación, etc. // …
función verificarProof(uint [2] datos de llamada _pA, uint [2] [2] datos de llamada _pB, uint [2] datos de llamada _pC, uint [2] calldata _pubSignals) public view return (bool val) { // Código ensamblador de Snarkjs para verificación de prueba… // … }
// _pubSeñales [0] - la raíz del árbol contract-slot0||nonce Merkle // _pubSignals [1] - la función de dirección del titular lógico hased ute (dirección a pagar, monto uint256, uint [2] datos de llamada _pA, uint [2] [2] datos de llamada _pB, uint [2] datos de llamada _pC, uint [2] calldata _pubSignals) public { contractRootPrecompile.getRoot(block.number) uint256 especificadoLogicHolder = _pubSignals [1] ; require(specifiedLogicHolder == logicHoldingAccountHash, “No permitido”);
bool validProof = verificarProof(_pA, _pB, _pC, _pubSignals) == verdadero; if (validProof) { (bool éxito,) = to.call{valor:cantidad}(“”); requerir(éxito); } }
recibir() pago externo {
Las cuentas de tenencia de activos almacenan activos como ETH y permiten a los usuarios enviar pruebas de retiros. Al verificar que el LogicHolder especificado coincida con el logicHoldingAccountHash, el propietario puede garantizar que el contrato de tenencia de activos solo acepte pruebas del contrato de tenencia lógica autorizado, en lugar de cualquier contrato arbitrario.
El secreto proporcionado como señal privada al construir la prueba garantiza que sólo el propietario de la cuenta que contiene la lógica de gasto pueda acceder a los fondos de la cuenta de tenencia de activos.
3.Circuito
El siguiente circuito fue desarrollado usando circom, el código completo se puede encontrar aquí.
pragma circom 2.0.2;
incluir “./modules/merkleTree.circom”; incluir “./modules/commitmentHasher.circom”;
plantilla principal (niveles) { raíz de entrada de señal; lógica de entrada de señalHoldingAddressHash; lógica de entrada de señalHoldingAddress; secreto de entrada de señal; entrada de señal nonce; ruta de entrada de señalElementos [levels] ; ruta de entrada de señalÍndices [levels] ; componente secretHasher = SecretHasher(); secretHasher.secret <== secreto; hasher de componente = CommitmentHasher(); hasher.logicHoldingAddress <== logicHoldingAddress; hasher.secret <== secretHasher.hashedSecret; hasher.nonce <== nonce; hasher.logicHoldingAddressHash === logicHoldingAddressHash; árbol de componentes = MerkleTreeChecker(niveles); árbol.hoja <== hasher.commitment; árbol.raíz <== raíz; para ( i = 0; i < niveles; i++) { tree.pathElements [i] <== elementos de ruta [i] ; árbol.rutaíndices [i] <== índices de ruta [i] ;
componente principal {público [raíz,logicHoldingAddressHash]} = Principal(N);
El circuito tiene un total de 7 señales, 2 de las cuales son públicas, a saber, la raíz del árbol Merkle y la dirección hash de la cuenta de tenencia lógica (que debe ser codificada antes de codificarse en el contrato de tenencia de activos para evitar que los observadores agreguen la cuenta). clase) basado en la misma lógica que la cuenta del titular).
en conclusión
En un mundo donde los usuarios deben administrar varias cuentas, la necesidad de una funcionalidad única de recuperación social es cada vez más importante. Zk-SNARK se puede usar en billeteras que implementan lógica/separación de activos, lo que permite a los usuarios usar la “lógica” de la Cuenta A para gastar desde la Cuenta B sin crear un vínculo entre las dos. Como primer paso, las pruebas SNARK se pueden utilizar para acciones que sean menos riesgosas que los desembolsos de activos. Por ejemplo, un buen punto de partida podría ser permitir a los usuarios iniciar “solicitudes de retiro”. Si el propietario del contrato de tenencia lógica no presenta objeciones, el usuario puede finalizar la solicitud después de un período de tiempo.
De esta manera, el propietario del contrato de tenencia lógico aún puede intervenir, aunque rompiendo la privacidad, en caso de que suceda algo inesperado.