जब Solidity डिप्लॉय किए जाने वाले smart contract के लिए bytecode जनरेट करता है, तो यह bytecode के अंत में कंपाइलेशन के बारे में metadata जोड़ता है। हम इस bytecode में मौजूद डेटा की जांच करेंगे।
एक साधारण smart contract
आइए सबसे सरल संभव Solidity smart contract के कंपाइलर आउटपुट को देखें
//SPDX-License-Identifier: MIT
pragma solidity 0.8.20;
contract Empty {
constructor() payable {}
}
यह contract सचमुच कुछ नहीं करता है। हम इसका init code देखने के लिए इसे solc --optimize-runs 1000 --bin C.sol के साथ कंपाइल कर सकते हैं। हमें निम्नलिखित आउटपुट मिलता है
======= C.sol:Empty =======
Binary:
6080604052603e80600f5f395ff3fe60806040525f80fdfea26469706673582212203082dbb4f4db7e5d53b235f44d3e38f839dc82075e2cda9df05b88e6585bca8164736f6c63430008140033
कुछ भी न करने वाले contract के लिए यह बहुत बड़ा लगता है, है ना? आइए समझते हैं कि यह सारा bytecode क्या है।
जब हम कोड को solc --optimize-runs 1000 --bin --no-cbor-metadata C.sol के साथ कंपाइल करते हैं तो हमें निम्नलिखित आउटपुट मिलता है:
======= C.sol:Empty =======
Binary:
6080604052600880600f5f395ff3fe60806040525f80fd
यह काफी छोटा है! तो वह सारी अतिरिक्त जानकारी क्या है?
Solidity Metadata
डिफ़ॉल्ट रूप से, Solidity कंपाइलर “वास्तविक” init code के अंत में metadata जोड़ता है, जो constructor का निष्पादन पूरा होने पर ब्लॉकचेन में स्टोर हो जाता है। यहाँ नीचे “अतिरिक्त” कोड दिया गया है:
fea26469706673582212203082dbb4f4db7e5d53b235f44d3e38f839dc82075e2cda9df05b88e6585bca8164736f6c63430008140033
अंतिम दो बाइट्स 0033 का मतलब है “0x33 बाइट्स पीछे देखें, वही metadata है।” यह शुरुआती fe (जो कि INVALID opcode है) और अंत के 0033 के बीच के सभी कोड को संदर्भित करता है। हम जांच सकते हैं कि यह वास्तव में 0x33 बाइट्स है।
# fe and 0033 are not included
>>>hex(len('a26469706673582212203082dbb4f4db7e5d53b235f44d3e38f839dc82075e2cda9df05b88e6585bca8164736f6c6343000814') // 2)
# '0x33'
तो यह 0x33 (51 डेसीमल) स्ट्रिंग क्या है?
यदि हम सोर्स कोड में एक छोटा, महत्वहीन सा दिखने वाला बदलाव करते हैं, तो हमें एक संकेत मिल सकता है। यह बदलाव सचमुच केवल एक अतिरिक्त कमेंट है।
//SPDX-License-Identifier: MIT
pragma solidity 0.8.20;
contract Empty {
// nothing
constructor() payable {}
}
निम्नलिखित स्क्रीनशॉट में बदलाव के पहले और बाद की स्थिति दिखाई गई है।

आप देख सकते हैं कि रेखांकित हिस्से बदल गए हैं, भले ही कोड की कार्यक्षमता नहीं बदली है। हम अगले भाग में बॉक्स में दिए गए कोड की व्याख्या करेंगे।
metadata को डिकोड करना
शुरुआत में, ऐसा लगेगा कि हम जादुई रूप से हवा से substrings निकाल रहे हैं; थोड़ा धैर्य रखें।
आइए ऊपर दिए गए नीले बॉक्स में hex को देखें
>>> bytes.fromhex("69706673").decode("ASCII")
'ipfs'
इसके बाद लाल बॉक्स में दिए गए कोड को देखें
>>> bytes.fromhex("736f6c63").decode("ASCII")
'solc'
यह हमें एक सुराग देता है कि इस डेटा में क्या शामिल है: एक IPFS hash और Solidity कंपाइलर वर्ज़न।
IPFS Hash
पीले रंग में रेखांकित सेक्शन को फ़िरोज़ा बॉक्स के साथ निम्नलिखित python स्क्रिप्ट में रखा जा सकता है (ध्यान दें कि हम कोड के उस वर्ज़न का उपयोग कर रहे हैं जिसमें // nothing कमेंट है)
import base58
hex_ipfs_hash = "12206a68b6b8bcc01ba559ec3adf7a387b6c4210a5dc69a05d038e9d17cae3fa373b"
bytes_str = bytes.fromhex(hex_ipfs_hash)
print(base58.b58encode(bytes_str).decode("utf-8"))
# QmVW2XyafSxDtiSqirJRauuT5SaQtGnQYsxxyYHrFmRTEa
Qm...RTEa कंपाइलर द्वारा उत्पन्न metadata फ़ाइल का IPFS hash है। कोड का यह सेक्शन (फ़िरोज़ा और पीला) ऊपर दिए गए बॉक्स से अलग तरीके से एन्कोड किया गया है। विशेष रूप से, IPFS hash (फ़िरोज़ा और पीला) hex डेटा “1220…RTEa” का base58 एन्कोडेड वर्ज़न है।
यह वह IPFS hash है जो आपको तब मिलेगा जब आप Solidity कंपाइलर से प्राप्त JSON फ़ाइल को IPFS पर डालेंगे। संबंधित JSON फ़ाइल यहाँ दी गई है।

हम JSON फ़ाइल को एक वास्तविक फ़ाइल के रूप में स्टोर कर सकते हैं और फिर यह वैलिडेट कर सकते हैं कि hash ऊपर python में बनाए गए hash से मेल खाता है। इसके लिए आपको ipfs कमांडलाइन टूल इंस्टॉल करना होगा (how to install)।
mkdir out
solc --optimize-runs 1000 --bin --metadata C.sol --output-dir out
# Compiler run successful. Artifact(s) can be found in directory "out".
ipfs add -qr --only-hash out/Empty_meta.json
# QmVW2XyafSxDtiSqirJRauuT5SaQtGnQYsxxyYHrFmRTEa
यह पहले वाले hash से मेल खाता है।
क्या इससे hash collisions नहीं होंगे?
यदि समान सोर्स कोड और कंपाइलर कॉन्फ़िगरेशन वाले दो contracts अपना वेरीफाइड सोर्स कोड IPFS पर स्टोर करते हैं, तो IPFS hashes आपस में टकराएंगे, लेकिन यह वांछनीय है क्योंकि यह वास्तव में स्टोरेज स्पेस बचाता है। smart contracts को विशिष्ट रूप से chain id और उनके address के संयोजन द्वारा पहचाना जाता है, न कि IPFS कंटेंट द्वारा।
Solidity वर्ज़न प्राप्त करना
अंत में, यदि हम नारंगी बॉक्स वाले सेक्शन को कन्वर्ट करते हैं, तो हमें Solidity का वर्ज़न दिखाई देता है।
>>> 0x00 # solidity is version 0
0
>>> 0x08 # major version
8
>>> 0x14 # minor version
20
# correct, we used solidity 0.8.20
smart contract metadata क्यों मौजूद है?
यह metadata डिप्लॉयमेंट कॉस्ट में अतिरिक्त 53 बाइट्स जोड़ता है, जिसका अर्थ है अतिरिक्त 10,600 gas (प्रति bytecode 200) + calldata कॉस्ट (प्रति नॉन-ज़ीरो बाइट 16 gas, प्रति ज़ीरो-बाइट 4 gas)। यह calldata कॉस्ट में 848 अतिरिक्त gas तक बदल जाता है।
तो इसे क्यों शामिल किया जाता है?
यह smart contract कोड को सख्ती से वेरीफाई करने में सक्षम बनाता है। कंपाइलर आउटपुट के metadata JSON में सोर्स कोड का एक hash शामिल होता है। इसलिए यदि सोर्स कोड थोड़ा सा भी बदलता है, तो metadata JSON फ़ाइल बदल जाएगी और इसका IPFS hash भी बदल जाएगा।
IPFS hash के माध्यम से gas कम करने की एक अनोखी ट्रिक
डिप्लॉयमेंट के समय optimize gas cost का एक स्पष्ट तरीका --no-cbor-metadata विकल्प का उपयोग करना है। लेकिन यदि आपको contract वेरिफिकेशन के लिए इसकी आवश्यकता है, तो आप अभी भी उन IPFS hashes की माइनिंग करके gas कॉस्ट को कम कर सकते हैं जिनमें बहुत सारे ज़ीरो बाइट्स होते हैं। जब contract डिप्लॉय किया जाता है, तो ज़ीरो बाइट्स calldata की कॉस्ट को कम कर देंगे। क्योंकि सोर्स कोड को hash किया जाता है, जिसमें कमेंट्स भी शामिल होते हैं, इसका मतलब है कि कोई भी ऐसे कमेंट्स की माइनिंग कर सकता है जो gas-efficient IPFS hashes की ओर ले जाते हैं और जिन्हें contract के साथ जोड़ा जाएगा। ध्यान दें कि इसका मतलब है कि हम चाहते हैं कि hash के hex प्रतिनिधित्व में ज़ीरो हों, न कि base58 एन्कोडिंग में।
अतिरिक्त संसाधन
आप प्रासंगिक Solidity documentation में इस metadata में हेरफेर करने के सभी विकल्प देख सकते हैं। Sourcify मौजूदा smart contracts के metadata को पार्स करने के लिए एक टूल प्रदान करता है।
और जानें
अधिक उन्नत smart contract विषयों को जानने के लिए हमारा Solidity Bootcamp देखें।
मूल रूप से 25 मई, 2023 को प्रकाशित