5 मिनट में ICO के लिए एक स्मार्ट अनुबंध कैसे लिखें



सभी को नमस्कार! इस लेख में मैं आपको बताऊंगा कि कैसे आपके ICO के लिए 5 मिनट में स्मार्ट मनी-कलेक्शन कॉन्ट्रैक्ट लॉन्च करना है और टर्मिनल में कई कमांड्स हैं। यह निबंध संभावित रूप से आपको हजारों अमेरिकी डॉलर बचाएगा, क्योंकि किसी भी प्रोग्रामर - और एक प्रोग्रामर भी नहीं - एक ऑडिट और सुरक्षित स्मार्ट कॉन्ट्रैक्ट लॉन्च करने में सक्षम होगा (बजाय $ 15,000 का भुगतान करने के लिए - विकास के लिए $ 75,000)। संक्षेप में, आप इस स्मार्ट अनुबंध को पैसा भेज सकते हैं और इसके लिए ERC20 टोकन प्राप्त कर सकते हैं। यह कहा जा सकता है कि यह लेख उन सभी अनुभवों का संग्रह है जो मैंने अपनी परियोजना के लिए ICO लॉन्च करके प्राप्त किया था।

इंटरनेट पर, ये आपके पहले से ही स्मार्ट कॉन्ट्रैक्ट के बारे में लेखों से भरे हुए हैं, लेकिन जैसे ही आप एक लिखना शुरू करते हैं, आप इस तथ्य पर आते हैं कि जानकारी को हर जगह दोहराया जाता है, और आपके ERC20 को बेवकूफ बनाने के तरीके के बारे में कोई ट्यूटोरियल नहीं हैं, या वे पहले से ही पुराने हैं। वैसे, इस लेख को प्रासंगिक बने रहने के लिए, मैं उन संभावित स्थानों को इंगित करने का प्रयास करूँगा जहाँ यह अप्रचलित हो सकता है (और इसे कैसे ठीक किया जाए)। चलो चलते हैं!

दृढ़ता


यह मुख्य भाषा का नाम है जिसे केफिर टीम ने स्मार्ट कॉन्ट्रैक्ट लॉन्च करने के लिए विकसित किया था। यदि आप एक प्रोग्रामर हैं, तो बस भाषा के प्रलेखन पर जाएं - यह अशोभनीय सरल है। वैसे, उन्होंने इसे सरल बना दिया ताकि स्मार्ट अनुबंध लिखने में गलती करना अधिक कठिन हो। तो बिल्कुल किसी भी प्रोग्रामर, कम से कम जूनियर स्तर पर, यह पता लगाने में सक्षम होगा। डेवलपर्स के पास भारी मात्रा में पैसे देने का कोई मतलब नहीं है, जो एकांतता को जानता है - यह मौजूदा डेवलपर को प्रशिक्षित करने के लिए सस्ता परिमाण का एक आदेश होगा।

स्मार्ट कॉन्ट्रैक्ट


... और आपको उनके बारे में जानने की जरूरत है। यदि आप प्रोग्रामर नहीं हैं तो इस सेक्शन को छोड़ दें। एक स्मार्ट अनुबंध कोड का एक टुकड़ा है। सिद्धांत रूप में, यह सॉलिडिटी (OOP, Yes) में एक वर्ग है, जिसके दो प्रकार के कार्य हैं: राज्य-परिवर्तन और गैर-राज्य-परिवर्तन। ठीक है, बस इसे केफिर भेजकर एक स्मार्ट अनुबंध में कार्यों को चलाने के लिए, आपको इस फ़ंक्शन को payable करने payable चिह्नित करना होगा।

राज्य एक डेटा वेयरहाउस, ब्लॉकचैन, ईपीटी है। अनुबंध ब्लॉकचेन (राज्य, भंडारण) को बदल सकते हैं - लेकिन ब्लॉकचैन को बदलने के लिए आपको खनिकों को केफिर का भुगतान करने की आवश्यकता है। वे कैसे साझा करेंगे केफिर इस लेख के ढांचे में विश्लेषण नहीं किया जाएगा। राज्य-बदलते कोड चलाने के लिए खनिकों को भुगतान को गैस कहा जाता है। यदि कोई बाहर के केफिर को payable फ़ंक्शन के लिए एक स्मार्ट कॉन्ट्रैक्ट के पते पर फेंकता है, payable नहीं है, लेकिन Constant या View रूप में चिह्नित नहीं है, तो खनिक को भुगतान के लिए आवश्यक राशि को भेजे गए राशि से काट लिया जाएगा। आम तौर पर, ईआरसी 20 टोकन में, ये ऐसे कार्य हैं जो या तो केफिर के लिए टोकन प्रेषक देते हैं या टोकन को एक टोकन धारक से दूसरे में स्थानांतरित करते हैं।

और यदि आप Constant या View साथ अनुबंध में एक फ़ंक्शन को चिह्नित करते हैं (उनका मतलब एक ही बात है, तो वे आपको केवल राज्य को पढ़ने की अनुमति देते हैं) या Pure (एक ही चीज़, आप राज्य को भी नहीं पढ़ते हैं), तो आपको इस फ़ंक्शन के निष्पादन पर केफिर खर्च करने की आवश्यकता नहीं है! मैं यह भी अधिक कहता हूं कि इन कार्यों को लेनदेन द्वारा कॉल करने की आवश्यकता नहीं है - आखिरकार, कोई भी दही ग्राहक सैद्धांतिक रूप से इसे घर पर निष्पादित कर सकता है - और किसी को भी इस बारे में जानने की आवश्यकता नहीं है (आखिरकार, ब्लॉकचेन को कुछ भी नहीं लिखा गया है)।

और ठोसता में दो महत्वपूर्ण बातें हैं: कई विरासत और फ़ंक्शन संशोधक। आपको उनके बारे में भी जानना होगा।

पहले - बस अनुबंधों को कई वर्गों से एक साथ विरासत में लिया जा सकता है जैसे कि TimedCrowdsale , CappedCrowdsale , MintedCrowdsale , Ownable - जबकि Ownable के कार्यों को एक के बाद एक लॉन्च किया जाता है - लेकिन मैं इसे बाद में एक उदाहरण के रूप में Ownable

दूसरा कार्य बनाने की क्षमता है जिसे बाद में अन्य कार्यों में डाला जाएगा। यह सरल एनकैप्सुलेशन की तरह है, बस थोड़ा अधिक लचीला है - यह सचमुच एक फ़ंक्शन टेम्पलेट है । जब आप एक संशोधक बनाते हैं, तो आप विशेष अक्षर _ लिखते हैं जहाँ आप इस संशोधक का उपयोग करके फ़ंक्शन के कोड का अर्थ करते हैं। यही है, संशोधक केवल एनकैप्सुलेटेड कार्यक्षमता नहीं हैं जो एक मान लौटाता है; यह एक फ़ंक्शन टेम्प्लेट है जब एक संशोधक से कोड इस संशोधक का उपयोग करके सचमुच एक फ़ंक्शन में डाला जाता है।

अभ्यास के लिए आगे बढ़ते हैं।

खाना पकाने का वातावरण


यदि आपको नहीं पता है कि टर्मिनल क्या है, तो इस लेख को यहां पढ़ें। यदि आप खिड़कियों पर हैं, तो अपने आप को डब्ल्यूएलएस के माध्यम से एक टर्मिनल सेट करें। यदि आप पहले से ही टर्मिनल से परिचित हैं, तो चलिए जारी रखते हैं। इसके अलावा, तुरंत खुद को Node.js डालें - यह अगले चरणों के लिए आवश्यक होगा। एलटीएस को स्थापित करना बेहतर है, लेकिन, वास्तव में, इससे कोई फर्क नहीं पड़ता कि कौन से नोड के आधुनिक संस्करणों को स्थापित करना है।

पहली चीज जिसे हम तुरंत स्थापित करते हैं और ब्लॉक सिंक्रोनाइज़ेशन प्रक्रिया शुरू करते हैं geth । संक्षेप में, यह गो में लिखी एक उपयोगिता है जो हमें स्थानीय कंप्यूटर पर ईथर नोड चलाने और परीक्षण और वास्तविक नेटवर्क से जुड़ने की अनुमति देगा। आप इंस्टॉलरों के माध्यम से स्थापित कर सकते हैं, लेकिन मैं अत्यधिक अनुशंसा करता हूं कि आप टर्मिनल में तुरंत प्राप्त करें, जैसा कि यहां वर्णित है । टर्मिनल में कमांड चलाकर आप जांच कर सकते हैं कि आपके geth मानक geth हैं या geth :

 geth version 

यदि आपको गेट संस्करण मिलता है - सब कुछ ओपनवर्क में है, तो ट्यूटोरियल जारी रखें। यदि नहीं - बुरा, सही; ऐसा लगता है कि आपको टर्मिनल और आपके ऑपरेटिंग सिस्टम के साथ संभोग करना होगा - लेकिन यह आपके लिए यह पता लगाने का पहली बार नहीं है। कैसे geth स्थापित करने के लिए, टर्मिनल में कमांड चलाएँ:

 geth --testnet console 

यह आपके नोड को परीक्षण सर्वर के साथ सिंक्रनाइज़ करने की प्रक्रिया शुरू करेगा, जिसके ब्लॉक यहां देखे जा सकते हैं । यदि आप geth कंसोल कंसोल में नेटवर्क के साथ सिंक्रोनाइज़ कर सकते हैं:

 eth.blockNumber #  0 —     eth.syncing #     false,     

सिंक्रनाइज़ेशन प्रक्रिया मुझे 1 से 4 घंटे तक ले गई - जब कैसे। इसके अलावा, ब्लॉक सिंक्रनाइज़ेशन के अलावा, आपको राज्य सिंक्रनाइज़ेशन के लिए भी इंतजार करना होगा - यह अक्सर ब्लॉक सिंक्रोनाइज़ेशन से अधिक लंबा होता है। आप geth उपयोग geth फ्लैग के साथ भी कर सकते हैं - फिर सिंक्रोनाइज़ेशन कुछ सेकंड से लेकर एक मिनट तक रहता है और आप अभी भी कॉन्ट्रैक्ट को तैनात कर सकते हैं।

ठीक है, हमने पहली उपयोगिता स्थापित की - अगले एक को रखा। हमें geth का एक एनालॉग लगाने की जरूरत है, केवल एक बहुत ही स्थानीय testrpc सिमुलेशन - testrpc । हां, हमारे पास 3 ब्लॉकचेन हैं :

  • testrpc - स्थानीय testrpc सिमुलेशन; तेजी से, लेकिन नकली और केवल आपकी मशीन पर संग्रहीत
  • geth --testnet पहले से ही एक वास्तविक geth --testnet है, लेकिन आप पैसे नहीं खो सकते हैं जहाँ आप मुफ्त में केफिर प्राप्त कर सकते हैं और सभी geth --testnet परीक्षण कर सकते हैं
  • geth - मेननेट, मुख्य, वास्तविक ब्लॉकचेन, वास्तविक केफिर; सभी एक वयस्क तरीके से, यहां त्रुटियां वास्तविक केफिर के नुकसान हैं

तदनुसार, हम testrpc साथ परीक्षण अनुबंध शुरू करेंगे, फिर इसे geth --testnet में स्थापित करें, और फिर इसे geth में सीधे डाउनलोड करें।

हमने निम्न कमांड चलाकर testrpc :

 npm install -g ethereumjs-testrpc 

खैर, या यह एक ट्रफल के साथ तुरंत उगता है, क्योंकि अब testrpc ट्रफल विंग के नीचे है और इसे testrpc कहा जाता है। हालांकि शैतान जानता है, वेनिला testrpc साथ सबकुछ testrpc । और अगर यह काम करता है, तो इसे स्पर्श न करें, जैसा कि मुझे अंतरजाल अकादमी में सिखाया गया था। आप कंसोल में truffle को पंजीकृत करके इंस्टॉलेशन को सत्यापित करने के लिए भी इसे चला सकते हैं, लेकिन परीक्षण ब्लॉकचेन पहले से ही हमारे साथ सिंक्रनाइज़ है - चलो इसे परेशान न करें।

खैर, ब्लॉकचेन का पता लगा? अब नोड्स हैं और परीक्षण भी सिंक्रनाइज़ है? हम निम्नलिखित आदेश के साथ केफिर - truffle पर स्मार्ट अनुबंधों के साथ काम करने के लिए एक सुविधाजनक उपयोगिता रखते हैं:

 npm install -g truffle truffle version #  ,  ,   

Truffle एक ऐसा उपकरण है जो आपको अलग-अलग फ़ाइलों में स्मार्ट कॉन्ट्रैक्ट्स रखने, अन्य फ़ाइलों को आयात करने, और एक बड़े geth (किसी व्यक्ति द्वारा अपठनीय) में अपने स्मार्ट कॉन्ट्रैक्ट कोड को संकलित करने की अनुमति देता है, यह स्वचालित रूप से आपके स्थानीय रूप से चलने वाले geth (परीक्षण और वास्तविक) को geth ) या testrpc , इस नेटवर्क पर अपना स्‍मार्ट कॉन्ट्रैक्ट तैनात करें। इसके अलावा, त्रुटियों के लिए आपके स्मार्ट अनुबंध कोड की जांच करता है और हाल ही में पूर्ण किए गए लेनदेन भी डीबग करने में मदद करते हैं । मास्टहेड, संक्षेप में।

इस स्तर पर आपको स्थापित होना चाहिए: testrpc , geth , truffle - यदि geth कोई भी गायब है या संस्करण अनुरोध पर कंसोल से बाहर नहीं थूकता है, तो इसे ठीक करें; अन्यथा आप सफल नहीं होंगे।

इसके अलावा, मैंने एक साधारण बैश स्क्रिप्ट फेंकी जो आपके लिए सब कुछ स्थापित करेगी। इस तरह कहा जाता है:

 source <(curl -s https://raw.githubusercontent.com/backmeupplz/eth-installer/master/install.sh) 

- लेकिन मैंने अभी तक इसका परीक्षण नहीं किया है, इसलिए मुझे इसके प्रदर्शन पर यकीन नहीं है। हालाँकि, मुझे अनुरोधों को खींचने में खुशी होगी।

अंजीर का अनुबंध


सब कुछ पहले से ही आपके लिए आविष्कार और लिखा जा चुका है - यह अच्छा है। थोड़ा बुंटिंग सभी समान होगा - लेकिन मैं इसे आपके लिए कम से कम करने की कोशिश करूंगा। हम OpenZeppelin से तैयार किए गए ERC20 अनुबंध का उपयोग करेंगे - यह अब उद्योग मानक है, उन्होंने ऑडिट पास कर लिया है, और वास्तव में वे सभी अपने कोड का उपयोग करते हैं। ओपन सोर्स में आपके योगदान के लिए बहुत-बहुत धन्यवाद।

cd को कुछ सुरक्षित फ़ोल्डर में बनाएँ और फिर लिखें:

 mkdir contract && cd contract 

इस फ़ोल्डर में हम काम करेंगे। हमारे स्मार्ट अनुबंध के लिए यहां एक स्टब बनाएं:

 truffle init 

हकलाना, स्पष्ट रूप से। अब हमारे पास दो बहुत महत्वपूर्ण फ़ोल्डर हैं जिनमें हम चढ़ेंगे: contracts और migrations । पहला है हमारे कॉन्ट्रैक्ट्स के लिए कोड, दूसरा ट्रफल के लिए कोड है, यह जानने के लिए कि ब्लॉक करने वाले को कॉन्ट्रैक्ट्स करते समय क्या करना है।

अगला, हमें npm से वर्तमान स्मार्ट कॉन्ट्रैक्ट कोड लेने की आवश्यकता है और वास्तव में, प्रोजेक्ट को स्वयं शुरू करें:

 npm init -y #     ( -y) npm install -E openzeppelin-solidity #       ( -E) 

वैसे, OpenZeppelin से स्मार्ट कॉन्ट्रैक्ट्स का कोड हमारी जेब में फ़ोल्डर node_modules/openzeppelin-solidity/contracts । अब हम मुख्य contracts फ़ोल्डर में जाते हैं, वहां सभी फ़ाइलों को हटा दें और फ़ाइलों को जोड़ MyToken.sol और MyCrowdsale.sol - स्वाभाविक रूप से, आप अपने अनुबंधों को अलग नाम देंगे। पहला हमारे ERC20 टोकन के लिए एक अनुबंध होगा, और दूसरा हमारे ICO का अनुबंध होगा, जो केफिर को स्वीकार करेगा और लोगों MyToken वितरित MyToken । यह लेख पुराना हो सकता है, लेकिन आप हमेशा यह देख सकते हैं कि OpenZeppelin आपको अपने भंडार में अनुबंध बनाने का सुझाव कैसे देता है । इस तरह MyToken.sol दिखेगा:

 pragma solidity ^0.4.23; // Imports import "../node_modules/openzeppelin-solidity/contracts/token/ERC20/MintableToken.sol"; // Main token smart contract contract MyToken is MintableToken { string public constant name = "My Token"; string public constant symbol = "MTKN"; uint8 public constant decimals = 18; } 

नाइस - आपके पास अपने स्वयं के टोकन का एक स्मार्ट अनुबंध है (बस स्थिरांक में नाम बदलें)! आप देख सकते हैं कि MintableToken से किस MintableToken विरासत है - लेकिन वहां सब कुछ यथासंभव सरल है। यह एक टोकन है, जो जारी किया जा सकता है (अंग्रेजी "मिंट" से - टकसाल तक), और केवल मालिक को इसे जारी करने का अधिकार है, क्योंकि MintableToken को भी खुद से विरासत में मिला है। इसके अलावा, MintableToken भी OpenZeppelin द्वारा लिखे गए ERC20 टोकन की कक्षाओं से विरासत में मिला है, जिसमें ERC20 इंटरफ़ेस लागू किया गया है:

 contract ERC20Basic { function totalSupply() public view returns (uint256); function balanceOf(address who) public view returns (uint256); function transfer(address to, uint256 value) public returns (bool); event Transfer(address indexed from, address indexed to, uint256 value); } 

हाँ, यहाँ आपके पास पूरा ERC20 इंटरफ़ेस है। क्या यह मुश्किल है? मुझे ऐसा नहीं लगता। यह आपको यह देखने का अवसर देता है कि कितने टोकन जारी किए गए थे, नेटवर्क पर प्रकाश केफिर ग्राहकों के लिए स्थानांतरण घटना को थूककर, पते की शेष राशि की जांच करें और टोकन को दूसरे पते पर स्थानांतरित करें। और यह सब आप अपने MyToken.sol में MyToken.sol के काम के लिए मुफ्त में प्राप्त करते हैं - वे महान हैं।

और अब चलो हमारे ICO के मुख्य भाग पर चलते हैं - हमें केफिर को स्वीकार करने और MyToken को बाहर करने की MyToken ! यह आपका MyCrowdsale.sol दिखेगा:

 pragma solidity ^0.4.23; // Imports import "../node_modules/openzeppelin-solidity/contracts/crowdsale/emission/MintedCrowdsale.sol"; import "../node_modules/openzeppelin-solidity/contracts/crowdsale/distribution/RefundableCrowdsale.sol"; import "../node_modules/openzeppelin-solidity/contracts/crowdsale/validation/CappedCrowdsale.sol"; import "../node_modules/openzeppelin-solidity/contracts/token/ERC20/MintableToken.sol"; contract MyCrowdsale is CappedCrowdsale, RefundableCrowdsale, MintedCrowdsale { constructor( uint256 _openingTime, uint256 _closingTime, uint256 _rate, address _wallet, uint256 _cap, MintableToken _token, uint256 _goal ) public Crowdsale(_rate, _wallet, _token) CappedCrowdsale(_cap) TimedCrowdsale(_openingTime, _closingTime) RefundableCrowdsale(_goal) { //   ,  ,    // ,     require(_goal <= _cap); } } 

सो-सो, तो हमारे साथ क्या है? क्या, लड़कों, स्मार्ट अनुबंध? टोकन की हमारी सार्वजनिक बिक्री सबसे लोकप्रिय गुणों में से तीन विरासत में मिली: इसमें एक हार्ड-कैप है, जिसे अब एकत्र नहीं किया जा सकता है; नरम टोपी, इकट्ठा नहीं जो एस्टर वापस आ रहे हैं; टोकन बिक्री का समय और अंत। असल में, खुशी के लिए और क्या चाहिए?

प्रोग्रामर, ध्यान दें कि कैसे कई वंशानुक्रम वर्गों के निर्माता एक पंक्ति में व्यवस्थित होते हैं और MyCrowdsale के मुख्य निर्माता से तर्क प्राप्त करते हैं। इसके अलावा, हम जांचते हैं कि हार्डकी सॉफ्टी से अधिक है - एलेस गट! इसके अलावा, MyCrowdsale कंस्ट्रक्टर में MyCrowdsale मापदंडों से MyCrowdsale न हों - हम उन्हें ट्रफल में अनुबंध परिनियोजन के चरण में पास करेंगे।

यह सब - आपके पास अपने खुद के ERC20 टोकन और यहां तक ​​कि एक ICO स्मार्ट अनुबंध का तैयार अनुबंध है, जो आपकी इच्छा के अनुसार कॉन्फ़िगर किया गया है और केफिर के लिए अपने टोकन देता है। इसके अलावा, यह सभी ईआरसी 20 पर्स द्वारा समर्थित है - एक गड़गड़ाहट! चलो मैन्युअल परीक्षण और तैनाती के लिए आगे बढ़ते हैं।

प्रवास


जैसा कि मैंने पहले कहा था, हम तीन ब्लॉकचेन नेटवर्क पर क्रमिक रूप से परीक्षण करेंगे, लेकिन पेन के साथ परीक्षण की प्रक्रिया हमेशा समान रहेगी। चलो testrpc शुरू करते हैं, फिर geth --testnet पर geth --testnet और geth --testnet पर चलते geth । सू हेडलाइट्स, हमने अभी कोड लिखा है, आइए इसे संकलित करने का प्रयास करें। प्रोजेक्ट फ़ोल्डर में, लिखें:

 truffle compile 

यदि सब कुछ समस्याओं के बिना संकलित किया जाता है, तो आप build देखेंगे, जिसमें ट्रफल के लिए क्राकोज़ीब होगा ताकि यह ब्लॉकचेन में आपके स्मार्ट कॉन्ट्रैक्ट्स के बाईटेकोड को एम्बेड कर सके। स्मार्ट अनुबंधों को तैनात करने से पहले, हमें ट्रफल को यह बताने की आवश्यकता है कि क्या करना है। स्मार्ट कॉन्ट्रैक्ट्स की ट्रफल तैनाती को माइग्रेशन कहा जाता है - ठीक है, चलो इस शब्दावली से चिपके रहते हैं। migrations/1_initial_migration.js और इसे निम्न तरीके से बदलें:

 const token = artifacts.require("../contracts/MyToken.sol"); const crowdsale = artifacts.require("../contracts/MyCrowdsale.sol"); module.exports = function(deployer, network, accounts) { const openingTime = 1514764800; // 15  2018 const closingTime = 1561939200; // 1  2019 const rate = new web3.BigNumber(1); // 1   1  const wallet = '0x281055afc982d96fab65b3a49cac8b878184cb16'; // - const cap = 200 * 1000000; //  const goal = 100 * 1000000; //  return deployer .then(() => { return deployer.deploy(token); }) .then(() => { return deployer.deploy( crowdsale, openingTime, closingTime, rate, wallet, cap, token.address, goal ); }) .then(() => { // Crowdsale    var tokenContract = web3.eth.contract(token.abi).at(token.address); web3.eth.defaultAccount = web3.eth.accounts[0]; tokenContract.transferOwnership(crowdsale.address); }); }; 

यह वही फ़ाइल है जिसका उपयोग ट्रफल द्वारा अनुबंधों को तैनात करने के लिए किया जाएगा। तो हम यहाँ क्या कर रहे हैं? सबसे पहले, हमने MyToken और MyCrowdsale संकलित करने का अनुरोध किया। इसके बाद, हम अपने ICO के सभी तर्कों के साथ स्थिरांक निर्धारित करते हैं - प्रारंभ और अंत समय निर्धारित करते हैं; केफिर के 1 वेन के लिए कितने टोकन लोग प्राप्त करेंगे (0.000000000000000001 eth = 1 wei; सेटिंग decimals यह दर्शाता है कि आपके नए बने टोकन में से 1 प्राप्त करने के लिए कितने ऑर्डर करने की आवश्यकता है); बटुआ, जहां बिक्री से प्राप्त केफिर आएगा; हार्ड कैप और सॉफ्ट कैप। कृपया ध्यान दें कि TimedCrowdsale में वर्तमान ब्लॉक के समय के बाद होना चाहिए - अन्यथा आपका स्मार्ट अनुबंध TimedCrowdsale में स्थिति की जांच करने के कारण अवरुद्ध नहीं होगा। मैंने इस रैक पर कदम रखा, और असफल लेनदेन पर बहस नहीं की जा सकती। अपनी इच्छानुसार इन स्थिरांक को बदलें।

अगला कदम ठीक स्मार्ट अनुबंधों की तैनाती है। यहां कुछ भी दिलचस्प नहीं है: हमारे पास एक deployer ऑब्जेक्ट है जो स्मार्ट कॉन्ट्रैक्ट कलाकृतियों को तैनात करता है और वहां तर्क देता है। ध्यान दें कि MyToken पहले MyToken , और उसके बाद ही MyCrowdsale - और पहले का पता तर्क के रूप में दूसरे में पारित किया गया है।

तब सबसे दिलचस्प बात यह है कि वे या तो दस्तावेज में या किताबों में नहीं लिखते हैं। जब आप किसी वॉलेट से MyToken बनाते हैं, तो यह वॉलेट MyToken में MyToken का मालिक बन जाता है - यही बात MyCrowdsale साथ भी MyCrowdsale । यदि आप MintableToken में गहरी खुदाई करते हैं, तो आप देख सकते हैं कि केवल Owner ही सिक्के टकसाल कर सकते हैं! और MyToken का मालिक कौन है? यह सही है: पता जो उसे परेशान करता है। और सिक्कों के खनन के लिए अनुरोध कौन भेजेगा? सही: MyCrowdsale स्मार्ट अनुबंध। आपको याद दिला दूं कि MyToken और MyCrowdsale पते दो अलग-अलग पते हैं।

इसलिए, हम गैर-रूढ़िवादी तीसरे परिनियोजन चरण को जोड़ रहे हैं, जहां पते ने अनुबंध ( web3.eth.accounts[0] ) को MyToken किया है जो MyToken अनुबंध पर transferOwnership फ़ंक्शन को कॉल करता है MyToken MyCrowdsale का मालिक MyToken और सिक्कों का टकसाल कर सके। और MyCrowdsale अभी भी web3.eth.accounts[0] के स्वामित्व में है - इसलिए सब कुछ बंडल है।

web3.eth.accounts[0] बारे में ध्यान दें: स्मार्ट अनुबंध को लागू करते समय, सुनिश्चित करें कि web3.eth.accounts[0] में web3.eth.accounts[0] या testrpc का सही बटुआ है - इसके लिए निजी कुंजी न खोएं, हालांकि यह आपको नुकसान नहीं पहुँचाता है, लेकिन अचानक मालिक को बाद में कुछ करने की आवश्यकता होगी, लेकिन कुंजी अब नहीं है?
testrpc , एक नियम के रूप में, स्टार्टअप पर तुरंत खाते बनाए जाते हैं और उन्हें तुरंत अनलॉक कर दिया जाता है; हालाँकि, एक परीक्षण और वास्तविक एयर ब्लॉकचैन पर, यह personal.newAccount() माध्यम से एक खाता बनाने के लायक है - फिर परीक्षण ब्लॉकचैन या असली ब्लॉकचेन पर असली केफिर के माध्यम से इस पते को फिर से भरें। अपना पासवर्ड और निजी कुंजी न खोएं।
इसके अलावा, आप web3.personal.importRawKey('pvt_key', 'password') कॉल करके अपने खातों में एक मौजूदा बटुआ जोड़ सकते हैं, लेकिन इसके लिए आपको अतिरिक्त पैरामीटर --rpcapi="db,eth,net,web3,personal,web3" साथ geth को कॉल करना होगा। --rpcapi="db,eth,net,web3,personal,web3" । मुझे लगता है कि आप इसका पता लगा लेंगे।

परीक्षण और तैनाती


हां, अनुबंध तैयार हैं, माइग्रेशन लिखे गए हैं, यह केवल तैनात करने और जांच करने के लिए बना हुआ है। दोनों geth (परीक्षण और वास्तविक) और testrpc truffle console माध्यम से एक ही तरीके से प्रबंधित किया जाता truffle console - इसलिए मैं testrpc लिए सत्यापन विधि का वर्णन testrpc और आपको बताऊंगा कि geth को कैसे सक्षम किया geth । और इसलिए, हम परीक्षण स्थानीय केफिर ब्लॉकचैन लॉन्च करते हैं:

 testrpc 

बेनाम: उम ... यह सब है। आप स्थानीय रूप से केफिर ब्लॉकचेन का अनुकरण करते हैं।

और इस कमांड के बजाय टेस्ट ईथर geth --testnet --rpc तैनात करने के लिए, आपको geth --testnet --rpc । और ईथर के वास्तविक geth --rpc पर तैनात करने के लिए, आप बस geth --rpc--rpc फ्लैग --rpc जरूरत है ताकि ट्रफल कनेक्ट हो सके। तीनों प्रकार के ब्लॉकचेन के लिए निम्न परिनियोजन और परीक्षण चरण कमोबेश समान हैं। केवल एक चीज यह है कि जब आप परीक्षण या वास्तविक geth को geth माध्यम से geth , तो यह ब्लॉकों को सिंक्रनाइज़ करना शुरू कर देगा - और एक अच्छे इंटरनेट कनेक्शन पर 4-5 घंटे तक का समय लग सकता है। इस बारे में एक टिप्पणी लेख की शुरुआत में थी। स्मार्ट अनुबंधों को तैनात करने से पहले, मैं पूर्ण सिंक्रनाइज़ेशन की प्रतीक्षा करने की सलाह देता हूं। इसके अलावा, ब्लॉकचैन का वजन 60-100 गीगाबाइट के क्षेत्र में है, इसलिए इसके लिए डिस्क स्थान तैयार करें।
इसके अलावा-यह भी सुनिश्चित करें कि web3.eth.accounts[0] अनलॉक किया गया है। आप आमतौर पर कंसोल में testrpc को पंजीकृत कर सकते हैं, जो तुरंत खुलता है, या कंसोल में एक अलग टर्मिनल विंडो में, जो geth console माध्यम से geth console : eth.unlockAccount(eth.accounts[0], ", ", 24*3600) - यह आपके खाते को अनलॉक करेगा, जिसे एक स्मार्ट अनुबंध बनाना चाहिए

अब एक नई टर्मिनल विंडो खोलें ( testrpc क्लोज़ testrpc बंद नहीं करते हैं - यह काम करना चाहिए) और इसे प्रोजेक्ट फ़ोल्डर में लिखें:

 truffle migrate --reset 

यह मैजिक कमांड एक स्मार्ट कॉन्ट्रैक्ट संकलित करेगा (यानी, आपको हर बार truffle compile लिखने की आवश्यकता नहीं है) और इसे ब्लॉकचेन माइक्रो सर्वर पर तैनात करना चाहिए जो स्थानीय रूप से खुला पाया जाता है। यह ध्यान देने योग्य है कि अगर testrpc तुरंत ऐसा करता है, तो परीक्षण और असली testrpc अगले ब्लॉक में लेनदेन को अधिक लंबे समय तक शामिल करेंगे। उसके बाद आपको कंसोल में कुछ इस तरह से थूकना चाहिए:

 Using network 'development'. Running migration: 1_initial_migration.js Running step... Replacing MyToken... ... 0x86a7090b0a279f8befc95b38fa8bee6918df30928dda0a3c48416454e2082b65 MyToken: 0x2dc35f255e56f06bd2935f5a49a0033548d85477 Replacing MyCrowdsale... ... 0xf0aab5d550f363478ac426dc2aff570302a576282c6c2c4e91205a7a3dea5d72 MyCrowdsale: 0xaac611907f12d5ebe89648d6459c1c81eca78151 ... 0x459303aa0b79be2dc2c8041dd48493f2d0e109fac19588f50c0ac664f34c7e30 Saving artifacts... 

मुझे लगता है कि आपको पहले ही एहसास हो गया है कि कंसोल ने आपको स्मार्ट कॉन्ट्रैक्ट्स MyToken और MyCrowdsale के पते MyCrowdsale । वह सब है! स्मार्ट कॉन्ट्रैक्ट ब्लॉकचेन में एम्बेडेड है जिसका माइक्रो-सर्वर आपके पास खुला है। यह केवल यह सत्यापित करने के लिए बनी हुई है कि टोकन वास्तव में उन उपयोगकर्ताओं को वितरित किए जाते हैं जो MyCrowdsale स्मार्ट अनुबंध में केफिर भेजते हैं। हम ट्रफल कंसोल में प्रवेश करने के लिए टर्मिनल में निम्नलिखित लिखते हैं:

 truffle console 

हम अब ट्रफल में निम्नलिखित लिखते हैं (केवल कोई टिप्पणी नहीं):

 //   - t="0x2dc35f255e56f06bd2935f5a49a0033548d85477" //     MyToken ="0xaac611907f12d5ebe89648d6459c1c81eca78151" //     MyCrowdsale //   - token=MyToken.at(t) crowdsale=MyCrowdsale.at(c) //       account=web3.eth.accounts[0] // ,      token.balanceOf(account) //   0 //    - web3.eth.sendTransaction({from: account, to:c, value: web3.toWei(0.1, 'ether'), gas: 900000}) 

के मामले में, testrpcआप तुरंत हमारे वॉलेट का संतुलन फिर से जांच सकते हैं, लेकिन परीक्षण और वास्तविक ब्लॉकचेन के मामले में, आपको तब तक इंतजार करना होगा जब तक कि हमारे लेनदेन को ब्लॉक में शामिल नहीं किया जाता है - आमतौर पर जब ऐसा होता है, तो ट्रफल आपको लेनदेन नंबर देता है। क्या आपने इंतजार किया है? फिर से हमारे संतुलन की जाँच करें MyToken:

 // ,      token.balanceOf(account) //     

वह सब है!पहले अपने अनुबंध का परीक्षण करें testrpc, फिर ऑन geth --testnet, फिर पर तैनात करें geth। तो आपने अपना ICO लॉन्च किया! और आपको ऑडिट और लॉन्च के लिए दसियों किलोबॉट खर्च करने होंगे। OpenZeppelin के लोगों ने हमें जो प्रदान किया है, उसके साथ खिलवाड़ करना वास्तव में बहुत कठिन है। और जब आप इसका उपयोग करते हैं truffle- यह है कि कैसे एकजुटता विकास आम तौर पर एक परी कथा में बदल जाता है। खैर, ऐसे मामलों को छोड़कर जब स्मार्ट कॉन्ट्रैक्ट पर निष्पादन के दौरान लेन-देन उल्टा हो जाता है - उनके नरक की शुरुआत करें। लेकिन स्मार्ट कॉन्ट्रैक्ट का डिबगिंग वास्तव में एक अलग लेख के योग्य है।

निष्कर्ष


इस लेख के अंत तक पढ़ने के लिए बहुत-बहुत धन्यवाद! यदि मैं आपको समय या धन बचाने में कामयाब रहा, या यदि आपने इस लेख से कुछ नया सीखा है, तो मुझे बहुत खुशी होगी। अगर आप अपने दोस्तों या परिचितों के साथ इस लेख को साझा करते हैं तो मैं बहुत आभारी रहूंगा जो ICO का संचालन करना चाहते हैं - उन्हें अंडर-प्रोग्रामर के लिए $ 75,000 बचाएं, जो परजीवी जैसे क्रिप्टो बाजार से पैसा चूसते हैं, कोड की समान 25 पंक्तियों को कॉपी-पेस्ट करते हैं ।

स्मार्ट कॉन्ट्रैक्ट विकसित करने में शुभकामनाएँ! अभी भी प्रश्न हैं? मैं आपको टिप्पणियों में पूछता हूं - मुझे हर चीज का जवाब देने और समस्याओं के साथ मदद करने की कोशिश करने में खुशी होगी।

बोनस


लेकिन क्या होगा यदि आप तर्क को बदलना चाहते हैं जिसके द्वारा टोकन की खरीद मूल्य पर विचार किया जाता है? बेशक, आप इसे सही तरीके से बदल सकते हैं rateया OpenZeppelin से अनुबंधों में से एक वर्ग का उपयोग कर सकते हैं , लेकिन क्या होगा यदि आप कुछ और भी अधिक विकृत चाहते हैं? एक स्मार्ट अनुबंध में, आप फ़ंक्शन getTokenAmountको इस प्रकार से ओवरराइड कर सकते हैं :

 function _getTokenAmount(uint256 _weiAmount) internal view returns (uint256) { if (block.timestamp < 1533081600) { // August 1st, 2018 rate = rate * 4; } else if (block.timestamp < 1546300800) { // January 1st, 2019 rate = rate * 2; } return _weiAmount.mul(rate); } 

सामान्य तौर पर, यह टोकन की कीमत खरीद के समय पर निर्भर कर सकता है - जंगल में दूर, अधिक महंगी टोकन। स्मार्ट कॉन्ट्रैक्ट की कुछ विशेषताओं को प्रयोग करने और फिर से लिखने से डरो मत - यह मजेदार है!

Source: https://habr.com/ru/post/hi414493/


All Articles