[TOC]

इथेरियम-आधारित वेब3 विकास को आसानी से आरंभ करने के लिए FMZ का उपयोग करें
एथेरियम ब्लॉकचेन प्रौद्योगिकी पर आधारित एक स्मार्ट अनुबंध प्लेटफॉर्म है, जो स्मार्ट अनुबंधों को लिखने और तैनात करने का विकेन्द्रीकृत तरीका प्रदान करता है। स्मार्ट अनुबंध एक विशेष कंप्यूटर प्रोग्राम है जिसे ब्लॉकचेन पर स्वचालित रूप से निष्पादित किया जा सकता है और यह किसी तीसरे पक्ष पर भरोसा किए बिना विभिन्न व्यावसायिक तर्कों को क्रियान्वित कर सकता है।
इन्वेंटर क्वांटिटेटिव ट्रेडिंग प्लेटफॉर्म (FMZ.COM) एक उपयोग में आसान एपीआई प्रदान करता है जो डेवलपर्स के लिए एथेरियम ब्लॉकचेन और इसके पारिस्थितिकी तंत्र के साथ बातचीत करना आसान बनाता है। विकेन्द्रीकृत एक्सचेंजों (DEX) तक पहुंच, ऑन-चेन डेटा प्राप्त करना और लेनदेन भेजना जैसे कार्यों को साकार करना।
इस ट्यूटोरियल में उपयोग किए गए उदाहरणJavaScriptभाषा लेखन, परीक्षण वातावरण का उपयोगएथेरियम मेननेट、गोएर्ली टेस्टनेट. आप ट्यूटोरियल में प्रयुक्त API इंटरफेस के साथ-साथ FMZ प्लेटफॉर्म के API दस्तावेज़ में संबंधित विवरण और कोड उदाहरण भी देख सकते हैं।
FMZ क्वांटिटेटिव ट्रेडिंग प्लेटफॉर्म का उपयोग करना सीखने से पहले, हमें कई बुनियादी अवधारणाओं से परिचित होना चाहिए:
एफएमजेड क्वांटिटेटिव ट्रेडिंग प्लेटफॉर्म (https://www.fmz.com) की आधिकारिक वेबसाइट पर पंजीकरण और लॉग इन करने के बाद, आप प्लेटफॉर्म के विभिन्न कार्यों का उपयोग कर सकते हैं। एफएमजेड वेबसाइट संपूर्ण प्रणाली का प्रबंधन छोर है, और उपयोगकर्ताओं द्वारा लिखे गए प्रोग्राम वास्तव में होस्ट पर चलाए जाते हैं। होस्ट एक सॉफ्टवेयर प्रोग्राम है जिसे विभिन्न उपकरणों, जैसे सर्वर, कंप्यूटर आदि पर तैनात किया जा सकता है। जब कोई उपयोगकर्ता कोई प्रोग्राम लिखता है और FMZ वेबसाइट पर एक चालू इंस्टैंस बनाता है, तो FMZ प्लेटफॉर्म होस्ट के साथ संचार करेगा और होस्ट पर एक प्रोग्राम इंस्टैंस शुरू करेगा।

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

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

FMZ क्वांटिटेटिव ट्रेडिंग प्लेटफॉर्म एक मुफ्त डिबगिंग टूल प्रदान करता है जो समर्थन करता हैJavaScript,TypeScriptपृष्ठ है: https://www.fmz.com/m/debug, क्योंकि इंस्टैंस बनाना और उसे चलाना बिल योग्य है। इस डिबगिंग टूल का उपयोग प्रारंभिक शिक्षण अवधि के दौरान परीक्षण और सीखने के लिए किया जा सकता है। डिबगिंग टूल इंस्टैंस बनाने से अलग नहीं है, सिवाय इसके कि इसका चलने का समय 3 मिनट तक सीमित है।
उपयोगTypeScriptभाषा का उपयोग करते समय, आपको इसे कोड की पहली पंक्ति में लिखना होगा// @ts-checkस्विच करने के लिएTypeScriptमोड, यदि स्विच नहीं किया गया है, तो डिफ़ॉल्ट हैJavaScriptभाषा।
FMZ पर, “एक्सचेंज” एक सामान्य अवधारणा है। CEX एक्सचेंज के लिए, यह एक विशिष्ट एक्सचेंज खाता कॉन्फ़िगरेशन को संदर्भित करता है। वेब3 के लिए, यह आदान-प्रदान कॉन्फ़िगरेशन जानकारी को संदर्भित करता है, जिसमें नोड पता और निजी कुंजी कॉन्फ़िगरेशन शामिल है।
FMZ प्लेटफॉर्म पर लॉग इन करने पर,https://www.fmz.com/m/add-platformपृष्ठ पर, आप विनिमय जानकारी को कॉन्फ़िगर कर सकते हैं, जहां विनिमय एक सामान्य अवधारणा है।

चुननाWeb3, RPC नोड पता और निजी कुंजी कॉन्फ़िगर करें। सुरक्षा तंत्र को देखने के लिए आप निचले दाएं कोने में “संवेदनशील जानकारी एन्क्रिप्ट की जाती है और एक स्वतंत्र निजी कुंजी का उपयोग करके सहेजी जाती है” पर क्लिक कर सकते हैं।
नोड्स स्वयं निर्मित हो सकते हैं या नोड सेवा प्रदाताओं द्वारा प्रदान किये जा सकते हैं। कई नोड सेवा प्रदाता हैं, जैसे:Infura. पंजीकरण के बाद, आप अपने खाते का नोड पता देख सकते हैं। मेननेट और टेस्टनेट दोनों हैं, जो अधिक सुविधाजनक है। ऊपर दिए गए चित्र में इस नोड पते को कॉन्फ़िगर करें।Rpc Addressनियंत्रण में. कॉन्फ़िगर किए गए एक्सचेंज ऑब्जेक्ट को अलग करने के लिए टैग को स्वयं नामित किया जा सकता है।

चित्र मेंhttps://mainnet.infura.io/v3/xxxxxxxxxxxxxयह निजी इन्फुरा ETH मेननेट RPC नोड पता है।
कस्टोडियन प्रोग्राम को तैनात करने और एक्सचेंज ऑब्जेक्ट को कॉन्फ़िगर करने के बाद, आप परीक्षण के लिए FMZ.COM के “डिबगिंग टूल” का उपयोग कर सकते हैं। एथेरियम के साथ इंटरैक्ट करने के लिए एथेरियम RPC विधियों को कॉल करें। इस अध्याय में सूचीबद्ध कई RPC विधियों के अलावा, आप अन्य RPC विधियों के लिए दस्तावेज़ देख सकते हैं, जैसे किhttps://www.quicknode.com/docs。
आइये कुछ सरल उदाहरण लें और मूल बातों से शुरू करें। विभिन्न भाषाओं और उपकरणों के लिए वेब 3 तक पहुँचने के तरीके हैं, जैसा कि चित्र में दिखाया गया है:

RPC विधि कॉल भी FMZ पर समाहित हैं। ये फ़ंक्शन FMZ API फ़ंक्शन में समाहित हैंexchange.IOमध्य। कॉलिंग विधि हैexchange.IO("api", "eth", ...). पहला पैरामीटर निश्चित है."api", दूसरा पैरामीटर तय है"eth", अन्य पैरामीटर बुलाए गए विशिष्ट RPC विधि पर निर्भर करते हैं।
जानकारी आउटपुट करने के लिए, हम FMZ प्लेटफॉर्म का उपयोग करते हैंLogसमारोह,Logफ़ंक्शन कई पैरामीटर पास कर सकता है और फिर उन्हें FMZ प्लेटफ़ॉर्म के “डीबग टूल” या “रियल ट्रेडिंग” पेज के लॉग क्षेत्र में आउटपुट कर सकता है। “डीबग टूल” पेज हमारे परीक्षण के लिए मुख्य उपकरण होगा।
Ethereumeth_getBalanceइस विधि का उपयोग एथेरियम पर किसी पते के ETH बैलेंस को क्वेरी करने के लिए किया जाता है। इस विधि में दो पैरामीटर पास करने की आवश्यकता होती है।
आइए एथेरियम के संस्थापक के बारे में जानेंV神ETH वॉलेट पता, ज्ञात पते हैं:0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045。
function main() {
let ethBalance = exchange.IO("api", "eth", "eth_getBalance", "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045", "latest")
Log("ethBalance:", ethBalance)
}
कस्टोडियन को तैनात किया गया है (चित्र में: linux/amd64 …) और एक्सचेंज ऑब्जेक्ट को कॉन्फ़िगर किया गया है (चित्र में: Web3 परीक्षण)। डिबगिंग टूल में कोड का परीक्षण करें:

इस कोड को चलाने और परिणाम प्रदर्शित करने के लिए “निष्पादित करें” बटन पर क्लिक करें:
ethBalance: 0x117296558f185bbc4c6
Logफ़ंक्शन प्रिंट करता हैethBalanceचर मान हैं:0x117296558f185bbc4c6, जो एक स्ट्रिंग प्रकार है. हाँहेक्साडेसिमल मान में ETH शेष राशि,द्वाराweiएक इकाई के रूप में,1e18 wei1 हैETH. इसलिए, इसे एक पठनीय दशमलव ETH शेष में परिवर्तित करने की आवश्यकता है।
इच्छाethBalanceपठनीय डेटा में परिवर्तित करें:
function main() {
let ethBalance = exchange.IO("api", "eth", "eth_getBalance", "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045", "latest")
Log("ethBalance:", ethBalance)
// 将ethBalance转换为可读的数据
let vitalikEthBalance = parseInt(ethBalance.substring(2), 16) / 1e18
Log("vitalikEthBalance:", vitalikEthBalance)
}

शीर्ष परhttps://etherscan.io/सवाल:

हालाँकि, इस प्रसंस्करण में भाषा की सटीकता के कारण विचलन होगा, इसलिए FMZ प्लेटफॉर्म में डेटा प्रसंस्करण के लिए दो अंतर्निहित कार्य हैं:
कोड को पुनः समायोजित करें:
function main() {
let ethBalance = exchange.IO("api", "eth", "eth_getBalance", "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045", "latest")
// ETH的精度单位为1e18
let ethDecimal = 18
Log("vitalikEthBalance:", Number((BigDecimal(BigInt(ethBalance)) / BigDecimal(Math.pow(10, ethDecimal))).toString()))
}
vitalikEthBalance: 5149.6244846875215
eth_chainIdऔरnet_versionदोनों के उपयोग समान हैं, इसलिए हमने उनका एक साथ परीक्षण किया। दोनों फ़ंक्शन उस ब्लॉकचेन की आईडी लौटाते हैं जिससे वर्तमान RPC नोड जुड़ा हुआ है। अंतर यह है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

कॉन्फ़िगर किए गए Ethereum परीक्षण नेटवर्क का उपयोग करें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, " ,转换:", parseInt(ethChainId.substring(2), 16))
}

पुकारना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, " ,转换:", toAmount(gasPrice, 0))
}
यहां हम एक हेक्साडेसिमल स्ट्रिंग को पठनीय मान में परिवर्तित करने के लिए एक फ़ंक्शन लिखते हैं:toAmount. ध्यान देने योग्य एक और बात यह है कि गैस की कीमत की इकाई हैwei, इसलिए पैरामीटरdecimalsसंगत वास्तविक पैरामीटर को 0 के रूप में पारित किया जा सकता है।
eth_blockNumbeब्लॉक ऊंचाई क्वेरी करने के लिए उपयोग किया जाता है।
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))
}
डीबगर में चलाएँ:

https://etherscan.io/प्रश्न पर:

ब्लॉक जानकारी क्वेरी करें.
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)
// 由于Log输出的内容过多,会自动截断,所以遍历返回的区块信息各个字段,逐个打印
for (let key in blockMsg) {
Log("key:", key, ", val:", blockMsg[key])
}
}
“डीबग टूल” में निष्पादित करके निम्नलिखित जानकारी प्राप्त की जा सकती है:

एथेरियम पर बड़ी संख्या में स्मार्ट कॉन्ट्रैक्ट एप्लिकेशन चल रहे हैं।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यह फ़ंक्शन FMZ प्लेटफ़ॉर्म का API फ़ंक्शन है, जिसका उपयोग विशेष रूप से FMZ प्लेटफ़ॉर्म पर एन्कोडिंग ऑपरेशन करने के लिए किया जाता है। यह फ़ंक्शन कई एन्कोडिंग विधियों और कई हैश एल्गोरिदम का समर्थन करता है।
Encode(algo, inputFormat, outputFormat, data, keyFormat, key string)
ENS दस्तावेज़ के अनुसार, उपयोग करेंsha3.keccak256एल्गोरिदम डेटा को संसाधित करते हैं.
पुकारनाnameHashकार्य, उदाहरण के लिए:Log(nameHash("vitalik.eth")), हम प्राप्त कर सकते हैं:ee6c4522aab0003e8d14cd40a6af439055fd2577951148c14b6cea9a53475835, आपको “0x” उपसर्ग जोड़ना होगा।0xee6c4522aab0003e8d14cd40a6af439055fd2577951148c14b6cea9a53475835ENS स्मार्ट अनुबंध के रूप मेंresolverविधि के पैरामीटर.
let ensNode = "0x" + nameHash("vitalik.eth") // 准备好调用resolver方法的参数ensNode
ENS दस्तावेज़ के अनुसार, ENS स्मार्ट अनुबंध एप्लिकेशन का अनुबंध पता है:0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e. स्मार्ट कॉन्ट्रैक्ट को कॉल करने मेंresolverआगे बढ़ने से पहले हमें अनुबंध तैयार करना होगाABI。
यह जानने के बाद, मैं यह पूछे बिना नहीं रह सका कि स्मार्ट अनुबंध क्या है?ABIऊनी कपड़े?
ABI,即应用程序二进制接口(Application Binary Interface),是智能合约与外部世界进行通信的接口标准。
智能合约的 ABI 定义了合约的函数接口、参数类型、返回值等信息,以及调用合约的方式和参数传递方式等规范。
智能合约的 ABI 通常以 JSON 格式存储,包含以下信息:
合约的函数接口:函数名、参数列表、返回值等信息。
函数参数类型:如 uint256、bool、string 等。
函数的输入参数和输出参数的编码方式:智能合约使用一种称为 Solidity ABI 的编码方式来编码函数的输入参数和输出参数,
以便与以太坊网络进行交互。
在以太坊网络中,使用智能合约的 ABI 来调用合约的函数。当需要调用合约函数时,需要提供函数名和函数参数,以及将函数参数按照 ABI 编码方式编码后的字节码。
以太坊节点会将这些信息打包成一笔交易,并将交易发送到以太坊网络中执行。
智能合约的 ABI 在 Solidity 语言中可以通过 interface 关键字来定义。以太坊开发工具如 Remix IDE、Truffle 等也提供了 ABI 编辑和生成工具,
使得开发者可以方便地创建和使用智能合约的 ABI。
ENS ABI से निम्नलिखित निकालें:resolverपूर्ण ABI का उपयोग भी किया जा सकता हैhttps://etherscan.io/आप GitHub पर अनुबंध की ABI के बारे में जानकारी प्राप्त कर सकते हैं, या अन्य माध्यमों (उदाहरण के लिए, प्रासंगिक परियोजना दस्तावेज़) के माध्यम से 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"}]`
यहां हमें FMZ प्लेटफॉर्म पर एक नई कॉलिंग विधि सीखनी है।exchange.IO("abi", address, abiContent), ABI को पंजीकृत करने के लिए इस विधि का उपयोग करें,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 是在以太坊主网上部署的ENS智能合约的地址
इसके बाद, आप ENS स्मार्ट कॉन्ट्रैक्ट को कॉल कर सकते हैंresolverविधि, जो लौटाती हैENS: Public Resolverअनुबंध का पता.

let resolverAddress = exchange.IO("api", "0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e", "resolver", ensNode)
उपयोगENS: Public Resolverसंविदात्मकaddrविटालिक का वॉलेट पता प्राप्त करने की विधि. आवाज देनाENS: Public Resolverअनुबंध को पहले ABI को पंजीकृत करने की आवश्यकता है। इस स्मार्ट अनुबंध की ABI जानकारी अभी भी यहां पाई जा सकती है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)

आखिरी कॉलENS: Public Resolverसंविदात्मकaddrविधि, पैरामीटर अभी भी हैंensNode。
let vitalikAddress = exchange.IO("api", resolverAddress, "addr", ensNode)
Log("vitalikAddress:", vitalikAddress)
लॉग फ़ंक्शन आउटपुट:

vitalikAddress: 0xd8da6bf26964af9d7eed9e03e53415d37aa96045
”`javascript 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() { // 计算名称 let ensNode = “0x” + nameHash(“vitalik.eth”)
// 注册ENS合约
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)
// 注册ENS Public Resolver合约
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","ty