संसाधन लोड हो रहा है... लोड करना...

एफएमजेड का उपयोग करके एथेरियम पर आधारित वेब3 विकास के साथ आसानी से आरंभ करें

लेखक:FMZ~Lydia, बनाया गयाः 2023-06-25 09:17:53, अद्यतन किया गयाः 2023-09-18 20:28:19

[TOC]

img

एफएमजेड का उपयोग करके एथेरियम पर आधारित वेब3 विकास के साथ आसानी से आरंभ करें

EtherEaseWithFMZ ट्यूटोरियल

एफएमजेड का उपयोग करके आसानी से एथेरियम पर आधारित वेब 3 विकास के साथ आरंभ करें

एथेरियम ब्लॉकचेन तकनीक पर आधारित एक स्मार्ट कॉन्ट्रैक्ट प्लेटफॉर्म है, जो स्मार्ट कॉन्ट्रैक्ट लिखने और तैनात करने का एक विकेंद्रीकृत तरीका प्रदान करता है। स्मार्ट कॉन्ट्रैक्ट एक विशेष प्रकार का कंप्यूटर प्रोग्राम है जो स्वचालित रूप से ब्लॉकचेन पर निष्पादित हो सकता है और तीसरे पक्ष पर भरोसा करने की आवश्यकता के बिना विभिन्न व्यावसायिक तर्क को लागू कर सकता है।

एफएमजेड क्वांट ट्रेडिंग प्लेटफॉर्म (FMZ.COM) एक आसान-से-उपयोग एपीआई प्रदान करता है, जिससे डेवलपर्स एथेरियम ब्लॉकचेन और इसके पारिस्थितिकी तंत्र के साथ अधिक आसानी से बातचीत कर सकते हैं। यह विकेंद्रीकृत एक्सचेंजों (डीईएक्स) तक पहुंच प्राप्त करता है, ऑन-चेन डेटा प्राप्त करता है, लेनदेन भेजता है, और अन्य कार्य करता है।

इस ट्यूटोरियल में, उदाहरणों में लिखा गया हैJavaScriptभाषा, परीक्षण वातावरण दोनों का उपयोग करता हैएथेरियम मुख्य नेटवर्कऔरगोरली परीक्षण जाल. और आप भी एपीआई इंटरफेस और संबंधित विवरण देख सकते हैं, एफएमजेड प्लेटफार्मs एपीआई प्रलेखन में ट्यूटोरियल में इस्तेमाल कोड उदाहरण.


एफएमजेड की शुरुआत

एफएमजेड क्वांट ट्रेडिंग प्लेटफॉर्म का उपयोग करने से पहले, हमें कुछ बुनियादी अवधारणाओं से परिचित होने की आवश्यकता हैः

1. एफएमजेड क्वांट ट्रेडिंग प्लेटफॉर्म आर्किटेक्चर

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

2. डॉकर

यदि आप एक प्रोग्राम इंस्टेंस चलाना चाहते हैं, तो आपको एक डॉकर तैनात करना होगा। डॉकर की तैनाती भी बहुत सरल है, और मंच पर तैनाती ट्यूटोरियल हैं। आप FMZ की ओर से किराए पर लिए गए सर्वर पर स्वचालित रूप से तैनात करने के लिए FMZ द्वारा प्रदान किए गए One-click Deployment का भी उपयोग कर सकते हैं।

  • व्यक्तिगत उपकरणों पर डॉकर तैनात करें

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

  1. लॉग इन करें या डिवाइस खोलें जहां डॉकर प्रोग्राम तैनात किया जाना है, जैसे किसर्वर में प्रवेश करनायाऑपरेटिंग सिस्टम में प्रवेश करने के लिए कंप्यूटर चालू करना.
  2. डॉकर प्रोग्राम का संबंधित संस्करण डाउनलोड करें (डिवाइस ऑपरेटिंग सिस्टम के आधार पर), डाउनलोड पृष्ठःhttps://www.fmz.com/m/add-node

img

  1. आपने जो डाउनलोड किया है वह एक संकुचित पैकेज है, इसे कम करने की आवश्यकता है।
  2. डॉकर प्रोग्राम चलाएँ, डॉकर प्रोग्राम एक निष्पादन योग्य फ़ाइल कहा जाता हैrobot. डॉकर संचार पते को कॉन्फ़िगर करें, जो प्रत्येक एफएमजेड खाते के लिए अद्वितीय है, एफएमजेड में लॉग इन करने के बाद, आप अपने स्वयं के पते को देख सकते हैंhttps://www.fmz.com/m/add-nodeपृष्ठ (यानी,./robot -s node.fmz.com/xxxxxपते की इस स्ट्रिंग, जहां सामग्री परxxxxxस्थिति प्रत्येक FMZ खाते के लिए अलग है) अंत में, आपको अपने FMZ खाते का पासवर्ड दर्ज करने की आवश्यकता है. इन सेटिंग्स को कॉन्फ़िगर करने के बाद, डॉकर प्रोग्राम चलाएं.
  • एफएमजेड प्लेटफार्म के वन-क्लिक डिप्लोयमेंट फ़ंक्शन का उपयोग करें

    एफएमजेड प्लेटफॉर्म पर एक डॉकर पेज जोड़ें, पताःhttps://www.fmz.com/m/add-node

    img

3. डिबगिंग टूल

एफएमजेड क्वांट ट्रेडिंग प्लेटफॉर्म एक मुफ्त डिबगिंग टूल प्रदान करता है जो समर्थन करता हैJavaScript, TypeScript, और पृष्ठ हैःhttps://www.fmz.com/m/debug. चूंकि चलाने के लिए उदाहरण बनाने के लिए बिल लगाया जाता है. प्रारंभिक सीखने की अवधि के दौरान, आप परीक्षण और सीखने के लिए इस डिबगिंग टूल का उपयोग कर सकते हैं. 3 मिनट की अधिकतम चलने की समय सीमा को छोड़कर, डिबगिंग टूल का उपयोग करने और चलाने के लिए एक उदाहरण बनाने के बीच कोई अंतर नहीं है.

उपयोग करते समयTypeScriptभाषा, आपको लिखने की जरूरत है// @ts-checkकोड की पहली पंक्ति पर स्विच करने के लिएTypeScriptमोड; यदि स्विच नहीं किया जाता है, तो डिफ़ॉल्ट हैJavaScript language.

4. प्लेटफार्म

FMZ पर, Platform एक सामान्य अवधारणा है। CEX एक्सचेंजों के लिए, यह एक विशिष्ट एक्सचेंज खाता कॉन्फ़िगरेशन को संदर्भित करता है। web3 के लिए, यह एक्सचेंज एक कॉन्फ़िगरेशन जानकारी को संदर्भित करता है जिसमें नोड पता और निजी कुंजी कॉन्फ़िगरेशन शामिल हैं।

एफएमजेड प्लेटफॉर्म के लॉग-इन राज्य में, परhttps://www.fmz.com/m/add-platformपृष्ठ, आप विनिमय जानकारी विन्यस्त कर सकते हैं, जहां विनिमय एक सामान्य अवधारणा है।

img

चुनेंWeb3, आरपीसी नोड पते को कॉन्फ़िगर करें, निजी कुंजी को कॉन्फ़िगर करें, आप सुरक्षा तंत्र देखने के लिए निचले दाएं कोने पर क्लिक कर सकते हैं

नोड्स स्वयं निर्मित नोड्स या नोड सेवा प्रदाताओं द्वारा प्रदान किए गए नोड्स हो सकते हैं। कई नोड सेवा प्रदाता हैं, जैसेःइन्फ्यूरा. पंजीकरण के बाद, आप अपने स्वयं के खाते के नोड पते को देख सकते हैं. दोनों मुख्यनेट और परीक्षणनेट उपलब्ध हैं, जो काफी सुविधाजनक है.Rpc Addressउपरोक्त चित्र में दिखाया गया नियंत्रण। विन्यस्त विनिमय वस्तुओं के बीच अंतर करने के लिए लेबल को स्वयं नामित किया जा सकता है।

img

तस्वीर में,https://mainnet.infura.io/v3/xxxxxxxxxxxxxनिजी Infura ETH मुख्य नेटवर्क RPC नोड पता है.


एफएमजेड का उपयोग करके एथेरियम के साथ बातचीत करें

डॉकर प्रोग्राम को तैनात करने और विनिमय वस्तु को कॉन्फ़िगर करने के बाद, आप उपयोग कर सकते हैंFMZ.COMs Debugging Tool परीक्षण के लिए। Ethereum RPC विधियों को कॉल करें और Ethereum के साथ बातचीत करें, इस अध्याय में सूचीबद्ध और पेश किए गए कई RPC विधियों के अलावा, अन्य RPC विधियों को परामर्श सामग्री द्वारा पाया जा सकता है, जैसे किhttps://www.quicknode.com/docs.

हम कुछ सरल उदाहरण सूचीबद्ध करते हैं, मूल बातें से शुरू करते हुए। विभिन्न भाषाओं और उपकरणों के लिए, वेब 3 तक पहुंचने के तरीके हैं, जैसा कि चित्र में दिखाया गया हैः

img

एफएमजेड पर, आरपीसी विधि कॉल को भी कैप्सूल किया जाता है, और ये फ़ंक्शन एफएमजेड एपीआई फ़ंक्शन में कैप्सूल किए जाते हैंexchange.IO. कॉल करने का तरीका हैexchange.IO("api", "eth", ...). पहला पैरामीटर तय है"api", दूसरा पैरामीटर तय किया जाता है"eth", और अन्य मापदंड विशिष्ट आरपीसी विधि पर निर्भर करते हैं जिसे बुलाया जा रहा है।

आउटपुट जानकारी के लिए, हम उपयोग करेंगेLogएफएमजेड प्लेटफॉर्म का कार्य।Logfunction कई पैरामीटर स्वीकार कर सकता है और फिर उन्हें FMZ प्लेटफॉर्म पर Debug Tool या Bot पृष्ठ के लॉग क्षेत्र में आउटपुट कर सकता है। Debug Tool पृष्ठ हमारा मुख्य परीक्षण उपकरण होगा।

eth_getBalance

..eth_getBalanceएथेरियम की विधि का उपयोग एथेरियम पर एक पते के एथेरियम संतुलन को क्वेरी करने के लिए किया जाता है, और इस विधि के लिए दो मापदंडों की आवश्यकता होती है।

  • पता पूछना है।
  • लेबल, हम आमतौर पर अंतिम का उपयोग करते हैं. आइए एथेरियम के संस्थापक की जांच करेंVitalik Buterinईटीएच वॉलेट का पता, ज्ञात पता हैः0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045.
function main() {
    let ethBalance = exchange.IO("api", "eth", "eth_getBalance", "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045", "latest")
    Log("ethBalance:", ethBalance)
}

पहले से ही डॉकर (चित्र मेंः लिनक्स/amd64...) और विनिमय ऑब्जेक्ट (चित्र मेंः वेब 3 परीक्षण) को कॉन्फ़िगर किया, डिबगिंग टूल में परीक्षण कोडः

img

कोड चलाने और परिणाम प्रदर्शित करने के लिए Execute बटन पर क्लिक करें:

ethबालन्सः 0x117296558f185bbc4c6

..logफ़ंक्शन प्रिंट आउट करता हैethBalanceचर मान के रूप मेंः0x117296558f185bbc4c6, जो एक स्ट्रिंग प्रकार है. यह हैईटीएच शेष का हेक्साडेसिमल मानमेंweiइकाइयों, के साथ1e18 wei1 के बराबर हैETHइसलिए, इसे एक पठनीय दशमलव ईटीएच बैलेंस बनने के लिए परिवर्तित करने की आवश्यकता है।

रूपांतरणethBalanceपठनीय डेटा मेंः

function main() {
    let ethBalance = exchange.IO("api", "eth", "eth_getBalance", "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045", "latest")
    Log("ethBalance:", ethBalance)
    
    // Converting ethBalance into readable data
    let vitalikEthBalance = parseInt(ethBalance.substring(2), 16) / 1e18
    Log("vitalikEthBalance:", vitalikEthBalance)
}

खोज जारी रखेंhttps://etherscan.io/:

img

हालाँकि, भाषा की सटीकता की समस्या के कारण, प्रसंस्करण के इस तरीके में विचलन होंगे। इसलिए, एफएमजेड प्लेटफॉर्म में डेटा प्रसंस्करण के लिए दो कार्य अंतर्निहित हैंः

  • BigInt: हेक्साडेसिमल स्ट्रिंग को BigInt ऑब्जेक्ट में परिवर्तित करें.
  • BigDecimal: संख्यात्मक प्रकार की वस्तुओं को BigDecimal वस्तुओं में परिवर्तित करें.

कोड को फिर से समायोजित करेंः

function main() {
    let ethBalance = exchange.IO("api", "eth", "eth_getBalance", "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045", "latest")

    // The precision unit of ETH is 1e18
    let ethDecimal = 18
    Log("vitalikEthBalance:", Number((BigDecimal(BigInt(ethBalance)) / BigDecimal(Math.pow(10, ethDecimal))).toString()))
}

जीवनसाथी बैलेंसः 5149.6244846875215

eth_chainId

eth_chainIdऔरnet_versionइन दोनों कार्यों को ब्लॉकचेन की आईडी लौटाता है कि वर्तमान आरपीसी नोड से जुड़ा हुआ है, अंतर यह है किnet_versionदशमलव आईडी देता है औरeth_chainIdहेक्साडेसिमल आईडी देता है.

चेनआईडी के अनुरूप नेटवर्क नाम

1 - ethereum mainnet
2 - morden testnet (deprecated)
3 - ropsten testnet
4 - rinkeby testnet
5 - goerli testnet
11155111 - sepolia testnet
10 - optimism mainnet
69 - optimism kovan testnet
42 - kovan testnet
137 - matic/polygon mainnet
80001 - matic/polygon mumbai testnet
250 - fantom mainnet
100 - xdai mainnet
56 - bsc mainnet

कॉन्फ़िगर किए गए एथेरियम टेस्टनेट के साथ परीक्षण करेंgoerliनोडः

function main() {
    let netVersionId = exchange.IO("api", "eth", "net_version")
    let ethChainId = exchange.IO("api", "eth", "eth_chainId")

    Log("netVersionId:", netVersionId)
    Log("ethChainId:", ethChainId, " , conversion:", parseInt(ethChainId.substring(2), 16))
}

eth_gasPrice

कॉल करेंeth_gasPriceवर्तमान क्वेरी करने के लिए विधिgas priceश्रृंखला पर।

function toAmount(s, decimals) {
    return Number((BigDecimal(BigInt(s)) / BigDecimal(Math.pow(10, decimals))).toString())
}

function main() {
    let gasPrice = exchange.IO("api", "eth", "eth_gasPrice")
    Log("gasPrice:", gasPrice, " , conversion:", toAmount(gasPrice, 0))
}

यहाँ हम हेक्साडेसिमल स्ट्रिंग को पठनीय संख्यात्मक मान में परिवर्तित करने के लिए एक फ़ंक्शन लिखते हैंःtoAmountइसके अतिरिक्त, ध्यान दें किgasPriceहैwei, तो औपचारिक पैरामीटर के अनुरूप वास्तविक पैरामीटर के लिए मान 0 पारितdecimals.

eth_blockसंख्या

"eth_blockNumberब्लॉक ऊंचाई की क्वेरी करने के लिए प्रयोग किया जाता है।

function toAmount(s, decimals) {
    return Number((BigDecimal(BigInt(s)) / BigDecimal(Math.pow(10, decimals))).toString())
}

function main() {
    let blockNumber = exchange.IO("api", "eth", "eth_blockNumber")
    Log(toAmount(blockNumber, 0))
}

डिबगिंग टूल में चलाएँः

img

खोज जारी रखेंhttps://etherscan.io/:

img

eth_getBlockByNumber

क्वेरी ब्लॉक की जानकारी।

function main() {
    let blockNumber = exchange.IO("api", "eth", "eth_blockNumber")    
    Log(blockNumber)
    let blockMsg = exchange.IO("api", "eth", "eth_getBlockByNumber", blockNumber, true)
    Log(typeof(blockMsg), blockMsg)
    
    // Due to the excessive content of Log output, it will be truncated automatically, so traverse each field of the returned block information and print them one by one
    for (let key in blockMsg) {
        Log("key:", key, ", val:", blockMsg[key])
    }
}

डिबगिंग टूल में निष्पादित करने से निम्नलिखित जानकारी प्राप्त की जा सकती हैः

img

अनुबंध की जानकारी पढ़ें

कई स्मार्ट कॉन्ट्रैक्ट एप्लिकेशन एथेरियम पर चलते हैं, औरENSउनमें से एक है।ENS, या एथेरियम नाम सेवा, एथेरियम ब्लॉकचेन पर आधारित एक विकेंद्रीकृत डोमेन नाम संकल्प सेवा है। क्या आपको ट्यूटोरियल में उदाहरण याद है जहां हमने एथेरियम के संस्थापक विटालिक बुटेरीन के बटुए का संतुलन चेक किया था?0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045. तो हम कैसे पता पता है? वास्तव में, यह के माध्यम से पूछताछ की जा सकती हैENSएक सहज नाम का उपयोग कर स्मार्ट अनुबंधvitalik.eth.

इस अध्याय में निम्नलिखित सामग्री एथेरियम मुख्य नेटवर्क वातावरण का उपयोग करती है,ENSदस्तावेज,Hashing Namesएथेरियम डोमेन नामों की क्वेरी के लिए आवश्यक हैं। संसाधित करने के लिए निम्न कोड का उपयोग करेंvitalik.eth.

function nameHash(name) {
    if (name == "") {
        return "0000000000000000000000000000000000000000000000000000000000000000"
    } else {
        let arr = name.split(".")
        let label = arr[0]
        
        arr.shift()
        let remainder = arr.join(".")
        return Encode("sha3.keccak256", "hex", "hex", nameHash(remainder) + Encode("sha3.keccak256", "raw", "hex", label))
    }
}

ऊपर कोड उदाहरण में, हम एक और अपरिचित समारोह देखाEncode. यह फ़ंक्शन एफएमजेड प्लेटफॉर्म का एपीआई फ़ंक्शन है और विशेष रूप से एफएमजेड प्लेटफॉर्म पर एन्कोडिंग संचालन के लिए उपयोग किया जाता है। यह फ़ंक्शन कई एन्कोडिंग विधियों और विभिन्न हैश एल्गोरिदम का समर्थन करता है।

Encode(algo, inputFormat, outputFormat, data, keyFormat, key string)

ENS दस्तावेज में वर्णित के अनुसार,sha3.keccak256डेटा को संसाधित करने के लिए एल्गोरिथ्म।

कॉल करेंnameHashकार्य, उदाहरण के लिएःLog(nameHash("vitalik.eth")), आप प्राप्त कर सकते हैंःee6c4522aab0003e8d14cd40a6af439055fd2577951148c14b6cea9a53475835, और आप 0x उपसर्ग जोड़ने की जरूरत है.0xee6c4522aab0003e8d14cd40a6af439055fd2577951148c14b6cea9a53475835के पैरामीटर के रूप में प्रयोग किया जाता हैresolverएनएस स्मार्ट कॉन्ट्रैक्ट में विधि।

let ensNode = "0x" + nameHash("vitalik.eth")    // Prepare the parameters ensNode for calling the resolver method

ENS प्रलेखन के अनुसार, ENS स्मार्ट कॉन्ट्रैक्ट अनुप्रयोगों के लिए अनुबंध पता हैः0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e.resolverस्मार्ट कॉन्ट्रैक्ट की विधि, हमें भी तैयार करने की जरूरत हैABIअनुबंध का।

एबीआई पंजीकृत करें

यह जानकर आप पूछ सकते हैं किABIएक स्मार्ट अनुबंध की?

ABI, or Application Binary Interface, is the interface standard for smart contracts to communicate with the external world.
The ABI of a smart contract defines the contract's function interfaces, parameter types, return values, and other information, as well as specifications for calling the contract and passing parameters.

The ABI of a smart contract is usually stored in JSON format and contains the following information:

Contract function interfaces: function names, parameter lists, return values, etc.
Function parameter types: such as uint256, bool, string etc.
Encoding methods for input and output parameters of functions: Smart contracts use an encoding method called Solidity ABI to encode input and output parameters of functions so that they can interact with Ethereum network.
In Ethereum network ,the ABI of a smart contract is used to call its functions. When you need to call a contract function, you need to provide the name of the function, its parameters, and bytecode encoded according to ABI encoding method.
Ethereum nodes will package this information into transactions and send them out on Ethereum network for execution.

In Solidity language,the keyword 'interface' can be used define ABIs for smart contracts. Ethereum development tools like Remix IDE ,Truffle also provide editing & generation tools making it easier developers create & use ABIs.

निकालेंresolverविधि भाग ENSs ABI से, या आप पूर्ण ABI का उपयोग कर सकते हैं। आप अनुबंध पर ABI क्वेरी कर सकते हैंhttps://etherscan.io/या अन्य चैनलों (जैसे, प्रासंगिक परियोजना दस्तावेज) के माध्यम से एबीआई प्राप्त करें।

img

let abiENS_resolver = `[{"constant":true,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"resolver","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"}]`

यहाँ हम FMZ मंच पर एक नया आह्वान विधि सीखने के लिए जा रहे हैं,exchange.IO("abi", address, abiContent), जिसका उपयोग एबीआई को पंजीकृत करने के लिए किया जाता है।addressपैरामीटर स्मार्ट अनुबंध का पता है औरabiContentपैरामीटर संबंधित स्मार्ट कॉन्ट्रैक्ट ABI (स्ट्रिंग) है।

let abiENS_resolver = `[{"constant":true,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"resolver","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"}]`
exchange.IO("abi", "0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e", abiENS_resolver)  // 0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e is the address of the ENS smart contract deployed on the Ethereum mainnet

स्मार्ट कॉन्ट्रैक्ट्स को कॉल करने के तरीके

अगला, आप कॉल कर सकते हैंresolverENS स्मार्ट कॉन्ट्रैक्ट की विधि, जोENS: Public Resolver contract.

img

let resolverAddress = exchange.IO("api", "0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e", "resolver", ensNode)

उपयोग करेंENS: Public Resolverअनुबंधaddrविटालिक बुटेरिन के वॉलेट पते को प्राप्त करने के लिए विधि.ENS: Public Resolverइस स्मार्ट कॉन्ट्रैक्ट के लिए एबीआई जानकारी अभी भी प्राप्त की जा सकती हैhttps://etherscan.io/.

let abiENSPublicResolver = `[{"inputs":[{"internalType":"contract ENS","name":"_ens","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":true,"internalType":"uint256","name":"contentType","type":"uint256"}],"name":"ABIChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"address","name":"a","type":"address"}],"name":"AddrChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"coinType","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"newAddress","type":"bytes"}],"name":"AddressChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"target","type":"address"},{"indexed":false,"internalType":"bool","name":"isAuthorised","type":"bool"}],"name":"AuthorisationChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"bytes","name":"hash","type":"bytes"}],"name":"ContenthashChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"bytes","name":"name","type":"bytes"},{"indexed":false,"internalType":"uint16","name":"resource","type":"uint16"},{"indexed":false,"internalType":"bytes","name":"record","type":"bytes"}],"name":"DNSRecordChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"bytes","name":"name","type":"bytes"},{"indexed":false,"internalType":"uint16","name":"resource","type":"uint16"}],"name":"DNSRecordDeleted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"DNSZoneCleared","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":true,"internalType":"bytes4","name":"interfaceID","type":"bytes4"},{"indexed":false,"internalType":"address","name":"implementer","type":"address"}],"name":"InterfaceChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"string","name":"name","type":"string"}],"name":"NameChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"bytes32","name":"x","type":"bytes32"},{"indexed":false,"internalType":"bytes32","name":"y","type":"bytes32"}],"name":"PubkeyChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":true,"internalType":"string","name":"indexedKey","type":"string"},{"indexed":false,"internalType":"string","name":"key","type":"string"}],"name":"TextChanged","type":"event"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"uint256","name":"contentTypes","type":"uint256"}],"name":"ABI","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"addr","outputs":[{"internalType":"address payable","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"uint256","name":"coinType","type":"uint256"}],"name":"addr","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"authorisations","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"clearDNSZone","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"contenthash","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"bytes32","name":"name","type":"bytes32"},{"internalType":"uint16","name":"resource","type":"uint16"}],"name":"dnsRecord","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"bytes32","name":"name","type":"bytes32"}],"name":"hasDNSRecords","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"bytes4","name":"interfaceID","type":"bytes4"}],"name":"interfaceImplementer","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes[]","name":"data","type":"bytes[]"}],"name":"multicall","outputs":[{"internalType":"bytes[]","name":"results","type":"bytes[]"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"pubkey","outputs":[{"internalType":"bytes32","name":"x","type":"bytes32"},{"internalType":"bytes32","name":"y","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"uint256","name":"contentType","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"setABI","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"uint256","name":"coinType","type":"uint256"},{"internalType":"bytes","name":"a","type":"bytes"}],"name":"setAddr","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"address","name":"a","type":"address"}],"name":"setAddr","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"address","name":"target","type":"address"},{"internalType":"bool","name":"isAuthorised","type":"bool"}],"name":"setAuthorisation","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"bytes","name":"hash","type":"bytes"}],"name":"setContenthash","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"setDNSRecords","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"bytes4","name":"interfaceID","type":"bytes4"},{"internalType":"address","name":"implementer","type":"address"}],"name":"setInterface","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"string","name":"name","type":"string"}],"name":"setName","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"bytes32","name":"x","type":"bytes32"},{"internalType":"bytes32","name":"y","type":"bytes32"}],"name":"setPubkey","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"string","name":"key","type":"string"},{"internalType":"string","name":"value","type":"string"}],"name":"setText","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes4","name":"interfaceID","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"string","name":"key","type":"string"}],"name":"text","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"}]`
exchange.IO("abi", resolverAddress, abiENSPublicResolver)

img

अंत में, कॉल करेंENS: Public Resolverअनुबंधaddrविधि, पैरामीटर अभी भी होने के साथensNode.

let vitalikAddress = exchange.IO("api", resolverAddress, "addr", ensNode)
Log("vitalikAddress:", vitalikAddress)

लॉग फ़ंक्शन आउटपुटः

vitalikAddress: 0xd8da6bf26964af9d7eed9e03e53415d37aa96045

ENS का पूरा कोड कॉल करें

function nameHash(name) {
    if (name == "") {
        return "0000000000000000000000000000000000000000000000000000000000000000"
    } else {
        let arr = name.split(".")
        let label = arr[0]
        
        arr.shift()
        let remainder = arr.join(".")
        return Encode("sha3.keccak256", "hex", "hex", nameHash(remainder) + Encode("sha3.keccak256", "raw", "hex", label))
    }
}

function main() {
    // Calculate the name
    let ensNode = "0x" + nameHash("vitalik.eth")    

    // Register ENS contract
    let abiENS_resolver = `[{"constant":true,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"resolver","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"}]`
    exchange.IO("abi", "0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e", abiENS_resolver)
    let resolverAddress = exchange.IO("api", "0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e", "resolver", ensNode)
    
    // Register ENS Public Resolver contract
    let abiENSPublicResolver = `[{"inputs":[{"internalType":"contract ENS","name":"_ens","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":true,"internalType":"uint256","name":"contentType","type":"uint256"}],"name":"ABIChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"address","name":"a","type":"address"}],"name":"AddrChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"coinType","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"newAddress","type":"bytes"}],"name":"AddressChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"target","type":"address"},{"indexed":false,"internalType":"bool","name":"isAuthorised","type":"bool"}],"name":"AuthorisationChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"bytes","name":"hash","type":"bytes"}],"name":"ContenthashChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"bytes","name":"name","type":"bytes"},{"indexed":false,"internalType":"uint16","name":"resource","type":"uint16"},{"indexed":false,"internalType":"bytes","name":"record","type":"bytes"}],"name":"DNSRecordChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"bytes","name":"name","type":"bytes"},{"indexed":false,"internalType":"uint16","name":"resource","type":"uint16"}],"name":"DNSRecordDeleted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"DNSZoneCleared","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":true,"internalType":"bytes4","name":"interfaceID","type":"bytes4"},{"indexed":false,"internalType":"address","name":"implementer","type":"address"}],"name":"InterfaceChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"string","name":"name","type":"string"}],"name":"NameChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"bytes32","name":"x","type":"bytes32"},{"indexed":false,"internalType":"bytes32","name":"y","type":"bytes32"}],"name":"PubkeyChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":true,"internalType":"string","name":"indexedKey","type":"string"},{"indexed":false,"internalType":"string","name":"key","type":"string"}],"name":"TextChanged","type":"event"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"uint256","name":"contentTypes","type":"uint256"}],"name":"ABI","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"addr","outputs":[{"internalType":"address payable","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"uint256","name":"coinType","type":"uint256"}],"name":"addr","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"authorisations","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"clearDNSZone","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"contenthash","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"bytes32","name":"name","type":"bytes32"},{"internalType":"uint16","name":"resource","type":"uint16"}],"name":"dnsRecord","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"bytes32","name":"name","type":"bytes32"}],"name":"hasDNSRecords","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"bytes4","name":"interfaceID","type":"bytes4"}],"name":"interfaceImplementer","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes[]","name":"data","type":"bytes[]"}],"name":"multicall","outputs":[{"internalType":"bytes[]","name":"results","type":"bytes[]"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"pubkey","outputs":[{"internalType":"bytes32","name":"x","type":"bytes32"},{"internalType":"bytes32","name":"y","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"uint256","name":"contentType","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"setABI","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"uint256","name":"coinType","type":"uint256"},{"internalType":"bytes","name":"a","type":"bytes"}],"name":"setAddr","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"address","name":"a","type":"address"}],"name":"setAddr","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"address","name":"target","type":"address"},{"internalType":"bool","name":"isAuthorised","type":"bool"}],"name":"setAuthorisation","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"bytes","name":"hash","type":"bytes"}],"name":"setContenthash","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"setDNSRecords","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"bytes4","name":"interfaceID","type":"bytes4"},{"internalType":"address","name":"implementer","type":"address"}],"name":"setInterface","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"string","name":"name","type":"string"}],"name":"setName","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"bytes32","name":"x","type":"bytes32"},{"internalType":"bytes32","name":"y","type":"bytes32"}],"name":"setPubkey","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"string","name":"key","type":"string"},{"internalType":"string","name":"value","type":"string"}],"name":"setText","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes4","name":"interfaceID","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"string","name":"key","type":"string"}],"name":"text","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"}]`
    exchange.IO("abi", resolverAddress, abiENSPublicResolver)
    let vitalikAddress = exchange.IO("api", resolverAddress, "addr", ensNode)
    Log("vitalikAddress:", vitalikAddress)
}

ईटीएच भेजें

पिछले पाठ्यक्रम अध्यायों में, हमने सीखा है कि निजी कुंजी कैसे कॉन्फ़िगर करें। हम कैसे जानते हैं कि कॉन्फ़िगर किए गए एक्सचेंज ऑब्जेक्ट के लिए इस निजी कुंजी के अनुरूप वॉलेट पता? एफएमजेड पर, आप उपयोग कर सकते हैंexchange.IO("address")कॉन्फ़िगर की गई निजी कुंजी के अनुरूप वॉलेट पता प्राप्त करने के लिए कार्य।

इस अध्याय में निम्नलिखित सामग्री Goerli परीक्षण नेटवर्क वातावरण का उपयोग करता है, तो नोड मैं उपयोग कर रहा हूँ हैःhttps://goerli.infura.io/v3/*******, और Infura प्रत्येक पंजीकृत उपयोगकर्ता के लिए अलग नोड पते असाइन करता है।*******विशिष्ट सामग्री छिपाता है।

function main() {
    let walletAddress = exchange.IO("address")
    Log("Testnet goerli wallet address:", walletAddress)
}

अपने वॉलेट का पता जानने के बाद, आप Ethereum के RPC विधि का उपयोग कर सकते हैंeth_getTransactionCountवॉलेट पते के लेनदेन की गिनती पूछने के लिए. एथेरियम में, यह गिनती बहुत आम है, और यह वास्तव में हैnonceएक पैरामीटर जिसे स्थानांतरण संचालन के दौरान पारित करने की आवश्यकता होती है। एथेरियम में, nonce एक अद्वितीय संख्या है जिसका उपयोग यह सुनिश्चित करने के लिए किया जाता है कि प्रत्येक लेनदेन अद्वितीय है। यह एक बढ़ती संख्या है, और यह हर बार एक नया लेनदेन भेजे जाने पर स्वचालित रूप से बढ़ेगी। इसलिए, जब आप एक स्मार्ट अनुबंध में लेनदेन भेजते हैं, तो आपको यह सुनिश्चित करने के लिए एक nonce प्रदान करने की आवश्यकता होती है कि लेनदेन अद्वितीय है और सही क्रम में है। हम कुछ सामग्रियों और दस्तावेजों में यह जानकारी पा सकते हैंः

https://goethereumbook.org/en/

img

यहाँ,PendingNonceAtGo भाषा के एथेरियम पुस्तकालय में समारोह वास्तव में कॉल कर रहा हैeth_getTransactionCountविधि. पिछले पाठ्यक्रमों में, हम भी सीखा है कि कैसे आरपीसी विधियों को कॉल करने के लिए. यहाँ हम का उपयोगexchange.IO("api", "eth", ...)फिर से कार्य करता है।

function toAmount(s, decimals) {
    return Number((BigDecimal(BigInt(s)) / BigDecimal(Math.pow(10, decimals))).toString())
}

function main() {
    let walletAddress = exchange.IO("address")
    Log("Testnet goerli wallet address:", walletAddress)

    /**
    * eth_getTransactionCount
    * @param address - string - The address from which the transaction count to be checked.
    * @param blockNumber - string - The block number as a string in hexadecimal format or tags.
    * @returns The integer of the number of transactions sent from an address encoded as hexadecimal.
    */
    let nonce: string = exchange.IO("api", "eth", "eth_getTransactionCount", walletAddress, "pending")
    Log("wallet address:", walletAddress, "current nonce:", nonce, ", convert to decimal:", toAmount(nonce, 0))
}

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

  • गैस मूल्य

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

  • गैस सीमा

    एक मानक ईथर हस्तांतरण में 21,000 इकाइयों की गैस सीमा होती है।

के अवधारणाओं को समझने के बादnonce, gasPrice, औरgasLimit, आप हस्तांतरण का परीक्षण कर सकते हैं. एफएमजेड एक बहुत ही सरल और उपयोग करने में आसान हस्तांतरण समारोह प्रदान करता है.

exchange.IO("api", "eth", "send", toAddress, toAmount)

जब इसका उपयोग हस्तांतरण के लिए किया जाता है, तो तीसरा पैरामीटरexchange.IOभेजें के रूप में तय है,toAddressपैरामीटर वह पता है जो स्थानांतरण के दौरान ETH प्राप्त करता है, औरtoAmountहस्तांतरित ईटीएच की राशि है।

मापदंडnonce, gasPrice, औरgasLimitसभी FMZ पर स्वचालित रूप से प्राप्त सिस्टम डिफ़ॉल्ट मानों का उपयोग कर सकते हैं। उन्हें भी निर्दिष्ट किया जा सकता हैः

exchange.IO("api", "eth", "send", toAddress, toAmount, {gasPrice: 5000000000, gasLimit: 21000, nonce: 100})

इसके बाद, हम एक निश्चित मात्रा में ईटीएच को गोरली परीक्षण नेटवर्क पर एक विशिष्ट पते पर स्थानांतरित करेंगेः

function toInnerAmount(s, decimals) {
    return (BigDecimal(s)*BigDecimal(Math.pow(10, decimals))).toFixed(0)
}

function main() {
    let walletAddress = exchange.IO("address")
    Log("Testnet goerli wallet address:", walletAddress)

    let ret = exchange.IO("api", "eth", "send", "0x4D75a08E870674E68cAE611f329A27f446A66813", toInnerAmount(0.01, 18))
    return ret // return Transaction Hash : 0xa6f9f51b00d8ae850b0f204380b59da98f4bbce34b813577d3d948f61de4734e
}

क्योंकि Ethereum हस्तांतरण राशि की इकाई हैwei, एक कस्टम समारोहtoInnerAmountमें मूल्य को संसाधित करने के लिए इस्तेमाल किया जाना चाहिएwei units.

क्वेरी लेनदेन हैशः0xa6f9f51b00d8ae850b0f204380b59da98f4bbce34b813577d3d948f61de4734eपरhttps://etherscan.io/.

img

आप भी क्वेरी स्थानांतरण हैश करने के लिए कोड लिख सकते हैं0xa6f9f51b00d8ae850b0f204380b59da98f4bbce34b813577d3d948f61de4734e, का उपयोग करकेeth_getTransactionReceiptप्रश्नों के लिए विधि।

function main() {
    let transHash = "0xa6f9f51b00d8ae850b0f204380b59da98f4bbce34b813577d3d948f61de4734e"
    let info = exchange.IO("api", "eth", "eth_getTransactionReceipt", transHash)
    return info
}

क्वेरी परिणामः

{
	"cumulativeGasUsed": "0x200850",
	"effectiveGasPrice": "0x1748774421",
	"transactionHash": "0xa6f9f51b00d8ae850b0f204380b59da98f4bbce34b813577d3d948f61de4734e",
	"type": "0x0",
	"blockHash": "0x6bdde8b0f0453ecd24eecf7c634d65306f05511e0e8f09f9ed3f59eee2d06ac7",
	"contractAddress": null,
	"blockNumber": "0x868a50",
	"logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
	"gasUsed": "0x5208",
	"to": "0x4d75a08e870674e68cae611f329a27f446a66813",
	"status": "0x1",
	"transactionIndex": "0x23",
	"from": "0x6b3f11d807809b0b1e5e3243df04a280d9f94bf4",
	"logs": []
}

प्रत्येक फ़ील्ड के अनुरूप विवरणः

blockHash - The hash value of the block where the transaction is located.
blockNumber - The block number of the block where the transaction is located, encoded in hexadecimal.
contractAddress - If it's a contract creation, the address of the contract; otherwise null.
cumulativeGasUsed - The total gas used when executing this transaction in the block.
effectiveGasPrice - Total base fee plus tip per unit of gas.
from - Sender's address.
gasUsed - Gas used by this specific transaction.
logs - Array of log objects generated by this transaction.
  address - Address that generated this log.
  topics - Data array with 0 to 4 indexed log parameters, each with 32 bytes. In Solidity, first topic is event signature hash (e.g., Deposit(address,bytes32,uint256)), unless you declare an event using anonymous specifier.
  data - Non-indexed parameters for logs with length of 32 bytes.
  blockNumber - The block number of the block where this log is located.
  transactionHash - Transaction hash at time when log was created. Null if pending state.
  transactionIndex - Index position during creation. Null if pending state.
  blockHash - The hash value for containing block.
  logIndex - Hexadecimal-encoded integer index position within containing block. Null if pending state.
  removed - True if deleted due to chain reorganization; false for valid logs.
logsBloom - Bloom filter for retrieving related logs.
status - Hexadecimal-encoded value either being '1' (success) or '0' (failure).
to - Receiving party's address; null for contract creation transactions.
transactionHash - The hash value associated with given transaction.
transactionIndex - Hexadecimal-encoded index position within its respective containing-block.
type - Type value.

एथेरियम स्मार्ट कॉन्ट्रैक्ट कॉल करें

अध्याय में Reading Contract Information पर, हमने एक पूर्ण उदाहरण का उपयोग किया है जो कि एथेरियम पर तैनात ENS अनुबंध की विधि को Vitalik Buterin के वॉलेट पते को प्राप्त करने के लिए बुलाता है। ये विधियांReadविधियों, और इन विधियों को कॉल करने की आवश्यकता नहीं हैgas(याद है कि हम गैस के बारे में पहले क्या बात की थी? इस अध्याय में, हम कुछ बुलाएंगेWriteएथेरियम पर स्मार्ट कॉन्ट्रैक्ट के तरीकों और भुगतान के लिएgas. इन कार्यों को पूरे नेटवर्क में प्रत्येक नोड और खनिक द्वारा सत्यापित किया जाएगा और ब्लॉकचेन स्थिति को बदल दिया जाएगा.

ERC20

ERC20 अनुबंध (ERC20 टोकन अनुबंध) के लिए, FMZ प्लेटफ़ॉर्म ERC20 अनुबंध ABI के ABI को सीधे सिस्टम में निर्मित एक सामान्य ABI के रूप में सूचीबद्ध करता है, ABI को पंजीकृत करने के चरण को समाप्त करता है। हमने पिछले ट्यूटोरियल में ABI के बारे में भी सीखा है जब हमने ENS अनुबंधों को पंजीकृत किया था।

एबीआई को बेहतर ढंग से समझने के लिए, आप इसका उपयोग करने से पहले इसकी जांच कर सकते हैं। यहाँ ERC20 अनुबंधों के लिए एबीआई हैः

[{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"guy","type":"address"},{"name":"wad","type":"uint256"}],"name":"approve","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"src","type":"address"},{"name":"dst","type":"address"},{"name":"wad","type":"uint256"}],"name":"transferFrom","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"wad","type":"uint256"}],"name":"withdraw","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"dst","type":"address"},{"name":"wad","type":"uint256"}],"name":"tran

संबंधित

अधिक