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.