Solidez - Guía de estilo
La guía de estilo ayuda a mantener el diseño del código coherente y hacer que el código sea más legible. A continuación se presentan las mejores prácticas que se siguen al escribir contratos con Solidity.
Diseño de código
Indentation- Utilice 4 espacios en lugar de tabulación para mantener el nivel de sangría. Evite mezclar espacios con pestañas.
Two Blank Lines Rule - Utilice 2 líneas en blanco entre dos definiciones de contrato.
pragma solidity ^0.5.0;
contract LedgerBalance {
//...
}
contract Updater {
//...
}
One Blank Line Rule- Utilice 1 línea en blanco entre dos funciones. En caso de declaración única, no es necesario tener líneas en blanco.
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 sola línea no debe cruzar 79 caracteres para que los lectores puedan analizar fácilmente el código.
Wrapping rules- El primer argumento debe estar en una nueva línea sin abrir paréntesis. Utilice sangría única por argumento. Elemento de terminación); debería ser el ú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 - Preferiblemente se utilizará codificación UTF-8 o ASCII.
Imports - Las declaraciones de importación deben colocarse en la parte superior del archivo, justo después de la declaración pragma.
Order of Functions - Las funciones deben agruparse según su visibilidad.
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 los espacios en blanco inmediatamente entre paréntesis, corchetes o llaves.
Control structures- Las llaves deben abrirse en la misma línea que la declaración. Cierre en su propia línea manteniendo la misma sangría. Utilice un espacio con abrazadera de 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- Utilice la regla anterior para llaves. Agregue siempre una etiqueta de visibilidad. La etiqueta de visibilidad debe ir primero antes de cualquier modificador personalizado.
function kill() public onlyowner {
selfdestruct(owner);
}
Mappings - Evite los espacios en blanco al declarar variables de mapeo.
mapping(uint => uint) map;
mapping(address => bool) registeredAddresses;
mapping(uint => mapping(bool => Data[])) public data;
mapping(uint => mapping(uint => s)) data;
Variable declaration - Evite los espacios en blanco al declarar variables de matriz.
uint[] x; // not unit [] x;
String declaration - Utilice comillas dobles para declarar una cadena en lugar de comillas simples.
str = "foo";
str = "Hamlet says, 'To be or not to be...'";
Orden de diseño
Los elementos deben estar distribuidos en el siguiente orden.
Declaraciones de pragma
Importar declaraciones
Interfaces
Libraries
Contracts
Dentro de las interfaces, bibliotecas o contratos, el orden debe ser el siguiente:
Declaraciones de tipo
Variables de estado
Events
Functions
Convenciones de nombres
El contrato y la biblioteca deben nombrarse usando CapWords Style. Por ejemplo, SmartContract, Owner, etc.
El contrato y el nombre de la biblioteca deben coincidir con sus nombres de archivo.
En caso de varios contratos / bibliotecas en un archivo, use el nombre del contrato / biblioteca principal.
Own.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 {
//...
}
Nombres de estructuras
- Utilice el estilo CapWords como SmartCoin.Nombres de eventos
- Utilice el estilo de CapWords como Depósito, AfterTransfer.Nombres de funciones
- Utilice MixedCase Style como initiateSupply.Variables locales y estatales
- Utilice MixedCase Style como creatorAddress, suministro.Constantes
- Utilice todas las letras mayúsculas con subrayado para separar palabras como MAX_BLOCKS.Nombres de modificadores
- Utilice mixCase Style como onlyAfter.Nombres de enumeración
- Utilice el estilo de CapWords como TokenGroup.