Solidity-style-guide

提供:Dev Guides
移動先:案内検索

Solidity-スタイルガイド

スタイルガイドは、コードレイアウトの一貫性を維持し、コードを読みやすくするのに役立ちます。 Solidityと契約書を作成する際のベストプラクティスは次のとおりです。

コードレイアウト

  • インデント-インデントレベルを維持するには、タブの代わりに4つのスペースを使用します。 タブとスペースを混在させないでください。
  • * 2つの空行ルール*-2つの契約定義の間に2つの空行を使用します。
pragma solidity ^0.5.0;

contract LedgerBalance {
  //...
}
contract Updater {
  //...
}
  • * 1つの空行ルール*-2つの関数の間に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 {
     //...
   }
}
  • 最大行長-読者がコードを簡単に解析できるように、1行が79文字を超えてはなりません。
  • ラッピングルール-最初の引数は、カッコを開けずに改行で入力します。 引数ごとに単一のインデントを使用します。 終了要素);最後でなければなりません。
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
);
  • ソースコードエンコーディング-できればUTF-8またはASCIIエンコーディングを使用してください。
  • Imports -インポートステートメントは、プラグマ宣言の直後のファイルの先頭に配置する必要があります。
  • 関数の順序-関数は、可視性に従ってグループ化する必要があります。
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
  //...
}
  • 余分な空白を避ける-括弧、括弧、または中括弧のすぐ内側の空白を避けます。
  • 制御構造-中括弧は宣言と同じ行で開く必要があります。 同じインデントを維持しながら、独自の行で閉じます。 開きブレースのあるスペースを使用します。
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 kill() public onlyowner {
   selfdestruct(owner);
}
  • マッピング-マッピング変数を宣言する際に空白を避けます。
mapping(uint => uint) map;
mapping(address => bool) registeredAddresses;
mapping(uint => mapping(bool => Data[])) public data;
mapping(uint => mapping(uint => s)) data;
  • 変数宣言-配列変数の宣言中に空白を避けます。
uint[] x; //not unit [] x;
  • 文字列宣言-二重引用符を使用して、単一引用符の代わりに文字列を宣言します。
str = "foo";
str = "Hamlet says, 'To be or not to be...'";

レイアウトの順序

要素は次の順序でレイアウトする必要があります。

  • プラグマステートメント
  • インポートステートメント
  • インターフェース
  • 図書館
  • 契約

インターフェイス、ライブラリ、または契約内では、順序は次のようになります-

  • 型宣言
  • 状態変数
  • イベント
  • 関数

命名規則

  • 契約およびライブラリは、CapWordsスタイルを使用して名前を付ける必要があります。 たとえば、SmartContract、所有者など。
  • 契約名とライブラリ名はファイル名と一致する必要があります。
  • 1つのファイルに複数の契約/ライブラリがある場合、コア契約/ライブラリの名前を使用します。

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 {
  //...
}
  • 構造体名 + − SmartCoinのようなCapWordsスタイルを使用します。
  • イベント名 + − Deposit、AfterTransferなどのCapWordsスタイルを使用します。
  • 関数名 +-initializeSupplyのようなmixedCaseスタイルを使用します。
  • ローカル変数と状態変数 +-creatorAddressのようなmixedCaseスタイルを使用します。
  • 定数 +-下線付きのすべての大文字を使用して、MAX_BLOCKSなどの単語を区切ります。
  • 修飾子名 + − onlyAfterのようなmixCaseスタイルを使用します。
  • 列挙名 + − TokenGroupのようなCapWordsスタイルを使用します。