Operações de Blockchain na Cena

Aprenda o que o SDK oferece para realizar operações com a blockchain Ethereum

Uma cena da Decentraland pode interagir com a blockchain Ethereum. Isso pode servir para obter dados sobre a carteira do usuário e os tokens nela, ou para acionar transações que possam envolver qualquer token Ethereum, fungível ou não fungível. Isso pode ser usado de várias maneiras, por exemplo para vender tokens, recompensar tokens como parte de uma mecânica de jogo, alterar como um jogador interage com uma cena se ele possuir certos tokens, etc.

Observe que todas as transações na mainnet do Ethereum acionadas por uma cena exigirão que o jogador aprove e pague uma taxa de gas.

Todas as operações com blockchain também precisam ser realizadas como funções assíncronas, já que o tempo depende de eventos externos.

Obter a conta ethereum de um jogador

Para obter a conta Ethereum de um jogador, use o getPlayer() função.

import { getPlayer } from '@dcl/sdk/src/players'

export function main() {
	let userData = getPlayer()
	if (!userData.isGuest) {
		console.log(userData.userId)
	} else {
		log('Player is not connected with Web3')
	}
}

Observe que se um jogador entrou na Decentraland como guest, ele não terá uma carteira ethereum conectada. Se eles estiverem conectados como guests, o isGuest campo na resposta de getPlayer() será true. Se hasConnectedWeb3 for true, então você pode obter o endereço do jogador no campo publicKey. Saiba mais sobre os dados que você pode obter de um jogador em get player data

Você deve envolver a função em um async() function, saiba mais sobre isso em funções assíncronas

circle-exclamation

Verificar preço do gas

Após importar a eth-connect biblioteca, você deve instanciar um provedor web3 e um request manager, que permitirão conectar via web3 ao Metamask no navegador do jogador.

A função abaixo busca o preço atual do gas na rede principal do Ethereum e o imprime.

circle-info

💡 Tip: Observe que as funções tratadas pelo requestManager devem ser chamadas usando await, já que elas dependem de buscar dados externos e podem levar algum tempo para serem concluídas.

Importar um ABI de contrato

Um ABI (Application Binary Interface) descreve como interagir com um contrato Ethereum, determinando quais funções estão disponíveis, quais entradas elas recebem e o que elas retornam. Cada contrato Ethereum tem seu próprio ABI; você deve importar os ABIs de todos os contratos que deseja usar em seu projeto.

Por exemplo, aqui está um exemplo de uma função no ABI do MANA:

As definições de ABI podem ser bastante longas, pois muitas vezes incluem muitas funções, então recomendamos colar o conteúdo JSON de um arquivo ABI em um .ts arquivo separado e importá‑lo em outros arquivos de cena a partir daí. Também recomendamos manter todos os arquivos ABI em uma pasta separada da sua cena, chamada /contracts.

Aqui estão links para diferentes contratos da Decentraland. Obtenha o ABI de cada contrato clicando em Export ABI e escolhendo JSON Format.

Estes são os contratos das várias coleções de wearables: (cada coleção foi emitida como um contrato separado)

circle-info

💡 Tip: Para ver claramente as funções expostas por um contrato, abra‑o em abitopic.ioarrow-up-right. Basta colar o endereço do contrato lá e abrir a functions aba para ver a lista completa de funções suportadas e seus argumentos. Você pode até testar chamar as funções com diferentes parâmetros pela página web.

Configurar o TypeScript para poder importar de um arquivo JSON tem suas dificuldades. A solução alternativa recomendada e mais fácil é alterar a ABI.JSON extensão do arquivo para .ts e modificá‑lo levemente para que seu conteúdo comece com export default.

Por exemplo, se o conteúdo do arquivo ABI começa com [{"constant":true,"inputs":[{"internalType":"bytes4" ...etc, modifique‑o para que comece com export default [{"constant":true,"inputs":[{"internalType":"bytes4" ...etc.

Instanciar um contrato

Após importar a eth-connect biblioteca e o abi, você deve instanciar vários objetos que permitirão usar as funções do contrato e conectar-se ao Metamask no navegador do jogador.

Você também deve importar o provedor web3. Isso porque o Metamask no navegador do jogador usa web3, então precisamos de uma forma de interagir com ele.

circle-info

💡 Tip: Para contratos que seguem o mesmo padrão, como ERC20 ou ERC721, você pode importar um único ABI genérico para todos. Em seguida, gera um único ContractFactory objeto com esse ABI e usa essa mesma factory para instanciar interfaces para cada contrato.

Chamar os métodos em um contrato

Depois de criar um contract objeto, você pode facilmente chamar as funções definidas em seu ABI, passando os parâmetros de entrada especificados.

O exemplo acima usa o abi do contrato MANA em Ropsten e transfere 100 MANA falso para sua conta na rede de teste Ropsten.

Outras funções

A biblioteca eth-connect inclui diversos outros utilitários que você pode usar. Por exemplo, para:

  • Obter um preço de gas estimado

  • Obter o saldo de um endereço fornecido

  • Obter o recibo de uma transação

  • Obter o número de transações enviadas de um endereço

  • Converter entre vários formatos incluindo hexadecimal, binário, utf8, etc.

Usando a rede de testes Ethereum

Enquanto testa sua cena, para evitar transferir MANA real ou outras moedas, você pode usar a rede de teste Ethereum Sepolia e transferir MANA de teste fake nessa rede.

Para usar a rede de testes você deve configurar sua extensão Metamask no Chrome para usar a rede de testes Sepolia em vez da Rede principal.

Você deve adquirir Ether de Sepolia, que pode obter gratuitamente de várias faucets externas como esta aquiarrow-up-right.

circle-info

💡 Tip: Para executar a transação de transferência de MANA Sepolia para sua carteira, você precisará pagar uma taxa de gas em Sepolia Ether.

Para pré-visualizar sua cena usando a rede de testes, cole a seguinte URL em uma aba do navegador. Isso abrirá a cena no cliente desktop do Decentraland:

decentraland://realm=http://127.0.0.1:8000&local-scene=true&debug=true&dclenv=zone&position=0,0

circle-info

💡 Tip: Altere o parâmetro position para as coordenadas da sua cena, para carregar diretamente na sua cena.

Quaisquer transações que você aceitar enquanto visualizar a cena nesse modo ocorrerão apenas na rede de testes e não afetarão o saldo de MANA na sua carteira real.

Se precisar testar transações na Polygon Testnet e precisar ter MANA nessa testnet, será necessário trocar o MANA para essa rede após adquiri-lo em Sepolia. Para fazer bridge do MANA de Sepolia para a Polygon Testnet, visite sua página de conta Decentraland em Sepoliaarrow-up-right e clique em ‘swap’ do lado do Ethereum MANA.

Ao executar uma pré-visualização no cliente web legado, de uma cena que usa uma das bibliotecas ethereum, você deve abrir a pré-visualização em uma janela de navegador separada, ter o Metamask aberto no seu navegador e incluir manualmente a string &ENABLE_WEB3.

Enviar mensagens RPC personalizadas

Use a função sendAsync() para enviar mensagens através do protocolo RPCarrow-up-right.

Contratos inteligentes da Decentraland

No link a seguir você pode encontrar uma lista de contratos inteligentes Ethereum relevantes para o ecossistema Decentraland. A lista inclui os contratos na mainnet assim como em outras redes de teste Ethereum.

contracts.decentraland.orgarrow-up-right

Atualizado