
इस लेख में, हम दो उदाहरणों पर गौर करेंगे कि
ओन्टोलॉजी ब्लॉकचेन नेटवर्क के आधार पर
WASM का उपयोग करके C ++ में एक स्मार्ट अनुबंध कैसे लिखा
जाए । आज, परीक्षण मोड में कई महीनों के स्थिर संचालन के बाद,
ओन्टोलॉजी ने मुख्य नेटवर्क पर
डब्ल्यूएएसएम का शुभारंभ किया , जो जटिल व्यावसायिक तर्क के साथ ब्लॉकचेन को दर्द रहित और कम लागत पर स्थानांतरित करने की अनुमति देता है, जिससे डीएपी पारिस्थितिकी तंत्र को काफी समृद्ध किया जा सकता है।
ओन्टोलॉजी वास्म रस्ट भाषा में स्मार्ट कॉन्ट्रैक्ट के निर्माण का भी समर्थन करता है, आप इसके बारे में
यहां पढ़ सकते हैं।
नीचे एक स्मार्ट अनुबंध के दो उदाहरण दिए गए हैं: पहला, "हैलो वर्ल्ड!" और फिर एक आभासी पैसे का लिफाफा बनाएं जो एक दोस्त को उपहार के रूप में भेजा जा सकता है।
C ++ का उपयोग करके WASM अनुबंध का विकास
उदाहरण 1. हैलो वर्ल्ड
आइए नमस्ते दुनिया से शुरू करते हैं:
#include<ontiolib/ontio.hpp> #include<stdio.h> using namespace ontio; class hello:public contract { public: using contract::contract: void sayHello(){ printf("hello world!"); } }; ONTIO_DISPATCH(hello, (sayHello));
अनुबंध निर्माण
ओन्टोलॉजी वास्म सीडीटी संकलक में एक प्रवेश बिंदु और पार्सिंग पैरामीटर होते हैं, इसलिए डेवलपर्स को इनपुट विधियों को फिर से परिभाषित करने की आवश्यकता नहीं होती है। इसके अलावा, सेवा के तर्क को लिखने के लिए, आप स्मार्ट अनुबंध के एपीआई तरीकों को कॉल कर सकते हैं।
ONTIO_DISPATCH(hello, (sayHello));
उपरोक्त उदाहरण में, हम केवल अब तक का समर्थन करते हैं:
printf("hello world!");
"हैलो वर्ल्ड!" डिबग नोड लॉग में प्रदर्शित किया जाएगा। सीधे स्मार्ट कॉन्ट्रैक्ट लिखते समय, प्रिंटफ केवल डीबगिंग के लिए उपयोग किया जा सकता है, क्योंकि स्मार्ट कॉन्ट्रैक्ट में अधिक कार्यात्मक कमांड होते हैं।
स्मार्ट कॉन्ट्रैक्ट एपीआई
ओन्टोलॉजी वॉल्म सर्वर ब्लॉकचैन के साथ बातचीत के लिए निम्नलिखित एपीआई प्रदान करता है:

उदाहरण 2: धन लिफाफा
अब चलो एक और अधिक जटिल उदाहरण देखते हैं, जो कि वास्म स्मार्ट अनुबंध एपीआई का उपयोग करता है।
इस उदाहरण में, हम एक वर्चुअल मनी लिफाफा लिखेंगे, लाल लिफाफे का एक एनालॉग (होंगबाओ) चीनी वीचैट मैसेंजर की एक लोकप्रिय विशेषता है, जो आपको चैट में दोस्तों को पैसे भेजने की अनुमति देता है। उपयोगकर्ता को लाल लिफाफे के रूप में एक संदेश प्राप्त होता है, इसे खोलता है और धन स्वचालित रूप से खाते की शेष राशि में जमा हो जाता है।
एक स्मार्ट अनुबंध के हिस्से के रूप में, उपयोगकर्ता इस अनुबंध का उपयोग अपने मित्रों को वर्चुअल मनी लिफाफे का उपयोग करके ओएनटी, ओएनजी, या ओईपी -4 टोकन भेजने के लिए कर सकते हैं, जो तब टोकन को अपने ब्लॉकचेन वॉलेट में स्थानांतरित कर सकते हैं।
एक अनुबंध बनाने की तैयारी कर रहा है
सबसे पहले, स्रोत अनुबंध फ़ाइल बनाएं और इसे redEnvelope.cpp नाम दें। अगला, हमें इस अनुबंध के लिए तीन एपीआई चाहिए:
- createRedEnvelope : एक पैसा लिफ़ाफ़ा बनाएँ
- queryEnvelope : लिफाफा जानकारी का अनुरोध करें
- दावा लिफाफा: एक लिफाफा खोलें और धन प्राप्त करें
#include<ontiolib/ontio.hpp> using namespace ontio; class redEnvlope: public contract{ } ONTIO_DISPATCH(redEnvlope, (createRedEnvlope)(queryEnvlope)(claimEnvelope));
अब हमें कुंजी-मूल्य को बचाने की आवश्यकता है। एक स्मार्ट अनुबंध में, डेटा को एक कुंजी-मूल्य के रूप में अनुबंध के संदर्भ में संग्रहीत किया जाता है, और हमें बाद के अनुरोध के लिए प्रमुख डेटा के लिए एक उपसर्ग जोड़ना होगा।
नीचे हम तीन उपसर्गों को परिभाषित करते हैं जिनका हम उपयोग करेंगे:
std::string rePrefix = "RE_PREFIX_"; std::string sentPrefix = "SENT_COUNT_"; std::string claimPrefix = "CLAIM_PREFIX_";
चूंकि अनुबंध ओन्टोलॉजी टोकन - ओएनटी और ओएनजीजी दोनों का समर्थन करता है, हम उनके अनुबंध के पते को पहले से निर्धारित कर सकते हैं। एक मानक स्मार्ट अनुबंध के विपरीत, ओन्टोलॉजी का अपना अनुबंध पता तय है और अनुबंध के हैश से प्राप्त नहीं है।
address ONTAddress = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}; address ONGAddress = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2};
अगला, आपको अनुबंध में उपयोग किए गए टोकन के बारे में जानकारी सहेजने की आवश्यकता है: अनुबंध टोकन का पता, लिफाफे की कुल राशि और लिफाफे की संख्या।
struct receiveRecord{ address account;
निम्नलिखित ओन्टोलॉजी वास सीडीटी द्वारा परिभाषित मैक्रो ऑपरेशन है, जो डेटा संरचना से पहले क्रमांकन के लिए उपयोग किया जाता है।
ONTLIB_SERIALIZE(receiveRecord,(account)(amount))
एक लिफाफा बनाना
अब जब हमने आवश्यक तैयारी पूरी कर ली है, तो हम एपीआई तर्क का विकास शुरू करेंगे।
1. मनी लिफाफा बनाते समय, आपको स्वामी के पते, लिफाफे की संख्या और राशि और साथ ही टोकन का पता बताना होगा:
bool createRedEnvlope(address owner,asset packcount, asset amount,address tokenAddr ){ return true; }
2. मालिक के हस्ताक्षर की जांच करें, अन्यथा हम रोलबैक करेंगे (लेन-देन रोलबैक करें) और बाहर निकलें:
ontio_assert(check_witness(owner),"checkwitness failed");
नोट : ontio_assert (expr, misormsg): गलत expr एक त्रुटि देता है और अनुबंध से बाहर निकलता है।
3. यदि एक लिफाफे में ONT टोकन का उपयोग किया जाता है, तो यह याद रखना महत्वपूर्ण है कि, ONT खंडित नहीं है (कम से कम 1 ONT)। फिर धन लिफाफे की कुल राशि टोकन की संख्या से अधिक या उसके बराबर होनी चाहिए ताकि यह सुनिश्चित हो सके कि प्रत्येक लिफाफे में कम से कम 1 ONT है:
if (isONTToken(tokenAddr)){ ontio_assert(amount >= packcount,"ont amount should greater than packcount"); }
4. इसके बाद, हम लिफाफे के धारक के लिए निर्धारित करते हैं कि वह कितने पैसे लिफाफे भेजता है:
key sentkey = make_key(sentPrefix,owner.tohexstring()); asset sentcount = 0; storage_get(sentkey,sentcount); sentcount += 1; storage_put(sentkey,sentcount);
5. लिफाफे के हैश उत्पन्न करें - पहचानकर्ता जो इस लिफाफे को चिह्नित करता है:
H256 hash ; hash256(make_key(owner,sentcount),hash) ; key rekey = make_key(rePrefix,hash256ToHexstring(hash));
6. हम अनुबंध में टोकन का अनुवाद करेंगे। हम उस अनुबंध के पते का पता लगाते हैं जिसे वर्तमान में self_address () कमांड का उपयोग करके निष्पादित किया जा रहा है, फिर हम टोकन के प्रकार के आधार पर निर्दिष्ट टोकन को अनुबंध में स्थानांतरित करेंगे:
address selfaddr = self_address(); if (isONTToken(tokenAddr)){ bool result = ont::transfer(owner,selfaddr ,amount); ontio_assert(result,"transfer native token failed!"); }else if (isONGToken(tokenAddr)){ bool result = ong::transfer(owner,selfaddr ,amount); ontio_assert(result,"transfer native token failed!"); }else{ std::vector<char> params = pack(std::string("transfer"),owner,selfaddr,amount); bool res; call_contract(tokenAddr,params, res ); ontio_assert(res,"transfer oep4 token failed!"); }
नोट 1: ONT और ONG के लिए, ओण्टोलॉजी वॉल्म CDT, टोकन ट्रांसफर करने के लिए ont :: transfer API प्रदान करता है; OEP-4 टोकन को पारंपरिक क्रॉस-कॉन्ट्रैक्ट कॉल विधि का उपयोग करके भेजा जाना चाहिए।
नोट 2: एक नियमित वॉलेट पते की तरह, अनुबंध का पता किसी भी प्रकार के टोकन को स्वीकार कर सकता है। हालाँकि, अनुबंध का पता एक संकलित बाइनरी हैश द्वारा बनाया गया है और इस प्रकार इसके पास निजी कुंजी नहीं है और अनुबंध टोकन का उपयोग नहीं कर सकता है। यदि आपने एक निजी कुंजी सेट नहीं की है, तो आप इन टोकन को प्रबंधित करने में सक्षम नहीं होंगे।
7. डेटा गोदाम में अनुबंध के बारे में जानकारी सहेजें:
struct envlopeStruct es ; es.tokenAddress = tokenAddr; es.totalAmount = amount; es.totalPackageCount = packcount; es.remainAmount = amount; es.remainPackageCount = packcount; es.records = {}; storage_put(rekey, es);
8. लिफाफे के निर्माण के बारे में एक अधिसूचना भेजें। यह एक स्मार्ट अनुबंध को लागू करने के लिए एक अतुल्यकालिक प्रक्रिया है, अनुबंध निष्पादन के परिणाम की एक अधिसूचना भी भेजेगा। निष्पादन प्रारूप अनुबंध के लेखक द्वारा निर्धारित किया जा सकता है।
char buffer [100]; sprintf(buffer, "{\"states\":[\"%s\", \"%s\", \"%s\"]}","createEnvlope",owner.tohexstring().c_str(),hash256ToHexstring(hash).c_str()); notify(buffer); return true;
हुर्रे, पैसा लिफाफा लगभग तैयार है। अब देखते हैं कि लिफाफा जानकारी का अनुरोध कैसे करें।
क्वेरी एनवेलप (क्वेरी)
अनुरोध का तर्क काफी सरल है, आपको केवल डेटा स्टोर से जानकारी और प्रारूप प्राप्त करने की आवश्यकता है, और फिर आउटपुट:
std::string queryEnvlope(std::string hash){ key rekey = make_key(rePrefix,hash); struct envlopeStruct es; storage_get(rekey,es); return formatEnvlope(es); }
नोट: केवल पढ़ने के लिए स्मार्ट अनुबंध संचालन (जैसे क्वेरी), आप पूर्व-निष्पादन के माध्यम से परिणाम की जांच कर सकते हैं। एक नियमित अनुबंध कॉल के विपरीत, पूर्व-निष्पादन के लिए एक वॉलेट हस्ताक्षर की आवश्यकता नहीं होती है और इसलिए ONG में कमीशन की आवश्यकता नहीं होती है। ऐसा करने के बाद, अन्य उपयोगकर्ता अब लिफाफे के लिए आवेदन कर सकते हैं यदि उनके पास एक लिफाफा हैश (लिफाफा आईडी) है।
लिफाफा प्राप्त करना
इस स्तर पर, हमने पहले से ही सफलतापूर्वक एक स्मार्ट अनुबंध में टोकन स्थानांतरित कर दिया है, ताकि आपके मित्र सफलतापूर्वक लिफाफे में हिस्सेदारी का दावा कर सकें, आपको उन्हें लिफाफा पहचानकर्ता (हैश) भेजने की आवश्यकता है।
1. एक लिफाफा प्राप्त करने के लिए, आपको अपने खाते का पता और लिफाफे का हैश दर्ज करना होगा:
bool claimEnvlope(address account, std::string hash){ return true; }
2. इसके बाद, अनुबंध यह सुनिश्चित करने के लिए आपके खाते के हस्ताक्षर को सत्यापित करेगा कि आप उसके मालिक हैं। प्रत्येक खाता केवल एक बार लिफाफे के लिए आवेदन कर सकता है:
ontio_assert(check_witness(account),"checkwitness failed"); key claimkey = make_key(claimPrefix,hash,account); asset claimed = 0 ; storage_get(claimkey,claimed); ontio_assert(claimed == 0,"you have claimed this envlope!");
3. जाँचें कि क्या लिफाफे को स्टोर से प्राप्त हैश जानकारी के अनुसार प्राप्त किया गया है:
key rekey = make_key(rePrefix,hash); struct envlopeStruct es; storage_get(rekey,es); ontio_assert(es.remainAmount > 0, "the envlope has been claimed over!"); ontio_assert(es.remainPackageCount > 0, "the envlope has been claimed over!");
4. एक दावा रिकॉर्ड बनाना:
struct receiveRecord record ; record.account = account; asset claimAmount = 0;
5. प्रत्येक लिफाफा आवेदक के लिए राशि की गणना।
अंतिम प्रतिभागी के लिए, शेष राशि निर्धारित की जाती है, किसी भी अन्य के लिए, घोषित राशि वर्तमान ब्लॉक और वर्तमान लिफाफा जानकारी के हैश द्वारा गणना की गई यादृच्छिक संख्या द्वारा निर्धारित की जाती है:
if (es.remainPackageCount == 1){ claimAmount = es.remainAmount; record.amount = claimAmount; }else{ H256 random = current_blockhash() ; char part[8]; memcpy(part,&random,8); uint64_t random_num = *(uint64_t*)part; uint32_t percent = random_num % 100 + 1; claimAmount = es.remainAmount * percent / 100;
6. धन जमा करना
गणना परिणामों के अनुसार, लिफाफे आवेदकों के खाते में टोकन की इसी राशि को हस्तांतरित किया जाता है:
address selfaddr = self_address(); if (isONTToken(es.tokenAddress)){ bool result = ont::transfer(selfaddr,account ,claimAmount); ontio_assert(result,"transfer ont token failed!"); } else if (isONGToken(es.tokenAddress)){ bool result = ong::transfer(selfaddr,account ,claimAmount); ontio_assert(result,"transfer ong token failed!"); } else{ std::vector<char> params = pack(std::string("transfer"),selfaddr,account,claimAmount); bool res = false; call_contract(es.tokenAddress,params, res ); ontio_assert(res,"transfer oep4 token failed!"); }
7. हम धन की प्राप्ति के बारे में जानकारी और तिजोरी में लिफाफे के बारे में अद्यतन जानकारी लिखेंगे और अनुबंध की पूर्ति पर एक अधिसूचना भेजेंगे:
storage_put(claimkey,claimAmount); storage_put(rekey,es); char buffer [100]; std::sprintf(buffer, "{\"states\":[\"%s\",\"%s\",\"%s\",\"%lld\"]}","claimEnvlope",hash.c_str(),account.tohexstring().c_str(),claimAmount); notify(buffer); return true;
जैसा कि ऊपर उल्लेख किया गया है, यह अनुबंध अनुबंध से क्लेम के माध्यम से टोकन भेज सकता है। यह लिफाफे में रहते हुए टोकन की सुरक्षा सुनिश्चित करता है, क्योंकि आवश्यक आवश्यकताओं को पूरा किए बिना कोई भी संपत्ति नहीं निकाल सकता है।
हो गया! आपने अपना पहला स्मार्ट अनुबंध लिखा था। पूरा अनुबंध कोड
यहाँ GitHub पर पाया जा सकता
है ।
संविदा परीक्षण
अनुबंध को सत्यापित करने के दो तरीके हैं:
- सीएलआई का उपयोग करें
- गोलंग एसडीके का उपयोग करें
निष्कर्ष
इस लेख में, हमने इस बारे में बात की कि ब्लॉकचेन एपीआई का उपयोग करके ओन्टोलजी वासम के लिए एक स्मार्ट अनुबंध कैसे लिखा जाए। यह गोपनीयता समस्या को हल करने के लिए बनी हुई है ताकि स्मार्ट अनुबंध एक पूर्ण विकसित उत्पाद में बदल जाए। कोड के इस चरण में, कोई भी अनुबंध के रिकॉर्ड को ट्रैक करके लाल लिफाफे का हैश प्राप्त कर सकता है, जिसका अर्थ है कि कोई भी लिफाफे में हिस्सेदारी का दावा कर सकता है। यह समस्या बस हल की जा सकती है - हम उन खातों की एक सूची को परिभाषित करते हैं जो एक लिफाफे के लिए आवेदन कर सकते हैं जब यह बनाया जाता है। यदि वांछित है, तो इस फ़ंक्शन का परीक्षण भी किया जा सकता है।
$ 20,000 से dApp विकास के लिए एक ओन्टोलोजी
अनुदान प्राप्त करेंओन्टोलोजी छात्र प्रतिभा कार्यक्रम के
लिए आवेदन करें
क्या आप एक डेवलपर हैं?
Discord पर हमारे तकनीकी समुदाय में शामिल हों। इसके अलावा, हमारी वेबसाइट पर
डेवलपर केंद्र पर एक नज़र डालें, जहां आप डेवलपर टूल, प्रलेखन और बहुत कुछ पा सकते हैं।
आंटलजी