एथेरम स्मार्ट कॉन्ट्रैक्ट्स में इवेंट्स एंड लॉग्स के लिए एक गाइड

ब्लॉग 1NewsDevelopersEnterpriseBlockchain समझाया और सम्मेलनसमाचार

हमारे न्यूज़लेटर की सदस्यता लें.

ईमेल पता

हम आपकी निजता का सम्मान करते हैं

HomeBlogBlockchain विकास

एथेरम स्मार्ट कॉन्ट्रैक्ट्स में इवेंट्स एंड लॉग्स के लिए एक गाइड

नमूना कोडबी जोसेफ चाउज्यून 6, 2016 के साथ एथेरियम ब्लॉकचैन पर घटनाओं और लॉग के लिए मामलों का उपयोग करने के लिए एक तकनीकी परिचय, 6 जून 2016 को पोस्ट किया गया

ConsenSys एथेरम स्मार्ट कॉन्ट्रैक्ट्स हीरो में घटनाओं और लॉग्स के लिए एक गाइड को सिग्नल दें


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

घटनाओं को भ्रमित किया जा सकता है क्योंकि उनका उपयोग विभिन्न तरीकों से किया जा सकता है। एक के लिए एक घटना दूसरे के लिए एक घटना की तरह नहीं लग सकती है। घटनाओं और लॉग के लिए 3 मुख्य उपयोग के मामले हैं:

  1. उपयोगकर्ता इंटरफ़ेस के लिए स्मार्ट कॉन्ट्रैक्ट रिटर्न मान
  2. एसिंक्रोनस डेटा के साथ चलाता है
  3. भंडारण का एक सस्ता रूप

घटनाओं और लॉग के बीच शब्दावली भ्रम का एक और स्रोत है और इसे तीसरे उपयोग के मामले में समझाया जाएगा.

1) यूजर इंटरफेस के लिए स्मार्ट कॉन्ट्रैक्ट रिटर्न वैल्यू

किसी इवेंट का सबसे सरल उपयोग अनुबंध से ऐप के फ्रंटएंड में रिटर्न वैल्यू के साथ गुजरना है। समझाने के लिए, यहाँ समस्या है:

अनुबंध ExampleContract {// कुछ राज्य चर … फ़ंक्शन फू (int256 _value) रिटर्न (int256) {// जोड़ तोड़ राज्य … वापसी _value; }} कोड भाषा: जावास्क्रिप्ट (जावास्क्रिप्ट)

उदाहरण मानें कि कांटैक्ट्रेक्ट उदाहरण का एक उदाहरण हैकंट्रेक्ट, web3.js का उपयोग करने वाला एक दृश्य, अनुबंध निष्पादन का अनुकरण करके एक वापसी मूल्य प्राप्त कर सकता है:

var returnValue = exampleContract.foo.call (2); कंसोल.लॉग (रिटर्नवैल्यू) // 2कोड भाषा: जावास्क्रिप्ट (जावास्क्रिप्ट)

हालाँकि, जब web3.js अनुबंध कॉल को लेनदेन के रूप में प्रस्तुत करता है, तो यह रिटर्न मूल्य नहीं प्राप्त कर सकता है [1]:

var returnValue = exampleContract.foo.sendTransaction (2, {from: web3.eth.coinbase}); कंसोल .लॉग (वापसी) // लेन-देन हैशकोड भाषा: जावास्क्रिप्ट (जावास्क्रिप्ट)

SendTransaction विधि का रिटर्न मान हमेशा उस लेनदेन का हैश होता है जो बनाया जाता है। लेन-देन मोर्चे पर अनुबंध का मूल्य वापस नहीं करते हैं क्योंकि लेनदेन तुरंत खनन और ब्लॉकचेन में शामिल नहीं होते हैं.

अनुशंसित समाधान एक घटना का उपयोग करना है, और यह घटनाओं के लिए इच्छित उद्देश्यों में से एक है.

अनुबंध ExampleContract {घटना ReturnValue (पता अनुक्रमित _from, int256 _value); function foo (int256 _value) रिटर्न (int256) {ReturnValue (msg.sender, _value); प्रतिलाभ की मात्रा; }} एक दृश्यपटल रिटर्न मान प्राप्त कर सकता है: var exampleEvent = exampleContract.ReturnValue ({_ from: web3.eth.coinbase}); exampleEvent.watch (फ़ंक्शन (त्रुटि, परिणाम) {अगर (इरेट) {कंसोल.लॉग (गलत) रिटर्न;} कंसोल.लॉग (result.args._value) // चेक करें कि result.args._from web3.eth.coinbase है तब // प्रदर्शन result.args._value इन UI और कॉल // exampleEvent.stopWatching ()}) exampleContract.foo.sendTransaction (2, {from: web3.eth.coinbass}) कोड भाषा: जावास्क्रिप्ट (जावास्क्रिप्ट)

जब foo का लेन-देन करने वाला लेनदेन खनन किया जाता है, तो घड़ी के अंदर कॉलबैक चालू हो जाएगा। यह प्रभावी रूप से दृश्यपटल को फू से रिटर्न मान प्राप्त करने की अनुमति देता है.

2) एसिंक्रोनस ट्रिगर डेटा के साथ

रिटर्न मान घटनाओं के लिए एक न्यूनतम उपयोग मामला है, और घटनाओं को आमतौर पर डेटा के साथ अतुल्यकालिक ट्रिगर माना जा सकता है। जब कोई अनुबंध सीमा को ट्रिगर करना चाहता है, तो अनुबंध एक घटना का उत्सर्जन करता है। जैसा कि, दृश्यपटल घटनाओं के लिए देख रहा है, यह कार्रवाई कर सकता है, एक संदेश प्रदर्शित कर सकता है, आदि इसका एक उदाहरण अगले भाग में प्रदान किया गया है (जब कोई उपयोगकर्ता जमा करता है तो यूआई को अपडेट किया जा सकता है।)

3) भंडारण का एक सस्ता रूप

तीसरा उपयोग मामला जो कवर किया गया है, उससे काफी अलग है, और यह घटनाओं को भंडारण के एक सस्ते रूप के रूप में उपयोग कर रहा है। इथेरियम वर्चुअल मशीन (ईवीएम) और में एथेरियम येलो पेपर, घटनाओं को लॉग के रूप में संदर्भित किया जाता है (लॉग ऑपकोड हैं)। भंडारण की बात करते समय, यह कहना तकनीकी रूप से अधिक सटीक होगा कि डेटा को लॉग में संग्रहीत किया जा सकता है, क्योंकि घटनाओं में संग्रहीत डेटा के विपरीत। हालांकि, जब हम प्रोटोकॉल के ऊपर एक स्तर पर जाते हैं, तो यह कहना अधिक सटीक है कि अनुबंध उन घटनाओं का उत्सर्जन करते हैं या ट्रिगर करते हैं जो फ्रंटएंड प्रतिक्रिया कर सकते हैं। जब भी किसी घटना का उत्सर्जन होता है, तो संबंधित लॉग ब्लॉकचेन को लिखे जाते हैं। घटनाओं और लॉग के बीच की शब्दावली भ्रम का एक अन्य स्रोत है, क्योंकि संदर्भ यह निर्धारित करता है कि कौन सा शब्द अधिक सटीक है.

लॉग को स्टोरेज के रूप में डिज़ाइन किया गया था, जिसमें कॉन्ट्रैक्ट स्टोरेज की तुलना में काफी कम गैस खर्च होती है। लॉग्स मूल रूप से [2] प्रति बाइट में per गैस खर्च करते हैं, जबकि अनुबंध भंडारण में प्रति ३२ बाइट में २०,००० गैस खर्च होती है। हालांकि लॉग्स गर्ग्यूआन गैस बचत प्रदान करते हैं, लॉग किसी भी अनुबंध से सुलभ नहीं हैं [3].

फिर भी, सीमा के लिए ट्रिगर के बजाय सस्ते भंडारण के रूप में लॉग का उपयोग करने के मामले हैं। लॉग के लिए एक उपयुक्त उदाहरण ऐतिहासिक डेटा संग्रहीत कर रहा है जिसे दृश्यपटल द्वारा प्रदान किया जा सकता है.

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

अनुबंध CryptoExchange {इवेंट जमा (uint256 अनुक्रमित _market, पता अनुक्रमित _sender, uint256 _amount, uint256 _time); समारोह जमा (uint256 _amount, uint256 _market) रिटर्न (int256) {// प्रदर्शन जमा, अद्यतन उपयोगकर्ता का संतुलन, आदि जमा (_market, msg.sender, _amount, अब); } कोड भाषा: जावास्क्रिप्ट (जावास्क्रिप्ट)

मान लीजिए कि हम एक यूआई को अपडेट करना चाहते हैं क्योंकि उपयोगकर्ता जमा करता है। यहां डेटा (_market, msg.sender, _amount, now) के साथ एक अतुल्यकालिक ट्रिगर के रूप में एक घटना (जमा) का उपयोग करने का एक उदाहरण है। CryptoExChange का एक उदाहरण है

var DepositEvent = cryptoExContract.Deposit ({_ प्रेषक: userAddress}); DepositEvent.watch (फ़ंक्शन (त्रुटि, परिणाम) {अगर (इरेट) {कंसोल.लॉग (इर) वापसी;} // result.args का UI पर विवरण दें)) कोड भाषा: जावास्क्रिप्ट (जावास्क्रिप्ट)

एक उपयोगकर्ता के लिए सभी घटनाओं को प्राप्त करने की दक्षता में सुधार यही कारण है कि घटना के लिए _sender पैरामीटर अनुक्रमित है: घटना जमा (uint256 अनुक्रमित _market, पता अनुक्रमित _sender, uint256 _amount, uint256 _time).

डिफ़ॉल्ट रूप से, घटनाओं के लिए सुनना केवल उस बिंदु पर शुरू होता है जब घटना को त्वरित किया जाता है। जब UI पहली बार लोड हो रहा होता है, तो इसमें कोई राशि जमा नहीं होती है। इसलिए हम ब्लॉक 0 के बाद से घटनाओं को फिर से प्राप्त करना चाहते हैं और यह एक घटना से FromBlock पैरामीटर जोड़कर किया जाता है.

var DepositEventAll = cryptoExContract.Deposit ({_ प्रेषक: userAddress}, {fromBlock: 0, toBlock: ‘latest’}); DepositEventAll.watch (फ़ंक्शन (इरेट, परिणाम) {अगर (इरेट) {कंसोल.लॉग (इरेट) रिटर्न; // // result.args का यूआई में जोड़ें विवरण) कोड भाषा: जावास्क्रिप्ट (जावास्क्रिप्ट)

जब यूआई को जमा किया जाता है तोEventAll.stopWatching () कहा जाना चाहिए.

एक तरफ – अनुक्रमित मापदंडों

3 मापदंडों तक अनुक्रमित किया जा सकता है। उदाहरण के लिए, एक प्रस्तावित टोकन मानक है: इवेंट ट्रांसफर (पता अनुक्रमित _from, पता अनुक्रमित _to, uint256 _value)। इसका मतलब यह है कि एक सीमा कुशलता से टोकन हस्तांतरण के लिए बस देख सकते हैं:

  • एक पते के द्वारा भेजा गया
  • या एक पते के द्वारा प्राप्त किया टोकन
  • या एक पते के द्वारा एक विशिष्ट पते tokenContract.Transfer ({_ from: भेजने वाले जोड़ें, _to: रिसीवरAddress})

निष्कर्ष

घटनाओं के लिए तीन उपयोग के मामले प्रस्तुत किए गए हैं। सबसे पहले, SendTransaction () के साथ संलग्न अनुबंध फ़ंक्शन से केवल रिटर्न वैल्यू प्राप्त करने के लिए एक घटना का उपयोग करना। दूसरा, डेटा के साथ एक अतुल्यकालिक ट्रिगर के रूप में एक घटना का उपयोग करना, जो एक पर्यवेक्षक को सूचित कर सकता है जैसे कि यूआई। तीसरा, ब्लॉकचैन में लॉग को स्टोर करने के लिए एक सस्ता फॉर्म के रूप में लिखने के लिए एक घटना का उपयोग करना। यह परिचय कुछ दिखाया गया है शहद की मक्खी घटनाओं के साथ काम करने के लिए। वहां अन्य दृष्टिकोण घटनाओं, लॉग और रसीदों के साथ काम करना और इन विषयों को भविष्य के लेखों में शामिल किया जा सकता है.

इस लेख पर प्रतिक्रिया के लिए हारून डेविस, विंसेंट गार्पी और जोसेफ लुबिन को धन्यवाद.

संदर्भ

[1] web3.js ब्लॉकचेन को शामिल करने के लिए लेनदेन देख सकता है, फिर ईवीएम के एक उदाहरण में लेनदेन को फिर से दोहरा सकता है, रिटर्न वैल्यू प्राप्त करने के लिए, लेकिन यह web3.j में जोड़ने के लिए तर्क की एक महत्वपूर्ण राशि है

].

[३] लॉग के लिए मर्कल प्रमाण संभव है, इसलिए यदि कोई बाहरी संस्था इस तरह के प्रमाण के साथ अनुबंध की आपूर्ति करती है, तो एक अनुबंध यह सत्यापित कर सकता है कि लॉग वास्तव में ब्लॉकचेन के अंदर मौजूद है।.

डेवलपर अपने इनबॉक्स में सीधे गाइड करना चाहते हैं?

ConsenSys ‘डेवलपर न्यूज़लेटर की सदस्यता लें

न्यूज़लैटर नवीनतम न्यूज़रेम समाचार, एंटरप्राइज़ समाधान, डेवलपर संसाधनों, और अधिक के लिए हमारे न्यूज़लेटर को बताएं।कैसे एक सफल ब्लॉकचेन उत्पाद बनाने के लिएवेबिनार

कैसे एक सफल ब्लॉकचेन उत्पाद बनाने के लिए

कैसे सेट अप करें और एक Ethereum नोड चलाएंवेबिनार

कैसे सेट अप करें और एक Ethereum नोड चलाएं

अपनी खुद की Ethereum API कैसे बनायेवेबिनार

अपनी खुद की Ethereum API कैसे बनाये

सोशल टोकन कैसे बनाएंवेबिनार

सोशल टोकन कैसे बनाएं

स्मार्ट अनुबंध विकास में सुरक्षा उपकरणों का उपयोग करनावेबिनार

स्मार्ट अनुबंध विकास में सुरक्षा उपकरणों का उपयोग करना

फ्यूचर ऑफ़ फ़ाइनेंस डिजिटल एसेट्स एंड डेफीवेबिनार

भविष्य का वित्त: डिजिटल एसेट्स और डीआईएफआई

Mike Owergreen Administrator
Sorry! The Author has not filled his profile.
follow me