CanalQb - Blockchain - Cryptozombies - Criando um contrato inteligente em ETH com Solidity
CanalQb - Blockchain - Cryptozombies - Criando um contrato inteligente em ETH com Solidity
Olha a lição concluida: https://share.cryptozombies.io/en/lesson/1/share/CanalQb?id=Y3p8NTkxMTMw
O que é Solidity?
Solidity é uma linguagem de programação especialmente projetada para criar contratos inteligentes na rede Ethereum. Esses contratos inteligentes são como acordos digitais autônomos, que são executados automaticamente quando as condições pré-programadas são atendidas. Imagine um contrato que se autoexecuta sem a necessidade de intermediários - é aí que o Solidity brilha.
Por que é importante?
O Solidity é a "cola" que une a lógica empresarial com a tecnologia blockchain. Ele permite que desenvolvedores criem aplicativos descentralizados (DApps) revolucionários, nos quais a confiança é construída na matemática e na criptografia, eliminando a necessidade de confiar em terceiros.
Principais Recursos e Conceitos
Contratos Inteligentes: Solidity é a linguagem que permite definir como um contrato inteligente irá se comportar. Isso inclui estabelecer as condições para a execução, ações a serem tomadas e como os dados serão manipulados.
Tipos de Dados: Assim como em outras linguagens de programação, o Solidity oferece tipos de dados para representar informações, como inteiros, strings e booleanos.
Herança e Modularidade: Solidity suporta herança, permitindo que contratos inteligentes herdem características de outros contratos, facilitando a reutilização de código e a organização do projeto.
Eventos: Os eventos permitem que contratos comuniquem informações para fora da blockchain, facilitando a interação com DApps e interfaces externas.
Visibilidade de Funções: As funções em um contrato inteligente podem ter diferentes níveis de visibilidade, como público, privado e interno, controlando quem pode chamar essas funções.
Conclusão
O Solidity é o alicerce que permite a criação de contratos inteligentes e aplicativos descentralizados na rede Ethereum. Com essa linguagem, as possibilidades de automação, segurança e transparência aumentam significativamente. Se você está empolgado com a ideia de revolucionar transações e acordos, o Solidity é um caminho a ser explorado.
Esperamos que este resumo tenha fornecido uma visão clara e básica do Solidity. Nos próximos artigos, mergulharemos mais fundo em conceitos e exemplos práticos. Até lá, continue explorando o mundo empolgante dos contratos inteligentes!
Site oficial do Solidity: https://soliditylang.org/
Site oficial do Solidity: https://soliditylang.org/
Agora que temos o conhecimento sobre a programação para fazer contratos, vamos iniciar nossa pequena aula
Preparando o Terreno
Antes de mergulharmos nas linhas de código, vamos garantir que estamos usando a versão certa do Solidity. Certifique-se de que seu ambiente de desenvolvimento esteja configurado para usar a versão solidity >=0.5.0 <0.6.0. Isso nos garantirá compatibilidade e acesso aos recursos mais recentes.
Criando o Contrato ZombieFactory
Agora é a hora de trazer à vida nosso contrato ZombieFactory. Imagine isso como o laboratório secreto onde daremos vida aos nossos zumbis digitais. Vamos criar um contrato vazio chamado ZombieFactory para começar.
// Defina a versão do Soliditypragma solidity >=0.5.0 <0.6.0;// Declaração do contrato ZombieFactorycontract ZombieFactory {// Mais funcionalidades emocionantes serão adicionadas aqui!}
Próximos Passos
Parabéns! Você acabou de criar seu primeiro contrato ZombieFactory. Embora possa parecer vazio agora, este é apenas o início de nossa jornada na criação de zumbis e contratos inteligentes na blockchain. Nos próximos posts, vamos explorar e adicionar funcionalidades emocionantes a este contrato, trazendo nossos zumbis à vida.
É hora de mergulhar mais fundo em nosso laboratório zumbi e decifrar o código genético que dará vida aos nossos zumbis digitais. Estamos prestes a dar um grande passo na criação do nosso exército de criaturas assustadoras, definindo o DNA zumbi através de um número de 16 dígitos. Vamos começar!
Compreendendo o DNA Zumbi
Assim como os seres vivos têm um código genético que determina suas características, nossos zumbis digitais também possuem um "DNA" único. Este DNA será composto por um número de 16 dígitos, que irá ditar as características e habilidades de cada zumbi que criarmos.
Declarando e Definindo o DNA Digits
Para iniciar o processo, precisamos declarar uma variável que armazenará o número de dígitos do nosso DNA. Vamos chamá-la de "dnaDigits" e atribuir o valor 16 a ela.
// Declaração do contrato ZombieFactorycontract ZombieFactory {// Número de dígitos no DNA zumbiuint256 dnaDigits = 16;// Mais funcionalidades incríveis virão em breve!}
Os Próximos Passos Horripilantes
Ao definir o número de dígitos do DNA zumbi como 16, demos um passo crucial na personalização de nossos zumbis digitais. Nos próximos posts, vamos continuar explorando o mundo do DNA zumbi, adicionando elementos de aleatoriedade e aprendendo como usar esses dígitos para criar zumbis únicos e aterrorizantes.
Prepare-se para mais emocionantes avanços no nosso laboratório zumbi! A era dos zumbis digitais está se aproximando... e você faz parte disso.
Garantindo 16 Caracteres de DNA
Nossa missão é certificar-nos de que o DNA de cada zumbi seja único e tenha exatamente 16 caracteres. Para isso, vamos criar uma variável chamada "dnaModulus" que nos ajudará a encurtar os números e manter apenas os 16 dígitos mais significativos.
Declarando e Definindo o dnaModulus
Vamos declarar uma variável chamada "dnaModulus" e definir seu valor como 10 elevado à potência do número de dígitos do nosso DNA (que é 16).
// Declaração do contrato ZombieFactorycontract ZombieFactory {// Número de dígitos no DNA zumbiuint256 public dnaDigits = 16;// Valor usado para encurtar o DNA para 16 dígitosuint256 public dnaModulus = 10 ** dnaDigits;// Mais funcionalidades incríveis virão em breve!}
Os Próximos Passos Assombrosos
Com a declaração e definição da variável "dnaModulus", demos um passo crucial para garantir que nosso DNA zumbi esteja sempre com 16 caracteres. Nos próximos posts, vamos explorar como usar esse valor para criar e personalizar nossos zumbis, garantindo a singularidade de cada um deles.
Prepare-se para mais emoções aterrorizantes enquanto continuamos construindo nossos zumbis digitais e desvendando os segredos do DNA!
Definindo a Estrutura Zombie
Agora que estamos prontos para trazer nossos zumbis à vida, vamos criar uma estrutura chamada "Zombie". Esta estrutura será o esqueleto que abrigará as propriedades únicas de cada zumbi que criarmos.
Declarando a Estrutura Zombie
Vamos declarar uma estrutura chamada "Zombie" com duas propriedades: "name" (uma string que representará o nome do zumbi) e "dna" (um número inteiro sem sinal que definirá o código genético do zumbi).
// Declaração do contrato ZombieFactorycontract ZombieFactory {// Número de dígitos no DNA zumbiuint256 public dnaDigits = 16;// Valor usado para encurtar o DNA para 16 dígitosuint256 public dnaModulus = 10 ** dnaDigits;// Declaração da estrutura Zombiestruct Zombie {string name;uint256 dna;}// Mais funcionalidades incríveis virão em breve!}
Próximos Passos Horripilantes
Agora que temos nossa estrutura Zombie definida, nossos zumbis digitais estão começando a ganhar forma! Nos próximos posts, vamos continuar aprimorando nossa criação, adicionando funcionalidades e detalhes únicos aos nossos zumbis.
Prepare-se para mergulhar mais fundo na personalização e criação dos nossos zumbis digitais! A jornada está apenas começando, e os terrores que estão por vir prometem ser eletrizantes.
Criando a Matriz de Zumbis
Para armazenar e compartilhar nossos zumbis, precisamos criar uma matriz. Essa matriz conterá os detalhes dos zumbis que criamos, e faremos isso usando nossa estrutura Zombie.
Declarando a Matriz "zombies"
Vamos criar uma matriz pública chamada "zombies" que conterá elementos do tipo Zombie. Isso nos permitirá armazenar todos os nossos zumbis de forma organizada e acessível.
// Declaração do contrato ZombieFactorycontract ZombieFactory {// Número de dígitos no DNA zumbiuint256 public dnaDigits = 16;// Valor usado para encurtar o DNA para 16 dígitosuint256 public dnaModulus = 10 ** dnaDigits;// Declaração da estrutura Zombiestruct Zombie {string name;uint256 dna;}// Matriz pública de zumbisZombie[] public zombies;// Mais funcionalidades incríveis virão em breve!}
Próximos Passos Assustadores
Ao criar a matriz pública "zombies", demos um passo crucial na construção do nosso exército de zumbis digitais. Nos próximos posts, vamos continuar a aprimorar nossa matriz, adicionando e gerenciando zumbis, e explorando como podemos interagir com ela.
Criando a Função "createZombie"
Para trazer zumbis à existência, precisamos de uma função especializada. Vamos criar uma função chamada "createZombie" que aceitará dois parâmetros: "_name" (uma string que será o nome do zumbi) e "_dna" (um número inteiro sem sinal que representará o código genético do zumbi).
Definindo a Função "createZombie"
Ao criar a função "createZombie", lembre-se de usar a palavra-chave "memory" para o primeiro argumento, que é a string "_name". Isso garantirá que o argumento seja passado por valor.
// Declaração do contrato ZombieFactorycontract ZombieFactory {// Número de dígitos no DNA zumbiuint256 public dnaDigits = 16;// Valor usado para encurtar o DNA para 16 dígitosuint256 public dnaModulus = 10 ** dnaDigits;// Declaração da estrutura Zombiestruct Zombie {string name;uint256 dna;}// Matriz pública de zumbisZombie[] public zombies;// Função para criar um novo zumbifunction createZombie(string memory _name, uint256 _dna) public {// Lógica para criar um novo zumbi será adicionada aqui!}}
Próximos Passos de Criação
Ao criar a função "createZombie", demos um passo crucial na transformação de dados em zumbis digitais. Nos próximos posts, vamos mergulhar na lógica necessária para criar zumbis, ajustar seus DNAs e adicioná-los à nossa matriz de zumbis.
Dando Vida ao Novo Zumbi
Para criar um novo zumbi e adicioná-lo à nossa matriz de zumbis, precisamos preencher o corpo da função "createZombie". Faremos isso em uma única linha de código, para manter tudo organizado e limpo.
Preenchendo a Função "createZombie"
// Declaração do contrato ZombieFactorycontract ZombieFactory {// Número de dígitos no DNA zumbiuint256 public dnaDigits = 16;// Valor usado para encurtar o DNA para 16 dígitosuint256 public dnaModulus = 10 ** dnaDigits;// Declaração da estrutura Zombiestruct Zombie {string name;uint256 dna;}// Matriz pública de zumbisZombie[] public zombies;// Função para criar um novo zumbifunction createZombie(string memory _name, uint256 _dna) public {zombies.push(Zombie(_name, _dna));}}
Próximos Passos Sombrios
Com o preenchimento da função "createZombie", demos um passo crucial na transformação de nossos zumbis digitais de entidades abstratas para criaturas reais dentro da matriz. Nos próximos posts, vamos continuar aprimorando nossos zumbis, ajustando DNAs, explorando interações e compartilhando como nossos zumbis podem ser vistos por outros aplicativos.
O Poder do Acesso Privado
Para controlar quem pode invocar zumbis em nosso exército, faremos a função "createZombie" se tornar privada. Assim, somente nosso contrato poderá convocar novos zumbis, mantendo nosso exército a salvo de invocações indesejadas.
Tornando a Função "createZombie" Privada
// Declaração do contrato ZombieFactorycontract ZombieFactory {// Número de dígitos no DNA zumbiuint256 public dnaDigits = 16;// Valor usado para encurtar o DNA para 16 dígitosuint256 public dnaModulus = 10 ** dnaDigits;// Declaração da estrutura Zombiestruct Zombie {string name;uint256 dna;}// Matriz pública de zumbisZombie[] public zombies;// Função privada para criar um novo zumbifunction _createZombie(string memory _name, uint256 _dna) private {zombies.push(Zombie(_name, _dna));}}
Seguindo a Convenção de Nomenclatura
Ao tornar a função privada, usamos o prefixo "_" no nome dela para indicar que é uma função interna. Isso é uma convenção de nomenclatura importante que ajuda a evitar confusões entre funções públicas e privadas.
Próximos Passos nas Sombras
Com a transformação da função "createZombie" em uma função privada, nosso contrato se tornou mais seguro e controlado. Nos próximos posts, vamos continuar a evoluir nossos zumbis, explorando como podemos invocá-los e manipulá-los com segurança.
Gerando o DNA das Sombras
Para trazer um toque de aleatoriedade ao DNA dos nossos zumbis, criaremos uma função que gera um valor numérico baseado em um parâmetro string. Essa função será completamente privada e apenas visualizará informações do contrato, sem modificá-las.
Criando a Função "_generateRandomDna"
// Declaração do contrato ZombieFactorycontract ZombieFactory {// Número de dígitos no DNA zumbiuint256 public dnaDigits = 16;// Valor usado para encurtar o DNA para 16 dígitosuint256 public dnaModulus = 10 ** dnaDigits;// Declaração da estrutura Zombiestruct Zombie {string name;uint256 dna;}// Matriz pública de zumbisZombie[] public zombies;// Função privada para criar um novo zumbifunction _createZombie(string memory _name, uint256 _dna) private {zombies.push(Zombie(_name, _dna));}// Função privada para gerar o DNA aleatóriofunction _generateRandomDna(string memory _str) private view returns (uint256) {// Lógica para gerar o DNA aleatório será adicionada aqui!}}
A Arte da Visualização sem Modificação
Ao definir a função "_generateRandomDna" como "view", garantimos que ela só visualiza os dados do contrato e não os modifica. Isso nos ajuda a manter a integridade dos dados enquanto geramos aleatoriedade.
Próximos Passos nas Sombras
Embora o corpo da função "_generateRandomDna" esteja vazio por enquanto, não se preocupe! Nos próximos posts, vamos preencher o vazio com o poder da aleatoriedade, gerando DNAs únicos para nossos zumbis digitais.
Gerando o DNA Pseudo-Aleatório
Vamos criar um código que pegará o hash keccak256 de uma string, converterá para um uint e, em seguida, ajustará para ter 16 dígitos (lembrando do nosso "dnaModulus"). Isso nos dará o DNA único e assustador para cada zumbi.
Compleção da Função "_generateRandomDna"
// Declaração do contrato ZombieFactorycontract ZombieFactory {// Número de dígitos no DNA zumbiuint256 public dnaDigits = 16;// Valor usado para encurtar o DNA para 16 dígitosuint256 public dnaModulus = 10 ** dnaDigits;// Declaração da estrutura Zombiestruct Zombie {string name;uint256 dna;}// Matriz pública de zumbisZombie[] public zombies;// Função privada para criar um novo zumbifunction _createZombie(string memory _name, uint256 _dna) private {zombies.push(Zombie(_name, _dna));}// Função privada para gerar o DNA aleatóriofunction _generateRandomDna(string memory _str) private view returns (uint256) {uint256 rand = uint256(keccak256(abi.encodePacked(_str)));return rand % dnaModulus;}}
O Poder da Aleatoriedade Controlada
A primeira linha de código gera um valor pseudo-aleatório baseado no hash keccak256 da string "_str". A segunda linha, com o operador "%", garante que o valor resultante esteja dentro do limite dos 16 dígitos do "dnaModulus".
Próximos Passos nas Sombras
Com o preenchimento da função "_generateRandomDna", demos um passo crucial na criação de zumbis digitais com DNAs únicos e surpreendentes. Nos próximos posts, vamos unir tudo o que aprendemos até agora, criando zumbis completos e personalizados!
Criando Zumbis Aleatórios com Mistério
Esta função pública nos permitirá criar zumbis com nomes fornecidos e DNAs gerados aleatoriamente. Vamos dar um toque mágico à nossa criação!
Invocando a Função "createRandomZombie"
// Declaração do contrato ZombieFactorycontract ZombieFactory {// Número de dígitos no DNA zumbiuint256 public dnaDigits = 16;// Valor usado para encurtar o DNA para 16 dígitosuint256 public dnaModulus = 10 ** dnaDigits;// Declaração da estrutura Zombiestruct Zombie {string name;uint256 dna;}// Matriz pública de zumbisZombie[] public zombies;// Função privada para criar um novo zumbifunction _createZombie(string memory _name, uint256 _dna) private {zombies.push(Zombie(_name, _dna));}// Função privada para gerar o DNA aleatóriofunction _generateRandomDna(string memory _str) private view returns (uint256) {uint256 rand = uint256(keccak256(abi.encodePacked(_str)));return rand % dnaModulus;}// Função pública para criar um zumbi aleatóriofunction createRandomZombie(string memory _name) public {uint256 randDna = _generateRandomDna(_name);_createZombie(_name, randDna);}}
Um Toque de Mistério em Quatro Linhas
A função "createRandomZombie" faz uso das funções privadas que construímos anteriormente. Ela gera um DNA aleatório com base no nome fornecido e, em seguida, cria um novo zumbi com esse DNA e o nome fornecido.
Próximos Passos nas Sombras
Com a criação da função "createRandomZombie", demos um passo crucial na criação de zumbis digitais de maneira completamente aleatória. Nos próximos posts, vamos continuar a aprimorar nossa criação de zumbis, explorando mais funcionalidades e possibilidades.
Anunciando a Criação dos Zumbis
Vamos criar um evento chamado "NewZombie" para informar ao mundo cada vez que um novo zumbi é criado. Este evento transmitirá o ID do zumbi, seu nome e seu DNA.
Criando o Evento "NewZombie" e Modificando a Função "_createZombie"
// Declaração do contrato ZombieFactorycontract ZombieFactory {// Número de dígitos no DNA zumbiuint256 public dnaDigits = 16;// Valor usado para encurtar o DNA para 16 dígitosuint256 public dnaModulus = 10 ** dnaDigits;// Declaração da estrutura Zombiestruct Zombie {string name;uint256 dna;}// Matriz pública de zumbisZombie[] public zombies;// Evento para anunciar a criação de um novo zumbievent NewZombie(uint256 zombieId, string name, uint256 dna);// Função privada para criar um novo zumbifunction _createZombie(string memory _name, uint256 _dna) private {uint256 id = zombies.push(Zombie(_name, _dna)) - 1;emit NewZombie(id, _name, _dna);}// Função privada para gerar o DNA aleatóriofunction _generateRandomDna(string memory _str) private view returns (uint256) {uint256 rand = uint256(keccak256(abi.encodePacked(_str)));return rand % dnaModulus;}// Função pública para criar um zumbi aleatóriofunction createRandomZombie(string memory _name) public {uint256 randDna = _generateRandomDna(_name);_createZombie(_name, randDna);}}
Celebrando com o Evento "NewZombie"
Na função "_createZombie", depois de adicionar o zumbi à matriz, usamos "emit" para acionar o evento "NewZombie", informando o ID do zumbi, seu nome e seu DNA.
Próximos Passos na Celebração
Com a adição do evento "NewZombie", estamos prontos para compartilhar com o mundo cada novo zumbi que criamos. Nos próximos posts, vamos continuar a aprimorar nossos zumbis e explorar mais possibilidades de interação com a blockchain.
Desvendando a Interação com o Web3.js em HTML: Uma Breve Olhada
Embora possa parecer um mundo distante agora, é importante começar a entender como o JavaScript e o Web3.js podem se comunicar com nosso contrato Solidity na blockchain Ethereum. Vamos dar uma olhada em um exemplo de código em HTML que mostra como o Web3.js pode ser usado para interagir com nossos contratos. Lembre-se de que este é apenas um vislumbre, e em lições posteriores, mergulharemos mais profundamente nesse tópico.
HTML e JavaScript Mágico com o Web3.js
Aqui, mostraremos como o HTML e o JavaScript interagem com nosso contrato ZombieFactory por meio do Web3.js:
<!DOCTYPE html><html><head><title>Interação com Contrato ZombieFactory</title></head><body><input type="text" id="nameInput" placeholder="Nome do Zumbi"><button id="ourButton">Criar Zumbi</button><script src="https://cdn.jsdelivr.net/npm/web3@1.5.2/dist/web3.min.js"></script><script>// Inicializa o provedor Web3if (typeof web3 !== 'undefined') {web3 = new Web3(web3.currentProvider);} else {// Defina o provedor Web3 (por exemplo, para o MetaMask)// web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));}// Aqui está como acessar nosso contrato:var abi = /* abi gerado pelo compilador */;var contractAddress = /* nosso endereço de contrato no Ethereum após a implantação */;var ZombieFactoryContract = new web3.eth.Contract(abi, contractAddress);// Ouvinte de evento para capturar a entrada de texto:document.getElementById("ourButton").addEventListener("click", function() {var name = document.getElementById("nameInput").value;// Chama a função `createRandomZombie` do nosso contrato:ZombieFactoryContract.methods.createRandomZombie(name).send({ from: web3.eth.defaultAccount }).then(function(receipt) {// A transação foi enviada com sucesso!}).catch(function(error) {console.error(error);});});// Ouve o evento `NewZombie` e atualiza a interface do usuárioZombieFactoryContract.events.NewZombie(function(error, event) {if (error) return;var zombieDetails = generateZombie(event.returnValues.zombieId, event.returnValues.name, event.returnValues.dna);// Atualiza a interface com os detalhes do zumbi});// Função para gerar detalhes do zumbifunction generateZombie(id, name, dna) {var dnaStr = String(dna);while (dnaStr.length < 16)dnaStr = "0" + dnaStr;var zombieDetails = {headChoice: dnaStr.substring(0, 2) % 7 + 1,eyeChoice: dnaStr.substring(2, 4) % 11 + 1,shirtChoice: dnaStr.substring(4, 6) % 6 + 1,skinColorChoice: parseInt(dnaStr.substring(6, 8) / 100 * 360),eyeColorChoice: parseInt(dnaStr.substring(8, 10) / 100 * 360),clothesColorChoice: parseInt(dnaStr.substring(10, 12) / 100 * 360),zombieName: name,zombieDescription: "Um CryptoZumbi Nível 1"};return zombieDetails;}</script>
Desvendando os Mistérios da Interatividade em HTML
Embora pareça mágico, esse código HTML e JavaScript se conecta com nosso contrato Solidity e possibilita a criação de zumbis aleatórios.
E ai ficou curioso, tá na hora de você aprender na pratica com Cryptozombies, segue o link para você começar: https://cryptozombies.io/en/course
Todas as lições précriadas: https://github.com/CryptozombiesHQ/cryptozombies-lesson-code
Nenhum comentário
Comente só assim vamos crescer juntos!
Observação: somente um membro deste blog pode postar um comentário.