Nova igra Capture the Ether izrađena je s namjerom da sudionike nauči osnovama Ethereum programiranja kao i naši uvodni članci, te da igračima približi osnove sigurnosti pametnih ugovora i blockchaina općenito.

Igra svaki korak objašnjava i boduje, dok najbolje igrače izlistava na top listi.

Prvi su koraci tu za zagrijavanje i učenje koncepata, no svejedno nisu dovoljno pristupačni ljudima koji nikada nisu radili u Solidity programskom jeziku. Stoga svakako predlažemo da prije početka pročitate naše uvodne članke o izradi tombole na Ethereum blockchainu.

Igra igrače prvo vodi kroz proces mijenjanja Ethereum mreže na koju su spojeni MetaMaskom na drugu, testnu mrežu Ropsten, a zatim kroz dobivanje testnog Ropsten ethera kako bi se izazovi mogli rješavati.

Prođimo drugi i treći izazov (preskačemo prvi – obavite ga sami) radi demonstracije i objasnimo njihov kod.

Call Me

Da bismo rješili ovaj izazov, potrebno je pozvati callme funkciju ugovora koji se nalazi na adresi prikazanoj na ekranu. U mom slučaju to je 0x80d70155c1defd5c38D8ae0421e9f668b8ac024c. Srećom, objavili smo članak upravo o tome – kako zvati funkcije na Ethereum blockchainu.

Kod zadatka izgleda ovako:

pragma solidity ^0.4.21;

contract CallMeChallenge {
    bool public isComplete = false;

    function callme() public {
        isComplete = true;
    }
}

Kao što smo to objasnili u prijašnjim vodičima, linija pragma označava kojom verzijom Soliditija je pisan ovaj kod.

Sljedeće se definira ugovor CallMeChallenge koji prvo deklarira jednu boolean (to znači da može biti samo true ili false – istinito ili neistinito) varijablu isComplete koja je u početku false, i funkciju callme koja je public, što znači da je se može pozvati i izvan ugovora i unutar ugovora iz neke druge funkcije. Ta funkcija čim bude pozvana mijenja vrijednost isComplete varijable na true, što je i cilj zadatka.

Dovoljno je dakle otvoriti Remix, zalijepiti kod koji nam se prikazuje na ekranu u praznu datoteku (1), otvoriti Run jezičac (2), unijeti adresu u At Address dio pored imena ugovora (3), pobrinuti se da je Environment pri vrhu ekrana na “Injected Web3” (4), i kliknuti na At Address (5).

Process
Process

Ako dobijete sljedeću grešku prilikom dodavanja koda u novu datoteku:

browser/Untitled.sol:1:1: SyntaxError: Source file requires different compiler version (current compiler is 0.4.19+commit.c4cbbb05.Emscripten.clang - note that nightly builds are considered to be strictly less than the released version

… na jezičcu “Settings” promijenite prvu vrijednost “Solidity Version” na neku veću – po mogućnosti prvu na popisu koja je najnovija.

Nakon tog procesa, gumb callme i gumb isComplete postati će dostupni u sučelju tog pametnog ugovora:

Pametni ugovor u Remixu
Pametni ugovor u Remixu

Primjetite da klikom na isComplete gumb dobivate odgovor false, što pokazuje da zadatak još nije izvršen.

Klikom na crveni gumb “callme” izvršiti će se callme funkcija uzrokovanjem transakcije preko MetaMask ekstenzije. Potvrdite je, i zadatak je izvršen. Možemo ga provjeriti i ponovnim klikom na isCompleted gumb, i u igri klikom na “Check solution”.

Win
Win

Choose a nickname

U sličnom ruhu, sljedeći zadatak od nas zahtjeva da odaberemo nadimak.

Kod izazova je sljedeći:

pragma solidity ^0.4.21;

// Relevant part of the CaptureTheEther contract.
contract CaptureTheEther {
    mapping (address => bytes32) public nicknameOf;

    function setNickname(bytes32 nickname) public {
        nicknameOf[msg.sender] = nickname;
    }
}

// Challenge contract. You don't need to do anything with this; it just verifies
// that you set a nickname for yourself.
contract NicknameChallenge {
    CaptureTheEther cte = CaptureTheEther(msg.sender);
    address player;

    // Your address gets passed in as a constructor parameter.
    function NicknameChallenge(address _player) public {
        player = _player;
    }

    // Check that the first character is not null.
    function isComplete() public view returns (bool) {
        return cte.nicknameOf(player)[0] != 0;
    }
}

Bitno je napomenuti da je kod koji je vidljiv na ekranu zapravo spoj dijelova dva različita ugovora. Funkcija setNickname je glavna funkcija CaptureTheEther glavnog pametnog ugovora cijele igre, ali je ovdje prikazana bez ostale logike koja pokreće igru radi jednostavnosti. To ne znači da se cijeli ugovor sastoji samo od te funkcije!

contract CaptureTheEther {
    mapping (address => bytes32) public nicknameOf;

    function setNickname(bytes32 nickname) public {
        nicknameOf[msg.sender] = nickname;
    }
}

Ovaj ugovor prvo definira mapping koji spaja Ethereum adrese i tekst. Funkcija setNickname koja je public prima jedan tekstualni argument – nadimak igrača – te ga sprema na njegovu adresu u nicknameOf mapping.

Drugi ugovor NicknameChallenge je tu samo kao validator uspješnog izvršenja ovog trenutnog zadatka. U programiranju takav program zovemo “Test”, jer mu je jedina svrha da testira uspješnost prvog programa.

contract NicknameChallenge {
    CaptureTheEther cte = CaptureTheEther(msg.sender);
    address player;

    // Your address gets passed in as a constructor parameter.
    function NicknameChallenge(address _player) public {
        player = _player;
    }

    // Check that the first character is not null.
    function isComplete() public view returns (bool) {
        return cte.nicknameOf(player)[0] != 0;
    }
}

Ovaj ugovor prvo referencira (otvara) već pokrenuti CaptureTheEther ugovor za trenutnog korisnika, sprema ga u cte varijablu, i deklarira varijablu player koja sprema adresu trenutnog igrača. To vidimo i u NicknameChallenge funkciji koja namjerno ima isti naziv kao i ugovor – funkcije koje imaju isti naziv kao i ugovori u kojima se nalaze zovu se constructor i automatski se pokreću kod pokretanja ugovora. Funkcija nakon primanja adrese igrača sprema tu vrijednost u prije definiranu player varijablu.

Konačno, isComplete provjerava je li zadatak pravilno izvršen: cte.nicknameOf poziva nicknameOf varijablu u CaptureTheEther ugovoru koji je referenciran u cte varijabli na početku test ugovora. [0] označava nulti (tj. prvi, jer brojanje počinje od 0) element u mappingu, dok != 0 uspoređuje taj prvi element s nulom – drugim riječima provjerava se da nadimak nije prazan.

Zadatak kaže sljedeće:

To complete this challenge, set your nickname to a non-empty string. The smart contract is running on the Ropsten test network at the address 0x71c46Ed333C35e4E6c62D32dc7C8F00D125b4fee.

Od nas se traži da na adresi 0x71c46Ed333C35e4E6c62D32dc7C8F00D125b4fee (vaša adresa biti će drukčija) pozovemo funkciju setNickname i postavimo si nadimak. Slijedimo proceduru iz prijašnjeg zadatka i dobiti ćemo sličnu funkcionalnost.

Set Nickname
Set Nickname

Primijetite da smo “bitfalls.com” nadimak unijeli s navodnicima. To je vrlo bitno u Remixu kada se radi s podacima koji su tekstualni. Navodnici ne ulaze u finalnu vrijednost. Da provjerite je li vaš nadimak spremljen, u igri kliknite na “Check solution”. Osim što će se pojaviti pobjednički ekran…

Win
Win

… ime igrača u gornjem desnom kutu igre će sada također biti promijenjeno.

Name
Name

Zaključak

Prošli smo kroz prva dva primjera igre CaptureTheEther kojoj je namjena educiranje i eksperimentiranje s Solidity programskim jezikom i pametnim ugovorima na Ethereum mreži.

Dok su neke odluke autora igre upitne (npr. funkcije koje se pozivaju samo izvana trebale bi biti external a ne public) igra je odličan izvor iskustva u Ethereum ekosustavu i predlažemo da, ukoliko imate programerskih aspiracija, pokušate doći na top listu. Sretno!

LEAVE A REPLY

Please enter your comment!
Please enter your name here