Datos tipados verificados y mensajes de firma validados en cadena
Cómo realizar la verificación de firmas de mensajes en cadena y para contratos de wallet no desplegados, para asegurar la integridad de los datos en una blockchain por parte de los firmantes
Tiempo estimado: 10-20 minutos
En esta guía le mostraremos cómo usar el código fuente proporcionado para un contrato basado en EVM y explicaremos el funcionamiento interno de un contrato verificador de mensajes personalizado en cadena que compone el Universal Signature Validator (ERC-6492), y cómo realizar la verificación de firmas en la aplicación usando datos tipados.
Esto se puede lograr en 6 pasos:
- Cree un proyecto en Builder y obtenga una clave de acceso
- Inicialice una aplicación React Vite
- Use Sequence Wallet para el inicio de sesión del usuario
- Utilice datos tipados EIP712 para generar firmas EIP6492
- Implemente el contrato para verificación EIP712 y validación EIP1271
- Renderice la respuesta del contrato de verificación y validación
El flujo general de esta aplicación se puede ver en el siguiente diagrama de secuencia:
Consulte el código completo del demo para más información y un ejemplo de demo aquí.
1. Cree un proyecto en Builder y obtenga una clave de acceso
Primero, siga esta guía para crear un proyecto en Sequence Builder y obtener una clave de acceso para el proyecto.
2. Inicialice una aplicación React Vite
A continuación, comience inicializando un nuevo proyecto que contendrá todo el código necesario para generar firmas y respuestas de validación desde la blockchain:
Esto debería crear un proyecto en blanco al que puede empezar a agregar elementos y lógica.
3. Use Sequence Wallet para el inicio de sesión del usuario
Instale los paquetes necesarios para que el proyecto funcione:
Luego, permita que un usuario inicie sesión en la red seleccionada y con la clave de acceso del proyecto obtenida en el paso 1.
4. Utilice datos tipados EIP712 para generar firmas EIP6492
A continuación, definiremos un dato tipado personalizado en TypeScript y, usando la biblioteca de utilidades de Sequence, construiremos un tipo TypedData
, donde verificaremos una estructura de mensaje con los parámetros name
, wallet
y message
:
En este ejemplo, VERIFYING_CONTRACT_ADDRESS
es el smart contract que desplegamos en sepolia
, pero en el siguiente paso le mostraremos qué hace este contrato para que pueda desplegarlo usted mismo en cualquier red:
Luego, firmaremos el objeto de mensaje tipado con las distintas propiedades referenciadas:
Perfecto, asocie la función a un botón y observe cómo se genera la firma después de que el usuario haga clic en el botón:
5. Despliegue el contrato para verificación EIP712 y validación EIP1271
Ahora le proporcionaremos el código fuente que puede utilizar en herramientas como Remix para desplegar un contrato, o incluso algo como Foundry para construir y desplegar con el Sequence Builder
Universal Signature Validator
El Universal Signature Validator puede, en teoría, desplegarse una sola vez para una red específica y compartirse entre muchas aplicaciones, lo que lo hace componible y reutilizable. Se utiliza tanto para wallets inteligentes off-chain como on-chain compatibles con EIP6492.
Puede encontrar el código fuente aquí para desplegarlo.
Verificador de contrato personalizado
El siguiente contrato lo explicaremos más en detalle junto con sus distintas funciones, ya que puede personalizarse para la aplicación específica. Comience con lo básico, pasando el Universal Signature Validator en el constructor en el primer paso:
Verificar firma
A continuación, tenemos la función de verificación de firma que tanto crea el hash del mensaje como valida al firmante:
Digest personalizado de persona
En la siguiente función, recreamos el hash de la estructura con los parámetros recibidos, los cuales pueden ampliarse para incluir más o menos parámetros de distintos tipos:
Para más información sobre cómo construir el digest, consulte la especificación EIP712.
Validar firmante
A continuación, validamos la dirección del signer
, el digest
y la signature
. Si se ha proporcionado una firma EIP6492, usamos el Universal Signature Validator; de lo contrario, verificamos la firma EIP1271 directamente:
Ya está listo para desplegar ambos contratos, asegúrese de elegir su red.
6. Renderice la respuesta del contrato de verificación y validación
Pasamos las firmas y llamamos al contrato desplegado usando ethers
con el PROJECT_ACCESS_KEY
en los siguientes pasos:
Cree un provider
Cree un provider usando la clave de acceso del proyecto:
Inicialice un contrato de Ethers
Importe el ABI generado en el paso 5 (o cópielo del código fuente en git), incluya el provider e ingrese la dirección del contrato verificador:
Llamada estática a la función de verificación de firma
Al realizar una llamada estática a la función, simulamos la transacción sin enviarla en cadena. Esto devuelve un resultado que especifica si la validación fue verdadera o falsa:
Conclusión
Ahora que tenemos estructuras de mensajes enviadas a la blockchain y mensajes verificados con sus entradas, podemos ampliar la aplicación a muchos casos de uso que aseguren que los usuarios firman la información correcta (por ejemplo, permitir gastar ERC20, realizar ofertas fuera de cadena, códigos QR que contienen firmas aprobadas para minteo, etc.).