Od svog uvođenja 2014. programski jezik Solidity postao je de facto standard za pisanje pametnih ugovora na Ethereum blockchain mreži. Solidity je toliko popularan da ga podržavaju brojne blockchain mreže, uključujući Avalanche, Polygon i Binance Smart Chain.
U ovom ću članku pokriti osnove pisanja jednostavnog pametnog ugovora u Solidityju koji je varijacija uvodnog programa Hello World. Primjer ugovora može se činiti trivijalnim, ali pokazuje neke vrlo važne detalje koje svaki programer mora razumjeti da bi programirao u Solidityju.
Kako kompajlirati i implementirati pametni ugovor pomoću IDE-a
Solidity je prevedeni jezik koji koristi model prevođenja sličan Javi. U ovom modelu, Solidity izvorni kod je kompajliran u bajt kod. Taj se bajt kod pohranjuje na blockchainu i obrađuje ga Ethereum Virtual Machine (EVM) koji se nalazi na jednom od brojnih računalnih čvorova na blockchain mreži. Slika 1 ilustrira proces, sličan načinu na koji JVM obrađuje Java bajt kod.

Uobičajeni način za stvaranje Solidity pametnog ugovora je korištenje IDE-a kao što je Visual Studio Code ili Remix. VS Code IDE podržava Solidity putem dodatka za proširenje; Remix IDE, kao što je prikazano na slici 2, namijenjen je prvenstveno za korištenje kao mrežni IDE i podržava Solidity odmah nakon postavljanja.

Remix se također čvrsto integrira s blockchain tehnologijom. Programeri mogu izraditi, kompajlirati i implementirati pametni ugovor na interni blockchain emulator, testni blockchain na mreži zvan testnet ili proizvodni blockchain koji se obično naziva a glavna mreža. Za programere koji tek počinju s Solidity programiranjem, korištenje Remixa je najlakši način jer je to sve-u-jednom način za stvaranje pametnih ugovora.
Struktura Solidity pametnog ugovora
Programeri obično stvaraju izvorni kod Solidity pametnog ugovora kao .sol datoteku.
Struktura Solidity pametnog ugovora slična je klasi u objektno orijentiranom programiranju. U OOP-u, klasa je osnovna organizacijska jedinica za grupiranje funkcija i članova podataka; analogni ekvivalent u Solidityju je ugovor.
Slika 3 prikazuje jednostavan pametni ugovor koji izlaže funkciju pod nazivom getMessage() koja vraća poruku kada se pozove. Odjeljci u nastavku opisuju detalje pametnog ugovora.

Kao što je ranije spomenuto, Solidity je kompajlirani programski jezik. Solidity prevodilac se razvio tijekom godina kako bi se prilagodio brojnim današnjim verzijama prevoditelja. Kao takav, Solidity pametni ugovor mora deklarirati verziju kompajlera koju izvorni kod podržava. Ova je deklaracija prva izjava u pametnom ugovoru i definirana je pomoću ključne riječi pragma kao što je prikazano u oblačiću 1, slika 3. U ovom primjeru izjava pragma označava da razvojni programer koristi Solidity kompajler verzije 0.8.9.0 ili novije. Kod za stvarni pametni ugovor slijedi nakon ove izjave.
Programer zatim objavljuje pametni ugovor koristeći ključnu riječ contract u oblačiću 2, slika 3. U gornjem primjeru, pametni ugovor se zove BasicContract. Sav kod pametnog ugovora nalazi se između vitičastih zagrada BasicContracta.
Kao što je spomenuto na početku članka, Solidity je vrlo sličan OOP jezicima kao što su Java ili C#. Jedna od tih sličnosti je da Solidity podržava konstruktor za implementaciju ponašanja inicijalizacije u pametnom ugovoru. Konstruktor u oblačiću 3, sl. 3 dodjeljuje vrijednost Hello, World! na varijablu imenovanu frazom. Ovo se ponašanje pokreće kada se pametni ugovor prvi put implementira na ciljanu blockchain mrežu.
Još jedna sličnost s OOP-om je da Solidity podržava privatni i javni opseg. Privatni opseg znači da su varijable i funkcije deklarirane kao privatne vidljive samo unutar pametnog ugovora. Varijable i funkcije deklarirane kao javne dostupne su izvan pametnog ugovora.
U kodu BasicContract prikazanom na slici 3, varijabla pod nazivom fraza deklarirana je u retku 6. Varijabla je tipa niz i ima privatni opseg, što znači da je održiva samo unutar pametnog ugovora. Međutim, funkcija pod nazivom getMessage() u oblačiću 4, slika 3 je javna. To znači da se funkcija može pozvati izvan pametnog ugovora.
Za one od vas koji su programirali u Javi ili C#, ovo je prilično standardna stvar. Ali interni kod funkcije getMessage() sadrži ključne riječi kao što su memorija, pogled i bajtovi koji otkrivaju posebne aspekte Solidity programiranja.
Pogledajmo još jednom izoliranu funkciju getMessage().
Anatomija funkcije čvrstoće
Slika 4 prikazuje funkciju Solidity getMessage() u izolaciji. Funkcija vraća niz kako ga je deklarirao (string memory) u retku 12. Ključna riječ memory znači da je vraćena vrijednost pohranjena samo u memoriji. Ništa nije pohranjeno na temeljnom računalu koje podržava pametni ugovor.

Također primijetite da funkcija getMessage() dobiva javni opseg i da potpis funkcije koristi prikaz ključne riječi.
Ključna riječ view, koja je specifična za Solidity, znači da je stanje ugovora nepromjenjivo — drugim riječima, funkcija je samo za čitanje. U pametni ugovor ne dodaju se novi podaci, a vrijednosti za varijable izvan funkcije ostaju nepromijenjene.
Na primjer, slika 5 prikazuje pogrešnu upotrebu pogleda u Solidity kodu. Primijetite da se pogled ključne riječi koristi u potpisu funkcije add() u retku 22, no funkcija add() mijenja stanje varijable pod nazivom c deklarirane u retku 20 koja je izvan funkcije. Korištenje prikaza ključne riječi omogućuje Remix IDE-u da izbaci pogrešku tijekom dizajna jer je stanje ugovora promijenjeno.

Uz tehnike programiranja koje se obično vide u jezicima više razine kao što su Java i JavaScript, Solidity ima mnoge značajke koje se obično povezuju s jezicima niske razine kao što su C i C++. To je osobito vidljivo kod manipulacije stringovima. Jezici kao što su JavaScript i Java automatski spajaju nizove kada je to potrebno bez potrebe za manipulacijom memorije niske razine. Takva manipulacija stringovima u Solidityju malo je složenija.
Na primjer, u retku 13 na gornjoj slici 4, za spajanje dva niza zajedno u Solidityju potrebno je konvertirati nizove u nizove od dva bajta u kombinaciji pomoću funkcije abi.encodePacked() za stvaranje trećeg niza nazvanog spojeni. Rezultirajući niz je vrijednost koju vraća funkcija getMessage().
Biblioteka abi, koja je ugrađena u Solidity, pruža funkcije za kodiranje i dekodiranje podataka prema ABI specifikaciji. ABI specifikacija opisuje skup funkcija koje se obično koriste u programiranju pametnih ugovora na jezično-agnostički način; spajanje nizova je jedna takva funkcija.
Postoje druge biblioteke koje se mogu uvesti u pametni ugovor koje pojednostavljuju manipulaciju nizovima. Međutim, korištenje Solidity-a izvan okvira za kombiniranje nizova ima pristup niske razine za rad sa nizovima. Detaljnije ćemo raspravljati o uvozu knjižnica u Solidity u budućim člancima.
Razumijevanje naknada za plin u funkciji Solidity
Uz pružanje mogućnosti programiranja niske razine, postoji još nešto što je posebno u Solidity programiranju i programiranju pametnih ugovora općenito. Pokretanje pametnog ugovora na blockchainu zahtijeva naknade koje se moraju platiti u kriptovaluti koja je izvorna za određeni blockchain.
Na primjer, ako pokrenete Solidity pametni ugovor na mreži Ethereum, platit ćete naknade koje morate platiti u kriptovaluti Ether (ETH). Pokrenite Solidity program u mreži Hedera i platit ćete naknade koje morate platiti u HBAR-u. Postoje i drugi tandemi blockchaina i kriptovaluta koje također treba razmotriti.
Te se naknade naplaćuju zbog prirode odnosa između pametnih ugovora i pridružene blockchain mreže.
Ovih dana, cijena računalstva u smislu stvarno obavljenog posla nije toliko briga za mnoge programere. Pohranjivanje je jeftino, memorija je jeftina, a cijena CPU ciklusa je beskrajno mala.
Međutim, važan je svaki dio posla koji obavi pametni ugovor i svaki resurs koji koristi. Blockchain mreže su, po definiciji, konzorcij od desetaka pa do tisuća autonomnih strojeva u neovisnom vlasništvu koji djeluju usklađeno prema dobro poznatim algoritmima. Vlasnici tih strojeva žele biti plaćeni za resurse koje koristi pametni ugovor.
Za implementaciju Solidity pametnog ugovora na proizvodni blockchain, kao što je Ethereum mainnet, postoji naknada kad god se resursi kao što su memorija i CPU ciklusi koriste za provjeru valjanosti transakcije. Na primjer, postoji naknada kada se pametni ugovor implementira, a još jedna kada se pozove funkcija pametnog ugovora. Sve naknade nastale za potvrdu transakcije nazivaju se naknada za plin.
Izračun naknade za plin ovisi o blockchainu na kojem je implementiran pametni ugovor. Pojedinosti o optimizaciji naknade za plin malo su izvan opsega ovog članka; obradit ćemo ih kasnije. Za sada je važno razumjeti da će vas pametni ugovor koji implementirate na produkcijski blockchain koštati dok radi. Također, morate imati dovoljno kriptovalute blockchaina da biste platili transakcijske naknade koje naplaćuje vaš pametni ugovor.
Kad imate pametni ugovor, nema besplatnog ručka. Takva je priroda decentraliziranog računalstva.
Sve skupa
Pametni ugovori izgrađeni na blockchainovima transformiraju poduzeća i opskrbne lance. Razne blockchain platforme podržavaju Solidity, što sugerira da će svijetu trebati više Solidity programera, a ne manje. Slučajevi korištenja će rasti. Prilike su očite.
Solidity je vrlo moćan programski jezik koji razvojnim programerima omogućuje pisanje pametnih ugovora koji upravljaju zadacima koji su mnogo važniji za poslovanje od jednostavne aplikacije Hello World. Zakup nekretnina, kupnja karata i aktivnosti opskrbnog lanca mogu proizaći iz blockchaina. Kao i kod učenja bilo kojeg programskog jezika, najbolje je započeti od početka sa Solidityjem prije nego prijeđete na njegove naprednije značajke.







