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).

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:

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”.

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.

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…

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

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!