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 − import 문은 pragma 선언 바로 뒤에 파일 상단에 위치해야합니다.

  • 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...'";

레이아웃 순서

요소는 다음 순서로 레이아웃되어야합니다.

  • Pragma 문

  • 수입 명세서

  • 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 {
   //...
}
  • 구조체 이름

    − SmartCoin과 같은 CapWords 스타일을 사용하십시오.

  • 이벤트 이름

    − Deposit, AfterTransfer와 같은 CapWords 스타일을 사용하십시오.

  • 기능 명

    − initializeSupply와 같은 mixedCase 스타일을 사용합니다.

  • 지역 및 상태 변수

    − creatorAddress, supply와 같은 mixedCase 스타일을 사용합니다.

  • 상수

    − MAX_BLOCKS와 같은 단어를 구분하려면 밑줄과 함께 모두 대문자를 사용하십시오.

  • 수정 자 이름

    − onlyAfter와 같이 mixCase 스타일을 사용합니다.

  • 열거 형 이름

    − TokenGroup과 같은 CapWords Style을 사용합니다.