सॉलिडिटी - स्टाइल गाइड

स्टाइल गाइड कोड लेआउट को बनाए रखने और कोड को अधिक पठनीय बनाने में मदद करता है। सॉलिडिटी के साथ अनुबंध लिखते समय निम्नलिखित सर्वोत्तम अभ्यास हैं।

कोड लेआउट

  • Indentation- इंडेंटेशन स्तर को बनाए रखने के लिए टैब के बजाय 4 रिक्त स्थान का उपयोग करें। टैब के साथ रिक्त स्थान मिलाने से बचें।

  • Two Blank Lines Rule - दो अनुबंध परिभाषाओं के बीच 2 खाली लाइनों का उपयोग करें।

pragma solidity ^0.5.0;

contract LedgerBalance {
   //...
}
contract Updater {
   //...
}
  • One Blank Line Rule- दो कार्यों के बीच में ब्लेंक लाइन का उपयोग करें। केवल घोषणा के मामले में, खाली लाइनों की आवश्यकता नहीं है।

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 - आयात विवरणों को केवल घोषणा के बाद फ़ाइल के शीर्ष पर रखा जाना चाहिए।

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

लेआउट का आदेश

तत्वों को निम्नलिखित क्रम में लेआउट होना चाहिए।

  • प्रज्ञा कथन

  • आयात बयान

  • Interfaces

  • Libraries

  • Contracts

Interfaces, पुस्तकालयों या अनुबंधों के अनुसार ऑर्डर निम्नानुसार होना चाहिए -

  • घोषणाएं लिखें

  • चर बताएं

  • Events

  • Functions

नामकरण की परंपरा

  • कॉन्ट्रैक्ट और लाइब्रेरी का नाम कैपिटिक्स स्टाइल का उपयोग करके रखा जाना चाहिए। उदाहरण के लिए, 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 {
   //...
}
  • संरचना नाम

    - स्मार्टकॉइन की तरह कैपस्क्रिप्ट स्टाइल का उपयोग करें।

  • घटना का नाम

    - जमा, आफ्टरफ्रंट की तरह कैपिटिक्स स्टाइल का उपयोग करें।

  • कार्य का नाम

    - आरंभ की तरह मिश्रित शैली का उपयोग करें।

  • स्थानीय और राज्य चर

    - CreatorAddress, आपूर्ति की तरह मिश्रित शैली का उपयोग करें।

  • स्थिरांक

    - MAX_BLOCKS जैसे शब्दों को अलग करने के लिए अंडरस्कोर के साथ सभी बड़े अक्षरों का उपयोग करें।

  • संशोधक नाम

    - केवल बाद में जैसे मिक्सकेस स्टाइल का उपयोग करें।

  • एनम नाम

    - टोकेनग्रुप की तरह कैपिटिक्स स्टाइल का उपयोग करें।