Skip to content

ERC-721 - a.k.a. NFT

Tokens no fungibles

En Ethereum existe un ERC (Ethereum improvement proposals) que normaliza el uso de los tokens no fungibles, este es el ERC-721. Inspirado en los tokens fungibles (ERC-20) poseen una especificación orientada a representar la propiedad de activos físicos o digitales.

Se podría pensar en un NFT como:

  • Un boleto de avión,
  • Un contrato de propiedad de una casa
  • Una obra de arte

Dentro del estándar se mencionan las funcionalidades básicas que debe contener pero también la enumeración que servirá para determinar un identificador único para cada token. Es interesante mencionar algunos puntos adicionales:

  • Es posible cobrar un fee a ambas partes de una transacción
  • Las transferencias pueden ser iniciadas por el propietario del NFT, una dirección que esté previamente aprobada o un operador autorizado por el actual propietario del NFT.

Los NFT también pueden poseer metadatos que detallan el activo, sin embargo estos metadatos no suelen estar dentro del contrato porque hacen que las transacciones sean muy costosas. Por lo tanto, la implementación mayormente adoptada es contener una URI que determina dónde ir a buscar los metadatos de cada NFT. Hay otras implementaciones posibles que incrustan propiedades dentro de estructuras onchain, sin embargo, como se mencionó anteriormente, lo hace más costoso.

También es importante saber algunas limitaciones como por ejemplo la cantidad de NFT que puede contener un smart contract (hasta ahora probado y mencionado dentro del ERC-721) que es de 2^128. Para darse una idea es posible atribuir cada dirección IPv6 existente a una dirección de Ethereum.

Un ejemplo del JSON que representaría a los metadatos de un NFT es el siguiente:

JSON
{
    "title": "Asset Metadata",
    "type": "object",
    "properties": {
        "name": {
            "type": "string",
            "description": "Identifies the asset to which this NFT represents"
        },
        "description": {
            "type": "string",
            "description": "Describes the asset to which this NFT represents"
        },
        "image": {
            "type": "string",
            "description": "A URI pointing to a resource with mime type image/* representing the asset to which this NFT represents. Consider making any images at a width between 320 and 1080 pixels and aspect ratio between 1.91:1 and 4:5 inclusive."
        }
    }
}
{
    "title": "Asset Metadata",
    "type": "object",
    "properties": {
        "name": {
            "type": "string",
            "description": "Identifies the asset to which this NFT represents"
        },
        "description": {
            "type": "string",
            "description": "Describes the asset to which this NFT represents"
        },
        "image": {
            "type": "string",
            "description": "A URI pointing to a resource with mime type image/* representing the asset to which this NFT represents. Consider making any images at a width between 320 and 1080 pixels and aspect ratio between 1.91:1 and 4:5 inclusive."
        }
    }
}