Operaciones blockchain de la escena
Aprende qué ofrece el SDK para realizar operaciones con la blockchain de Ethereum
Una escena de Decentraland puede interactuar con la blockchain de Ethereum. Esto puede servir para obtener datos sobre la wallet del usuario y los tokens que contiene, o para iniciar transacciones que podrían involucrar cualquier token de Ethereum, fungible o no fungible. Esto puede usarse de muchas maneras, por ejemplo para vender tokens, recompensar tokens como parte de una mecánica de juego, cambiar cómo un jugador interactúa con una escena si posee ciertos tokens, etc.
Ten en cuenta que todas las transacciones en la mainnet de Ethereum que sean iniciadas por una escena requerirán que el jugador apruebe y pague una tarifa de gas.
Todas las operaciones con la blockchain también deben llevarse a cabo como funciones asíncronas, ya que el tiempo depende de eventos externos.
Obtener la cuenta de ethereum de un jugador
Para obtener la cuenta de Ethereum de un jugador, usa getPlayer() función.
import { getPlayer } from '@dcl/sdk/src/players'
export function main() {
let userData = getPlayer()
if (!userData.isGuest) {
console.log(userData.userId)
} else {
log('El jugador no está conectado con Web3')
}
}Ten en cuenta que si un jugador ha entrado a Decentraland como invitado, no tendrá una wallet de ethereum conectada. Si han entrado como invitados, el isGuest campo en la respuesta de getPlayer() será verdadero. Si hasConnectedWeb3 es verdadero, entonces puedes obtener la dirección del jugador desde el campo publicKey. Aprende más sobre los datos que puedes obtener de un jugador en obtener datos del jugador
Deberías envolver la función en una async() función, aprende más sobre esto en funciones async
📔 Nota: Aunque la dirección de eth puede contener caracteres en mayúscula, algunos navegadores convierten la cadena devuelta a minúsculas automáticamente. Si deseas comparar valores de direcciones y que funcione en todos los navegadores, usa el .toLowerCase() método para convertir el valor a minúsculas.
Comprobar el precio del gas
Después de importar la librería eth-connect debes instanciar un proveedor web3 y un request manager, lo que te permitirá conectarte vía web3 a Metamask en el navegador del jugador.
La función abajo obtiene el precio de gas actual en la red principal de Ethereum y lo muestra.
💡 Tip: Ten en cuenta que las funciones manejadas por el requestManager deben llamarse usando await, ya que dependen de la obtención de datos externos y pueden tardar algún tiempo en completarse.
Importar un ABI de contrato
Un ABI (Application Binary Interface) describe cómo interactuar con un contrato de Ethereum, determinando qué funciones están disponibles, qué entradas requieren y qué devuelven. Cada contrato de Ethereum tiene su propio ABI; debes importar los ABIs de todos los contratos que desees usar en tu proyecto.
Por ejemplo, aquí hay un ejemplo de una función en el ABI de MANA:
Las definiciones de ABI pueden ser bastante largas, ya que a menudo incluyen muchas funciones, por lo que recomendamos pegar el contenido JSON de un archivo ABI en un .ts archivo separado e importarlo desde allí en otros archivos de escena. También recomendamos guardar todos los archivos ABI en una carpeta separada de tu escena, llamada /contracts.
Aquí hay enlaces a diferentes contratos de Decentraland. Obtén el ABI de cada contrato haciendo clic en Export ABI y eligiendo JSON Format.
Estos son los contratos de las distintas colecciones de wearables: (cada colección fue emitida como un contrato separado)
💡 Tip: Para ver claramente las funciones expuestas por un contrato, ábrelo en abitopic.io. Simplemente pega la dirección del contrato allí y abre la functions pestaña para ver la lista completa de funciones soportadas y sus argumentos. Incluso puedes probar a llamar a las funciones con diferentes parámetros a través de la página web.
Configurar TypeScript para poder importar desde un archivo JSON tiene sus dificultades. La solución alternativa más sencilla recomendada es cambiar la ABI.JSON extensión del archivo a .ts y modificarlo ligeramente para que su contenido comience con export default.
Por ejemplo, si el contenido del archivo ABI comienza con [{"constant":true,"inputs":[{"internalType":"bytes4" ...etc, modifícalo para que comience con export default [{"constant":true,"inputs":[{"internalType":"bytes4" ...etc.
Instanciar un contrato
Después de importar la librería eth-connect biblioteca y el abi, debes instanciar varios objetos que te permitirán usar las funciones del contrato y conectar con Metamask en el navegador del jugador.
También debes importar el proveedor web3. Esto se debe a que Metamask en el navegador del jugador usa web3, por lo que necesitamos una forma de interactuar con eso.
💡 Tip: Para contratos que siguen un mismo estándar, como ERC20 o ERC721, puedes importar un único ABI genérico para todos. Luego generas un solo ContractFactory objeto con ese ABI y usas esa misma factory para instanciar interfaces para cada contrato.
Llamar a los métodos de un contrato
Una vez que hayas creado un contract objeto, puedes llamar fácilmente a las funciones que están definidas en su ABI, pasándoles los parámetros de entrada especificados.
El ejemplo anterior usa el abi del contrato MANA en Ropsten y transfiere 100 MANA falsos a tu cuenta en la red de pruebas Ropsten.
Otras funciones
La biblioteca eth-connect incluye una serie de otros ayudantes que puedes usar. Por ejemplo, para:
Obtener un precio estimado del gas
Obtener el balance de una dirección determinada
Obtener el recibo de una transacción
Obtener el número de transacciones enviadas desde una dirección
Convertir entre varios formatos incluyendo hexadecimal, binario, utf8, etc.
Usar la red de pruebas de Ethereum
Mientras pruebas tu escena, para evitar transferir MANA real u otras monedas, puedes usar la red de pruebas Ethereum Sepolia y transferir MANA de prueba falso en su lugar.
Para usar la red de pruebas debes configurar tu extensión Metamask en Chrome para usar la red de pruebas Sepolia en lugar de red principal.
Debes conseguir Ether de Sepolia, que puedes obtener gratis desde varios faucets externos como este.
💡 Tip: Para ejecutar la transacción de transferir MANA de Sepolia a tu wallet, necesitarás pagar una tarifa de gas en Sepolia Ether.
Para previsualizar tu escena usando la red de pruebas, pega la siguiente URL en una pestaña del navegador. Esto abrirá la escena en el cliente de escritorio de Decentraland:
decentraland://realm=http://127.0.0.1:8000&local-scene=true&debug=true&dclenv=zone&position=0,0
💡 Tip: Cambia el parámetro position por las coordenadas de tu escena, para cargar directamente en tu escena.
Cualquier transacción que aceptes mientras visualizas la escena en este modo solo ocurrirá en la red de pruebas y no afectará el saldo de MANA en tu wallet real.
Si necesitas probar transacciones en la Testnet de Polygon y necesitas tener MANA en esa testnet, tendrás que cambiar (swap) MANA a esa red después de adquirirlo en Sepolia. Para puentear (bridge) MANA de Sepolia a la Testnet de Polygon, visita tu página de cuenta de Decentraland en Sepolia y haz clic en ‘swap’ en el lado de Ethereum MANA.
Al ejecutar una vista previa en el cliente web heredado, de una escena que usa una de las librerías de ethereum, debes abrir la vista previa en una ventana de navegador separada, tener Metamask abierto en tu navegador e incluir manualmente la cadena &ENABLE_WEB3.
Enviar mensajes RPC personalizados
Usa la función sendAsync() para enviar mensajes por protocolo RPC.
Contratos inteligentes de Decentraland
En el siguiente enlace puedes encontrar una lista de contratos inteligentes de Ethereum relevantes para el ecosistema de Decentraland. La lista incluye los contratos en mainnet así como en otras redes de prueba de Ethereum.
Última actualización