Hrvatski

Istražite Solidity, vodeći programski jezik za razvoj pametnih ugovora na Ethereum blockchainu. Ovaj sveobuhvatan vodič pokriva sve, od osnovnih koncepata do naprednih tehnika.

Solidity: Sveobuhvatan vodič za programiranje pametnih ugovora

Solidity je programski jezik visoke razine, orijentiran na ugovore, koji se koristi za implementaciju pametnih ugovora na različitim blockchain platformama, a najpoznatiji je Ethereum. Na njega su snažno utjecali C++, Python i JavaScript, a dizajniran je za Ethereum Virtual Machine (EVM). Ovaj vodič pruža detaljan pregled Solidityja, prikladan i za početnike i za iskusne programere koji žele uroniti u svijet razvoja blockchaina.

Što su pametni ugovori?

Prije nego što uronimo u Solidity, ključno je razumjeti što su pametni ugovori. Pametni ugovor je samoispunjavajući ugovor s uvjetima sporazuma izravno upisanim u kod. Pohranjuje se na blockchainu i automatski se izvršava kada su ispunjeni unaprijed određeni uvjeti. Pametni ugovori omogućuju automatizaciju, transparentnost i sigurnost u različitim aplikacijama, uključujući:

Zašto Solidity?

Solidity je dominantni jezik za pisanje pametnih ugovora na Ethereumu i drugim blockchainovima kompatibilnim s EVM-om zbog nekoliko čimbenika:

Postavljanje vašeg razvojnog okruženja

Da biste počeli razvijati s Solidityjem, morat ćete postaviti prikladno razvojno okruženje. Evo nekoliko popularnih opcija:

Remix IDE

Remix je online IDE koji se temelji na pregledniku i savršen je za učenje i eksperimentiranje sa Solidityjem. Ne zahtijeva lokalnu instalaciju i pruža značajke kao što su:

Pristupite Remix IDE na https://remix.ethereum.org/

Truffle Suite

Truffle je sveobuhvatan razvojni okvir koji pojednostavljuje proces izgradnje, testiranja i postavljanja pametnih ugovora. Pruža alate kao što su:

Za instalaciju Truffle:

npm install -g truffle

Hardhat

Hardhat je još jedno popularno razvojno okruženje za Ethereum, poznato po svojoj fleksibilnosti i proširivosti. Omogućuje vam prevođenje, postavljanje, testiranje i otklanjanje pogrešaka u vašem Solidity kodu. Ključne značajke uključuju:

Za instalaciju Hardhat:

npm install --save-dev hardhat

Solidity osnove: Sintaksa i tipovi podataka

Istražimo temeljnu sintaksu i tipove podataka u Solidityju.

Struktura Solidity ugovora

Solidity ugovor sličan je klasi u objektno orijentiranom programiranju. Sastoji se od varijabli stanja, funkcija i događaja. Evo jednostavnog primjera:

pragma solidity ^0.8.0;

contract SimpleStorage {
 uint256 storedData;

 function set(uint256 x) public {
 storedData = x;
 }

 function get() public view returns (uint256) {
 return storedData;
 }
}

Objašnjenje:

Tipovi podataka

Solidity podržava različite tipove podataka:

Primjer:

pragma solidity ^0.8.0;

contract DataTypes {
 uint256 public age = 30;
 bool public isAdult = true;
 address public owner = 0x5B38Da6a701c568545dCfcB03FcB875f56beddC4;
 bytes32 public name = "JohnDoe";
 uint[] public numbers = [1, 2, 3, 4, 5];
 mapping(address => uint) public balances;

 constructor() {
 balances[msg.sender] = 100;
 }
}

Varijable stanja vs. Lokalne varijable

Varijable stanja deklariraju se izvan funkcija i pohranjuju se na blockchainu. One opstaju tijekom poziva funkcija i izvršavanja ugovora. U gornjem primjeru, storedData je varijabla stanja.

Lokalne varijable deklariraju se unutar funkcija i postoje samo unutar opsega te funkcije. Ne pohranjuju se na blockchainu i odbacuju se kada funkcija završi.

Funkcije u Solidityju

Funkcije su građevni blokovi pametnih ugovora. One definiraju logiku i operacije koje ugovor može izvoditi. Funkcije mogu:

Vidljivost funkcije

Solidity funkcije imaju četiri modifikatora vidljivosti:

Modifikatori funkcije

Modifikatori funkcije koriste se za izmjenu ponašanja funkcije. Često se koriste za provedbu sigurnosnih ograničenja ili izvođenje provjera prije izvršavanja logike funkcije.

Primjer:

pragma solidity ^0.8.0;

contract Ownership {
 address public owner;

 constructor() {
 owner = msg.sender;
 }

 modifier onlyOwner() {
 require(msg.sender == owner, "Only owner can call this function");
 _;
 }

 function transferOwnership(address newOwner) public onlyOwner {
 owner = newOwner;
 }
}

U ovom primjeru, modifikator onlyOwner provjerava je li pozivatelj vlasnik ugovora. Ako nije, poništava transakciju. Zamjenski znak _ predstavlja ostatak koda funkcije.

Promjenjivost stanja funkcije

Solidity funkcije također mogu imati modifikatore promjenjivosti stanja:

Primjer:

pragma solidity ^0.8.0;

contract Example {
 uint256 public value;

 function getValue() public view returns (uint256) {
 return value;
 }

 function add(uint256 x) public pure returns (uint256) {
 return x + 5;
 }

 function deposit() public payable {
 value += msg.value;
 }
}

Kontrolne strukture

Solidity podržava standardne kontrolne strukture kao što su if, else, for, while i do-while petlje.

Primjer:

pragma solidity ^0.8.0;

contract ControlStructures {
 function checkValue(uint256 x) public pure returns (string memory) {
 if (x > 10) {
 return "Value is greater than 10";
 } else if (x < 10) {
 return "Value is less than 10";
 } else {
 return "Value is equal to 10";
 }
 }

 function sumArray(uint[] memory arr) public pure returns (uint256) {
 uint256 sum = 0;
 for (uint256 i = 0; i < arr.length; i++) {
 sum += arr[i];
 }
 return sum;
 }
}

Događaji i zapisivanje

Događaji omogućuju pametnim ugovorima komunikaciju s vanjskim svijetom. Kada se dogodi događaj, on se pohranjuje u zapisnike transakcija blockchaina. Te zapisnike mogu nadzirati vanjske aplikacije za praćenje aktivnosti ugovora.

Primjer:

pragma solidity ^0.8.0;

contract EventExample {
 event ValueChanged(address indexed caller, uint256 newValue);

 uint256 public value;

 function setValue(uint256 newValue) public {
 value = newValue;
 emit ValueChanged(msg.sender, newValue);
 }
}

U ovom primjeru, događaj ValueChanged se emitira kad god se pozove funkcija setValue. Ključna riječ indexed na parametru caller omogućuje vanjskim aplikacijama filtriranje događaja na temelju adrese pozivatelja.

Nasljeđivanje

Solidity podržava nasljeđivanje, omogućujući vam stvaranje novih ugovora na temelju postojećih. To promiče ponovnu upotrebu koda i modularnost.

Primjer:

pragma solidity ^0.8.0;

contract BaseContract {
 uint256 public value;

 function setValue(uint256 newValue) public {
 value = newValue;
 }
}

contract DerivedContract is BaseContract {
 function incrementValue() public {
 value++;
 }
}

U ovom primjeru, DerivedContract nasljeđuje od BaseContract. Nasljeđuje varijablu stanja value i funkciju setValue. Također definira vlastitu funkciju, incrementValue.

Biblioteke

Biblioteke su slične ugovorima, ali ne mogu pohranjivati podatke. Koriste se za implementaciju koda za višekratnu upotrebu koji mogu pozvati više ugovora. Biblioteke se implementiraju samo jednom, što smanjuje troškove plina.

Primjer:

pragma solidity ^0.8.0;

library Math {
 function add(uint256 a, uint256 b) internal pure returns (uint256) {
 return a + b;
 }
}

contract Example {
 using Math for uint256;
 uint256 public result;

 function calculateSum(uint256 x, uint256 y) public {
 result = x.add(y);
 }
}

U ovom primjeru, biblioteka Math definira funkciju add. Izraz using Math for uint256; omogućuje vam pozivanje funkcije add na varijablama uint256 pomoću notacije točke.

Uobičajene ranjivosti pametnih ugovora

Pametni ugovori podložni su raznim ranjivostima koje mogu dovesti do gubitka sredstava ili neočekivanog ponašanja. Ključno je biti svjestan tih ranjivosti i poduzeti korake za njihovo ublažavanje.

Ponovni ulaz

Do ponovnog ulaza dolazi kada ugovor poziva vanjski ugovor, a vanjski ugovor poziva natrag u izvorni ugovor prije nego što se izvršenje izvornog ugovora dovrši. To može dovesti do neočekivanih promjena stanja.

Ublažavanje: Koristite uzorak Provjere-Učinci-Interakcije i razmislite o upotrebi funkcija transfer ili send za ograničavanje plina dostupnog za vanjski poziv.

Prelijevanje i podlijevanje

Do prelijevanja dolazi kada aritmetička operacija premašuje maksimalnu vrijednost tipa podataka. Do podlijevanja dolazi kada aritmetička operacija rezultira vrijednošću manjom od minimalne vrijednosti tipa podataka.

Ublažavanje: Koristite SafeMath biblioteke (iako su s Solidity 0.8.0 i novijim verzijama provjere prelijevanja i podlijevanja ugrađene prema zadanim postavkama) kako biste spriječili ove probleme.

Ovisnost o vremenskoj oznaci

Oslanjanje na vremensku oznaku bloka (block.timestamp) može vaš ugovor učiniti ranjivim na manipulaciju od strane rudara, jer oni imaju određenu kontrolu nad vremenskom oznakom.

Ublažavanje: Izbjegavajte upotrebu block.timestamp za kritičnu logiku. Razmislite o upotrebi proročanstava ili drugih pouzdanijih izvora vremena.

Uskraćivanje usluge (DoS)

DoS napadi imaju za cilj učiniti ugovor neupotrebljivim legitimnim korisnicima. To se može postići potrošnjom svog dostupnog plina ili iskorištavanjem ranjivosti koje uzrokuju poništavanje ugovora.

Ublažavanje: Implementirajte ograničenja plina, izbjegavajte petlje s neograničenim iteracijama i pažljivo provjerite korisničke unose.

Prednje pokretanje

Do prednjeg pokretanja dolazi kada netko promatra transakciju na čekanju i podnosi vlastitu transakciju s višom cijenom plina kako bi se izvršila prije izvorne transakcije.

Ublažavanje: Koristite sheme obvezivanja-otkrivanja ili druge tehnike za skrivanje detalja transakcije dok se ne izvrše.

Najbolje prakse za pisanje sigurnih pametnih ugovora

Napredni Solidity koncepti

Kada steknete čvrsto razumijevanje osnova, možete istražiti naprednije koncepte:

Asembler

Solidity vam omogućuje pisanje inline asemblerskog koda, što vam daje veću kontrolu nad EVM-om. Međutim, to također povećava rizik od uvođenja pogrešaka i ranjivosti.

Proxyji

Proxyji vam omogućuju nadogradnju vaših pametnih ugovora bez migracije podataka. To uključuje implementaciju proxy ugovora koji prosljeđuje pozive ugovoru za implementaciju. Kada želite nadograditi ugovor, jednostavno implementirate novi ugovor za implementaciju i ažurirate proxy da pokazuje na novu implementaciju.

Meta-transakcije

Meta-transakcije omogućuju korisnicima interakciju s vašim pametnim ugovorom bez izravnog plaćanja naknada za plin. Umjesto toga, relej plaća naknade za plin u njihovo ime. To može poboljšati korisničko iskustvo, posebno za korisnike koji su novi u blockchainu.

EIP-721 i EIP-1155 (NFT-ovi)

Solidity se obično koristi za stvaranje nezamjenjivih tokena (NFT-ova) pomoću standarda kao što su EIP-721 i EIP-1155. Razumijevanje ovih standarda ključno je za izgradnju aplikacija temeljenih na NFT-ovima.

Solidity i budućnost Blockchaina

Solidity igra ključnu ulogu u brzo rastućem krajoliku blockchain tehnologije. Kako se usvajanje blockchaina nastavlja rasti, programeri Solidityja bit će vrlo traženi za izgradnju inovativnih i sigurnih decentraliziranih aplikacija. Jezik se neprestano ažurira i poboljšava, stoga je ostati u tijeku s najnovijim događajima ključno za uspjeh u ovom području.

Zaključak

Solidity je moćan i svestran jezik za izgradnju pametnih ugovora na Ethereum blockchainu. Ovaj vodič pružio je sveobuhvatan pregled Solidityja, od osnovnih koncepata do naprednih tehnika. Ovladavanjem Solidityjem i slijeđenjem najboljih praksi za siguran razvoj, možete pridonijeti uzbudljivom svijetu decentraliziranih aplikacija i pomoći u oblikovanju budućnosti blockchain tehnologije. Zapamtite da uvijek dajete prednost sigurnosti, temeljito testirajte svoj kod i budite informirani o najnovijim događajima u Solidity ekosustavu. Potencijal pametnih ugovora je ogroman, a uz Solidity možete oživjeti svoje inovativne ideje.