Firmas dummy y transferencias de gas tokens en ERC-4337
Autores: Dan Coombs, David Philipson
En ERC-4337 Gas Estimation hablamos sobre cómo funciona el gas en ERC-4337 y nuestro método para la estimación de gas. Con este método, deberíamos poder proporcionar a los usuarios valores precisos para enviar sus user operations. Sin embargo, no siempre es tan simple.
Veamos algunos otros problemas que complican la estimación de gas en ERC-4337.
¿Qué son los valores dummy de signature?
En la mayoría de las implementaciones de smart contract accounts, el campo signature se calcula off-chain hasheando una user operation y firmando ese hash usando algún esquema de firma (siendo ECDSA el más popular). Esta firma se verifica onchain por el contrato de la account durante la fase de verificación.
Por ejemplo, SimpleAccount usa un esquema de firma EIP-191 sobre el hash que se valida onchain durante su función validateUserOp usando la librería ECDSA de OpenZeppelin.
Esta firma debe calcularse después de estimar el gas, ya que esos campos están incluidos en el hash.
Sin embargo, hay partes del paso de estimación de gas que requieren que el campo signature esté completo: preVerificationGas y verificationGasLimit .
preVerificationGas
En la sección sobre la estimación de preVerificationGas en la primera parte de esta serie, hablamos de tres cálculos que usa el bundler para contabilizar el gas no medido.
Nótese que los pasos 2 y 3 (calcular la parte del costo de gas de calldata que corresponde a la user op y la parte del overhead de gas de ejecución que corresponde a la user op) dependen directamente de la longitud y el contenido de una user operation, incluyendo el campo signature.
verificationGasLimit
Casi todas las implementaciones útiles de smart contract accounts requerirán algún tipo de verificación de firma. ¡Este gas debe estimarse! Este proceso de estimación no puede revertir, o de lo contrario no se podría implementar el verification gas.
¿Cómo elegimos qué firma usar?
Cómo calcular valores dummy signature
Para resolver estos problemas, muchos bundlers de ERC-4337 usan una "Dummy Signature" que debe ser proporcionada por quien llama a eth\_estimateUserOperationGas según el tipo específico de account.
Restricciones
Esta dummy signature tiene algunas restricciones:
- La longitud del valor dummy debe ser igual a la longitud máxima de la signature y debe contener el número máximo de bytes distintos de cero válidos para la account.
a. Esto asegura que los cálculos de
preVerificationGaspuedan contabilizar la contribución de la signature en el peor caso a los costos de overhead de calldata y del entry point. - El valor dummy debe, al proporcionarse a la función de validación de la account, provocar el uso de gas en el peor caso y no debe provocar un revert.
- El valor dummy no debe ser una signature válida para ninguna user operation válida.
Puede encontrarse un valor dummy signature para SimpleAccount en nuestra documentación del método eth_estimateUserOperationGas.
Esta dummy signature tiene las siguientes propiedades:
- Tiene la longitud exacta de una signature ECDSA
- Tiene el número máximo de bytes distintos de cero permitidos en una signature ECDSA
- Es una signature ECDSA válida (para que la llamada
.recover\(\)no revierta) - No es una signature para ninguna user operation conocida, así que
SimpleAccountsiempre devolveráSIG\_VALIDATION\_FAILED
Los implementadores de accounts deben asegurarse de escribir sus funciones de validación de manera que sea posible proporcionar una dummy signature.
Esto significa:
- Usar
REVERTúnicamente en signatures que no puedan ser la dummy signature. DevolverSIG\_VALIDATION\_FAILEDcuando se proporcione la dummy signature. - Tener cuidado de no hacer "short-circuit" del fallo para la dummy signature. Es decir, el valor dummy debe recorrer toda la función de validación y usar la cantidad máxima de gas.
- En la práctica, esto significa eliminar cualquier retorno anticipado. Una función de validación de account puede determinar tempranamente que la signature es inválida, pero debe seguir ejecutando la lógica de la función y devolver el fallo al final.
Cómo calcular valores dummy de paymasterAndData
Los mismos requisitos anteriores aplican al campo paymasterAndData durante la estimación de gas: para cualquier implementación de paymaster que dependa de los valores de los campos de gas (por ejemplo, para calcular una signature), debemos resolver el mismo problema de proporcionar un valor dummy.
Restricciones
Este paymasterAndData dummy tiene algunas restricciones:
- La longitud del valor dummy debe ser igual a la longitud máxima de
paymasterAndDatay debe contener el número máximo de bytes distintos de cero válidos para la account. a. Esto asegura que los cálculos depreVerificationGaspuedan contabilizar la contribución depaymasterAndDataen el peor caso a los costos de overhead de calldata y del entry point. - El valor dummy debe, al proporcionarse a la función de validación del paymaster, provocar el uso de gas en el peor caso y no debe provocar un revert.
- El valor dummy no debe ser un
paymasterAndDataválido para ninguna user operation válida.
Por ejemplo, un sponsoring paymaster que depende de la verificación de una signature de patrocinio sobre el hash de la user operation necesitará proporcionar un valor dummy de paymasterAndData durante la estimación con propiedades similares a las descritas anteriormente:
- El valor dummy debe contener una dirección de contrato de paymaster válida
- Longitud máxima y valores de byte máximos para los cálculos de
preVerificationGas - Al proporcionarse a la función de validación del paymaster, debe consumir el máximo de gas y resultar en un valor de retorno
SIG\_VALIDATION\_FAILED
Los implementadores de paymasters deben asegurarse de escribir sus funciones de validación de manera que sea posible proporcionar un paymasterAndData dummy.
Esto significa:
- Usar
revertúnicamente en datos que no puedan formar parte del dummy. DevolverSIG\_VALIDATION\_FAILEDen su lugar. - Tener cuidado de no hacer "short-circuit" del fallo para el dummy. Es decir, el dummy debe recorrer toda la función de validación y usar la cantidad máxima de gas. a. En la práctica, esto significa eliminar cualquier retorno anticipado. Una función de validación de paymaster puede determinar tempranamente que la signature es inválida, pero debe seguir ejecutando la lógica de la función y devolver el fallo al final.
Transferencias de gas token
La estimación de verificationGasLimit debe tener en cuenta el costo de gas de cualquier transferencia de tokens durante la fase de validación. Muchas user ops implican una transferencia de tokens durante la validación para pagar el gas por adelantado, con un reembolso al final de la operación por cualquier gas que no se haya consumido.
Hay dos casos:
- Sin Paymaster: esta es una transferencia de ETH del sender al contrato entry point.
- Con un Paymaster: esto puede ser cualquier cosa (dentro de las reglas permitidas por la especificación), pero a menudo toma la forma de una transferencia de token ERC-20 del sender al paymaster.
¿Qué sucede si la account no tiene fondos suficientes?
Si maxFeePerGas se establece con un valor distinto de cero, la transferencia durante la validación revertirá si la account no tiene suficientes tokens para pagar la fee. Esto significa que los usuarios deben fondear sus accounts antes de intentar estimar el gas.
Un flujo de trabajo deseado que actualmente no es posible:
- Estimar el gas
- Fondear la account para el gas
- Enviar la operación
Una posible solución aquí es indicarle al usuario que deje maxFeePerGas sin establecer, o en cero, al llamar a eth\_estimateUserOperationGas. Sin embargo, esto hará que el costo de gas sea cero y, por lo tanto, un valor de cero para cualquier transferencia de token que deba ocurrir. En muchos tipos de account/paymaster, un costo de gas de cero omitirá la llamada a transfer. Esto lleva a una subestimación de gas cuando se usa un maxFeePerGas igual a cero.
Otro problema tiene que ver con usar un maxFeePerGas distinto de cero e intentar el enfoque de estimación por búsqueda binaria definido en "Attempt 3: Binary Search", de la primera parte de esta serie.
El primer paso en ese enfoque es asegurarse de que la operación sea posible usando un valor de gas máximo. El sender puede no tener suficientes activos para pagar el gas en ese valor máximo, y el bundler no siempre tiene suficiente información para determinar el balance del fee token (por ejemplo, en el caso de un paymaster ERC-20) y así determinar el límite superior correcto.
¿Cómo resuelve el bundler de Alchemy la estimación de gas con la transferencia de tokens?
El enfoque adoptado por Rundler para eth\_estimateUserOperationGas es el siguiente:
Caso sin paymaster
- Rundler siempre ignorará
maxFeePerGasymaxPriorityFeePerGasy los establecerá en 0. - Rundler siempre añadirá un valor estático de 10K de gas a
verificationGasLimitpara contabilizar la transferencia del depósito de ETH del sender al entry point. - No se requieren cambios del lado del cliente.
💡 El punto #1 es una desviación de la especificación ERC-4337, que establece que "los parámetros de límites de gas (y precios) son opcionales, pero se usan si se especifican"
Caso con paymaster
- Rundler siempre ignorará
maxFeePerGasymaxPriorityFeePerGasy los establecerá en 0. - El
verificationGasLimitde Rundler siempre se subestimará si alguna lógica del paymaster depende del valor de la fee (como sería el caso de una transferencia ERC-20) - Los usuarios de estos paymasters deben contabilizar del lado del cliente cualquier gas adicional que se genere por una fee distinta de cero.
Por ejemplo, si se usa un paymaster ERC-20 que realiza una transferencia durante la fase de validación, siempre hay que añadir un valor estático de 75K de gas al valor de retorno de verificationGasLimit de eth\_estimateUserOperationGas. Esto requiere que los clientes conozcan el contrato de paymaster al que están llamando y tengan conocimiento previo de los costos de gas subestimados debido a las transferencias.
💡 El aa-sdk de Alchemy permite que el middleware del paymaster modifique este límite de gas en consecuencia.
¿Qué significa esto para los desarrolladores?
Los valores dummy y el problema de la transferencia de tokens afectan a los desarrolladores que construyen smart contract accounts, paymasters y account clients.
Desarrolladores de smart contract accounts
Los desarrolladores de smart contract accounts deben asegurarse de que siempre sea posible determinar un valor de dummy signature del lado del cliente, según cómo vaya a ejecutarse la función de validación de la account. Esta signature no debe provocar un revert y debe resultar en una estimación de gas máxima.
Desarrolladores de paymasters
Los desarrolladores de paymasters deben asegurarse de que siempre sea posible determinar un valor dummy de paymasterAndData según cómo vaya a ejecutarse la función de validación del paymaster. Este valor no debe provocar un revert y debe resultar en una estimación de gas máxima.
💡 Alchemy simplifica esto para los usuarios en su sponsoring paymaster combinando el proceso de estimación de gas y el proceso de simulación mediante alchemy_requestGasAndPaymasterAndData
Desarrolladores de account clients
Los desarrolladores de account clients que se integran con un paymaster que realiza transferencias durante la fase de validación (o cualquier otra lógica basada en el valor de la fee), y que usan los endpoints de Alchemy para la estimación, deben añadir cualquier gas potencial asociado con la transferencia al verificationGasLimit devuelto por la estimación.
¡Estén atentos a una próxima publicación que describirá más complicaciones de la estimación de gas en ERC-4337!
🦀
Continuar leyendo
Los siguientes artículos de esta serie de 4 partes exploran los desafíos de estimar el gas en blockchains de layer 2 como Optimism y Arbitrum, y los signature aggregators.
La serie concluye con un recorrido por el proceso de estimación de la fee de las user operations. Si te perdiste la primera parte, ¡aprende cómo funciona la estimación de gas en ERC-4337!
Boletín de Alchemy
Entérate primero de los lanzamientos
Suscríbete a nuestro boletín
Recibe las últimas actualizaciones de productos y recursos de Alchemy
Al ingresar tu correo electrónico, aceptas recibir nuestras comunicaciones de marketing y actualizaciones de productos. Reconoces que Alchemy procesa la información que recibimos de acuerdo con nuestro Aviso de Privacidad. Puedes cancelar tu suscripción en cualquier momento.
Artículos relacionados

Glamsterdam: la guía completa para desarrolladores de Ethereum
Glamsterdam ya está en Sepolia. La guía completa sobre lo que significa para los desarrolladores y cómo Alchemy se preparó para la actualización de la red.

Por qué los equipos de trading eligen Alchemy para RPC de baja latencia
Los equipos de trading eligen Alchemy por lecturas y escrituras de baja latencia cuando el mercado se mueve, y un registro confiable cuando el dinero se liquida, incluso en el volumen pico.

¿Con qué proveedor de RPC deberías construir en Tokio?
Comparamos cinco de los proveedores de RPC que sirven Tokio en cinco cadenas. Así se comparan, y dónde importan las diferencias para los equipos sensibles a la latencia.