はじめに

本稿は以下をまとめたものになる。
https://docs.soliditylang.org/en/latest/style-guide.html

行間

コントラクト間は2行開ける。

pragma solidity >=0.4.0 <0.9.0;

contract A {
    // ...
}

contract B {
    // ...
}

contract C {
    // ...
}

コントラクト内の関数同士は一行開ける。
※ワンライナーの関数同士の場合空白はいらない

pragma solidity >=0.4.0 <0.9.0;

contract A {
    function spam() public pure;
    function ham() public pure;
}

contract B is A {
    function spam() public pure {
        // ...
    }

    function ham() public pure {
        // ...
    }
}

関数の順序づけ

関数は以下の順番に記述する。
※グループ内では、関数の最後に view や pure を付ける

  • constructor
  • receive function (もしあるなら)
  • fallback function(もしあるなら)
  • external
  • public
  • internal
  • private
pragma solidity >=0.7.0 <0.9.0;
contract A {
    constructor() {
        // ...
    }

    receive() external payable {
        // ...
    }

    fallback() external {
        // ...
    }

    // External functions
    // ...

    // External functions that are view
    // ...

    // External functions that are pure
    // ...

    // Public functions
    // ...

    // Internal functions
    // ...

    // Private functions
    // ...
}

関数修飾

関数には可視性修飾子を必ずつける。
※可視性修飾子は他のどのカスタム修飾子よりも先に来る必要がある

function kill() public onlyowner {
    selfdestruct(owner);
}

修飾子の順番は以下にする。

  1. Visibility
  2. Mutability
  3. Virtual
  4. Override
  5. Custom modifiers
function balance(uint from) public view override returns (uint)  {
    return balanceOf[from];
}

function shutdown() public onlyOwner {
    selfdestruct(owner);
}

長い関数宣言時は関数本体のインデントレベルで、各引数を独自の行に配置することを推奨。

function thisFunctionNameIsReallyLong(
    address x,
    address y,
    address z,
)
    public
    onlyowner
    priced
    returns (address)
{
    doSomething();
}

returnが複数ある場合。

function thisFunctionNameIsReallyLong(
    address a,
    address b,
    address c
)
    public
    returns (
        address someAddressName,
        uint256 LongArgument,
        uint256 Argument
    )
{
    doSomething()

    return (
        veryLongReturnArg1,
        veryLongReturnArg2,
        veryLongReturnArg3
    );
}

演算子

演算子はスペースで囲む

x = 3;
x = 100 / 10;
x += 3 + 4;
x |= y && z;

高い優先順位を持つ演算子は、優先順位を示すために周囲のスペースを除外することができる。

x = 2**3 + 5;
x = 2*y + 3*z;
x = (a+b) * (a-b);

命名規則

区別がつきにくいため1文字の変数名には以下を使用しない。

l - 小文字の el
O - 大文字の oh
I - 大文字の eye

コントラクトとライブラリ名

CapWordsスタイルを使用して命名する。

例: SimpleTokenSmartBankCertificateHashRepositoryPlayerCongressOwnedなど。

※コントラクトとライブラリの名前もそれらのファイル名と一致する必要がある。

Owned.sol

pragma solidity >=0.4.0 <0.9.0;

contract Owned {
     //...
}

Congress.sol

pragma solidity >=0.4.0 <0.9.0;

import "./Owned.sol";

contract Congress is Owned, TokenRecipient {
    //...
}

構造体名

CapWordsスタイルを使用して命名する。
例: MyCoinPositionPositionXYなど。

イベント名

CapWordsスタイルを使って命名する。
例: DepositTransferApprovalBeforeTransferAfterTransfer など。

関数名

コンストラクタ以外の関数はmixedCaseを使用する。
例: getBalancetransferverifyOwneraddMemberMARKDOWN_HASH5fc4edfc755c7ea7216e2376792f7595MARKDOWNHASH など。
プライベート関数の先頭には
(アンダースコア)をつけるのが通例らしい。

function _hoge() private {

関数の引数名

mixedCaseを使用する。
例: initialSupplyaccountrecipientAddresssenderAddressnewOwner など。

※カスタム構造体を操作するライブラリ関数を書くときは、その構造体を最初の引数にして、常に self という名前にする。

一部では関数の引数の先頭を _ (アンダースコア)にする通例もあるらしい?

function _hoge(uint _foo, string _bar) private {

ローカルと静的変数

mixedCaseを使用。
例:totalSupplyremainingSupplybalancesOfcreatorAddressisPreSaletokenExchangeRateなど。

定数

単語を区切るアンダースコア付きのすべて大文字で命名する。
例: MAX_BLOCKSTOKEN_NAMETOKEN_TICKERCONTRACT_VERSION など。

変数

mixedCaseを使用する。
例: onlyByonlyAfteronlyDuringThePreSale など。

列挙型

単純な型宣言において、CapWordsスタイルを使用する。
例: TokenGroupFrameHashStyleCharacterLocation など。

予約後との競合を避ける場合

例) single_trailing_underscore_


0件のコメント

コメントを残す

アバタープレースホルダー

メールアドレスが公開されることはありません。 が付いている欄は必須項目です