Salta el contingut

3. Funcions i Modificadors

Les funcions són el nucli de qualsevol smart contract. Solidity ofereix un sistema sofisticat de visibilitat, modificadors d'estat i modificadors personalitzats que permeten controlar amb precisió com i qui pot interactuar amb el contracte.

3.1 Visibilitat de Funcions

Visibilitat Accessible des de Notes
public Dins i fora del contracte Qualsevol caller
external Només des de fora Més eficient per arrays grans
internal Aquest contracte i derivats Com protected en OOP
private Exclusiu d'aquest contracte Màxima restricció

3.2 Modificadors d'Estat

Els modificadors d'estat indiquen com una funció interacciona amb les variables de la blockchain. Una correcta declaració estalvia gas i millora la llegibilitat del codi.

contract ModificadorsEstat {
    uint256 public valor = 100;
    mapping(address => uint256) public saldos;

    // view: pot llegir estat però NO modificar-lo
    function obtenirValor() public view returns (uint256) {
        return valor;
    }

    // pure: no llegeix NI modifica estat
    function calcular(uint256 a, uint256 b) public pure returns (uint256) {
        return a + b;
    }

    // payable: pot rebre Ether
    function dipositar() public payable {
        require(msg.value > 0, "Ha d'enviar Ether");
        saldos[msg.sender] += msg.value;
    }
} 
  • view

    Llegeix variables d'estat però no les modifica No consumeix gas si es crida externament

  • pure

    No accedeix a l'estat. Només opera amb paràmetres locals. Ideal per càlculs matemàtics.

  • payable

    Permet que la funció rebi Ether en la transacció. Essencial per contractes financers.

3.3 Modificadors Personalitzats

Els modificadors personalitzats permeten reutilitzar lògica de validació de forma elegant. El símbol _; indica on s'executa el cos de la funció modificada.

contract ModificadorsPersonalitzats {
 address public propietari;
 bool public actiu = true;

 modifier nomesPropietari() {
 require(msg.sender == propietari, "No es el propietari");
 _; // Executa la funció
 }

 modifier contracteActiu() {
 require(actiu, "Contracte no actiu");
 _;
 }

 constructor() {
 propietari = msg.sender;
 }

 function desactivar() public nomesPropietari {
 actiu = false;
 }

 function incrementar() public contracteActiu {
 // Lògica protegida
 }
}