SolidityLabs/cryptozombies-labs.sol

131 lines
4.4 KiB
Solidity
Raw Permalink Normal View History

2022-07-17 18:55:02 -03:00
pragma solidity ^0.4.19;
2022-07-08 17:31:58 -03:00
2022-07-17 18:55:02 -03:00
/**
* contrato fabrica de Zombie
2022-07-08 17:31:58 -03:00
*/
contract ZombieFactory {
2022-07-17 18:55:02 -03:00
//variaveis com as caracteristicas de dna
2022-07-08 17:31:58 -03:00
uint dnaDigits = 16;
uint dnaModulus = 10 ** dnaDigits;
2022-07-17 18:55:02 -03:00
//struct com as caracteristicas do zombie
2022-07-08 17:31:58 -03:00
struct Zombie {
string name;
uint dna;
}
2022-07-17 19:16:02 -03:00
/*
* aqui estamos declarando uma variavel array
* do tipo structs de acesso public
*/
2022-07-17 18:55:02 -03:00
Zombie[] public zombies;
/**
* function publica para criacao de zombies
* que recebe 2 variavies publicas do contrato
* e elas sao atribuidas para o array de zombies;
* o padrao para variaveis nos parametros de function
* para se diferenciar de variavies de globais
* eh que elas comecem com "_variavel"
2022-07-17 19:04:03 -03:00
* esta function eh private, entao o patrao para
* funcoes privadas eh que o nome dela seja iniciada
* com "_" e private no acesso
2022-07-17 18:55:02 -03:00
*/
2022-07-17 19:04:03 -03:00
function _createZombie(string _name, uint _dna) private {
2022-07-17 18:55:02 -03:00
zombies.push(Zombie(_name, _dna));
}
2022-07-17 19:16:02 -03:00
/**
* Modificadores das Funções
* Na verdade a função acima não altera estado algum em Solidity
* em outras palavras não altera qualquer valor ou escreve qualquer coisa.
* Neste caso nós podemos declará-la como uma função com palavra reservada
* view (observa), que significa: somente uma observação do dado, mas nenhuma alteração de fato.
*/
function sayHello() public view returns (string) { }
/**
* Em Solidity também existem funções puras usando a palavra reservada pure,
* que significa que nenhum dado será acessado na aplicação. Pense na seguinte situação:
* Esta função nem mesmo um estado da aplicação - os seus valores retornados
* dependem somente dos parâmetros da função. Então neste caso nós podemos declarar a
* função como pura usando a palavra reservada pure.
*/
function _multiply(uint a, uint b) private pure returns (uint) {
return a * b;
}
2022-07-17 20:25:58 -03:00
/**
* function private que retorna um uint
* keccak256(_str) => eh uma function evm que recebe str && retorna um hash 256
* apos isso ele realiza um parser deste retorno para uint();
*/
2022-07-17 20:09:36 -03:00
function _generateRandomDna(string _str) private view returns (uint) {
uint rand = uint(keccak256(_str));
return rand % dnaModulus;
}
2022-07-17 20:25:58 -03:00
/**
* exemplos da function evm keccak256();
*
* keccak256("aaaab");
* #6e91ec6b618bb462a4a6ee5aa2cb0e9cf30f7a052bb467b0ba58b8748c00d2e5
*
* keccak256("aaaac");
* #b1f078126895a1424524de5321b339ab00408010b7cf0e6ed451514981e58aa9
*/
2022-07-17 20:09:36 -03:00
2022-07-17 20:25:58 -03:00
/**
* Conversão de Tipos
*
* Algumas vezes você precisa converter tipos diferentes. Pegue por exemplo o seguinte:
* uint8 a = 5;
* uint b = 6;
*
* // lança um erro, porque a * b retorna um uint, não um uint8:
* uint8 c = a * b;
*
* // nós temos de converter b em uint8 para isso funcionar:
* uint8 c = a * uint8(b);
*
* Logo acima, a * b retorna um uint, mas nós estamos tentando guardar o seu valor em um uint8, que potencialmente pode causar problemas. Ao converter-lo como um uint8, a conversão irá funcionar e o compilador não irá reclamar.
*/
2022-07-17 20:09:36 -03:00
2022-07-17 20:25:58 -03:00
/**
* criada function publica onde ela chama as functions
* privadas que realizam a geracao e a criacao do zombie;
*/
2022-07-17 20:09:36 -03:00
function createRandomZombie(string _name) public {
uint randDna = _generateRandomDna(_name);
_createZombie(_name, randDna);
}
2022-07-17 20:46:58 -03:00
/**
Nosso contrato esta quase terminado! Agora vamos adicionar um evento.
Eventos são as maneiras dos seus contratos comunicarem que algo aconteceu na blockchain para o seu aplicativo em um frontend, que pode ouvir por certos tipos de eventos e tomar ações quando algo acontecer.
Exemplo:
// Declarando o evento
event IntegersAdded(uint x, uint y, uint result);
2022-07-17 20:09:36 -03:00
2022-07-17 20:46:58 -03:00
function add(uint _x, uint _y) public {
uint result = _x + _y;
// Dispare um evento e deixe o aplicativo saber que a função foi chamada:
IntegersAdded(_x, _y, result);
return result;
}
O seu aplicativo frontend poderá então ouvir o evento. Uma implementação em Javascript ficaria assim:
YourContract.IntegersAdded(function(error, result) {
// Faça algo com o resultado
}
*/
2022-07-08 17:31:58 -03:00
}