Skip to content

Solidity uvod

Dodatni materijali

Osnovni tipovi podataka

  • address default 0x0...0
  • int256 default 0
  • uint256 default 0
  • boolean default false
  • string ""
    contract tipovi{
        bool public boolean; // false
        uint256 public neoznaceni_broj; // 0
        int256 public oznaceni_broj; // 0
        address public adresa; // 0x0000000000000000000000000000000000000000
    
        //public znaci da imam podrazumevani getter
        //ne znaci da bilo ko moze da promeni promenljivu
    }
    

Promenljive

  • lokalne (promenljive definisane u funkcijama - ne cuvaju se na blockchainu)
  • stanja (promenljive definisane u ugovoru - cuvaju se na blockchainu)
  • env promenljive (globalne - cuvaju se na blockchainu- promenljive poput ko je pozvao funkciju, koji je redni broj bloka...)
contract promenljive{
    //promenljive stanja(cuvaju se na blockchainu, placamo gas za njih):
    bool proba; 
    address nesto;
    function proba() public view{
        //lokalne promenljive(postoje samo dok se funkcija izvrsava, ne placamo gas za njihovo cuvanje):
        uint broj;
        address neko;

        //globalne promenljive(ne deklarisu se, imaju podatke o blockchainu, svakako postoje):
        msg.sender
        msg.value
        block.blockhash 
        ...
    }

}

Kontrola toka

  • grananje if/else if...
  • petlje for, while
contract kontrola_toka{
    function proba() public pure{
        for(uint i = 0; i < 10; i++){
            if(i % 3 == 1) continue;
            else if(i == 7) break;
        }
    }

}

Napradniji tipovi podataka

  • mapping
  • struct
  • array
contract stuktura{
    struct student{
        string ime;
        uint polozenoESPB;
    }
    uint[] public niz; // niz dinamicke duzine
    uint[3] public niz2; // niz od 3 elementa
    mapping (uint => uint) public transformacija; // kljuc -> vrednost, nije iterablian
    student[] private studenti;
    mapping (address => student) public nesto; //mapping ne dozvoljava strukturu kao kljuc 

    function dodaj(uint _a) public {
        transformacija[_a] = (_a + 7)* 57 % 23;
        niz.push(_a);
    } 
    function suma() public view returns(uint){
        uint s = 0;
        uint i;
        for(i = 0; i < niz.length;i++){
            s += niz[i];
        }
        return s;
    }
}

Funkcije

  • public/private
  • view/pure
  • constructor
  • modifier
  • payable
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.26;

contract PetStore {
    struct Pet{
        string ime;
        uint id;
        uint cena;
        address vlasnik;
        bool naprodaju;
    }
    uint broj;
    uint id;
    address public vlasnik;
    mapping (uint => Pet) public ljubimci;
    event AddedPet(string _ime, uint cena);
    event PetBought(uint _id);
    constructor(){
        broj = 0;
        id = 0;
        vlasnik = msg.sender;
    }
    modifier samoVlasnik(){
        require(vlasnik == msg.sender,"samo vlasnik sme da radi ovo");
        _;
    }
    function addPet(string memory _ime, uint _cena) public samoVlasnik{
        _dodaj(_me,_cena);
        emit AddedPet(_ime,_cena);
    }
    function _dodaj(string memory _ime, uint _cena) private{
        address _a;
        _cena = _cena ;
        Pet memory _pet = Pet(_ime,id,_cena,_a,true);
        ljubimci[id]= _pet;
        id += 1;
        broj += 1;
    }
    function buyPet(uint _id) public payable returns(bool){
        require(ljubimci[_id].naprodaju,"Nije na prodaju");
        require(msg.value == ljubimci[_id].cena, "nisi poslao tacno koliko treba" );
        ljubimci[_id].vlasnik = msg.sender;
        ljubimci[_id].naprodaju = false;
        broj -=1;
        emit PetBought(_id);
        return true;
    }
    function getPet(uint _id) public view returns(Pet memory){
       return ljubimci[_id]; 
    }

}