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 initOpenZeppelin è scaricabile attraverso npm con il comando
npm install -E openzeppelin-solidityQuesto 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: pattern importantissimo per i nostri Smart Contracts
Andiamo a creare due file:
TestOwnership.sol
Ownable.sol
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{Attraverso la keywordfunction getOwner() onlyOwner returns (string) { return "Test"; } function changeOwner(address a) { transferOwnership(a); }
}
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.
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!
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:
- Che l'indirizzo Ethereum non sia 0
- Che la quota sia maggiore di 0
- Che non siano già presenti indirizzi nel nostro mapping
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!
Posted from my blog with SteemPress : https://www.coiners.it/openzeppelin-guida-alla-libreria-per-smart-contracts-sicuri/
Hi! I am a robot. I just upvoted you! I found similar content that readers might be interested in:
https://www.coiners.it/openzeppelin-guida-alla-libreria-per-smart-contracts-sicuri/
Downvoting a post can decrease pending rewards and make it less visible. Common reasons:
Submit
This user is on the @buildawhale blacklist for one or more of the following reasons:
Downvoting a post can decrease pending rewards and make it less visible. Common reasons:
Submit