U ovom ćemo članku demonstrirati kako pozvati funkcije pametnih ugovora na Ethereum blockchainu.
Funkcije su dijelovi koda koji izvršavaju određenu logiku. Npr. u CryptoHunt ICO-u ugradili smo funkciju requestRefund
koja se trebala pozvati da se vrate uložena sredstva kod neuspjeha ICO-a. Originalne upute bile su ovdje a u ovom ćemo članku demonstrirati proces na drugom, nepovezanom ugovoru.
Funkcije i Pametni Ugovori
Kada se pametni ugovor kompajlira, tj. prevodi u strojni jezik kojeg Ethereum razumije, on se komprimira u nečitki format (hashira se).
Zbog toga je za pozivanje funkcija potrebno nešto što zovemo ABI: Application Binary Interface. Ukratko, ABI je popis funkcija koje postoje na nekoj Ethereum adresi (i time u pametnom ugovoru koji leži na toj adresi), i taj popis se koristi za pokretanje tih funkcija. Zamišljajte ABI kao adapter za struju: laptop treba 12V a utičnica daje 200+V. Adapter pomaže da laptop može koristiti utičnicu od 200 i više bez da pregori.
ABI se generira prilikom kompajliranja pametnih ugovora i obično bude u posebnoj datoteci uz sam pametni ugovor napisan u Soliditiju ili u alatu koji radi kompilaciju (npr. Remix).
Bitno je napomenuti da ABI ne mora 100% odgovarati napisanom ugovoru – ako ugovor ima 10 funkcija od kojih je jedna mojaFunkcija
, ABI koji ima samo mojaFunkcija
u svojoj definiciji biti će dovoljan da se ta specifična funkcija pozove.
No, kako do ABI?
Postoji više načina:
- Autor pametnog ugovora nerijetko će izbaciti ABI u dokumentaciji svog projekta. Npr. ABI naše tombole je ovdje.
- Ako je autor izbacio izvorni kod svog pametnog ugovora, ABI se može generirati putem alata kao što su Truffle, Solc, ili čak Remix.
Demonstrirati ćemo oba pristupa u primjerima ispod.
Primjer
Prođimo kroz primjer izvršenja funkcije na Ethereum blockchainu. Nedavno smo kreirali tombolu za popularnu Splitsku blockchain konferenciju Blocksplit:
Datum minimalnog trajanja definiran u pametnom ugovoru tombole je završio, pa je stoga vrijeme da se pozove funkcija draw
dva puta kako bi se izvukla dva dobitnika.
Kako Generirati Solidity ABI
Ako je izvorni kod naše tombole sljedeći:
pragma solidity ^0.4.20;
contract Blocksplit {
address[] public players;
mapping (address => bool) public uniquePlayers;
address[] public winners;
address public charity = 0xc39eA9DB33F510407D2C77b06157c3Ae57247c2A;
uint256 drawnBlock = 0;
function() external payable {
play(msg.sender);
}
function play(address _participant) payable public {
require (winners.length < 2);
require (msg.value >= 1000000000000000 && msg.value <= 100000000000000000);
require (uniquePlayers[_participant] == false);
players.push(_participant);
uniquePlayers[_participant] = true;
}
function draw() external {
require (now > 1522908000);
require (block.number != drawnBlock);
require (winners.length < 2);
drawnBlock = block.number;
uint256 winningIndex = randomGen();
address winner = players[winningIndex];
winners.push(winner);
players[winningIndex] = players[players.length - 1];
players.length--;
if (winners.length == 2) {
charity.transfer(address(this).balance);
}
}
function randomGen() constant internal returns (uint256 randomNumber) {
uint256 seed = uint256(block.blockhash(block.number - 200));
return(uint256(keccak256(block.blockhash(block.number-1), seed )) % players.length);
}
}
Dovoljno je zalijepiti ga u novi ekran u Remix alatu, aktivirati kompilaciju pritiskom na Start to Compile, i otvoriti Details prozorčić.

Četvrti okvir od vrha u Details prozorčiću biti će ABI okvir. Kraj riječi ABI biti će mala ikona "kopiraj". Klik na tu ikonu će kopirati ABI ovog ugovora i isti će biti spreman za korištenje.

Demonstracije radi, pokrenuti ćemo draw
funckiju iz MyEtherWalleta i iz Remix-a, jednom za svakog pobjednika.
Pokretanje Ethereum funkcije putem MyEtherWallet alata
Jedan od najlakših načina za izvršenje funkcije na nekom Ethereum ugovoru je preko MyEtherWallet sučelja.
Otvorimo ekran "Contracts". U polje address
ide adresa ugovora na kojem izvršavamo funkciju, dok u donje, veće polje ide ABI. Desni izbornik postojećih ugovora može se ignorirati - to je isključivo za popularnije ugovore koje je MyEtherWallet tim odlučio trajno dodati u ponudu i nas se isti ne tiču.
Na Contracts ekranu u polje address unosimo 0x4127ab8d4a407b9fdcf1358f8d32b5686cb0b887
- adresu tombole. U ABI unosimo naš prije generirani ABI, ili ABI kojeg kopiramo odavde, a zatim pritišćemo "Access".
Otvara se izbornik "Read / Write Contract" koji nam omogućava interakciju s ugovorom. Npr. ako odaberemo funkciju players
i unesemo broj 4 u polje označeno s uint256
, dobiti ćemo petog po redu igrača tombole: adresu 0x5a8e3cabc6533958959892eee1419f3c1170fe72
.

Kako je točno došlo do toga da je taj igrač na petom mjestu kojem se pristupa brojem četiri saznajte u prijašnjem članku.
Sada odaberimo draw
funkciju.
Budući da je draw
funkcija "write" funkcija (funkcija koja piše podatke u blockchain), potrebno je izvršiti je transakcijom i platiti izvršenje. Zato nas MyEtherWallet pita kako želimo pristupiti novčaniku kojim ćemo izvršiti tu transakciju. Budući da smo ulogirani MetaMaskom, odabiremo tu opciju.

Odmah nakon klika na "Connect", izbor novčanika nestaje i ostaje samo "Write" gumb.

Klikom na isti, MyEtherWallet predlaže neke vrijednosti: količina Ethera koju želimo poslati uz ovu funkciju (0, jer ne šaljemo Ether nikome) i maksimalna količina gas-a koju želimo potrošiti na pokušaj izvršenja ove transakcije.

Budući da je funkcija dobro definirana u izvornom kodu pametnog ugovora, MyEtherWallet nema problema s preciznim predviđanjem koliko bi to gas-a moglo koštati. Potvrđivanjem ovog prozorčića, MetaMask nas pita za dodatni potvrdu izvršenja funkcije. Ukupni maksimalni trošak vršenja ove transakcije biti će 0.58 USD.

To možemo i smanjiti tako da kliknemo na postavke i promijenimo Gas Price. Manji gas price znači da će transakciji dulje trebati da se izvrši. Promjenom na 5 postižemo maksimalnu cijenu od 0.29 USD.

Nakon potvrde, MyEtherWallet izbaciti će poveznicu na upravo generiranu i poslanu transakciju koju možete pratiti uživo preko Etherscan platforme.

Nekoliko sekundi nakon slanja (u našem slučaju 22), transakcija bi trebala biti izvršena. Ako je sve prošlo kako treba, izvršenje funkcije winners
na našem ugovoru trebalo bi prikazati neku adresu na broju 0 (prvi pobjednik):

Prvi pobjednik je 0x58d092125a6945d45e18bc03d985c082dcab1a46
! Čestitamo!
Pokretanje funkcije putem Remix-a
Prođimo sada istu proceduru kroz Remix.
Remix nema mogućnost direktnog unosa ABI-ja, ali ga može generirati ako imamo pristup izvornom kodu pametnog ugovora.
Proces je sljedeći:
- Zalijepimo kod pametnog ugovora u prozor Remix-a
- Kliknemo na jezičac Run
- Odaberemo Injected Web3 pod Environment dok smo ulogirani u MetaMask
- Odaberemo naš ugovor na popisu u okviru ispod
- Create ostavimo prazno, a u At Addres stavimo adresu našeg ugovora tj. tombole
- Kliknemo na plavi "At Address" gumb.

To će kreirati sučelje za interakciju s ugovorom tombole. Osim što možemo pročitati svaku vrijednost tombole besplatno klikom na plave gumbe sučelja, možemo i direktno pokrenuti draw
funkciju klikom na njen crveni gumb.

Nakon toga, Remix nas pita za potvrdu izvršenja transakcije i za odabir cijene gas-a. On predlaže samo 2 Gwei, 5 puta manje od originalnog prijedloga s MyEtherWalleta. Remix uzima svoj prijedlog cijene s Ether Gas Station Info, stranice koja služi za analizu zauzetosti Ethereum mreže i prosječnih cijena transakcija.

Nakon potvrde, ponovno se javlja MetaMask za dodatnu potvrdu transakcije. Cijena ove transakcije - iako ima istu funckionalnost kao ona prošla - je zanemarivih 0.07 USD.

Nakon izvršenja, novi pobjednik je izvučen. To se može provjeriti i na MyEtherWallet, i u Remixu:


Prema pravilima definiranim u originalnom pametnom ugovoru, sav skupljeni ether u tomboli trebao je biti poslan na adresu Mining4Charity organizacije nakon izvlačenja 2 dobitnika. Pogledajmo je li zaista bilo tako. Adresa koju trebamo provjeriti je 0xc39eA9DB33F510407D2C77b06157c3Ae57247c2A. Budući da se radi o transakciji između ugovora na Ethereum blockchainu, a ne između korisnika vanjskih adresa, potrebno je pogledati "Internal Transactions" jezičac.

Zaista, transakcija je vidljiva - tombola je skupila dodatnih 0.5 Ethera za dobrotvorne svrhe!
Čestitamo novom pobjedniku 0xbc00d4391a507e36e8d62d3c37148860df2b9636
! Informacije o preuzimanju kupona biti će objavljene uskoro!
Zaključak
Pokrenuti Ethereum funkciju je vrlo jednostavno ako imamo adresu ugovora i njegov ABI. Ovom metodom možete pokretati razne funkcionalnosti raznih Ethereum aplikacija koje žive na blockchainu.
Zbog relativne kompleksnosti ove procedure i nepristupačnosti tehnički manje upućenim korisnicima izrađen je Web3.js - skup JavaScript funkcija koje ovaj proces olakšavaju. Više o tome u budućem članku.
Ako vam je ovaj članak koristio, razmislite o tome da nas podržite u daljnjem radu donacijom.