La abstracción de cuentas busca mejorar las experiencias de los usuarios y desarrolladores en todo el ecosistema de Ethereum. Además de hacer que las experiencias en cadena sean más accesibles y agradables para los usuarios, también capacita a los desarrolladores para poder hacer cosas más poderosas en Ethereum y servir a los usuarios de manera aún más significativa.
Nuestra clasificación de los enfoques de abstracción de cuentas es la siguiente:
Este enfoque presenta mecanismos que permiten a una EOA transicionar a una CA, sin tener que mover sus activos, como EIP 7377yEIP 5003 (cuando se considera junto con EIP 3074).
Anteriormente se han realizado varias propuestas para la creación de cuentas inteligentes y la consagración de la abstracción de cuentas a nivel de protocolo; EIP-86yEIP-2938son algunos de los más citados. Sin embargo, hubo mucha oposición debido a la complejidad percibida introducida por este diseño y la opinión mayoritaria de que Ethereum no está listo para tanta complejidad.
Siguiendo el resurgimiento de Vitalik del tema después de The Merge, ERC-4337se propuso como una versión optativa del estándar de cuentas inteligentes, similar a la infraestructura PBS (Proposer-Builder Separation) para MEV (Maximal Extractable Value). Así, los usuarios que busquen acceder a los beneficios de las cuentas inteligentes podrían simplemente usar el conducto ERC-4337 para redefinir la lógica de su cuenta y las reglas de validez de las transacciones en estructuras denominadas UserOperation (o UserOps en resumen).
ERC 4337 aporta los beneficios de las cuentas inteligentes al Ethereum actual sin consagrar ninguna de las complejidades, al funcionar como una alternativa fuera del protocolo para las cuentas inteligentes consagradas. Sin embargo, esto no significa que la infraestructura sea óptima en su estado actual, ya que su propia complejidad sigue siendo un punto considerable de falla.
Para abordar esta complejidad,RIP 7560fue redactado como una versión consagrada de la infraestructura ERC 4337 en Ethereum y sus L2s, para que herede los esquemas de resistencia de síbil de la red en lugar de tener que definir un nuevo conjunto de reglas (como lo hace ERC 4337 conERC 7562.
En este informe, nos centraremos en explorar la programabilidad de EOA, evaluando los diversos EIP que describen soluciones en esta línea y discutiremos sus méritos y desventajas. En la Parte 2 y 3 de esta serie, cubriremos las otras dos clases de enfoque para la abstracción de cuentas que se están explorando dentro de Ethereum.
Para buscar lo que se puede abstraer, necesitamos una imagen (algo) completa del diseño de la cuenta actual. Esta sección servirá principalmente como una revisión de lo que son en realidad las cuentas en Ethereum, y cómo se validan y ejecutan sus transacciones.
Las cuentas de Ethereum son entidades con un saldo de ether (ETH) y la capacidad de enviar transacciones en la cadena de bloques de Ethereum. Se representan como una “dirección” hexadecimal de 42 caracteres, que sirve como un indicador único de las tenencias y transacciones de la cuenta.
Una dirección actúa como una clave en el estado de trie del blockchain. Los nodos hoja de este trie son estructuras de datos de cuenta que se pueden descomponer en cuatro campos:
El contenido de estos cuatro campos se utiliza para definir el tipo de cuenta y, en última instancia, para definir la extensión de sus funcionalidades. Así, los dos tipos de cuentas de Ethereum son:
Las EOAs tienen los campos codeHash y storageHash vacíos y solo pueden ser controladas por cualquier persona que posea las claves privadas. Sus direcciones se pueden obtener a partir de la clave pública correspondiente agregando “0x” a los últimos veinte caracteres del hash keccak-256 de la clave pública de la cuenta.
Sus transacciones son completamente basadas en pull y están basadas en la lógica de su código implementado.
Dado que estas cuentas solo pueden ser controladas por su contenido de código, no necesitan una clave privada y solo tienen una clave pública. Por lo tanto, cualquier agente que tenga la capacidad de actualizar/cambiar el contenido del código de una cuenta de contrato podría acceder a su saldo.
La dirección de una CA se deriva de la dirección de su creador y su nonce hasta el punto de implementación del contrato.
Transacciones
Recientemente describimos las cuentas como entidades que poseen la capacidad de enviar transacciones a través de Ethereum. Por lo tanto, podemos entender que un propósito principal de una cuenta es enviar y recibir transacciones, mientras que la cadena de bloques actúa como un libro mayor que registra el historial de transacciones y describe cómo las transacciones alteran los campos de la cuenta basándose en las reglas descritas en la especificación del protocolo de la cadena de bloques.
Entonces, ¿qué son estas ‘transacciones’?
Las transacciones son operaciones enviadas desde una cuenta, que causan un cambio en el “estado” de la red. Son instrucciones firmadas criptográficamente de las cuentas, que resultan en una actualización del estado en toda la red cuando se ejecutan.
La falta de permisos conlleva el costo de incentivos perversos, para hacer frente a estos, es necesario definir pautas estrictas (o reglas de validez) para las interacciones en tales entornos.
En este contexto, las transacciones deben seguir ciertas reglas de validez para considerarse válidas y ejecutadas. La mayoría de estas reglas de validez se implementan a través de restricciones colocadas en la cuenta que envía la transacción, y varían según el tipo de cuenta que sea.
En Ethereum, las EOAs están optimizadas para la usabilidad ya que están orientadas al usuario final. Tienen la capacidad de enviar transacciones de manera específica y operar perfectamente de forma autónoma. También se pueden crear localmente, siendo el método más común el uso de proveedores de carteras como MetaMask, Rainbow, Rabby, etc.
Por otro lado, las cuentas de contrato solo pueden enviar transacciones permitidas por su lógica, en respuesta a ser “llamadas”. Además, solo pueden ser creadas por un EOA que tenga un saldo suficiente para pagar su almacenamiento de estado.
Una descripción más avanzada sería que las EOAs solo pueden tener un saldo, mientras que las CAs pueden tener tanto un saldo como lógica que dicta cómo se puede gastar este saldo.
Estas propiedades se deben a los siguientes parámetros lógicos que definen las reglas a las que deben adherirse las transacciones de una cuenta:
Estos parámetros están diseñados para ser rígidos para las EOAs así:
Más generalmente, la lógica de ejecución de las EOAs las limita a una transacción por firma válida.
Por otro lado, las CA tienen más flexibilidad en torno a estos parámetros:
En la mayoría de los casos prácticos, la lógica utilizada en este caso es un esquema de firma múltiple que estipula que se requieren M de N firmas válidas (donde M
Al evaluar estas características, observamos que cada tipo de cuenta está diseñado para tener un equilibrio entre autonomía y programabilidad.
Las EOAs tienen plena autonomía pero una programabilidad limitada; pueden autorizar y enviar transacciones cuando lo deseen, pero estas transacciones deben seguir un formato rígido para considerarse válidas. Las CAs tienen plena programabilidad (limitada solo por el diseño del EVM) pero una autonomía limitada; sus transacciones no tienen que seguir ningún formato rígido, pero solo pueden ser enviadas debido a que su lógica es llamada primero.
En la siguiente subsección, estudiaremos las implicaciones de estas elecciones de diseño, con el fin de comprender completamente la propuesta de cada EIP discutido a lo largo de esta serie.
Ahora que tenemos un conocimiento algo sucinto de las funcionalidades de las diferentes cuentas, podemos identificar fácilmente sus puntos de venta, así como los problemas que presentan tanto para los usuarios como para los desarrolladores en Ethereum.
Como mencionamos anteriormente, las EOAs están diseñadas como cuentas de primera clase dirigidas a los usuarios finales. Las aplicaciones están diseñadas para interactuar fácilmente con ellas, casi no hay complejidad en ellas y, por supuesto, no hay costo por crear una. Sin embargo, su simplicidad conlleva una pérdida significativa de novedad, ya que están diseñadas para ser estrictamente deterministas.
Algunas de las preocupaciones en torno a ellos son:
No todos quieren (o podrían) mantener siempre ETH (quiero decir, mira esa acción del precio), así que las soluciones viables serían permitir múltiples monedas de gas (demasiado difícil, rompe demasiadas invariantes como se describe en la sección “Moneda”) o…aquí), o permitir que los pagos de gas sean liquidados por otra cuenta que no sea el origen de la transacción.
En el otro extremo del espectro de cuentas, las CAs apuntan a los desarrolladores y a una base de usuarios más técnica. Sirven como vehículos para contratos inteligentes (es decir, consideramos que los contratos inteligentes son su lógica contenida o contenido de código) y por lo tanto pueden implementar nuevos formatos de transacción habilitados por el EVM.
Sin embargo, todas estas características son cuentas de segunda clase glorificadas, ya que no tienen autonomía. Algunas de sus desventajas son las siguientes:
Habiendo revisado las decisiones de diseño que llevaron a los problemas definidos en esta subsección, ahora podemos proceder a evaluar las soluciones propuestas.
El concepto de abstracción de cuentas (a través de cuentas inteligentes al menos) siempre ha sido una parte integral del plan de Ethereum. Se dice que la complejidad que rodea su implementación amenazó con retrasar aún más el lanzamiento de Ethereum, por lo que se descartó para el diseño actual con diferentes cuentas que ofrecen diferentes funcionalidades. Se retrasó de nuevo por el enfoque de Ethereum en The Merge, y ahora está resurgiendo como parte principal de la próxima gran actualización de la red - Pectra. Sin embargo, su complejidad sigue siendo considerada una desventaja significativa que impide su consagración, especialmente porque Ethereum ha pivotado hacia un plan centrado en Rollup.
Los requisitos ahora son dos veces más.
Intuitivamente, este concepto desempeña un papel más importante en el contexto de la abstracción de cuentas y la interoperabilidad, sin embargo, nuestro alcance en todo este informe se limita a las iniciativas técnicas tomadas para lograr la abstracción de cuentas en sí misma.
La abstracción de cuentas tiene como objetivo combinar las mejores características de las EOAs y las CAs en un nuevo estándar de cuenta, las cuentas inteligentes, que permiten la separación total o parcial de las reglas de validez de cualquier cuenta en lógica de validación y ejecución; de modo que las cuentas puedan definir sus propias reglas de validez, según lo permitido por el EVM, al igual que las cuentas de contrato, manteniéndose totalmente autónomas al igual que las cuentas propiedad de manera externa.
A menudo hay confusión en torno a las diferencias entre las cuentas inteligentes y las carteras de contratos inteligentes, así que vamos a describir explícitamente cuáles son estas diferencias a continuación:
La comercialización de las carteras de contratos inteligentes facilitó la adopción de las AC por un mercado más amplio, lo que permitió que los usuarios menos técnicos aprovecharan las características que ofrecen. Sin embargo, todavía enfrentan las desventajas asociadas con las AC.
Volviendo a la conversación; anteriormente habíamos discutido los parámetros que se utilizan para definir las reglas de validez de las transacciones de las cuentas:
Los valores de los primeros cuatro parámetros pueden ser referidos colectivamente como la lógica de validación de una cuenta, que son comprobaciones que ocurren antes de que comience la ejecución de una transacción.
El último parámetro define cómo debe proceder la ejecución de la transacción.
En la introducción, proporcionamos una descripción general de alto nivel del panorama actual de AA en forma de una clasificación de los diversos diseños propuestos. Ahora nos centraremos en la primera clase de soluciones para el dilema de cuentas de Ethereum: la programabilidad de EOA.
El mayor atractivo de Ethereum es su ecosistema DeFi joven pero vibrante que presenta una variedad de aplicaciones descentralizadas que son sus principales sumideros de liquidez. La mayoría de estas DApps están optimizadas para servir a EOAs, por lo que son difíciles de interfacear con CAs y, eventualmente, cuentas inteligentes. Si bien las carteras de contratos inteligentes ayudan a las CAs en este caso, tienen sus propias limitaciones y una experiencia de usuario completamente diferente.
Una solución provisional que se está explorando mientras tanto que tanto las DApps como los proveedores de carteras se acostumbran al estándar de cuenta inteligente, es proporcionar mejoras temporales a las EOAs que les permitan superar la mayoría de las restricciones impuestas, ya sea su lógica de validación o ejecución.
A continuación, repasamos las especificaciones de tres EIP principales que proporcionan rutas accionables a la programabilidad de la EOA; desde el menos conocidoEIP 5806, para los ambiciosos EIP 3074y luego finalmente al victoriosoEIP 7702.
Esta propuesta busca llevar más funcionalidad al estándar EOA al permitirle realizar llamadas delegadas a la lógica de la cuenta del contrato (su contrato inteligente). Esto hace que el contrato inteligente se ejecute efectivamente en el contexto del EOA del llamante, es decir, el EOA sigue controlando su lógica de validación, mientras que su lógica de ejecución es manejada por la lógica correspondiente de la CA.
Antes de seguir adelante, hagamos un viaje por la memoria evolutiva de Ethereum hasta…EIP-7.
El EIP-7 propuso la creación del opcode 0xf4/DELEgateCALL, que se utiliza para enviar llamadas de mensaje a una cuenta primaria con la lógica de una cuenta secundaria, manteniendo los valores de los campos [sender] y [value] de la cuenta primaria.
En otras palabras, la cuenta principal “hereda” (o toma prestada si lo prefiere) la lógica de la cuenta secundaria durante algún tiempo especificado en la llamada al mensaje, de modo que la lógica de esta última se ejecuta en el contexto de la primera.
Este opcode permitió a los desarrolladores de dApp dividir la lógica de su aplicación en múltiples contratos inteligentes manteniendo la interdependencia, de modo que pudieran esquivar fácilmente las barreras de tamaño de código y barreras de gas.
Bien, entonces ¿qué llamadas de delegado permiten que los AC sean interdependientes? Bueno, EIP-5806 utiliza EIP-7 como inspiración para proponer la expansión de la funcionalidad de llamada de delegado también a las EOA; es decir, permitamos que las EOA también sean interdependientes con los AC, porque ¿por qué no?
EIP 5806 introduce una nueva compatible con EIP-2718tipo de transacción que se empaqueta de la siguiente manera:
rlp([chainID, nonce, max_priority_fee_per_gas, max_fee_per_gas, gas_limit, destination, data, access_list, signature_y_parity, signature_r, signature_s]).
Estas transacciones están diseñadas de manera que el campo [to], que representa la dirección del destinatario, solo puede aceptar direcciones como entradas de 20 bytes, lo que impide que el remitente utilice el opcode CREATE.
La motivación detrás de cada componente del esquema RLP es la siguiente:
Si bien el empaquetado de transacciones EIP-5806 en sobres EIP-2718 permite una gran compatibilidad hacia atrás, las EOAs no son equivalentes a las CAs. Por lo tanto, se deben definir ciertas restricciones en la forma en que una EOA utiliza las llamadas de delegado para evitar la ruptura de invariantes.
Estas restricciones están dirigidas a los siguientes opcodes:
La aplicabilidad principal de EIP 5806 es la abstracción de ejecución para EOAs. Permitir que los EOAs interactúen de manera confiable con contratos inteligentes más allá de simples llamadas a su lógica les otorga funciones como:
Los cambios propuestos por EIP-5806, si bien permiten características necesarias, no son particularmente novedosos; su existencia se basa principalmente en un EIP-7 ya funcional. Esto le permite evitar muchos obstáculos potenciales para su aceptación.
Una de las principales preocupaciones expresadas en sus primeros días fue el riesgo potencial de permitir que las Cuentas Externas Autónomas (EOAs) accedan al almacenamiento y lo modifiquen, al igual que las Cuentas Contrato Actuales (CAs) lo hacen actualmente. Esto rompe muchos invariantes consagrados en la red sobre cómo deben realizarse las transacciones con las EOAs, y por eso se abordó introduciendo las restricciones mencionadas en la subsección anterior.
Una segunda crítica (que es un arma de doble filo) es la simplicidad de EIP-5806; existe la sensación de que las recompensas debidas a la aceptación de EIP-5806 podrían no valer la pena, ya que solo permite la abstracción de la ejecución y no mucho más. Todas las demás restricciones de validez siguen estando definidas por la red para las EOA que optan por EIP-5806, a diferencia de otras EIP algo similares que analizamos en las siguientes subsecciones.
EIP-3074 propone permitir que las EOAs deleguen la mayor parte de su lógica de validación a cuentas de contrato especializadas, denominadas invocadores, superponiendo la lógica de autorización de estos últimos sobre la suya para formas específicas de transacciones.
Esto se logra firmando su política de acceso a un contrato invoker, que luego se convierte en responsable de definir la política de acceso de la EOA.
Esta EIP propone la adición de dos nuevas opcodes al EVM:
Estos dos códigos de operación permiten que una EOA delegue el control a una CA preestablecida y, por lo tanto, actúe como una sola a través de ella, sin tener que implementar un contrato e incurrir en los costos y externalidades asociados con eso.
EIP-3074 permite que las transacciones utilicen un formato de firma [MAGIC] para evitar colisiones con otros formatos de firma de transacciones. La cuenta activa a la que se pasan las instrucciones [AUTHCALL] se define como un campo de variable de contexto llamado [authorized], que solo persiste a través de una sola transacción y debe ser redefinido para cada nuevo [AUTHCALL].
Antes de abordar las complejidades de cada código de operación, estas son las entidades involucradas en una transacción EIP-3074:
Los contratos Invoker reciben mensajes [AUTH] con un valor [COMMIT] de [autoridad]; este valor define las restricciones que la cuenta desea imponer en la ejecución de las instrucciones [AUTHCALL] de [autorizado].
Por lo tanto, los invocadores son responsables de garantizar que el [contract_code] definido en una cuenta [autorizada] no sea malicioso y tenga la capacidad de satisfacer los invarianes establecidos por la cuenta de firma principal en un valor de [COMMIT].
El código de operación [AUTH] tiene tres entradas de elementos de pila; o más simplemente, se define por tres entradas que calculan una sola salida. Estos insumos son:
Los dos últimos inputs se utilizan para describir un rango de memoria modificable de 0 a 97, donde:
Las variables [yParity], [r] y [s] se interpretan colectivamente como una firma ECDSA, [magic], en la curva secp256k1 sobre el mensaje:
[keccak256 (MAGIC || chainID || nonce || dirección del invocador || CONFIRMACIÓN)]
dónde:
Si la firma calculada es válida y la dirección del firmante es igual a [authority], el campo [authorized] se actualiza con el valor proporcionado por [authority]. Si alguno de estos requisitos no se cumple, el campo [authorized] permanece sin cambios en su estado anterior o como un valor no establecido.
El costo de gas para este opcode se calcula como la suma de:
[AUTH] se implementa para no modificar la memoria y toma el valor de [authority] como argumento, por lo que es trivial verificar su valor a partir de la firma proporcionada.
El opcode [AUTHCALL] tiene siete elementos de pila de entrada que se utilizan para calcular un solo elemento de pila de salida.
Tiene la misma lógica que el opcode [CALL], es decir, se utiliza para enviar llamadas de mensaje a una cuenta y activar una lógica específica en sus contratos. La única desviación en su lógica es que [AUTHCALL] está diseñado para establecer el valor de [CALLER] antes de continuar con la ejecución.
Por lo tanto, [AUTHCALL] es utilizado por la [autoridad] para desencadenar un comportamiento específico del contexto en [autorizado] con comprobaciones lógicas que proceden de la siguiente manera:
El costo de gas para [AUTHCALL] se calcula como la suma de:
Se accede a los datos devueltos desde un [AUTHCALL] a través de:
Para unirlo todo con mucho menos de la jerga técnica; Las transacciones de Ethereum suelen especificar dos valores:
En EOAs, como se mencionó anteriormente, la autorización está estrechamente vinculada con la ejecución, es decir, (tx.origin == msg.sender). Esta invariante simple da lugar a la mayoría de los problemas que explicamos en la subsección ‘Cuentas y validez de transacciones’ de este informe.
Los mensajes de [AUTH] de [authority] le permiten compensar la función tx.origin a [authorized], mientras que sigue siendo el msg.sender. También le permite definir restricciones a este privilegio utilizando un valor [COMMIT].
[AUTHCALL] luego permite que [autorizado] acceda a la lógica de un contrato, utilizando un [invocador] como intermediario para asegurar que el contrato al que desea acceder sea inofensivo. Es decir, para cada [AUTHCALL], [autorizado] debe especificar un [invocador] en particular para su [COMMIT].
EIP 3074 es principalmente responsable de permitir que las EOAs deleguen su lógica de autorización a una cuenta diferente, sin embargo su diseño abierto permite mucho más en diferentes contextos.
Toda la lógica de validación de una EOA puede ser abstracta aplicando diversas restricciones/innovaciones al invocador según sea necesario, algunos de los diseños posibles basados en su lógica objetivo incluyen:
Además, la lógica de ejecución se abstrae de manera intuitiva; después de todo, el invocador (que es una CA) ahora es responsable de ejecutar las solicitudes de transacción en nombre del EOA.
Cotizandouno de sus autores: “No esperaría que las carteras expongan funcionalidades para firmar sobre invocadores arbitrarios …”. Quizás el mayor problema planteado por la iniciativa 3074 es que la innovación encima de ella tenderá muy fácilmente a flujos de acuerdos con permisos y propietarios; al igual que las iteraciones actuales de los mercados MEV y PBS de Ethereum.
Por defecto, los contratos invoker deben ser ampliamente auditados para evitar ataques aún peores que los que son actualmente posibles. Esto inevitablemente tenderá a un ecosistema donde solo se adoptarán un puñado de contratos invoker desarrollados por figuras influyentes como los predeterminados para los desarrolladores de billeteras. Por lo tanto, se reduce a un compromiso entre tomar el difícil camino descentralizado de auditar y respaldar constantemente los contratos invoker con el riesgo de seguridad de los usuarios; o simplemente adoptar contratos invoker de fuentes establecidas y reputadas con mejores garantías de seguridad para el usuario y menos supervisión sobre la seguridad del contrato.
Otro aspecto de este punto es la función de coste asociada con el diseño, la auditoría y la comercialización de un invocador funcional y seguro. Los equipos más pequeños casi siempre serán superados por organizaciones más grandes, especialmente en el ámbito de la comercialización, que ya tienen cierta reputación establecida, incluso si su producto es mejor.
EIP-3074 afianza el esquema de firma ECDSA, ya que todavía se considera más válido que el esquema de autorización introducido a través del invocador. Si bien hay argumentos de que la resistencia cuántica no es actualmente un problema definitivo, y que hay mucho peor en juego en un futuro donde ECDSA sea corruptible; el objetivo algo no declarado de Ethereum es siempre estar por delante de tales problemas. Potencialmente sacrificar la resistencia cuántica y a la censura por mejoras marginales en la experiencia de usuario puede que no sea la mejor de las elecciones en un futuro cercano.
Otro punto sobre el argumento de la compatibilidad hacia adelante es que mientras se evaluaban los beneficios de 3074, ERC-4337 (que no requiere cambios en el protocolo) ahora tiene un gran mercado, por lo que también debes ser compatible con él para evitar la compartimentalización de los ecosistemas.
Incluso con la hoja de ruta de abstracción de cuentas nativas, los opcodes [AUTH] y [AUTHCALL] eventualmente se volverían obsoletos en el EVM, introduciendo una gran cantidad de deuda técnica en Ethereum para ofrecer una cantidad marginal de mejora en la experiencia del usuario.
Después de enviar un mensaje [AUTH] y delegar el control, se espera que el EOA evite el esquema habitual de autorización de clave privada, ya que el envío de una transacción “normal” hace que se revoque la autorización que delegó a cada invocador.
Así, el esquema ECDSA sigue siendo estrictamente superior a cualquier otro esquema de autorización que los contratos asociados puedan habilitar, lo que significa que la pérdida de claves privadas resultaría en una pérdida total de los activos de la cuenta.
Esta propuesta inicialmente se planteó como una variación algo minimalista de EIP 3074, y era incluso significadoser una actualización de ella. Nació para abordar las supuestas ineficiencias de EIP 3074, especialmente las preocupaciones sobre su incompatibilidad con el ecosistema ya próspero 4337 y la propuesta nativa de abstracción de cuentas - RIP 7560.
Su enfoque es la adición de un nuevo tipo de transacción compatible con EIP 2718, [SET_CODE_TX_TYPE], que permite a un EOA comportarse como una cuenta inteligente para transacciones especificadas.
Este diseño permite las mismas características que EIP 5806 y algunas más, al tiempo que es compatible con la hoja de ruta de abstracción de cuentas nativas y las iniciativas existentes.
EIP-7702 permite a un EOA ‘importar’ el contenido del código de un contrato a través de una transacción compatible con [SET_CODE_TX_TYPE] 2718 del siguiente formato:
rlp([chain_id, nonce, max_priority_fee_per_gas, max_fee_per_gas, gas_limit, destination, value, data, access_list, authorization_list, signature_y_parity, signature_r, signature_s])
Esta carga es completamente similar a la de EIP 5806, excepto que introduce una “lista de autorización”. Esta lista es una secuencia ordenada de valores de formato:
[[chain_id, dirección, nonce, y_parity, r, s], …]
donde cada tupla define el valor de la [dirección].
Antes de continuar, las partes involucradas en un SET_CODE_TX_TYPE son:
Cuando [authority] firma un SET_CODE_TX_TYPE especificando [address], se crea un designador de delegación. Este es un “programa de punteros” que hace que todas las solicitudes de recuperación de código debidas a las acciones del [authority] en cualquier momento se canalicen al código observable de [address].
Para cada tupla [chain_id, dirección, nonce, y_parity, r, s], el flujo lógico de una transacción de tipo 7702 es el siguiente:
¡Uf! Para atar todo esto de vuelta; este EIP permite a las EOAs enviar transacciones que establecen un puntero al código de un contrato, lo que les permite implementar esta lógica como propia en transacciones posteriores. De esta manera, es estrictamente más fuerte que el EIP 5806, porque permite a las EOAs tener realmente contenido de código todo el tiempo que deseen (en lugar de EIP 5806 que simplemente permite a las EOAs enviar llamadas delegadas).
Si bien se podría argumentar que ya no es una abstracción, ya que el EOA recibe activamente la lógica que desea ejecutar, aún no es el “propietario principal” de dicha lógica. Además, no contiene directamente la lógica, simplemente especifica un puntero a la lógica (para reducir la complejidad computacional). ¡Así que vamos con la abstracción de ejecución!
Si bien se rompe la invariante require (msg.sender == tx.origin) para permitir el patrocinio propio, el EIP todavía permite la integración de relevo de transacciones patrocinadas. Sin embargo, la advertencia es que dichos relevos necesitan un sistema basado en reputación o participación para prevenir ataques de sabotaje.
Las EOAs solo pueden apuntar a una porción específica del código de la cuenta, de modo que solo la lógica de esa porción es ejecutable en su contexto.
Esto también permite la existencia de subclaves que a su vez permiten la “desescalada de privilegios”, de modo que aplicaciones descentralizadas específicas solo tengan acceso al saldo de una cuenta en condiciones específicas. Por ejemplo, podría imaginarse un permiso para gastar tokens ERC-20 pero no ETH, o para gastar hasta el 1% del saldo total por día, o interactuar solo con aplicaciones específicas.
Debido a su naturaleza no restrictiva, una transacción EIP-7702 podría permitir a un usuario acceder al código de operación CREATE2 y usarlo para implementar el código de bytes en una dirección sin ningún otro parámetro restrictivo, como la lógica del mercado de tarifas (por ejemplo, EIP-1559 y EIP-4844). Esto permite que la dirección se recupere y se utilice en varias máquinas de estado, con el mismo código de bytes, donde su cuenta en cada cadena es responsable de definir los otros parámetros de variables de contexto.
Si bien EIP-7702 es todavía muy reciente, ya ha habido mucho prototipado y pruebas para sus dependencias y posibles desventajas, pero su modelo minimalista garantiza mucha flexibilidad, y por lo tanto utilidad, en diferentes contextos. Sin embargo, rompe demasiadas invariancias y no es inmediatamente compatible con versiones anteriores.
Parte de su lógica incluye:
La mayoría de los usuarios no están al tanto del contenido real de una cuenta (¡ni siquiera de la diferencia entre una cuenta y una dirección!), lo que significa que permitir colisiones de direcciones significa que un EOA podría hacerse pasar por una CA y atraer fondos de usuario en un largo proceso para finalmente robar todo. EIP-3607 aborda esto al estipular que las cuentas que contienen código no deberían poder gastar su saldo utilizando su propia lógica de autorización. Sin embargo, EIP 7702 rompe esta invariante para permitir que los EOAs sigan siendo autónomos incluso después de adquirir cierta programabilidad.
Firmar la dirección de una cuenta en lugar de su contenido de código es básicamente como el esquema 3074 con invocadores. No proporciona garantías estrictas sobre la consistencia del contenido del código entre cadenas, ya que una dirección podría adoptar un contenido de código diferente en diferentes cadenas. Esto significa que una dirección cuyo contenido de código contiene la misma lógica en una cadena podría ser depredadora o completamente maliciosa en otra cadena, y esto podría llevar a la pérdida de fondos de usuario.
Las EOAs en su forma actual están muy limitadas, ya que no permiten a los usuarios aprovechar las características de programabilidad ofrecidas por el EVM. Si bien hay varios caminos para mejorar las cuentas, como mencionamos al principio de este informe, la solución elegida debe mantener los principios de custodia propia segura y protegida. Además, las actualizaciones de las EOA pueden tener un impacto significativo tanto en la experiencia del usuario como en los desarrolladores de aplicaciones, por lo que se deben considerar todas las opiniones de las partes interesadas.
Permitir que las EOAs ejecuten código de cualquier manera amplía enormemente la funcionalidad de las cuentas, pero esta nueva expresividad conlleva riesgos significativos y posibles inconvenientes. Resolver estos compromisos es fundamental para ofrecer una actualización con beneficios de UX indiscutibles para los usuarios de Ethereum.
La cultura de discusión abierta de Ethereum lo convierte en un gran campo de pruebas para tales innovaciones, ya que casi todas las implicaciones de cada diseño son minuciosamente analizadas por expertos en la materia. Esta consideración integral debería ayudar a mitigar los riesgos de mala praxis por parte de adversarios.
EIP-7702 es actualmente el niño mimado de los mecanismos que buscan llevar la programabilidad de EVM a las EOAs, habiendo sido marcado como un reemplazo para el espacio en blanco de EIP 3074 en la actualización Pectra. Hereda el diseño abierto del mecanismo 3074 mientras reduce en gran medida la superficie de ataque/riesgos. También permite mucho más al evitar las restricciones de 3074 a ciertas clases de opcodes.
Si bien todavía se están realizando algunos refinamientos en el diseño de la propuesta, ya ha obtenido mucho apoyo y respaldo de los desarrolladores, especialmente porque Vitalik lo respalda directamente.
Dentro de la comunidad hay afirmaciones de que este enfoque de abstracción de cuentas podría ser incluso mejor que las cuentas inteligentes. Este comentario enfatiza que este enfoque requiere menos cambios y no es tan complejo, y que las EOA ya están consagradas. Sin embargo, debemos recordar el hito de seguridad futura de resistencia cuántica en cada nivel de la red Ethereum. Esta seguridad cuántica es inviable con el modelo de cuenta actual debido a la utilización de esquemas de firma basados en ECDSA para la autorización de EOA.
Así, la programabilidad de las EOA debe considerarse como un paso en el camino hacia las cuentas inteligentes y no como el destino. Potencia las EOA y permite una mejor experiencia para el usuario y el desarrollador, al tiempo que se mantiene compatible con el objetivo último de abstracción de cuentas de las cuentas inteligentes.
En nuestro próximo informe, nos sumergiremos en los esquemas de migración de EOA para ver qué tan bien se ajustan en el camino de la abstracción de cuentas, ¡manténgase atento!
La abstracción de cuentas busca mejorar las experiencias de los usuarios y desarrolladores en todo el ecosistema de Ethereum. Además de hacer que las experiencias en cadena sean más accesibles y agradables para los usuarios, también capacita a los desarrolladores para poder hacer cosas más poderosas en Ethereum y servir a los usuarios de manera aún más significativa.
Nuestra clasificación de los enfoques de abstracción de cuentas es la siguiente:
Este enfoque presenta mecanismos que permiten a una EOA transicionar a una CA, sin tener que mover sus activos, como EIP 7377yEIP 5003 (cuando se considera junto con EIP 3074).
Anteriormente se han realizado varias propuestas para la creación de cuentas inteligentes y la consagración de la abstracción de cuentas a nivel de protocolo; EIP-86yEIP-2938son algunos de los más citados. Sin embargo, hubo mucha oposición debido a la complejidad percibida introducida por este diseño y la opinión mayoritaria de que Ethereum no está listo para tanta complejidad.
Siguiendo el resurgimiento de Vitalik del tema después de The Merge, ERC-4337se propuso como una versión optativa del estándar de cuentas inteligentes, similar a la infraestructura PBS (Proposer-Builder Separation) para MEV (Maximal Extractable Value). Así, los usuarios que busquen acceder a los beneficios de las cuentas inteligentes podrían simplemente usar el conducto ERC-4337 para redefinir la lógica de su cuenta y las reglas de validez de las transacciones en estructuras denominadas UserOperation (o UserOps en resumen).
ERC 4337 aporta los beneficios de las cuentas inteligentes al Ethereum actual sin consagrar ninguna de las complejidades, al funcionar como una alternativa fuera del protocolo para las cuentas inteligentes consagradas. Sin embargo, esto no significa que la infraestructura sea óptima en su estado actual, ya que su propia complejidad sigue siendo un punto considerable de falla.
Para abordar esta complejidad,RIP 7560fue redactado como una versión consagrada de la infraestructura ERC 4337 en Ethereum y sus L2s, para que herede los esquemas de resistencia de síbil de la red en lugar de tener que definir un nuevo conjunto de reglas (como lo hace ERC 4337 conERC 7562.
En este informe, nos centraremos en explorar la programabilidad de EOA, evaluando los diversos EIP que describen soluciones en esta línea y discutiremos sus méritos y desventajas. En la Parte 2 y 3 de esta serie, cubriremos las otras dos clases de enfoque para la abstracción de cuentas que se están explorando dentro de Ethereum.
Para buscar lo que se puede abstraer, necesitamos una imagen (algo) completa del diseño de la cuenta actual. Esta sección servirá principalmente como una revisión de lo que son en realidad las cuentas en Ethereum, y cómo se validan y ejecutan sus transacciones.
Las cuentas de Ethereum son entidades con un saldo de ether (ETH) y la capacidad de enviar transacciones en la cadena de bloques de Ethereum. Se representan como una “dirección” hexadecimal de 42 caracteres, que sirve como un indicador único de las tenencias y transacciones de la cuenta.
Una dirección actúa como una clave en el estado de trie del blockchain. Los nodos hoja de este trie son estructuras de datos de cuenta que se pueden descomponer en cuatro campos:
El contenido de estos cuatro campos se utiliza para definir el tipo de cuenta y, en última instancia, para definir la extensión de sus funcionalidades. Así, los dos tipos de cuentas de Ethereum son:
Las EOAs tienen los campos codeHash y storageHash vacíos y solo pueden ser controladas por cualquier persona que posea las claves privadas. Sus direcciones se pueden obtener a partir de la clave pública correspondiente agregando “0x” a los últimos veinte caracteres del hash keccak-256 de la clave pública de la cuenta.
Sus transacciones son completamente basadas en pull y están basadas en la lógica de su código implementado.
Dado que estas cuentas solo pueden ser controladas por su contenido de código, no necesitan una clave privada y solo tienen una clave pública. Por lo tanto, cualquier agente que tenga la capacidad de actualizar/cambiar el contenido del código de una cuenta de contrato podría acceder a su saldo.
La dirección de una CA se deriva de la dirección de su creador y su nonce hasta el punto de implementación del contrato.
Transacciones
Recientemente describimos las cuentas como entidades que poseen la capacidad de enviar transacciones a través de Ethereum. Por lo tanto, podemos entender que un propósito principal de una cuenta es enviar y recibir transacciones, mientras que la cadena de bloques actúa como un libro mayor que registra el historial de transacciones y describe cómo las transacciones alteran los campos de la cuenta basándose en las reglas descritas en la especificación del protocolo de la cadena de bloques.
Entonces, ¿qué son estas ‘transacciones’?
Las transacciones son operaciones enviadas desde una cuenta, que causan un cambio en el “estado” de la red. Son instrucciones firmadas criptográficamente de las cuentas, que resultan en una actualización del estado en toda la red cuando se ejecutan.
La falta de permisos conlleva el costo de incentivos perversos, para hacer frente a estos, es necesario definir pautas estrictas (o reglas de validez) para las interacciones en tales entornos.
En este contexto, las transacciones deben seguir ciertas reglas de validez para considerarse válidas y ejecutadas. La mayoría de estas reglas de validez se implementan a través de restricciones colocadas en la cuenta que envía la transacción, y varían según el tipo de cuenta que sea.
En Ethereum, las EOAs están optimizadas para la usabilidad ya que están orientadas al usuario final. Tienen la capacidad de enviar transacciones de manera específica y operar perfectamente de forma autónoma. También se pueden crear localmente, siendo el método más común el uso de proveedores de carteras como MetaMask, Rainbow, Rabby, etc.
Por otro lado, las cuentas de contrato solo pueden enviar transacciones permitidas por su lógica, en respuesta a ser “llamadas”. Además, solo pueden ser creadas por un EOA que tenga un saldo suficiente para pagar su almacenamiento de estado.
Una descripción más avanzada sería que las EOAs solo pueden tener un saldo, mientras que las CAs pueden tener tanto un saldo como lógica que dicta cómo se puede gastar este saldo.
Estas propiedades se deben a los siguientes parámetros lógicos que definen las reglas a las que deben adherirse las transacciones de una cuenta:
Estos parámetros están diseñados para ser rígidos para las EOAs así:
Más generalmente, la lógica de ejecución de las EOAs las limita a una transacción por firma válida.
Por otro lado, las CA tienen más flexibilidad en torno a estos parámetros:
En la mayoría de los casos prácticos, la lógica utilizada en este caso es un esquema de firma múltiple que estipula que se requieren M de N firmas válidas (donde M
Al evaluar estas características, observamos que cada tipo de cuenta está diseñado para tener un equilibrio entre autonomía y programabilidad.
Las EOAs tienen plena autonomía pero una programabilidad limitada; pueden autorizar y enviar transacciones cuando lo deseen, pero estas transacciones deben seguir un formato rígido para considerarse válidas. Las CAs tienen plena programabilidad (limitada solo por el diseño del EVM) pero una autonomía limitada; sus transacciones no tienen que seguir ningún formato rígido, pero solo pueden ser enviadas debido a que su lógica es llamada primero.
En la siguiente subsección, estudiaremos las implicaciones de estas elecciones de diseño, con el fin de comprender completamente la propuesta de cada EIP discutido a lo largo de esta serie.
Ahora que tenemos un conocimiento algo sucinto de las funcionalidades de las diferentes cuentas, podemos identificar fácilmente sus puntos de venta, así como los problemas que presentan tanto para los usuarios como para los desarrolladores en Ethereum.
Como mencionamos anteriormente, las EOAs están diseñadas como cuentas de primera clase dirigidas a los usuarios finales. Las aplicaciones están diseñadas para interactuar fácilmente con ellas, casi no hay complejidad en ellas y, por supuesto, no hay costo por crear una. Sin embargo, su simplicidad conlleva una pérdida significativa de novedad, ya que están diseñadas para ser estrictamente deterministas.
Algunas de las preocupaciones en torno a ellos son:
No todos quieren (o podrían) mantener siempre ETH (quiero decir, mira esa acción del precio), así que las soluciones viables serían permitir múltiples monedas de gas (demasiado difícil, rompe demasiadas invariantes como se describe en la sección “Moneda”) o…aquí), o permitir que los pagos de gas sean liquidados por otra cuenta que no sea el origen de la transacción.
En el otro extremo del espectro de cuentas, las CAs apuntan a los desarrolladores y a una base de usuarios más técnica. Sirven como vehículos para contratos inteligentes (es decir, consideramos que los contratos inteligentes son su lógica contenida o contenido de código) y por lo tanto pueden implementar nuevos formatos de transacción habilitados por el EVM.
Sin embargo, todas estas características son cuentas de segunda clase glorificadas, ya que no tienen autonomía. Algunas de sus desventajas son las siguientes:
Habiendo revisado las decisiones de diseño que llevaron a los problemas definidos en esta subsección, ahora podemos proceder a evaluar las soluciones propuestas.
El concepto de abstracción de cuentas (a través de cuentas inteligentes al menos) siempre ha sido una parte integral del plan de Ethereum. Se dice que la complejidad que rodea su implementación amenazó con retrasar aún más el lanzamiento de Ethereum, por lo que se descartó para el diseño actual con diferentes cuentas que ofrecen diferentes funcionalidades. Se retrasó de nuevo por el enfoque de Ethereum en The Merge, y ahora está resurgiendo como parte principal de la próxima gran actualización de la red - Pectra. Sin embargo, su complejidad sigue siendo considerada una desventaja significativa que impide su consagración, especialmente porque Ethereum ha pivotado hacia un plan centrado en Rollup.
Los requisitos ahora son dos veces más.
Intuitivamente, este concepto desempeña un papel más importante en el contexto de la abstracción de cuentas y la interoperabilidad, sin embargo, nuestro alcance en todo este informe se limita a las iniciativas técnicas tomadas para lograr la abstracción de cuentas en sí misma.
La abstracción de cuentas tiene como objetivo combinar las mejores características de las EOAs y las CAs en un nuevo estándar de cuenta, las cuentas inteligentes, que permiten la separación total o parcial de las reglas de validez de cualquier cuenta en lógica de validación y ejecución; de modo que las cuentas puedan definir sus propias reglas de validez, según lo permitido por el EVM, al igual que las cuentas de contrato, manteniéndose totalmente autónomas al igual que las cuentas propiedad de manera externa.
A menudo hay confusión en torno a las diferencias entre las cuentas inteligentes y las carteras de contratos inteligentes, así que vamos a describir explícitamente cuáles son estas diferencias a continuación:
La comercialización de las carteras de contratos inteligentes facilitó la adopción de las AC por un mercado más amplio, lo que permitió que los usuarios menos técnicos aprovecharan las características que ofrecen. Sin embargo, todavía enfrentan las desventajas asociadas con las AC.
Volviendo a la conversación; anteriormente habíamos discutido los parámetros que se utilizan para definir las reglas de validez de las transacciones de las cuentas:
Los valores de los primeros cuatro parámetros pueden ser referidos colectivamente como la lógica de validación de una cuenta, que son comprobaciones que ocurren antes de que comience la ejecución de una transacción.
El último parámetro define cómo debe proceder la ejecución de la transacción.
En la introducción, proporcionamos una descripción general de alto nivel del panorama actual de AA en forma de una clasificación de los diversos diseños propuestos. Ahora nos centraremos en la primera clase de soluciones para el dilema de cuentas de Ethereum: la programabilidad de EOA.
El mayor atractivo de Ethereum es su ecosistema DeFi joven pero vibrante que presenta una variedad de aplicaciones descentralizadas que son sus principales sumideros de liquidez. La mayoría de estas DApps están optimizadas para servir a EOAs, por lo que son difíciles de interfacear con CAs y, eventualmente, cuentas inteligentes. Si bien las carteras de contratos inteligentes ayudan a las CAs en este caso, tienen sus propias limitaciones y una experiencia de usuario completamente diferente.
Una solución provisional que se está explorando mientras tanto que tanto las DApps como los proveedores de carteras se acostumbran al estándar de cuenta inteligente, es proporcionar mejoras temporales a las EOAs que les permitan superar la mayoría de las restricciones impuestas, ya sea su lógica de validación o ejecución.
A continuación, repasamos las especificaciones de tres EIP principales que proporcionan rutas accionables a la programabilidad de la EOA; desde el menos conocidoEIP 5806, para los ambiciosos EIP 3074y luego finalmente al victoriosoEIP 7702.
Esta propuesta busca llevar más funcionalidad al estándar EOA al permitirle realizar llamadas delegadas a la lógica de la cuenta del contrato (su contrato inteligente). Esto hace que el contrato inteligente se ejecute efectivamente en el contexto del EOA del llamante, es decir, el EOA sigue controlando su lógica de validación, mientras que su lógica de ejecución es manejada por la lógica correspondiente de la CA.
Antes de seguir adelante, hagamos un viaje por la memoria evolutiva de Ethereum hasta…EIP-7.
El EIP-7 propuso la creación del opcode 0xf4/DELEgateCALL, que se utiliza para enviar llamadas de mensaje a una cuenta primaria con la lógica de una cuenta secundaria, manteniendo los valores de los campos [sender] y [value] de la cuenta primaria.
En otras palabras, la cuenta principal “hereda” (o toma prestada si lo prefiere) la lógica de la cuenta secundaria durante algún tiempo especificado en la llamada al mensaje, de modo que la lógica de esta última se ejecuta en el contexto de la primera.
Este opcode permitió a los desarrolladores de dApp dividir la lógica de su aplicación en múltiples contratos inteligentes manteniendo la interdependencia, de modo que pudieran esquivar fácilmente las barreras de tamaño de código y barreras de gas.
Bien, entonces ¿qué llamadas de delegado permiten que los AC sean interdependientes? Bueno, EIP-5806 utiliza EIP-7 como inspiración para proponer la expansión de la funcionalidad de llamada de delegado también a las EOA; es decir, permitamos que las EOA también sean interdependientes con los AC, porque ¿por qué no?
EIP 5806 introduce una nueva compatible con EIP-2718tipo de transacción que se empaqueta de la siguiente manera:
rlp([chainID, nonce, max_priority_fee_per_gas, max_fee_per_gas, gas_limit, destination, data, access_list, signature_y_parity, signature_r, signature_s]).
Estas transacciones están diseñadas de manera que el campo [to], que representa la dirección del destinatario, solo puede aceptar direcciones como entradas de 20 bytes, lo que impide que el remitente utilice el opcode CREATE.
La motivación detrás de cada componente del esquema RLP es la siguiente:
Si bien el empaquetado de transacciones EIP-5806 en sobres EIP-2718 permite una gran compatibilidad hacia atrás, las EOAs no son equivalentes a las CAs. Por lo tanto, se deben definir ciertas restricciones en la forma en que una EOA utiliza las llamadas de delegado para evitar la ruptura de invariantes.
Estas restricciones están dirigidas a los siguientes opcodes:
La aplicabilidad principal de EIP 5806 es la abstracción de ejecución para EOAs. Permitir que los EOAs interactúen de manera confiable con contratos inteligentes más allá de simples llamadas a su lógica les otorga funciones como:
Los cambios propuestos por EIP-5806, si bien permiten características necesarias, no son particularmente novedosos; su existencia se basa principalmente en un EIP-7 ya funcional. Esto le permite evitar muchos obstáculos potenciales para su aceptación.
Una de las principales preocupaciones expresadas en sus primeros días fue el riesgo potencial de permitir que las Cuentas Externas Autónomas (EOAs) accedan al almacenamiento y lo modifiquen, al igual que las Cuentas Contrato Actuales (CAs) lo hacen actualmente. Esto rompe muchos invariantes consagrados en la red sobre cómo deben realizarse las transacciones con las EOAs, y por eso se abordó introduciendo las restricciones mencionadas en la subsección anterior.
Una segunda crítica (que es un arma de doble filo) es la simplicidad de EIP-5806; existe la sensación de que las recompensas debidas a la aceptación de EIP-5806 podrían no valer la pena, ya que solo permite la abstracción de la ejecución y no mucho más. Todas las demás restricciones de validez siguen estando definidas por la red para las EOA que optan por EIP-5806, a diferencia de otras EIP algo similares que analizamos en las siguientes subsecciones.
EIP-3074 propone permitir que las EOAs deleguen la mayor parte de su lógica de validación a cuentas de contrato especializadas, denominadas invocadores, superponiendo la lógica de autorización de estos últimos sobre la suya para formas específicas de transacciones.
Esto se logra firmando su política de acceso a un contrato invoker, que luego se convierte en responsable de definir la política de acceso de la EOA.
Esta EIP propone la adición de dos nuevas opcodes al EVM:
Estos dos códigos de operación permiten que una EOA delegue el control a una CA preestablecida y, por lo tanto, actúe como una sola a través de ella, sin tener que implementar un contrato e incurrir en los costos y externalidades asociados con eso.
EIP-3074 permite que las transacciones utilicen un formato de firma [MAGIC] para evitar colisiones con otros formatos de firma de transacciones. La cuenta activa a la que se pasan las instrucciones [AUTHCALL] se define como un campo de variable de contexto llamado [authorized], que solo persiste a través de una sola transacción y debe ser redefinido para cada nuevo [AUTHCALL].
Antes de abordar las complejidades de cada código de operación, estas son las entidades involucradas en una transacción EIP-3074:
Los contratos Invoker reciben mensajes [AUTH] con un valor [COMMIT] de [autoridad]; este valor define las restricciones que la cuenta desea imponer en la ejecución de las instrucciones [AUTHCALL] de [autorizado].
Por lo tanto, los invocadores son responsables de garantizar que el [contract_code] definido en una cuenta [autorizada] no sea malicioso y tenga la capacidad de satisfacer los invarianes establecidos por la cuenta de firma principal en un valor de [COMMIT].
El código de operación [AUTH] tiene tres entradas de elementos de pila; o más simplemente, se define por tres entradas que calculan una sola salida. Estos insumos son:
Los dos últimos inputs se utilizan para describir un rango de memoria modificable de 0 a 97, donde:
Las variables [yParity], [r] y [s] se interpretan colectivamente como una firma ECDSA, [magic], en la curva secp256k1 sobre el mensaje:
[keccak256 (MAGIC || chainID || nonce || dirección del invocador || CONFIRMACIÓN)]
dónde:
Si la firma calculada es válida y la dirección del firmante es igual a [authority], el campo [authorized] se actualiza con el valor proporcionado por [authority]. Si alguno de estos requisitos no se cumple, el campo [authorized] permanece sin cambios en su estado anterior o como un valor no establecido.
El costo de gas para este opcode se calcula como la suma de:
[AUTH] se implementa para no modificar la memoria y toma el valor de [authority] como argumento, por lo que es trivial verificar su valor a partir de la firma proporcionada.
El opcode [AUTHCALL] tiene siete elementos de pila de entrada que se utilizan para calcular un solo elemento de pila de salida.
Tiene la misma lógica que el opcode [CALL], es decir, se utiliza para enviar llamadas de mensaje a una cuenta y activar una lógica específica en sus contratos. La única desviación en su lógica es que [AUTHCALL] está diseñado para establecer el valor de [CALLER] antes de continuar con la ejecución.
Por lo tanto, [AUTHCALL] es utilizado por la [autoridad] para desencadenar un comportamiento específico del contexto en [autorizado] con comprobaciones lógicas que proceden de la siguiente manera:
El costo de gas para [AUTHCALL] se calcula como la suma de:
Se accede a los datos devueltos desde un [AUTHCALL] a través de:
Para unirlo todo con mucho menos de la jerga técnica; Las transacciones de Ethereum suelen especificar dos valores:
En EOAs, como se mencionó anteriormente, la autorización está estrechamente vinculada con la ejecución, es decir, (tx.origin == msg.sender). Esta invariante simple da lugar a la mayoría de los problemas que explicamos en la subsección ‘Cuentas y validez de transacciones’ de este informe.
Los mensajes de [AUTH] de [authority] le permiten compensar la función tx.origin a [authorized], mientras que sigue siendo el msg.sender. También le permite definir restricciones a este privilegio utilizando un valor [COMMIT].
[AUTHCALL] luego permite que [autorizado] acceda a la lógica de un contrato, utilizando un [invocador] como intermediario para asegurar que el contrato al que desea acceder sea inofensivo. Es decir, para cada [AUTHCALL], [autorizado] debe especificar un [invocador] en particular para su [COMMIT].
EIP 3074 es principalmente responsable de permitir que las EOAs deleguen su lógica de autorización a una cuenta diferente, sin embargo su diseño abierto permite mucho más en diferentes contextos.
Toda la lógica de validación de una EOA puede ser abstracta aplicando diversas restricciones/innovaciones al invocador según sea necesario, algunos de los diseños posibles basados en su lógica objetivo incluyen:
Además, la lógica de ejecución se abstrae de manera intuitiva; después de todo, el invocador (que es una CA) ahora es responsable de ejecutar las solicitudes de transacción en nombre del EOA.
Cotizandouno de sus autores: “No esperaría que las carteras expongan funcionalidades para firmar sobre invocadores arbitrarios …”. Quizás el mayor problema planteado por la iniciativa 3074 es que la innovación encima de ella tenderá muy fácilmente a flujos de acuerdos con permisos y propietarios; al igual que las iteraciones actuales de los mercados MEV y PBS de Ethereum.
Por defecto, los contratos invoker deben ser ampliamente auditados para evitar ataques aún peores que los que son actualmente posibles. Esto inevitablemente tenderá a un ecosistema donde solo se adoptarán un puñado de contratos invoker desarrollados por figuras influyentes como los predeterminados para los desarrolladores de billeteras. Por lo tanto, se reduce a un compromiso entre tomar el difícil camino descentralizado de auditar y respaldar constantemente los contratos invoker con el riesgo de seguridad de los usuarios; o simplemente adoptar contratos invoker de fuentes establecidas y reputadas con mejores garantías de seguridad para el usuario y menos supervisión sobre la seguridad del contrato.
Otro aspecto de este punto es la función de coste asociada con el diseño, la auditoría y la comercialización de un invocador funcional y seguro. Los equipos más pequeños casi siempre serán superados por organizaciones más grandes, especialmente en el ámbito de la comercialización, que ya tienen cierta reputación establecida, incluso si su producto es mejor.
EIP-3074 afianza el esquema de firma ECDSA, ya que todavía se considera más válido que el esquema de autorización introducido a través del invocador. Si bien hay argumentos de que la resistencia cuántica no es actualmente un problema definitivo, y que hay mucho peor en juego en un futuro donde ECDSA sea corruptible; el objetivo algo no declarado de Ethereum es siempre estar por delante de tales problemas. Potencialmente sacrificar la resistencia cuántica y a la censura por mejoras marginales en la experiencia de usuario puede que no sea la mejor de las elecciones en un futuro cercano.
Otro punto sobre el argumento de la compatibilidad hacia adelante es que mientras se evaluaban los beneficios de 3074, ERC-4337 (que no requiere cambios en el protocolo) ahora tiene un gran mercado, por lo que también debes ser compatible con él para evitar la compartimentalización de los ecosistemas.
Incluso con la hoja de ruta de abstracción de cuentas nativas, los opcodes [AUTH] y [AUTHCALL] eventualmente se volverían obsoletos en el EVM, introduciendo una gran cantidad de deuda técnica en Ethereum para ofrecer una cantidad marginal de mejora en la experiencia del usuario.
Después de enviar un mensaje [AUTH] y delegar el control, se espera que el EOA evite el esquema habitual de autorización de clave privada, ya que el envío de una transacción “normal” hace que se revoque la autorización que delegó a cada invocador.
Así, el esquema ECDSA sigue siendo estrictamente superior a cualquier otro esquema de autorización que los contratos asociados puedan habilitar, lo que significa que la pérdida de claves privadas resultaría en una pérdida total de los activos de la cuenta.
Esta propuesta inicialmente se planteó como una variación algo minimalista de EIP 3074, y era incluso significadoser una actualización de ella. Nació para abordar las supuestas ineficiencias de EIP 3074, especialmente las preocupaciones sobre su incompatibilidad con el ecosistema ya próspero 4337 y la propuesta nativa de abstracción de cuentas - RIP 7560.
Su enfoque es la adición de un nuevo tipo de transacción compatible con EIP 2718, [SET_CODE_TX_TYPE], que permite a un EOA comportarse como una cuenta inteligente para transacciones especificadas.
Este diseño permite las mismas características que EIP 5806 y algunas más, al tiempo que es compatible con la hoja de ruta de abstracción de cuentas nativas y las iniciativas existentes.
EIP-7702 permite a un EOA ‘importar’ el contenido del código de un contrato a través de una transacción compatible con [SET_CODE_TX_TYPE] 2718 del siguiente formato:
rlp([chain_id, nonce, max_priority_fee_per_gas, max_fee_per_gas, gas_limit, destination, value, data, access_list, authorization_list, signature_y_parity, signature_r, signature_s])
Esta carga es completamente similar a la de EIP 5806, excepto que introduce una “lista de autorización”. Esta lista es una secuencia ordenada de valores de formato:
[[chain_id, dirección, nonce, y_parity, r, s], …]
donde cada tupla define el valor de la [dirección].
Antes de continuar, las partes involucradas en un SET_CODE_TX_TYPE son:
Cuando [authority] firma un SET_CODE_TX_TYPE especificando [address], se crea un designador de delegación. Este es un “programa de punteros” que hace que todas las solicitudes de recuperación de código debidas a las acciones del [authority] en cualquier momento se canalicen al código observable de [address].
Para cada tupla [chain_id, dirección, nonce, y_parity, r, s], el flujo lógico de una transacción de tipo 7702 es el siguiente:
¡Uf! Para atar todo esto de vuelta; este EIP permite a las EOAs enviar transacciones que establecen un puntero al código de un contrato, lo que les permite implementar esta lógica como propia en transacciones posteriores. De esta manera, es estrictamente más fuerte que el EIP 5806, porque permite a las EOAs tener realmente contenido de código todo el tiempo que deseen (en lugar de EIP 5806 que simplemente permite a las EOAs enviar llamadas delegadas).
Si bien se podría argumentar que ya no es una abstracción, ya que el EOA recibe activamente la lógica que desea ejecutar, aún no es el “propietario principal” de dicha lógica. Además, no contiene directamente la lógica, simplemente especifica un puntero a la lógica (para reducir la complejidad computacional). ¡Así que vamos con la abstracción de ejecución!
Si bien se rompe la invariante require (msg.sender == tx.origin) para permitir el patrocinio propio, el EIP todavía permite la integración de relevo de transacciones patrocinadas. Sin embargo, la advertencia es que dichos relevos necesitan un sistema basado en reputación o participación para prevenir ataques de sabotaje.
Las EOAs solo pueden apuntar a una porción específica del código de la cuenta, de modo que solo la lógica de esa porción es ejecutable en su contexto.
Esto también permite la existencia de subclaves que a su vez permiten la “desescalada de privilegios”, de modo que aplicaciones descentralizadas específicas solo tengan acceso al saldo de una cuenta en condiciones específicas. Por ejemplo, podría imaginarse un permiso para gastar tokens ERC-20 pero no ETH, o para gastar hasta el 1% del saldo total por día, o interactuar solo con aplicaciones específicas.
Debido a su naturaleza no restrictiva, una transacción EIP-7702 podría permitir a un usuario acceder al código de operación CREATE2 y usarlo para implementar el código de bytes en una dirección sin ningún otro parámetro restrictivo, como la lógica del mercado de tarifas (por ejemplo, EIP-1559 y EIP-4844). Esto permite que la dirección se recupere y se utilice en varias máquinas de estado, con el mismo código de bytes, donde su cuenta en cada cadena es responsable de definir los otros parámetros de variables de contexto.
Si bien EIP-7702 es todavía muy reciente, ya ha habido mucho prototipado y pruebas para sus dependencias y posibles desventajas, pero su modelo minimalista garantiza mucha flexibilidad, y por lo tanto utilidad, en diferentes contextos. Sin embargo, rompe demasiadas invariancias y no es inmediatamente compatible con versiones anteriores.
Parte de su lógica incluye:
La mayoría de los usuarios no están al tanto del contenido real de una cuenta (¡ni siquiera de la diferencia entre una cuenta y una dirección!), lo que significa que permitir colisiones de direcciones significa que un EOA podría hacerse pasar por una CA y atraer fondos de usuario en un largo proceso para finalmente robar todo. EIP-3607 aborda esto al estipular que las cuentas que contienen código no deberían poder gastar su saldo utilizando su propia lógica de autorización. Sin embargo, EIP 7702 rompe esta invariante para permitir que los EOAs sigan siendo autónomos incluso después de adquirir cierta programabilidad.
Firmar la dirección de una cuenta en lugar de su contenido de código es básicamente como el esquema 3074 con invocadores. No proporciona garantías estrictas sobre la consistencia del contenido del código entre cadenas, ya que una dirección podría adoptar un contenido de código diferente en diferentes cadenas. Esto significa que una dirección cuyo contenido de código contiene la misma lógica en una cadena podría ser depredadora o completamente maliciosa en otra cadena, y esto podría llevar a la pérdida de fondos de usuario.
Las EOAs en su forma actual están muy limitadas, ya que no permiten a los usuarios aprovechar las características de programabilidad ofrecidas por el EVM. Si bien hay varios caminos para mejorar las cuentas, como mencionamos al principio de este informe, la solución elegida debe mantener los principios de custodia propia segura y protegida. Además, las actualizaciones de las EOA pueden tener un impacto significativo tanto en la experiencia del usuario como en los desarrolladores de aplicaciones, por lo que se deben considerar todas las opiniones de las partes interesadas.
Permitir que las EOAs ejecuten código de cualquier manera amplía enormemente la funcionalidad de las cuentas, pero esta nueva expresividad conlleva riesgos significativos y posibles inconvenientes. Resolver estos compromisos es fundamental para ofrecer una actualización con beneficios de UX indiscutibles para los usuarios de Ethereum.
La cultura de discusión abierta de Ethereum lo convierte en un gran campo de pruebas para tales innovaciones, ya que casi todas las implicaciones de cada diseño son minuciosamente analizadas por expertos en la materia. Esta consideración integral debería ayudar a mitigar los riesgos de mala praxis por parte de adversarios.
EIP-7702 es actualmente el niño mimado de los mecanismos que buscan llevar la programabilidad de EVM a las EOAs, habiendo sido marcado como un reemplazo para el espacio en blanco de EIP 3074 en la actualización Pectra. Hereda el diseño abierto del mecanismo 3074 mientras reduce en gran medida la superficie de ataque/riesgos. También permite mucho más al evitar las restricciones de 3074 a ciertas clases de opcodes.
Si bien todavía se están realizando algunos refinamientos en el diseño de la propuesta, ya ha obtenido mucho apoyo y respaldo de los desarrolladores, especialmente porque Vitalik lo respalda directamente.
Dentro de la comunidad hay afirmaciones de que este enfoque de abstracción de cuentas podría ser incluso mejor que las cuentas inteligentes. Este comentario enfatiza que este enfoque requiere menos cambios y no es tan complejo, y que las EOA ya están consagradas. Sin embargo, debemos recordar el hito de seguridad futura de resistencia cuántica en cada nivel de la red Ethereum. Esta seguridad cuántica es inviable con el modelo de cuenta actual debido a la utilización de esquemas de firma basados en ECDSA para la autorización de EOA.
Así, la programabilidad de las EOA debe considerarse como un paso en el camino hacia las cuentas inteligentes y no como el destino. Potencia las EOA y permite una mejor experiencia para el usuario y el desarrollador, al tiempo que se mantiene compatible con el objetivo último de abstracción de cuentas de las cuentas inteligentes.
En nuestro próximo informe, nos sumergiremos en los esquemas de migración de EOA para ver qué tan bien se ajustan en el camino de la abstracción de cuentas, ¡manténgase atento!