Tempo di lettura: 4 minuti

Dopo aver parlato di BatchOverflow in questa breve spiegazione, oggi parleremo sempre di sicurezza e Smart Contracts. Andremo infatti a lavorare con un una libreria che vuole risolvere, o almeno arginare vulnerabilità all’interno di Smart Contracts Ethereum: Open Zeppelin.

Introduzione

Open Zeppelin è un Framework, o meglio una libreria che nasce con lo scopo di fornire un set di Smart Contracts Open Source (testati quindi dalla comunità) da includere nei nostri SC per utilizzare codice sicuro, evitando di reinventare la ruota e cadere in banali ma fatali errori!

Installazione

Nella documentazione di OpenZeppelin viene suggerito l’utilizzo di Truffle, per poter generare un progetto attraverso il comando:

truffle init

OpenZeppelin è scaricabile attraverso npm con il comando

npm install -E openzeppelin-solidity

Questo comando andrà ad installare gli Smart Contracts di OpenZeppelin all’interno del nostro progetto nella directory

node_modules/openzeppelin-solidity/contracts

Remix IDE, una valida alternativa

In questo tutorial userò tuttavia Remix, l’IDE online di cui ho parlato in questo articolo. Prima di continuare con la lettura ti consiglio di leggerlo in quanto andremo ad utilizzare proprio Remix, che ci metterà di lavorare più velocemente con i nostri Smart Contracts! Cominciamo quindi con il tutorial di Open Zeppelin!

Ownership: gestisci la proprietà di uno Smart Contract in sicurezza!

Cominciamo con Ownable, famoso pattern per gestire permessi e proprietà di uno Smart Contract.

ownership smart contracts ethereum
Ownership: pattern importantissimo per i nostri Smart Contracts

Andiamo a creare due file:

  1. TestOwnership.sol
  2. Ownable.sol

Incolliamo all’interno di Ownable.sol il contenuto del file Ownable di OpenZeppelin, disponibile qui.

TestOwnership.sol sarà invece il nostro Smart Contract, che utilizzerà la libreria OpenZeppelin. Andiamo quindi ad importarlo con il comando import

pragma solidity ^0.4.21;
import "./Ownable.sol";
contract Open is Ownable{

    function getOwner() onlyOwner returns (string)   {
        return "Test";
    }

    function changeOwner(address a) {
        transferOwnership(a);
    }

}

Attraverso la keyword  is andremo a rendere il nostro contratto Open ereditario di Ownable, il contratto di OpenZeppelin. Questo ci permetterà di usufruire delle funzioni di Ownable, che andremo ora ad utilizzare!

Abbiamo infatti scritto due funzioni:

getOwner è una funzione marcata dal modifier onlyOwner (contenuto in Ownable), perciò potrà essere chiamata solamente dal creatore dello Smart Contract.

changeOwner invece ci permetterà di cambiare l’Owner del nostro SC! Proviamo quindi a passare alla funzione changeOwner il secondo indirizzo fornito da Remix, ricorda di includerlo tra doppi o singoli apici! Chiamando nuovamente getOwner ci potremmo accorgere che questa funzione verrà eseguita solamente nel caso in cui il chiamante sia il secondo account Ethereum, cioè il nuovo owner del nostro Smart Contract.

Crowdfunding con Blockchain e Open Zeppelin

Blockchain, Smart Contracts e Token sono gli strumenti perfetti per organizzare Crowdfunding in totale trasparenza. Tra i tanti file messi a disposizione da Open Zeppelin troviamo Crowdsale.sol e molti altri SC per creare Crowdfunding particolari, ciascuno con le proprie particolari funzionalità . Andiamo a fare una veloce review di questo Smart Contract.

crowdfunding open zeppelin
Blockchain e Crowdfunding: una combinazone perfetta!

Il funzionamento di un crowdfunding è molto semplice. Gli utenti potranno inviare i loro Ethereum all’indirizzo del nostro Smart Contract senza specificare alcuna funzione, in quanto presente una funzione di fallback, che si occuperà appunto di gestire gli ETH ricevuti con questa procedura.

function () external payable {
    buyTokens(msg.sender);
}

La funzione di fallback come puoi vedere non fa altro che chiamare la funzione buyTokens, passandogli come argomento l’indirizzo Ethereum del chiamante.

La funzione buyTokens è un po’ il core di questo Smart Contract. Prima di tutto salva in weiAmount la quantità di Wei inviati dal benefattore per poi passarlo alla funzione _preValidatePurchase. Questa funzione si occupa di validare la donazione, ed è estendibile nel nostro Smart Contract! Potremmo infatti modificarla andando ad aggiungere criteri come una soglia minima di donazione. Per istanziare questo Smart Contract dovremmo stabilire il rate, cioè i Wei di donazione saranno necessari per arrivare ad 1 Token ERC20.

SplitPayments, come fare sempre 50 e 50!

Dopo aver parlato di Crowdfunding andiamo ad analizzare un altro Smart Contract: SpliPayment. Questo semplice ma potente Contract ci permetterà di creare delle equity secondo cui verrà divisa qualsiasi cifra venga inviata al nostro Smart Contract!

tutorial open zeppelin solidity
Analisi di SplitPayment.sol

Possiamo trovare diverse variabili:

totalShares salverà il totale delle diverse equity

totalRealeased per tenere il conto di quanto è stato prelevato dallo Smart Contract

shares e released sono due mapping, due strutture necessarie per il salvataggio delle diverse quote (shares) e dei prelievi di ciascun indirizzo!

Cominciamo innanzitutto con il costruttore, che richiede come parametri due vettori: il primo contenente gli indirizzi Ethereum, il secondo le quote di ciascun indirizzo. Nel costruttore viene controllato che i due vettori siano della stessa lunghezza, in quanto ad ogni quota deve corrispondere un indirizzo.

Superato quindi il require alla riga 25 andiamo a scorrere i due vettori contemporaneamente chiamando la funzione addPayee.

addPayee effettua diversi controlli di sicurezza:

  1. Che l’indirizzo Ethereum non sia 0
  2. Che la quota sia maggiore di 0
  3. Che non siano già presenti indirizzi nel nostro mapping

Soddisfando queste tre condizioni andiamo a fare il push del nostro indirizzo all’interno del vettore payees, a modificare il nostro mapping shares e a sommare il totale delle quote.

Possiamo osservare alla riga 35 la fallback function, dal corpo vuoto. Scrivendo la funzione di fallback in questa maniera non faremo altro che salvare nel balance tutti i Wei inviati al nostro Smart Contract.

Non ci resta che studiare l’ultima parte di questo interessante Smart Contract: la funzione claim. Claim permetterà agli indirizzi Ethereum salvati nel vettore payees di ritirare la loro parte di Ethereum.

Salvando l’indirizzo del chiamante nella variabile payee alla riga 43 viene controllato che la sua quota sia maggiore di zero! Andiamo a calcolare il totale ricevuto dallo Smart Contract, da cui dobbiamo ricavare la parte che potrà ritirare ciascun utente, salvata in payment, che dovrà essere diverso di zero e minore del numero di Wei presenti nello Smart Contract.

Avendo soddisfatto queste condizioni possiamo continuare con la modifica della variable mapping released, che andremo ad aumentare in quanto abbiamo eseguito il claim, cioè abbiamo ritirato la nostra parte di Ethereum. Dopo aver incrementato totalReased possiamo finalmente effettuare la transazione con il metodo transfer.

Conclusioni

Quando scriviamo uno Smart Contract dobbiamo concentrarci sulla sia sicurezza, con la stessa preoccupazione che poniamo verso le sue funzionalità! Open Zeppelin è uno strumento davvero utile e ben sviluppato dalla comunità, che ci mette a disposizione davvero una vasta libreria.

Se hai trovato utile questo articolo ricorda di lasciare un mi piace alla nostra pagina facebook, che poi trovare sotto l’articolo insieme ai nostri profili Social!

Autore

Sono uno studente Web&Cloud. Amo programmare, negli anni ho sviluppato competenze full-stack, in particolare nel mondo Javascript. Linux e la crittografia mi hanno sempre appassionato, fino a portarmi nel mondo delle cryptovalute.

Scrivi un commento

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.