はじめに
本稿は以下をまとめたものになる。
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);
}
修飾子の順番は以下にする。
- Visibility
- Mutability
- Virtual
- Override
- 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スタイルを使用して命名する。
例: SimpleToken
、SmartBank
、CertificateHashRepository
、Player
、Congress
、Owned
など。
※コントラクトとライブラリの名前もそれらのファイル名と一致する必要がある。
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スタイルを使用して命名する。
例: MyCoin
、Position
、PositionXY
など。
イベント名
CapWordsスタイルを使って命名する。
例: Deposit
、Transfer
、Approval
、BeforeTransfer
、AfterTransfer
など。
関数名
コンストラクタ以外の関数はmixedCaseを使用する。
例: getBalance
、transfer
、verifyOwner
、addMember
、MARKDOWN_HASH5fc4edfc755c7ea7216e2376792f7595MARKDOWNHASH
など。
プライベート関数の先頭には (アンダースコア)をつけるのが通例らしい。
function _hoge() private {
関数の引数名
mixedCaseを使用する。
例: initialSupply
、account
、recipientAddress
、senderAddress
、newOwner
など。
※カスタム構造体を操作するライブラリ関数を書くときは、その構造体を最初の引数にして、常に self
という名前にする。
一部では関数の引数の先頭を _ (アンダースコア)にする通例もあるらしい?
function _hoge(uint _foo, string _bar) private {
ローカルと静的変数
mixedCaseを使用。
例:totalSupply
、remainingSupply
、balancesOf
、creatorAddress
、isPreSale
、tokenExchangeRate
など。
定数
単語を区切るアンダースコア付きのすべて大文字で命名する。
例: MAX_BLOCKS
、TOKEN_NAME
、TOKEN_TICKER
、CONTRACT_VERSION
など。
変数
mixedCaseを使用する。
例: onlyBy
、onlyAfter
、onlyDuringThePreSale
など。
列挙型
単純な型宣言において、CapWordsスタイルを使用する。
例: TokenGroup
、Frame
、HashStyle
、CharacterLocation
など。
予約後との競合を避ける場合
例) single_trailing_underscore_
0件のコメント