GitHub रेपो:- https://github.com/PradhumnaPancholi/Figbot
ज़रा सुनिए सभी! कुछ समय पहले, मैं डैप टूल्स सीख रहा था क्योंकि इसमें स्मार्ट कॉन्ट्रैक्ट्स को विकसित करने और ऑडिट करने के लिए शानदार टूल हैं। और हालांकि मुझे अनुभव पसंद आया, मुझे जल्द ही पता चला कि यह गुप्त विकास के चरण में है। इसका मतलब है कि आकस्मिक/व्यक्तिगत उपयोगकर्ता समर्थन और अपडेट के लिए अनुरक्षकों पर निर्भर नहीं रह सकते हैं।
तब मैं फाउंड्री पर ठोकर खाई। इसमें वह सब कुछ है जो डैप टूल्स बिल्ट-इन प्रतीकात्मक निष्पादन के अलावा प्रदान करता है (जो मेरे लिए कोई समस्या नहीं है क्योंकि मैं ट्रेल ऑफ बिट्स द्वारा मैन्टिकोर ई का उपयोग करता हूं)। और यह ऑडिटिंग से संबंधित है इसलिए कल्पना के किसी भी हिस्से से स्मार्ट अनुबंध विकास में बाधा नहीं है।
कुछ समय के लिए फाउंड्री के साथ काम करने के बाद, मैंने अनुभव का आनंद लिया और इसे दूसरों के साथ साझा करना चाहता था। इसलिए, यह लेख।
यह लेख फाउंड्री, इंस्टॉलेशन प्रक्रिया, एनएफटी विकसित करने (क्योंकि हर कोई इसमें रुचि रखता है), अनुबंध का परीक्षण करने और इसे फिगमेंट डेटाहब के साथ तैनात करने के लाभों से गुजरेगा।
फाउंड्री रस्ट में लिखे गए एथेरियम एप्लिकेशन डेवलपमेंट के लिए एक तेज, पोर्टेबल और मॉड्यूलर टूलकिट है।
फाउंड्री तीन घटकों से बना है:
आज का फोकस फोर्ज पर रहेगा। लेकिन मैं आने वाले हफ्तों में जाति और निहाई पर गहन लेख पोस्ट करूंगा।
ट्रफल, हार्डहाट और ब्राउनी जैसे कई स्मार्ट अनुबंध विकास उपकरण हैं। लेकिन डैप टूल्स को पहली बार देखने के मेरे प्राथमिक कारणों में से एक मूल सॉलिडिटी टेस्ट था। हार्डहट और ब्राउनी जैसे ढांचे के बीच स्विच करते समय स्मार्ट अनुबंध लिखना मुश्किल नहीं है। और वे प्लगइन्स के साथ अविश्वसनीय उपकरण हैं, लेकिन परीक्षण करने के लिए जावास्क्रिप्ट/टाइपस्क्रिप्ट और पायथन में अच्छी तरह से वाकिफ होना चाहिए।
फाउंड्री हमें सॉलिडिटी में मूल रूप से अपने परीक्षण लिखने की अनुमति देता है। यह नए डेवलपर्स को ऑनबोर्ड करने में बहुत समय बचाता है और प्रक्रिया को आसान बनाता है। लोगों को स्मार्ट अनुबंध विकास में अपना रास्ता बनाने में मदद करने के अपने अनुभव में, मैंने सीखा है कि जूनियर डेवलपर्स के लिए डीएओ/समुदाय-अनुरक्षित परियोजनाओं के साथ जुड़ने का सबसे अच्छा और सबसे कुशल तरीका परीक्षण लिखना और कोड-बेस के बारे में सीखना है। मुझे याद है कि स्कूपी ट्रूपल्स ने एक बार उल्लेख किया था कि उन्होंने बैंकलेस पर अल्केमिक्स फाइनेंस विकसित करते समय उसी दृष्टिकोण का उपयोग किया था।
इसके अलावा, बिल्ट-इन फ़ज़िंग, चीट कोड, कास्ट और एनविल इसे स्मार्ट कॉन्ट्रैक्ट्स के परीक्षण के लिए एक ठोस सूट बनाते हैं। जल्द ही आने वाले उन घटकों पर अधिक विस्तृत लेख होंगे। [स्थिर विश्लेषक को एकीकृत करने में आसान]
आइए अब एक एनएफटी परियोजना में गोता लगाएँ और निर्माण करें।
यदि आप मैक या लिनक्स पर हैं, तो आपको केवल दो कमांड चलाने की जरूरत है:
curl -L https://foundry.paradigm.xyz | bash
foundryup
foundryup
चलाने से पहले टर्मिनल को बंद करना सुनिश्चित करें।
और वोइला! आप सब कर चुके हैं।
विंडोज के लिए, आपको रस्ट इंस्टॉल करना होगा और फिर:
cargo install --git https://github.com/foundry-rs/foundry --locked
इस लेख के लिए, हम एक साधारण NFT प्रोजेक्ट बनाएंगे जिसे Figbots कहा जाता है।
"फिगबॉट्स" नामक एक निर्देशिका बनाकर प्रारंभ करें। और जब आप निर्देशिका के अंदर हों तो forge init
चलाएं। यह कमांड आपके लिए git
इनिशियलाइज़ के साथ एक फाउंड्री प्रोजेक्ट तैयार करेगा।
आइए फ़ोल्डर संरचना पर एक त्वरित नज़र डालें। आपके पास तीन प्राथमिक फ़ोल्डर हैं, अर्थात् src, lib, और परीक्षण। यहां बहुत आत्म-व्याख्यात्मक है, आप अपने अनुबंधों को src
में लिखते हैं, परीक्षण में test
करते हैं, और lib
में आपके द्वारा स्थापित सभी पुस्तकालय शामिल हैं, उदाहरण के लिए, OpenZeppelin। इसके अलावा, आपको foundry.toml
मिलता है जिसमें hardhat.config.js
और brownie-config.yaml
कॉन्फिग.यामल जैसे सभी कॉन्फ़िगरेशन होते हैं यदि आपने उन ढांचे का उपयोग किया है। एक और प्यारी चीज है .github, जहां आप अपने Github Actions को लिख सकते हैं। मुझे टीम में काम करते समय परीक्षणों के लिए यह वास्तव में सहायक लगता है।
चलो निर्माण शुरू करें! हम एक सीमित आपूर्ति, लागत (ढलाई के लिए) और निकासी के साथ फिगबॉट नामक एक साधारण एनएफटी बनाएंगे। इस दृष्टिकोण के साथ, हम विभिन्न परीक्षणों के लिए किनारों को कवर कर सकते हैं। सबसे पहले, अनुबंध.सोल और test/Contract.t.sol
Contract.sol
t.sol का नाम बदलकर क्रमशः Figbot.sol
और Figbot.t.sol
। अब, हम Openzeppelin के बिना स्मार्ट अनुबंध नहीं लिख सकते हैं, है ना?
फाउंड्री के साथ पुस्तकालय स्थापित करना हार्डहट और ब्राउनी से थोड़ा अलग है। हमारे पास npm या pip पैकेज नहीं हैं। हम फाउंड्री में सीधे स्रोत (GitHub रेपो) से पुस्तकालय स्थापित करते हैं।
forge install Openzeppelin/openzeppelin-contracts
अब हम अपना NFT बनाने के लिए ERC721URIStorage.sol एक्सटेंशन आयात कर सकते हैं। यह जांचने के लिए कि सब कुछ ठीक है, हम forge build
कमांड चला सकते हैं, और यह हमारी परियोजना को संकलित करेगा। अगर कुछ गड़बड़ है तो कंपाइलर आप पर चिल्लाएगा। अन्यथा, आपको एक सफल संकलन मिलेगा।
किसी भी अन्य पैकेज मैनेजर की तरह, फोर्ज आपको अपनी निर्भरता को प्रबंधित करने के लिए forge install <lib>,
forge remove <lib>
और forge update <lib>
का उपयोग करने की अनुमति देता है।
हम Openzeppelin के तीन अनुबंधों का उपयोग करेंगे। काउंटर, ERC721URISभंडारण, और स्वामित्व योग्य। पिनाटा का उपयोग करके अपनी संपत्ति को आईपीएफएस में अपलोड करने का समय आ गया है। हम स्वामित्व वाले अनुबंध का उपयोग परिनियोजन पते owner
को सेट करने के लिए करते हैं और केवल स्वामी को धन निकालने की अनुमति देने के लिए केवल onlyOwner
संशोधक तक पहुंच रखते हैं। एनएफटी अनुबंध को सरल रखने के लिए टोकन आईडी और ERC721URIStorage
के साथ हमारी मदद करने के लिए Counters
।
राज्य चर सेट करना:
MAX_SUPPLY
से 100COST
TOKEN_URI
से CID, हम पिनाटा से प्राप्त करते हैंटोकन आईडी के लिए काउंटर का उपयोग करना:
using Counters for Counters.Counter;
Counters.Counter private tokenIds;
ERC721 कंस्ट्रक्टर:
constructor() ERC721(“Figbot”, “FBT”) {}
टकसाल समारोह:
msg.value
COST
से अधिक हैtokenIds.current()
MAX_SUPPLY
से अधिक या बराबर है_safeMint
और _setTokenURI
निष्पादित करेंनिकासी समारोह:
function withdrawFunds() external onlyOwner { uint256 balance = address(this).balance; require(balance > 0, "No ether left to withdraw"); (bool success, ) = (msg.sender).call{value: balance}(""); require(success, "Withdrawal Failed"); emit Withdraw(msg.sender, balance); }
कुल आपूर्ति समारोह:
function totalSupply() public view returns (uint256) { return _tokenIds.current(); }
जैसा कि हम सभी जानते हैं, हमारे स्मार्ट अनुबंधों का परीक्षण करना वास्तव में महत्वपूर्ण है। इस खंड में, हम forge test
की एक ठोस समझ प्राप्त करने के लिए कुछ टेस्ट लिखेंगे और देशी सॉलिडिटी में टेस्ट लिखने की आदत डालेंगे। हमारे परीक्षण परिदृश्य में फिट होने के लिए खाता राज्यों का प्रबंधन करने के लिए हम तीन फाउंड्री चीट कोड (मैं उन्हें प्यार करता हूँ!)
हम निम्नलिखित परिदृश्यों के लिए परीक्षण करेंगे:
जैसा कि हमारे स्मार्ट अनुबंधों में जटिल तर्क हो सकते हैं। और उनसे राज्य के आधार पर अलग-अलग व्यवहार करने की उम्मीद की जाती है, खाता, समय, आदि का इस्तेमाल किया जाता है। ऐसे परिदृश्यों से निपटने के लिए, हम ब्लॉकचैन की स्थिति का प्रबंधन करने के लिए चीटकोड का उपयोग कर सकते हैं। हम इन चीटकोड्स का उपयोग vm
इंस्टेंस का उपयोग करके कर सकते हैं, जो फाउंड्री की Test
लाइब्रेरी का एक हिस्सा है।
हम अपने परीक्षणों में तीन चीटकोड का उपयोग करेंगे:
startPrank
: बाद की सभी कॉलों के लिए msg.sender
सेट करता है जब तक कि stopPrank
को कॉल न किया जाए।
stopPrank
:
startPrank
द्वारा शुरू किए गए एक सक्रिय शरारत को रोकता है, startPrank को कॉल करने से पहले msg.sender
और tx.origin
को मानों पर startPrank
कर देता है।
deal
: दिए गए पते के बैलेंस को दिए गए बैलेंस पर सेट करता है।
फाउंड्री एक अंतर्निहित परीक्षण पुस्तकालय के साथ आता है। हम इस परीक्षण पुस्तकालय, हमारे अनुबंध (जिसे हम परीक्षण करना चाहते हैं), परीक्षण को परिभाषित करने, चर सेट करने और setUp
फ़ंक्शन को आयात करके शुरू करते हैं।
pragma solidity ^0.8.13; import"forge-std/Test.sol"; import "../src/Figbot.sol"; contract FigbotTest is Test { Figbot figbot; address owner = address(0x1223); address alice = address(0x1889); address bob = address(0x1778); function setUp() public { vm.startPrank(owner); figbot = new Figbot(); vm.stopPrank(); } }
राज्य चर के लिए, हम Figbot
प्रकार का एक चर figbot
बनाते हैं। यह वह स्थान भी है जहां मैं उपयोगकर्ता खातों को परिभाषित करना पसंद करता हूं। फाउंड्री में, आप सिंटैक्स address(0x1243)
का उपयोग करके किसी पते का वर्णन कर सकते हैं। इसके लिए आप किन्हीं चार अक्षरांकीय वर्णों का प्रयोग कर सकते हैं। मैंने क्रमशः मालिक, ऐलिस और बॉब नाम के खाते बनाए हैं।
अब हमारा setUp
फंक्शन। फाउंड्री में परीक्षण लिखने के लिए यह एक आवश्यकता है। यह वह जगह है जहां हम उस प्रकृति की सभी तैनाती और चीजें करते हैं। मैंने उपयोगकर्ता को "स्वामी" में बदलने के लिए startPrank
का उपयोग किया। डिफ़ॉल्ट रूप से, फाउंड्री परीक्षण अनुबंधों को तैनात करने के लिए एक विशिष्ट पते का उपयोग करता है। लेकिन इससे withdrawFunds
फंड जैसे विशेष विशेषाधिकारों के साथ कार्यों का परीक्षण करना कठिन हो जाता है। इसलिए, हम इस परिनियोजन के लिए "स्वामी" खाते में स्विच करते हैं।
फाउंड्री कन्वेंशन सीखने के लिए एक साधारण अभिकथन परीक्षण से शुरू करें। परंपरा के अनुसार, सभी परीक्षण कार्यों में उपसर्ग test
होना चाहिए। और हम यह जांचने के लिए assertEq
का उपयोग करते हैं कि क्या दो मान समान हैं।
हम अपने MaxSupply
फ़ंक्शन को कॉल करते हैं और परीक्षण करते हैं कि क्या परिणाम मान 100 है, जैसा कि हमने अपने अनुबंध में वर्णित किया है। और हम अपने परीक्षण चलाने के लिए forge test
का उपयोग करते हैं।
और वोइला !!! हमारे पास एक उत्तीर्ण परीक्षा है।
अब जबकि हमने एक सरल परीक्षण लिख लिया है, आइए एक चीटकोड के साथ लिखें। हमारे अनुबंध का प्राथमिक कार्य।
balanceOf
ऐलिस 1 . है हमारे पास एक और परीक्षण फ़ंक्शन है जिसका उपयोग उन परीक्षणों के लिए किया जाता है जिन्हें हम विफल होने की उम्मीद करते हैं। ऐसे परीक्षण के लिए प्रयुक्त उपसर्ग testFail
है। यदि कॉलर के पास अपर्याप्त धन है तो हम परीक्षण करेंगे कि mint
फ़ंक्शन वापस आ जाता है या नहीं।
balanceOf
बॉब 1 . है क्योंकि टकसाल नहीं गुजरा, बॉब का संतुलन 1 नहीं होने वाला है। इसलिए, यह विफल हो जाएगा, जो कि वास्तव में हम परीक्षण के लिए उपयोग किए testFail
हैं। तो जब आप forge test
चलाते हैं, तो यह पास हो जाएगा।
यहां हम एक ऐसे फ़ंक्शन का परीक्षण करेंगे जिसे केवल "स्वामी" ही सफलतापूर्वक कर सकता है। इस परीक्षण के लिए, हम करेंगे:
withdrawFunds
निधि कार्य करें (यदि सफल हो, तो इसे स्वामी का शेष 0.69 ईथर बनाना चाहिए)अब जब हमने अपने अनुबंध का परीक्षण कर लिया है, तो इसे लागू करने का समय आ गया है। हमें एक वॉलेट (कुछ रिंकीबी टेस्ट ईटीएच के साथ) और एक आरपीसी यूआरएल के लिए निजी कुंजी की आवश्यकता है। हमारे RPC URL के लिए, हम Figment DataHu का उपयोग करेंगे।
फिगमेंट डेटाहब हमें वेब 3 पर विकसित करने के लिए बुनियादी ढांचा प्रदान करता है। यह एथेरियम, सेलो, सोलाना, टेरा इत्यादि जैसी कई श्रृंखलाओं का समर्थन करता है।
आप "प्रोटोकॉल" टैब के अंतर्गत रिंकीबी के लिए अपना आरपीसी यूआरएल प्राप्त कर सकते हैं।
इन दोनों चीजों को पर्यावरण चर के रूप में दर्ज करने के लिए अपना टर्मिनल खोलें।
export FIG_RINKEBY_URL=<Your RPC endpoint> export PVT_KEY=<Your wallets private key>
एक बार हमारे पास पर्यावरण चर हो जाने के बाद, हम तैनाती के लिए पूरी तरह तैयार हैं
forge create Figbot --rpc-url=$FIG_RINKEBY_URL --private-key=$PVT_KEY
हम यहाँ लगभग कर चुके हैं। अब तक, हमने फाउंड्री और फिगमेंट डेटाहब के साथ एक स्मार्ट अनुबंध लिखा, परीक्षण और तैनात किया है। लेकिन हम अभी पूरी तरह से नहीं बने हैं। अब हम अपने अनुबंध को सत्यापित करने जा रहे हैं। इसके लिए हमें अपनी इथरस्कैन एपीआई कुंजी सेट करनी होगी।
export ETHERSCAN_API=<Your Etherscan API Key>
और अब हम अपने स्मार्ट अनुबंध को सत्यापित कर सकते हैं।
forge verify-contract --chain-id <Chain-Id> --num-of-optimizations 200 --compiler-version <Compiler Version> src/<Contract File>:<Contract> $ETHERSCAN_API
बधाई हो! अब आप फाउंड्री का उपयोग करके स्मार्ट अनुबंध लिख सकते हैं, परीक्षण कर सकते हैं और तैनात कर सकते हैं। मुझे आशा है कि आपने इस लेख से आनंद लिया और सीखा। मुझे यह लिखने में वाकई बहुत अच्छा लगा। बेझिझक मुझे इसके बारे में अपने विचार बताएं।