Solidity - Hướng dẫn phong cách

Style Guide giúp duy trì bố cục mã nhất quán và làm cho mã dễ đọc hơn. Sau đây là các phương pháp hay nhất sau đây khi viết hợp đồng với Solidity.

Bố cục mã

  • Indentation- Sử dụng 4 dấu cách thay vì tab để duy trì mức độ thụt lề. Tránh trộn dấu cách với các tab.

  • Two Blank Lines Rule - Sử dụng 2 Dòng trống giữa hai định nghĩa hợp đồng.

pragma solidity ^0.5.0;

contract LedgerBalance {
   //...
}
contract Updater {
   //...
}
  • One Blank Line Rule- Sử dụng 1 Dòng trống giữa hai chức năng. Trường hợp chỉ khai báo thì không cần để trống dòng.

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 - Một dòng không được cắt ngang 79 ký tự để người đọc dễ phân tích mã.

  • Wrapping rules- Đối số đầu tiên ở dòng mới không mở ngoặc đơn. Sử dụng một thụt lề cho mỗi đối số. Phần tử kết thúc); nên là người cuối cùng.

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 - Tốt nhất nên sử dụng mã hóa UTF-8 hoặc ASCII.

  • Imports - Các câu lệnh nhập phải được đặt ở đầu tệp ngay sau khai báo pragma.

  • Order of Functions - Các chức năng nên được nhóm lại theo khả năng hiển thị của chúng.

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 - Tránh các khoảng trắng ngay bên trong dấu ngoặc đơn, dấu ngoặc hoặc dấu ngoặc nhọn.

  • Control structures- Dấu ngoặc nhọn phải mở trên cùng dòng với khai báo. Đóng trên dòng riêng của họ duy trì cùng một vết lõm. Sử dụng khoảng trống có dấu ngoặc nhọn.

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- Sử dụng quy tắc trên để niềng răng. Luôn thêm nhãn hiển thị. Nhãn hiển thị phải xuất hiện đầu tiên trước bất kỳ công cụ sửa đổi tùy chỉnh nào.

function kill() public onlyowner {
   selfdestruct(owner);
}
  • Mappings - Tránh các khoảng trắng trong khi khai báo các biến ánh xạ.

mapping(uint => uint) map;
mapping(address => bool) registeredAddresses;
mapping(uint => mapping(bool => Data[])) public data;
mapping(uint => mapping(uint => s)) data;
  • Variable declaration - Tránh khoảng trắng trong khi khai báo biến mảng.

uint[] x;  // not unit [] x;
  • String declaration - Sử dụng dấu ngoặc kép để khai báo một chuỗi thay vì dấu nháy đơn.

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

Thứ tự của bố cục

Các phần tử nên được bố trí theo thứ tự sau.

  • Tuyên bố Pragma

  • Nhập báo cáo

  • Interfaces

  • Libraries

  • Contracts

Trong Interfaces, thư viện hoặc hợp đồng, thứ tự phải là:

  • Nhập các khai báo

  • Biến trạng thái

  • Events

  • Functions

Quy ước đặt tên

  • Hợp đồng và Thư viện phải được đặt tên bằng cách sử dụng Cap AdWords Style. Ví dụ: SmartContract, Chủ sở hữu, v.v.

  • Hợp đồng và tên Thư viện phải khớp với tên tệp của chúng.

  • Trong trường hợp có nhiều hợp đồng / thư viện trong một tệp, hãy sử dụng tên của hợp đồng / thư viện lõi.

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 {
   //...
}
  • Tên cấu trúc

    - Sử dụng Cap AdWords Style như SmartCoin.

  • Tên sự kiện

    - Sử dụng Cap AdWords Style như Deposit, AfterTransfer.

  • Tên hàm

    - Sử dụng MixedCase Style giống như InitiateSupply.

  • Biến cục bộ và biến trạng thái

    - Sử dụng kiểu mixCase như createAddress, cung cấp.

  • Hằng số

    - Sử dụng tất cả các chữ cái viết hoa với dấu gạch dưới để tách các từ như MAX_BLOCKS.

  • Tên bổ trợ

    - Sử dụng MixCase Style như onlyAfter.

  • Enum Names

    - Sử dụng kiểu Cap AdWords như TokenGroup.