Solidity - Guia de Estilo

O Guia de Estilo ajuda a manter o layout do código consistente e torna o código mais legível. A seguir estão as práticas recomendadas ao escrever contratos com a Solidity.

Layout de código

  • Indentation- Use 4 espaços em vez de tabulação para manter o nível de recuo. Evite misturar espaços com guias.

  • Two Blank Lines Rule - Use 2 linhas em branco entre duas definições de contrato.

pragma solidity ^0.5.0;

contract LedgerBalance {
   //...
}
contract Updater {
   //...
}
  • One Blank Line Rule- Use 1 linha em branco entre duas funções. Em caso de declaração única, não é necessário deixar linhas em branco.

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 - Uma única linha não deve cruzar 79 caracteres para que os leitores possam analisar facilmente o código.

  • Wrapping rules- O primeiro argumento deve estar em uma nova linha sem abrir parênteses. Use recuo único por argumento. Elemento de terminação); deve ser o último.

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 - A codificação UTF-8 ou ASCII deve ser usada preferencialmente.

  • Imports - As instruções de importação devem ser colocadas no início do arquivo, logo após a declaração do pragma.

  • Order of Functions - As funções devem ser agrupadas de acordo com sua visibilidade.

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 - Evite espaços em branco imediatamente entre parênteses, colchetes ou colchetes.

  • Control structures- Os colchetes devem abrir na mesma linha da declaração. Fechar na própria linha mantendo o mesmo recuo. Use um espaço com chave de abertura.

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- Use a regra acima para chaves. Sempre adicione um rótulo de visibilidade. O rótulo de visibilidade deve vir primeiro, antes de qualquer modificador personalizado.

function kill() public onlyowner {
   selfdestruct(owner);
}
  • Mappings - Evite espaços em branco ao declarar variáveis ​​de mapeamento.

mapping(uint => uint) map;
mapping(address => bool) registeredAddresses;
mapping(uint => mapping(bool => Data[])) public data;
mapping(uint => mapping(uint => s)) data;
  • Variable declaration - Evite espaços em branco ao declarar variáveis ​​de matriz.

uint[] x;  // not unit [] x;
  • String declaration - Use aspas duplas para declarar uma string em vez de aspas simples.

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

Ordem de Layout

Os elementos devem ser dispostos na seguinte ordem.

  • Declarações de pragma

  • Declarações de importação

  • Interfaces

  • Libraries

  • Contracts

Em interfaces, bibliotecas ou contratos, o pedido deve ser como -

  • Declarações de tipo

  • Variáveis ​​de Estado

  • Events

  • Functions

Convenções de nomenclatura

  • O contrato e a biblioteca devem ser nomeados usando o estilo CapWords. Por exemplo, SmartContract, Owner etc.

  • O contrato e o nome da biblioteca devem corresponder aos nomes dos arquivos.

  • No caso de vários contratos / bibliotecas em um arquivo, use o nome do contrato / biblioteca 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 {
   //...
}
  • Nomes de Struct

    - Use o estilo CapWords como SmartCoin.

  • Nomes de Eventos

    - Use o estilo CapWords como Depósito, Após a transferência.

  • Nomes de Função

    - Use o estilo MixedCase como o InitteSupply.

  • Variáveis ​​locais e estaduais

    - Use o MixedCase Style como creatorAddress, supply.

  • Constantes

    - Use todas as letras maiúsculas com sublinhado para separar palavras como MAX_BLOCKS.

  • Nomes de modificadores

    - Use o estilo mixCase como onlyAfter.

  • Nomes Enum

    - Use o estilo CapWords como TokenGroup.