Solidité - Guide de style

Le Guide de style aide à maintenir la mise en page du code cohérente et à rendre le code plus lisible. Voici les meilleures pratiques à suivre lors de la rédaction de contrats avec Solidity.

Disposition du code

  • Indentation- Utilisez 4 espaces au lieu de tabulation pour maintenir le niveau d'indentation. Évitez de mélanger les espaces avec les onglets.

  • Two Blank Lines Rule - Utilisez 2 lignes vides entre deux définitions de contrat.

pragma solidity ^0.5.0;

contract LedgerBalance {
   //...
}
contract Updater {
   //...
}
  • One Blank Line Rule- Utilisez 1 ligne vide entre deux fonctions. En cas de déclaration uniquement, pas besoin de lignes vierges.

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 - Une seule ligne ne doit pas traverser 79 caractères afin que les lecteurs puissent facilement analyser le code.

  • Wrapping rules- Le premier argument est dans une nouvelle ligne sans ouvrir les parenthèses. Utilisez un seul retrait par argument. Élément de terminaison); devrait être le dernier.

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 - Le codage UTF-8 ou ASCII doit être utilisé de préférence.

  • Imports - Les instructions d'importation doivent être placées en haut du fichier juste après la déclaration de pragma.

  • Order of Functions - Les fonctions doivent être regroupées selon leur 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 - Évitez les espaces immédiatement entre parenthèses, crochets ou accolades.

  • Control structures- Les accolades doivent s'ouvrir sur la même ligne que la déclaration. Fermer sur leur propre ligne en conservant la même indentation. Utilisez un espace avec accolade ouvrante.

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- Utilisez la règle ci-dessus pour les accolades. Ajoutez toujours une étiquette de visibilité. L'étiquette de visibilité doit venir avant tout modificateur personnalisé.

function kill() public onlyowner {
   selfdestruct(owner);
}
  • Mappings - Évitez les espaces lors de la déclaration des variables de mappage.

mapping(uint => uint) map;
mapping(address => bool) registeredAddresses;
mapping(uint => mapping(bool => Data[])) public data;
mapping(uint => mapping(uint => s)) data;
  • Variable declaration - Évitez les espaces lors de la déclaration des variables de tableau.

uint[] x;  // not unit [] x;
  • String declaration - Utilisez des guillemets doubles pour déclarer une chaîne au lieu de guillemets simples.

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

Ordre de disposition

Les éléments doivent être mis en page dans l'ordre suivant.

  • Déclarations Pragma

  • Importer des déclarations

  • Interfaces

  • Libraries

  • Contracts

Dans les interfaces, les bibliothèques ou les contrats, la commande doit être comme -

  • Déclarations de type

  • Variables d'état

  • Events

  • Functions

Conventions de nommage

  • Le contrat et la bibliothèque doivent être nommés en utilisant le style CapWords. Par exemple, SmartContract, Owner, etc.

  • Le nom du contrat et de la bibliothèque doit correspondre à leurs noms de fichiers.

  • En cas de plusieurs contrats / bibliothèques dans un fichier, utilisez le nom du contrat / bibliothèque principal.

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 {
   //...
}
  • Noms de structure

    - Utilisez le style CapWords comme SmartCoin.

  • Noms d'événements

    - Utilisez le style CapWords comme Dépôt, AfterTransfer.

  • Noms des fonctions

    - Utilisez le style mixedCase comme initateSupply.

  • Variables locales et d'état

    - Utilisez le style mixedCase comme creatorAddress, supply.

  • Constantes

    - Utilisez toutes les lettres majuscules avec trait de soulignement pour séparer les mots tels que MAX_BLOCKS.

  • Noms des modificateurs

    - Utilisez le style mixCase comme onlyAfter.

  • Noms d'énumération

    - Utilisez le style CapWords comme TokenGroup.