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
}
}