Solidità - Guida allo stile

Style Guide aiuta a mantenere il layout del codice coerente e rendere il codice più leggibile. Di seguito sono riportate le migliori pratiche seguite durante la scrittura di contratti con Solidity.

Layout del codice

  • Indentation- Usa 4 spazi invece di tab per mantenere il livello di rientro. Evita di mischiare gli spazi con le linguette.

  • Two Blank Lines Rule - Utilizzare 2 righe vuote tra due definizioni di contratto.

pragma solidity ^0.5.0;

contract LedgerBalance {
   //...
}
contract Updater {
   //...
}
  • One Blank Line Rule- Utilizzare 1 riga vuota tra due funzioni. In caso di sola dichiarazione non è necessario avere righe vuote.

pragma solidity ^0.5.0;

contract A {
   function balance() public pure;
   function account() public pure;
}
contract B is A {
   function balance() public pure {
      // ...
   }
   function account() public pure {
      // ...
   }
}
  • Maximum Line Length - Una singola riga non deve attraversare 79 caratteri in modo che i lettori possano facilmente analizzare il codice.

  • Wrapping rules- Il primo argomento deve essere in una nuova riga senza aprire parentesi. Usa un singolo rientro per argomento. Elemento terminale); dovrebbe essere l'ultimo.

function_with_a_long_name(
   longArgument1,
   longArgument2,
   longArgument3
);
variable = function_with_a_long_name(
   longArgument1,
   longArgument2,
   longArgument3
);
event multipleArguments(
   address sender,
   address recipient,
   uint256 publicKey,
   uint256 amount,
   bytes32[] options
);
MultipleArguments(
   sender,
   recipient,
   publicKey,
   amount,
   options
);
  • Source Code Encoding - La codifica UTF-8 o ASCII deve essere utilizzata preferibilmente.

  • Imports - Le istruzioni di importazione devono essere posizionate all'inizio del file subito dopo la dichiarazione pragma.

  • Order of Functions - Le funzioni dovrebbero essere raggruppate secondo la loro visibilità.

pragma solidity ^0.5.0;

contract A {
   constructor() public {
      // ...
   }
   function() external {
      // ...
   }

   // External functions
   // ...

   // External view functions
   // ...

   // External pure functions 
   // ...

   // Public functions
   // ...

   // Internal functions
   // ...

   // Private functions
   // ...
}
  • Avoid extra whitespaces - Evitare spazi bianchi immediatamente all'interno di parentesi, parentesi o parentesi graffe.

  • Control structures- Le parentesi graffe dovrebbero aprirsi sulla stessa riga della dichiarazione. Chiudere sulla propria linea mantenendo la stessa rientranza. Usa uno spazio con parentesi graffa di apertura.

pragma solidity ^0.5.0;

contract Coin {
   struct Bank {
      address owner;
      uint balance;
   }
}
if (x < 3) {
   x += 1;
} else if (x > 7) {
   x -= 1;
} else {
   x = 5;
}
if (x < 3)
   x += 1;
else
   x -= 1;
  • Function Declaration- Usa la regola sopra per le parentesi graffe. Aggiungi sempre un'etichetta di visibilità. L'etichetta di visibilità dovrebbe essere prima di qualsiasi modificatore personalizzato.

function kill() public onlyowner {
   selfdestruct(owner);
}
  • Mappings - Evita gli spazi bianchi durante la dichiarazione delle variabili di mappatura.

mapping(uint => uint) map;
mapping(address => bool) registeredAddresses;
mapping(uint => mapping(bool => Data[])) public data;
mapping(uint => mapping(uint => s)) data;
  • Variable declaration - Evita gli spazi bianchi durante la dichiarazione delle variabili di matrice.

uint[] x;  // not unit [] x;
  • String declaration - Usa virgolette doppie per dichiarare una stringa invece di virgolette singole.

str = "foo";
str = "Hamlet says, 'To be or not to be...'";

Ordine di layout

Gli elementi dovrebbero essere disposti nel seguente ordine.

  • Dichiarazioni di Pragma

  • Importa dichiarazioni

  • Interfaces

  • Libraries

  • Contracts

All'interno di interfacce, biblioteche o contratti l'ordine dovrebbe essere il seguente:

  • Dichiarazioni di tipo

  • Variabili di stato

  • Events

  • Functions

Convenzioni di denominazione

  • Il contratto e la libreria devono essere denominati utilizzando lo stile CapWords. Ad esempio, SmartContract, Owner ecc.

  • Il nome del contratto e della libreria devono corrispondere ai rispettivi nomi di file.

  • In caso di più contratti / librerie in un file, utilizzare il nome del contratto / libreria principale.

Owned.sol

pragma solidity ^0.5.0;

// Owned.sol
contract Owned {
   address public owner;
   constructor() public {
      owner = msg.sender;
   }
   modifier onlyOwner {
      //....
   }
   function transferOwnership(address newOwner) public onlyOwner {
      //...
   }
}

Congress.sol

pragma solidity ^0.5.0;

// Congress.sol
import "./Owned.sol";

contract Congress is Owned, TokenRecipient {
   //...
}
  • Nomi strutturali

    - Usa lo stile CapWords come SmartCoin.

  • Nomi degli eventi

    - Usa lo stile CapWords come Deposito, AfterTransfer.

  • Nomi delle funzioni

    - Usa lo stile mixedCase come initiateSupply.

  • Variabili locali e di stato

    - Usa lo stile mixedCase come creatorAddress, supply.

  • Costanti

    - Utilizza tutte le lettere maiuscole con trattino basso per separare parole come MAX_BLOCKS.

  • Nomi dei modificatori

    - Usa lo stile mixCase come onlyAfter.

  • Enum Names

    - Usa lo stile CapWords come TokenGroup.