¡Entiende las Attestations! Guía definitiva📚
Published: 2024-01-30 00:40:05

---
title: ¡Entiende las Attestations! Guía definitiva📚
published: true
description: 
tags: 
cover_image: https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3l05zpen41ecd4zl8qv7.png
# Use a ratio of 100:42 for best results.
# published_at: 2024-01-19 00:11 +0000
---

Esta es la guía definitiva sobre attestations. ¿Qué son? ¿Para qué sirven? ¿Importan?  Vamos a ir de 0 a 100% con ejemplos prácticos y de actualidad para usuarios y desarrolladores. ¿Por qué estoy haciendo este artículo? Pienso que no son una moda, que serán una parte fundamental de web3 en áreas como gobernanza, DeFi, protección contra problemas de IA, entre otros. Además, en los últimos meses he tenido contacto directo con los creadores de EAS para entender más a profunidad este tema. Así que les invito a leer el artículo hasta el final donde voy a estar compartiendo tips avanzados.

## Primeros casos de uso

EAS ya lanzó en Ethereum Mainnet y también en varias L2 como Optimism, Arbitrum, Scroll, Base y Línea. Aunque EAS es un proyecto bastante reciente,  tenemos un par de aplicaciones que ya lanzaron o están próximas a lanzar. La que más me ha llamado la atención es la integración de [gitcoin passport](https://passport.gitcoin.co/) que ayudará a simplificar el proceso por medio del cual demostrás tu prueba de humanidad. Otro caso de uso que me parece muy interesante es cómo EAS puede ayudar a Coinbase a cumplir con la complejidad de la regulación en Estados Unidos por medio de [verificación on chain en Base](https://help.coinbase.com/en/coinbase/getting-started/verify-my-account/onchain-verification). Y moviéndonos un poco del tema de identad, tenemos a Optimism RPGF que uso EAS para registrar a los [Badge Holders](https://optimism.easscan.org/attestations/forSchema/0xfdcfdad2dbe7489e0ce56b260348b7f14e8365a8a325aef9834818c00d46b31b?page=4&limit=50), [aplicaciones](https://optimism.easscan.org/schema/view/0x76e98cce95f3ba992c2ee25cef25f756495147608a3da3aa2e5ca43109fe77cc) y más. Me encanta este ejemplo porque yo participé en la RPGF y ni me dí cuenta que lo estaba usando.

## Casos de uso en el futuro

Te comparto a continuación los casos de uso que me parecen más relevantes a continuación

- Proof of trade, esto para construir reputación on-chain y abrir posibilidad de préstamos sin colateral o acceso a diferentes tipos de derivados
- Legaltech, RWA, firmas de intención, anteriormente trabajé en legaltech en web2 y veo cómo EAS puede mejorar el estándar de validez y respaldo de todo tipo de documentos legales
- Grafos de identidad descentralizada, pruebas de reputación, mecanismos anti sybil
- Prueba de humanidad, diferenciación entre AI y humanos, pruebas anti deepfake

Estos son mis casos de uso favoritos, para mas casos de uso consulta [esta lista oficial de ideas](https://docs.attest.sh/docs/category/example-use-cases).

## Creemos una attestation desde el website

Puedes crear una attestation en base a un schema ya existente o crear el tuyo propio. Los schemas son el formato de en el que se realizarán las attestations y en este caso usaremos el schema [Is Human](https://scroll-sepolia.easscan.org/attestation/attestWithSchema/0x8af15e65888f2e3b487e536a4922e277dcfe85b4b18187b0cf9afdb802ba6bb6) para attestar que el dueño de cierto address es humano. Para este ejemplo solo necesitas colocar tu billetera de [Metamask](https://metamask.io/) (o cualquier wallet) en Scroll Sepolia, luego colocar el address al que le quieres hacer una attestation y hacer click en `Make attestation`. Puedes elegir si deseas la attestation off-chain, o sea gratis, que puedes obtener únicamente firmando una transacción. O alternativamente puedes elegir hacerla on-chain y pagar por la transacción para que quede pública y además la puedas conectar a lógica de smart contracts. En este caso necesitarás obtener fondos en Scroll Sepolia a través de una [Scroll Sepolia Faucet](https://docs.scroll.io/en/user-guide/faucet/)

![How to make an Attestation Using EAS Scan easscan](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/r2wr6i2wmqrprdp2wcu5.png)

## Ejemplo avanzado: Attestaciones de Swap

Este contrato hace un attestations de swaps de `WETH` a `GHO` en Uni V3 en Scroll Sepolia. Es un ejemplo que te puede ayudar a entender cómo integrar EAS en cualquier protocolo de manera autónoma, todo a través de Smart Contracts. Para probarlo, puedes lanzar este contracto y llamar la función `swap()` pasando como parámentro la cantidad de `WETH` que deseas cambiar. Luego puedes ver en el schema correspondiente en [EAS Scan](https://scroll-sepolia.easscan.org/schema/view/0x5312f94781cdc373a4f16ddb71e8aee048bc0e3fac0819ca0258cc170c646a1d) tu attestation. Recuerda que debes tener `WETH` de antemano, puedes obtenerlo mediante la función `deposit()` [aquí](https://sepolia.scrollscan.dev/address/0x5300000000000000000000000000000000000004#writeContract).


```javascript
// SPDX-License-Identifier: MIT

pragma solidity 0.8.23;

import { IEAS, AttestationRequest, AttestationRequestData, RevocationRequest, RevocationRequestData } from "@ethereum-attestation-service/eas-contracts/contracts/IEAS.sol";
import { NO_EXPIRATION_TIME, EMPTY_UID } from "@ethereum-attestation-service/eas-contracts/contracts/Common.sol";

struct ExactInputSingleParams {
    address tokenIn;
    address tokenOut;
    uint24 fee;
    address recipient;
    uint amountIn;
    uint amountOutMinimum;
    uint160 sqrtPriceLimitX96;
}

interface IUniswapV3Router {
    function exactInputSingle(
        ExactInputSingleParams calldata params
    ) external payable returns (uint amountOut);
}

interface IERC20 {
    function totalSupply() external view returns (uint256);
    function balanceOf(address account) external view returns (uint256);
    function transfer(address to, uint256 value) external returns (bool);
    function allowance(address owner, address spender) external view returns (uint256);
    function approve(address spender, uint256 value) external returns (bool);
    function transferFrom(address from, address to, uint256 value) external returns (bool);
}

contract SwapAttestation
{
    address WETH = 0x5300000000000000000000000000000000000004;
    address GHO  = 0xD9692f1748aFEe00FACE2da35242417dd05a8615;
    address uniswapRouter = 0x17AFD0263D6909Ba1F9a8EAC697f76532365Fb95;
    uint24 poolFee = 500;// 100 500 3000 10000
    address easAddress = 0xaEF4103A04090071165F78D45D83A0C0782c2B2a;
    bytes32 schema = 0x5312f94781cdc373a4f16ddb71e8aee048bc0e3fac0819ca0258cc170c646a1d;

    function swap(uint amountIn) public
    {
        IERC20(WETH).transferFrom(msg.sender, address(this), amountIn);
        IERC20(WETH).approve(uniswapRouter, amountIn);
        ExactInputSingleParams memory params =
            ExactInputSingleParams({
                tokenIn: WETH,
                tokenOut: GHO,
                fee: poolFee,
                recipient: msg.sender,
                amountIn: amountIn,
                amountOutMinimum: 0,
                sqrtPriceLimitX96: 0
            }
        );
        uint amountOut = IUniswapV3Router(uniswapRouter).exactInputSingle(params);

        IEAS(easAddress).attest(
                AttestationRequest({
                    schema: schema,
                    data: AttestationRequestData({
                        recipient: msg.sender,
                        expirationTime: NO_EXPIRATION_TIME,
                        revocable: false,
                        refUID: EMPTY_UID,
                        data: abi.encode(WETH, GHO, amountIn, amountOut),
                        value: 0 // No value/ETH
                    })
                })
            );
    }
}
```

## ¿Qué más puedo hacer con las Attestations?

Ahora que ya experimentamos las attestations, exploremos las posibilidades que nos ofrece EAS con ejemplos.

- Puedes crear schemas desde [el código](https://github.com/Turupawn/ContributionsNFTsAPI/blob/master/contracts/ContributionsNFT.sol#L91) o desde [EAS Scan](https://easscan.org/schema/create).
- Puedes hacer [attestation revocables](https://github.com/ethereum-attestation-service/eas-contracts-example/blob/master/contracts/Attester.sol#L50).
- Puedes colocar callbacks para ejecutar cualquier código luego de cada attestation por medio de [Resolvers](https://github.com/ethereum-attestation-service/eas-contracts-example/blob/master/contracts/LogResolver.sol). Esto puede ayudar a automatizar tareas y a conectar EAS con el resto de ecosistema de Smart Contracts.
- Puedes hacer attestation [expirables](https://github.com/ethereum-attestation-service/eas-contracts-example/blob/master/contracts/Attester.sol#L37).
- Puedes verificar attestations [gratis y offchain](https://github.com/ethereum-attestation-service/eas-contracts-example/blob/master/contracts/OffchainAttestationVerifier.sol).

## Herramientas interesantes para desarrollar attestation

- [Attestations privadas](https://docs.attest.sh/docs/tutorials/private-data-attestations), hacemos una attestation a un merkle root manteniendo encriptada la información almacenada en los nodos hoja.
- Verficación de firmas de Account Abstraction [usando el EIP 1271](https://ethdaily.io/coinbase-verifications-powered-by-eas/).
- [Indexador](https://github.com/ethereum-attestation-service/eas-indexing-service) opensource.
- [Metamask Snap](https://snaps.metamask.io/snap/npm/ethereum-attestation-service/eas-metamask-snap/) que permite a los usuarios decodificar los mensajes que están firmando para una mejor UX.

## Antes de diseñar tus attestations asegúrate de esto

Recientemente mientras diseñaba mis attestations tuve la oportunidad de platicar con el equipo de desarrollo de EAS. Yo les mostré un diseño de un schema muy similar a este a continuación, sobre attestations de ratings de libros.

- Book Rating Schema
    - Book name
    - Author name
    - Rating

El equipo de EAS me advirtió que al momento de diseñar attestations muchas veces es mejor hacer "Attestations de attestations" para mantener un mejor orden y ahorrar gas. Me recomendó hacer 2 esquemas como detallo a continación:

- Book Schema
    - Name
    - Author name
- Book Rating Schema
    - Book UID
    - Rating

Donde `Book UID` es una referencia a una attestation de `Book Schema` ya existente. Así es más fácil de indexar la información y hacer búsquedas de todas las attestation de un libro. Además que nos ahorramos el gas de guardar el detalle de cada libro (Autor y Nombre) para cada attestation.

**¡Gracias por leer este artículo!**

Sígueme en dev.to y en [Youtube](https://www.youtube.com/channel/UCNRB4tgwp09z4391JRjEsRA) para todo lo relacionado al desarrollo en Blockchain en Español.