Solidity - Руководство по стилю

Руководство по стилю помогает поддерживать согласованность макета кода и делает код более читаемым. Ниже приведены рекомендации по написанию контрактов с Solidity.

Макет кода

  • Indentation- Используйте 4 пробела вместо табуляции для поддержания уровня отступа. Избегайте смешивания пробелов с табуляциями.

  • Two Blank Lines Rule - Используйте 2 пустые строки между двумя определениями контрактов.

pragma solidity ^0.5.0;

contract LedgerBalance {
   //...
}
contract Updater {
   //...
}
  • One Blank Line Rule- Используйте 1 пустую строку между двумя функциями. В случае только объявления пустые строки не нужны.

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 - Одна строка не должна пересекать 79 символов, чтобы читатели могли легко разобрать код.

  • Wrapping rules- Первый аргумент должен быть в новой строке без открывающих скобок. Используйте один отступ для каждого аргумента. Завершающий элемент); должен быть последним.

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 - Предпочтительно использовать кодировку UTF-8 или ASCII.

  • Imports - Операторы импорта должны быть помещены в начало файла сразу после объявления прагмы.

  • Order of Functions - Функции должны быть сгруппированы по степени видимости.

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 - Избегайте использования пробелов внутри скобок, скобок или фигурных скобок.

  • Control structures- Фигурные скобки должны открываться на той же строке, что и объявление. Закройте на своей строке с таким же отступом. Используйте пробел с открывающей скобкой.

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- Используйте указанное выше правило для фигурных скобок. Всегда добавляйте метку видимости. Метка видимости должна быть первой перед любым настраиваемым модификатором.

function kill() public onlyowner {
   selfdestruct(owner);
}
  • Mappings - Избегайте пробелов при объявлении переменных сопоставления.

mapping(uint => uint) map;
mapping(address => bool) registeredAddresses;
mapping(uint => mapping(bool => Data[])) public data;
mapping(uint => mapping(uint => s)) data;
  • Variable declaration - Избегайте пробелов при объявлении переменных массива.

uint[] x;  // not unit [] x;
  • String declaration - Используйте двойные кавычки для объявления строки вместо одинарной кавычки.

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

Порядок расположения

Элементы должны быть расположены в следующем порядке.

  • Заявления прагмы

  • Операторы импорта

  • Interfaces

  • Libraries

  • Contracts

В интерфейсах, библиотеках или контрактах порядок должен быть следующим:

  • Объявления типов

  • Переменные состояния

  • Events

  • Functions

Соглашения об именах

  • Контракт и Библиотека должны быть названы в стиле CapWords. Например, SmartContract, Owner и т. Д.

  • Имя контракта и библиотеки должно совпадать с именами файлов.

  • В случае, если в файле несколько контрактов / библиотек, используйте имя основного контракта / библиотеки.

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 {
   //...
}
  • Имена структур

    - Используйте стиль CapWords, например SmartCoin.

  • Имена событий

    - Используйте стиль CapWords, например "Депозит", "AfterTransfer".

  • Имена функций

    - Используйте стиль смешанного случая, например initiateSupply.

  • Локальные и государственные переменные

    - Используйте стиль mixedCase, например creatorAddress, supply.

  • Константы

    - Используйте все заглавные буквы с подчеркиванием для разделения таких слов, как MAX_BLOCKS.

  • Имена модификаторов

    - Используйте стиль mixCase, как onlyAfter.

  • Enum Names

    - Используйте стиль CapWords, например TokenGroup.