खोज क्रिप्टोकरंसी - भाग 1: डेटा निष्कर्षण

स्रोत: https://www.cryptokitties.co/kitty/101

यदि आप इसे पढ़ रहे हैं, तो शायद आपने उस गेम के बारे में सुना है जिसने पिछले कुछ महीनों में Ethereum नेटवर्क पर सभी का ध्यान आकर्षित किया है: CryptoKitties!

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

ब्लॉक साइंस एक प्रौद्योगिकी अनुसंधान और विश्लेषण फर्म है जो विकेंद्रीकृत आर्थिक प्रणालियों के डिजाइन और मूल्यांकन में विशेषज्ञता है। CryptoKitties अर्थव्यवस्था के पहलुओं का विश्लेषण हमारे डेटा निष्कर्षण उपकरण को बेहतर बनाने के लिए एक महान अवसर की तरह लग रहा था, जबकि एक ही समय में (और जीवंत!) विकेन्द्रीकृत आवेदन से कुछ वास्तविक दुनिया डेटा पर हमारे हाथ हो रहे थे।

इस ब्लॉग पोस्ट को दो भागों में विभाजित किया गया है:

  • भाग 1 (यह पोस्ट) एथेरियम ब्लॉकचेन से डेटा निकालने और बदलने से संबंधित तकनीकी पहलुओं को शामिल करता है।
  • भाग 2 में कुछ गेम डेटा का वास्तविक विश्लेषण है।

इथेरियम ब्लॉकचैन से डेटा निकालना

भले ही कभी भी Ethereum नेटवर्क पर जो कुछ भी हुआ है वह ब्लॉकचेन पर रिकॉर्ड किया गया है, उन बिट्स को सार्थक डेटा में बदलना हमेशा सीधा नहीं होता है। लेन-देन के आंकड़ों को बताते हुए यह कहना सरल है कि किसी दिए गए ब्लॉक खाते में A ने कुछ ईथर (ETH) को B को भेजा और उस लेनदेन के लिए एक निश्चित गैस की कीमत तय की। हालाँकि, जब हम अनुबंधों पर भेजे गए लेनदेन पर काम कर रहे होते हैं, तो ब्लॉकचेन डेटा को डिकोड करना कई निश्चित चौड़ाई की टेक्स्ट फ़ाइलों से ईटीएल को लागू करने के लिए महत्वपूर्ण होता है, जिनके प्रारूप केवल उन्हीं सॉफ़्टवेयर के स्रोत कोड में वर्णित किए जाते हैं, जिन्हें उन्होंने बनाया था।

स्मार्ट कॉन्ट्रैक्ट्स में कॉल फ़ंक्शंस वाले लेनदेन

उदाहरण के लिए डेटा लेनदेन में निम्नलिखित सामग्री के साथ 0xb1690c08e213a35ed9bab7b318de14420fb57d8c अनुबंध पर भेजा गया लेन-देन करें

0x454a2ab300000000000000000000000000000000000000000000000000000000000871ad

यह क्या करता है?

डेटा फ़ील्ड का पहला भाग (0x454a2ab3) स्मार्ट अनुबंध के अंदर फ़ंक्शन को संदर्भित करता है जिसे लेनदेन द्वारा बुलाया जा रहा है। वे फ़ंक्शन हस्ताक्षर के हैश के पहले चार बाइट्स हैं, जिन्हें फ़ंक्शन के नाम के रूप में परिभाषित किया जाता है, जिसके बाद उसके मापदंडों के डेटा प्रकार होते हैं।

keccak256 ( "<समारोह> (, <...>, )")

शेष बाइट्स फ़ंक्शन पैरामीटर के मान हैं। आप इसके बारे में यहां विस्तार से पढ़ सकते हैं।

उन 4 बाइट्स को जानते हुए भी, हम कैसे बता सकते हैं कि किस फ़ंक्शन को बुलाया जा रहा है, या इसके कितने पैरामीटर हैं? इस विशिष्ट मामले में, हम जानते हैं कि अनुबंध 0xb1690c ... CryptoKitties नीलामी का अनुबंध है - बिल्लियों को खरीदने और बेचने के लिए बाजार। और क्योंकि इसके स्रोत कोड को सार्वजनिक कर दिया गया है, हम जानते हैं कि इसकी एक बोली है

/// एक खुली नीलामी में बोली लगाता है, नीलामी को पूरा करता है और
/// पर्याप्त Ether आपूर्ति होने पर NFT के स्वामित्व को स्थानांतरित करना।
/// param _tokenID: बोली लगाने के लिए टोकन की आईडी।
समारोह बोली (uint256 _tokenId)

यदि हम बोली फ़ंक्शन हस्ताक्षर के हैश की गणना करते हैं, तो हम देख सकते हैं कि पहले चार बाइट लेनदेन डेटा में मौजूद हैं।

keccak256 ("बोली (uint256)") = 454a2ab3c602fd9 ...

और क्योंकि फ़ंक्शन केवल एक तर्क लेता है, हम बता सकते हैं कि लेनदेन डेटा में उन पहले चार बाइट्स के बाद सब कुछ उस पैरामीटर है। दूसरे शब्दों में, लेनदेन बिल्ली नंबर 0x871ad (553389) पर बोली लगा रहा है।

स्मार्ट कॉन्ट्रैक्ट्स जो लॉग इन सूचना

स्मार्ट कॉन्ट्रैक्ट्स को उनके निष्पादन के दौरान जानकारी लॉग करना आम बात है। एक अनुबंध द्वारा दर्ज किए गए लॉग को JSON RPC API eth_getlogs विधि से कॉल करके प्राप्त किया जा सकता है। जैसा कि अनुबंध कार्यों को कॉल करने वाले लेनदेन के मामले में है, हमें इस एपीआई द्वारा लौटाए गए डेटा को डीकोड करने के लिए अनुबंध के स्रोत कोड को जानना होगा। उदाहरण के लिए, निम्नलिखित डेटा के साथ एक लॉग का क्या मतलब है?

ब्लॉकनंबर: 0x51968f
विषय: [0x0a5311bd2a6608f08a180df2ee7c5946819a649b204b554bb8e39825b2c50ad5] डेटा: 0x0000000000000000000000001b8f7b13b14a59d9770f7c1789cf727046f7e542000000000000000000000000000000000000000000000000000000000009fac1000000000000000000000000000000000000000000000000000000000009f80e000000000000000000000000000000000000000000000000000000000008957200004a50b390a6738697012a030ac21d585b4c8214ae39446194054b98e0b98f

लॉग तब रिकॉर्ड किए जाते हैं जब कोई अनुबंध किसी ईवेंट को ट्रिगर करता है। विषय सरणी का पहला तत्व (जिसमें हमारे उदाहरण में केवल एक तत्व है) इवेंट हस्ताक्षर का हैश है। क्रिप्टोकरंसीज के मामले में, लॉग तब रिकॉर्ड किए जाते हैं जब एक बिल्ली गर्भवती हो जाती है और जब एक बिल्ली का जन्म होता है, उदाहरण के लिए।

/// प्रेगनेंट इवेंट को निकाल दिया जाता है जब दो बिल्लियाँ सफलतापूर्वक प्रजनन करती हैं
/// और मैट्रॉन के लिए गर्भावस्था टाइमर शुरू होता है।
घटना गर्भवती (पता स्वामी, uint256 matronId, uint256 sireId, uint256 cooldownEndBlock);
/// जन्म की घटना को निकाल दिया जाता है जब भी कोई नया बिल्ली का बच्चा आता है
/// अस्तित्व। इसमें स्पष्ट रूप से किसी भी समय बिल्ली शामिल है
/// गिवबर्थ विधि के माध्यम से, लेकिन इसे कब कहा जाता है
/// एक नया gen0 बिल्ली बनाया गया है।
घटना का जन्म (पता मालिक, uint256 किटीआईड, uint256 matronId, uint256 sireId, uint256 जीन);

देखें कि जन्म घटना हस्ताक्षर का हैश हमारे उदाहरण में लॉग में मूल्य से कैसे मेल खाता है

keccak256 ("जन्म (पता, uint256, uint256, uint256, uint256)") = 0x0a5311bd2a6608f08a180df2i25959819a649b204b554bb8e39825b2c50ad2ad50ad5

अब तक, हम जानते हैं कि ब्लॉक नंबर 51968F (5346959) पर एक क्रिप्टोकरंसी का जन्म हुआ था! हमारी डिकोडिंग प्रक्रिया में अगला चरण जन्म घटना के पांच मापदंडों के अनुसार डेटा फ़ील्ड को विभाजित करना है। पहला पैरामीटर एक Ethereum पता है, जो 160 बिट लंबा है, लेकिन 256 बिट्स के साथ एन्कोड किया गया है (पता के बाईं ओर शून्य जोड़े जाते हैं)। अन्य पैरामीटर 256-बिट पूर्णांक हैं। डेटा फ़ील्ड को इसलिए 5 भागों में विभाजित किया गया है, प्रत्येक में 256-बिट (64 हेक्साडेसिमल वर्ण) हैं।

स्वामी: 0000000000000000000000001b8f7b13b14a59d9770f7c1789cf727046f7e542
kittyId:
000000000000000000000000000000000000000000000000000000000009fac1
matronId:
000000000000000000000000000000000000000000000000000000000009f80e
sireId:
0000000000000000000000000000000000000000000000000000000000089572
जीन:
00004a50b390a6738697012a030ac21d585b4c8214ae39446194054b98e0b98f

देखें कि "कई फिक्स्ड चौड़ाई पाठ फ़ाइलों से एक ईटीएल को लागू करने से मेरा क्या मतलब है, जिनके प्रारूप केवल सॉफ्टवेयर के स्रोत कोड में वर्णित हैं जो उन्हें बनाया गया है"? :-)

भाग 2 पर जाएँ, जहाँ हम CryptoKitties गेम डेटा का विश्लेषण करते समय कुछ दिलचस्प तथ्यों को साझा करते हैं!

अनुसंधान, अंतर्दृष्टि और समीक्षा के लिए ब्लॉक साइंस टीम का विशेष धन्यवाद।