diff options
| author | Al <develop0to1@gmail.com> | 2022-07-19 12:16:02 +0200 | 
|---|---|---|
| committer | Al <develop0to1@gmail.com> | 2022-07-19 12:16:02 +0200 | 
| commit | 7b47a236637e5769788bda2616cc916233531238 (patch) | |
| tree | 520aed7d8eb8f0151cc2484dcfbc41abeaa8ff69 /it-it/solidity.html.markdown | |
| parent | a35979214c3d83e201e7874658c75ed598635e55 (diff) | |
Translate bank example
Diffstat (limited to 'it-it/solidity.html.markdown')
| -rw-r--r-- | it-it/solidity.html.markdown | 102 | 
1 files changed, 101 insertions, 1 deletions
| diff --git a/it-it/solidity.html.markdown b/it-it/solidity.html.markdown index 84680ba1..c08f0355 100644 --- a/it-it/solidity.html.markdown +++ b/it-it/solidity.html.markdown @@ -115,4 +115,104 @@ Per ora continua a usare la `Javascript VM` a meno che non ti sia detto di  cambiarla. Quando distribuisci su una testnet, Metamask aprirà un pop up che  ti chiederà di "confermare" la transazione. Premi `yes` e dopo un certo lasso  di tempo, ti apparirà la stessa interfaccia per il contratto nella parte -inferiore dello schermo.
\ No newline at end of file +inferiore dello schermo. + + +```javascript +// Iniziamo con un semplice contratto su una Banca +// Permette di depositare, prelevare e fare l'estratto conto + +// simple_bank.sol (nota l'estensione .sol) +/* **** INIZIO DELL'ESEMPIO **** */ + +// Dichiara la versione del compilatore per il file sorgente +pragma solidity ^0.6.6; + +// Inizia con il commento Natspec (i tre slash) +// viene usato per la documentazione - e per i dati descrittivi per gli elementi +// dell'interfaccia utente / azioni + +/// @title SimpleBank +/// @author nemild + +/* 'contract' somiglia a 'class' in altri linguaggi (ha variabili di classe, +ereditarietà, etc.) */ +contract SimpleBank { // CapWords +    // Dichiariamo le variabili di stato fuori dalle funzioni, persisteranno +    // durante tutta la vita del contratto + +    // i dizionari mappano gli indirizzi con i saldi +    // fai sempre attenzione agli overflow attack che sfruttano i numeri +    mapping (address => uint) private balances; + +    // "private" significa che che altri contratti non possono leggere i +    // saldi ma le informazioni restano visibili ad altri attori sulla blockchain + +    address public owner; +    // 'public' lo rende leggibile dall'esterno (ma non modificabile) dagli +    // utenti e dai contratti + +    // Gli 'event' pubblicano le azioni in modo che siano ascoltabili da +    // listener esterni +    event LogDepositMade(address accountAddress, uint amount); + +    // I 'constructor' possono ricevere una o più parametri; Si può +    // dichiarare un solo costruttore +    constructor() public { +        // 'msg' fornisce i dettagli sul messaggio che è stato mandato al contratto +        // 'msg.sender' è chi invoca il contratto (l'indirizzo di chi lo crea) +        owner = msg.sender; +    } + +    /// @notice Deposita ether nella banca +    /// @return Il saldo dell'utente dopo che è stato effettualto il deposito +    function deposit() public payable returns (uint) { +        // Usiamo 'require' per testare gli input dell'utente, 'assert' per gli +        // invarianti interni. Qui ci assicuriamo di non avere a che fare con +        // un overflow +        require((balances[msg.sender] + msg.value) >= balances[msg.sender]); + +        balances[msg.sender] += msg.value; +        // Non servono "this." o "self." con le variabili di stato +        // Tutti i valori iniziali delle variabili sono impostati automaticamente +        // al valore di default per quel tipo di dato + +        emit LogDepositMade(msg.sender, msg.value); // Fa scattare l'evento + +        return balances[msg.sender]; +    } + +    /// @notice Preleva ether dalla banca +    /// @dev Non restituisce gli ether inviati in eccesso +    /// @param withdrawAmount L'importo che si vuole ritirare +    /// @return remainingBal +    function withdraw(uint withdrawAmount) public returns (uint remainingBal) { +        require(withdrawAmount <= balances[msg.sender]); + +        // Notiamo come per prima cosa scaliamo i soldi dal saldo, prima di +        // invarli. Ogni .transfer/.send in questo contratto può chiamare una  +        // funzione esterna. Questa cosa potrebbe permettere a chi invoca la +        // funzione di richiedere un importo maggiore del suo saldo usando +        // una chiamata ricorsiva. Miriamo ad aggiornare lo stato prima che sia +        // chiamata una funzione esterna, incluse .transfer/.send +        balances[msg.sender] -= withdrawAmount; + +        // Qui lancia automaticamente un errore se fallisce, il che implica +        // che il saldo (non più aggiornato) viene ripristinato a prima della +        // transazione +        msg.sender.transfer(withdrawAmount); + +        return balances[msg.sender]; +    } + +    /// @notice Recupera il saldo +    /// @return Il saldo dell'utente +    // 'view' (ex: constant) impedisce alle funzioni di modificare lo stato +    // delle variabili; consente alle le funzioni di essere disponibili in +    // locale/fuori dalla blockchain +    function balance() view public returns (uint) { +        return balances[msg.sender]; +    } +} +// ** FINE DELL'ESEMPIO ** +``` | 
