এফএমজেড ব্যবহার করে ইথেরিয়াম ভিত্তিক ওয়েব 3 বিকাশের সহজ ভূমিকা

লেখক:ছোট্ট স্বপ্ন, সৃষ্টিঃ ২০২৩-০৩-২৮ 13:32:48, আপডেটঃ ২০২৩-০৯-১৮ ২০ঃ২৭ঃ১৩

[TOC]

img

EtherEaseWithFMZ টিউটোরিয়াল

এফএমজেড ব্যবহার করে ইথেরিয়াম ভিত্তিক ওয়েব 3 বিকাশের সহজ ভূমিকা

ইথেরিয়াম একটি ব্লকচেইন প্রযুক্তির উপর ভিত্তি করে একটি স্মার্ট কন্ট্রাক্ট প্ল্যাটফর্ম যা স্মার্ট কন্ট্রাক্টগুলি লিখতে এবং স্থাপন করার জন্য একটি বিকেন্দ্রীভূত উপায় সরবরাহ করে। স্মার্ট কন্ট্রাক্টগুলি একটি বিশেষ কম্পিউটার প্রোগ্রাম যা ব্লকচেইনে স্বয়ংক্রিয়ভাবে সম্পাদন করতে পারে এবং কোনও তৃতীয় পক্ষের উপর নির্ভর না করে বিভিন্ন ব্যবসায়িক যুক্তি বাস্তবায়ন করতে পারে।

উদ্ভাবক পরিমাণগত ট্রেডিং প্ল্যাটফর্ম (((FMZ.COMএটি একটি সহজেই ব্যবহারযোগ্য এপিআই সরবরাহ করে যা ডেভেলপারদের ইথেরিয়াম ব্লকচেইন এবং এর বাস্তুতন্ত্রের সাথে আরও সহজেই ইন্টারঅ্যাক্ট করতে দেয়। এটি একটি কেন্দ্রীয় এক্সচেঞ্জ (DEX) অ্যাক্সেস করতে, চেইনের ডেটা পেতে, লেনদেন পাঠাতে এবং অন্যান্য বৈশিষ্ট্যগুলি সক্ষম করে।

এই টিউটোরিয়ালে উদাহরণ ব্যবহার করুনJavaScriptভাষা লেখার, পরীক্ষার পরিবেশ ব্যবহারইথেরিয়াম নেটগোয়ারলি টেস্ট নেটএফএমজেড প্ল্যাটফর্মের এপিআই ডকুমেন্টেশনে টিউটোরিয়ালে ব্যবহৃত এপিআই ইন্টারফেস এবং এর সাথে সম্পর্কিত বিবরণ, কোড উদাহরণগুলিও দেখা যাবে।


এফএমজেড ব্যবহার করে প্রবেশ

এফএমজেড কোয়ান্টাম ট্রেডিং প্ল্যাটফর্ম ব্যবহার করার আগে, আমাদের কয়েকটি মৌলিক ধারণার সাথে পরিচিত হওয়া দরকারঃ

১। এফএমজেড কোয়ালিফাইড ট্রেডিং প্ল্যাটফর্ম আর্কিটেকচার

এফএমজেড-এ কোয়ালিফাইড ট্রেডিং প্ল্যাটফর্মের অফিসিয়াল ওয়েবসাইট (((https://www.fmz.com) নিবন্ধন, লগইন এবং প্ল্যাটফর্মের বিভিন্ন বৈশিষ্ট্য ব্যবহার করা যাবে. FMZ ওয়েবসাইট পুরো সিস্টেমের প্রশাসক, ব্যবহারকারী লিখিত প্রোগ্রাম বাস্তবে হোস্ট উপর চালানো হয়. হোস্ট সফ্টওয়্যার প্রোগ্রাম বিভিন্ন ডিভাইসের উপর স্থাপন করা যেতে পারে, যেমন সার্ভার, কম্পিউটার ইত্যাদি. যখন ব্যবহারকারী একটি ভাল প্রোগ্রাম লিখুন এবং একটি চলমান উদাহরণ তৈরি করতে FMZ ওয়েবসাইটে, FMZ প্ল্যাটফর্ম হোস্ট সঙ্গে যোগাযোগ এবং হোস্ট উপর একটি প্রোগ্রাম উদাহরণ শুরু।

img

২। পরিচালক

যদি আপনি একটি প্রোগ্রামের উদাহরণ চালাতে চান তবে আপনাকে একটি হোস্ট স্থাপন করতে হবে, হোস্ট স্থাপন করা খুব সহজ, প্ল্যাটফর্মে স্থাপন টিউটোরিয়াল রয়েছে। আপনি FMZ-তে উপলব্ধ "এক-ক্লিক স্থাপনার হোস্ট" ব্যবহার করে স্বয়ংক্রিয়ভাবে FMZ এর পরিবর্তে ভাড়া সার্ভার স্থাপন করতে পারেন।

  • ব্যক্তিগত ডিভাইসে হোস্ট স্থাপন করুন

    সার্ভার, ব্যক্তিগত কম্পিউটার ইত্যাদি ডিভাইসে হোস্ট প্রোগ্রাম চালানো যায়, যখন নেটওয়ার্কটি সঠিকভাবে কাজ করছে তা নিশ্চিত করা হয় (যেমন একটি এক্সচেঞ্জ ইন্টারফেস, নোডের ঠিকানা ইত্যাদির জন্য উপযুক্ত লক্ষ্যে অ্যাক্সেস প্রয়োজন) ।

    ১। হোস্ট প্রোগ্রাম স্থাপন করার জন্য সাইন ইন করুন অথবা ডিভাইস খুলুন, যেমনঃসার্ভারে লগইন করুনঅথবাঅপারেটিং সিস্টেমে কম্পিউটার চালু করুন◄ ২, সংশ্লিষ্ট সংস্করণে হোস্ট প্রোগ্রাম ডাউনলোড করুন (ডিভাইসের অপারেটিং সিস্টেমের উপর নির্ভর করে), ডাউনলোড পৃষ্ঠাঃhttps://www.fmz.com/m/add-node img৩। ডাউনলোড করা হচ্ছে একটি কম্প্রেস প্যাক, যা আনকম্প্রেস করা প্রয়োজন। ৪। এই হোস্ট প্রোগ্রামটি চালান, হোস্ট প্রোগ্রামটি একটি নামকrobotএফএমজেডের এক্সিকিউটেবল ফাইল; কনফিগার হোস্টের যোগাযোগের ঠিকানা, যা প্রতিটি এফএমজেড অ্যাকাউন্টের জন্য অনন্য।https://www.fmz.com/m/add-nodeআপনি আপনার ঠিকানা দেখতে পারেন (যেমন)./robot -s node.fmz.com/xxxxxএই ঠিকানাটি এখানে।xxxxxএই ফাইলটি আপনার অ্যাকাউন্টের জন্য উপযুক্ত। এটিতে আপনি আপনার অ্যাকাউন্টের পাসওয়ার্ড লিখতে হবে এবং এটির সাথে আপনার অ্যাকাউন্টের ম্যানেজার প্রোগ্রাম চালাতে হবে।

  • এফএমজেড প্ল্যাটফর্মের "একটি বোতামে হোস্ট স্থাপন করুন" বৈশিষ্ট্য ব্যবহার করে

    এফএমজেড প্ল্যাটফর্মে অ্যাডমিনিস্ট্রেটর পাতা যোগ করা হয়েছে, ঠিকানাঃhttps://www.fmz.com/m/add-node

    img

৩। ডিবাগিং সরঞ্জাম

এফএমজেড কোয়ালিফাইড ট্রেডিং প্ল্যাটফর্ম একটি বিনামূল্যে ডিউটিং সরঞ্জাম প্রদান করে, যা সমর্থন করেJavaScriptTypeScriptএই পাতাটি:https://www.fmz.com/m/debug, কারণ ইনস্ট্যান্স তৈরির জন্য একটি চার্জ রয়েছে. প্রাথমিক বিদ্যালয়ের সময় আপনি এই ডিবাগিং সরঞ্জামটি পরীক্ষা, শেখার জন্য ব্যবহার করতে পারেন. ডিবাগিং সরঞ্জামটি সর্বোচ্চ 3 মিনিটের জন্য চলার সময়সীমা ছাড়াও অন্যান্য দিকগুলি থেকে ডিবাগিং সরঞ্জামটি তৈরির ক্ষেত্রে কোনও পার্থক্য নেই।

ব্যবহারTypeScriptভাষার ক্ষেত্রে, কোডের প্রথম লাইনে লিখতে হয়।// @ts-checkএর জন্য ব্যবহৃত হয়TypeScriptমোড, কোন স্যুইচ ডিফল্ট হয়JavaScriptভাষা ।

৪। এক্সচেঞ্জ

এফএমজেডে "এক্সচেঞ্জ" একটি সাধারণ ধারণা, যা সিইএক্স এক্সচেঞ্জের জন্য একটি নির্দিষ্ট এক্সচেঞ্জ অ্যাকাউন্টের কনফিগারেশন বোঝায়। ওয়েব 3 এর জন্য, এই এক্সচেঞ্জটি একটি কনফিগারেশন তথ্য বোঝায়, যা নোডের ঠিকানা, ব্যক্তিগত কী কনফিগারেশন অন্তর্ভুক্ত করে।

এফএমজেড প্ল্যাটফর্মে লগইন করুন।https://www.fmz.com/m/add-platformএই পাতাটি এক্সচেঞ্জ সম্পর্কিত তথ্য কনফিগার করতে পারে।

img

নির্বাচনWeb3RPC নোটের ঠিকানা এবং ব্যক্তিগত কী কনফিগার করার জন্য, আপনি নীচের ডানদিকে "স্বতন্ত্র ব্যক্তিগত কী দিয়ে সংবেদনশীল তথ্য এনক্রিপ্ট করুন" ক্লিক করে সুরক্ষা প্রক্রিয়াটি দেখতে পারেন।

নোটগুলি স্বনির্মিত নোটগুলির সাথে বা নোট সার্ভার দ্বারা সরবরাহিত নোটগুলির সাথেও ব্যবহার করা যেতে পারে।ইনফুরা❏ নিবন্ধন করার পর, আপনি আপনার অ্যাকাউন্টের নোট ঠিকানা দেখতে পারেন. ❏ মূল নেটওয়ার্ক, পরীক্ষামূলক নেটওয়ার্ক পাওয়া যায়, তুলনামূলকভাবে সুবিধাজনক, উপরের চিত্রটিতে এই নোট ঠিকানাটি কনফিগার করুন।Rpc Addressট্যাগগুলি তাদের নিজস্ব নাম দিতে পারে, যা কনফিগার করা এক্সচেঞ্জের বস্তুগুলিকে আলাদা করতে ব্যবহৃত হয়।

img

ছবিতেhttps://mainnet.infura.io/v3/xxxxxxxxxxxxxএটি ইনফুরার ব্যক্তিগত ইটিএইচ হোম নেটওয়ার্কের আরপিসি নোডের ঠিকানা।


এফএমজেড এবং ইথেরিয়ামের সাথে ইন্টারঅ্যাক্ট

在部署好托管者程序、配置好交易所对象的前提下,就可以使用FMZ.COM的「调试工具」进行测试了。调用以太坊RPC方法和以太坊交互,除了本章节列举介绍的几个RPC方法,其它RPC方法可以查询资料了解,例如https://www.quicknode.com/docs

আমরা কয়েকটি সহজ উদাহরণ তালিকাভুক্ত করেছি, প্রাথমিক দিক থেকে শুরু করার জন্য। বিভিন্ন ভাষা, সরঞ্জামগুলির জন্য ওয়েব 3 অ্যাক্সেসের উপায় রয়েছে, যেমনঃ

img

এফএমজেডে আরপিসি পদ্ধতির কলগুলির জন্যও প্যাকেজ করা হয়েছে, যা এফএমজেডের এপিআই ফাংশনে প্যাকেজ করা হয়েছে।exchange.IOমধ্যম...exchange.IO("api", "eth", ...)◎ প্রথম প্যারামিটার স্থির প্রবাহ"api"দ্বিতীয় প্যারামিটারটি স্থিরভাবে প্রবেশ করে।"eth"অন্যান্য প্যারামিটারগুলি নির্দিষ্টভাবে কল করা RPC পদ্ধতির উপর নির্ভর করে।

আমরা এফএমজেড প্ল্যাটফর্ম ব্যবহার করে তথ্য আউটপুট করি।Logফাংশন,Logফাংশনটি একাধিক প্যারামিটার ইনপুট করতে পারে এবং তারপরে এটি FMZ প্ল্যাটফর্মের "ডিবাগিং সরঞ্জাম" বা "রিয়াল ডিস্ক" পৃষ্ঠায় লগ এলাকায় আউটপুট দেয়, "ডিবাগিং সরঞ্জাম" পৃষ্ঠাটি আমাদের পরীক্ষার মূল সরঞ্জাম হবে।

eth_getবালান্স

ইথেরিয়ামেরeth_getBalanceএকটি পদ্ধতি যা একটি নির্দিষ্ট ইথেরিয়ামের ঠিকানার ETH ব্যালেন্স অনুসন্ধান করতে ব্যবহৃত হয়, যার জন্য দুটি পরামিতি পাস করা প্রয়োজন।

  • এই ভিডিওটি একটি ভিডিও বার্তায় প্রকাশ করা হয়েছে।
  • ট্যাগ, সাধারণত "latest" ব্যবহার করা হয়।

আসুন ইথেরিয়ামের প্রতিষ্ঠাতা সম্পর্কে জানতে পারি।V神ইটিএইচ ওয়ালেটের ঠিকানা, যা জানা যায়, তা হলঃ0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045

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

হোস্টার (চিত্রঃ linux/amd64...) এবং এক্সচেঞ্জ অবজেক্ট (চিত্রঃ Web3 test) কনফিগার করা হয়েছে, ডিবাগিং সরঞ্জামগুলিতে কোড পরীক্ষা করা হয়েছেঃ

img

"Execute" বোতামে ক্লিক করে এই কোডটি চালান এবং ফলাফল প্রদর্শিত হবেঃ

ethবালান্সঃ 0x117296558f185bbc4c6

Logফাংশন মুদ্রণethBalanceভেরিয়েবলের মান হলঃ0x117296558f185bbc4c6, একটি স্ট্রিং টাইপ ।ষোড়শ সংখ্যার ETH ব্যালেন্স,weiইউনিট,1e18 weiETH⇒ তাই এটিকে একটি পাঠযোগ্য দশমিক 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)
}

img

উপরেhttps://etherscan.io/অনুসন্ধানঃ

img

তবে এফএমজেড প্ল্যাটফর্মে ডেটা প্রক্রিয়াকরণের জন্য দুটি ফাংশন অন্তর্নির্মিত রয়েছেঃ

  • বিগঃইন্ট ষোল ডিজিটের স্ট্রিংকে বিগ-ইন্ট অবজেক্টে রূপান্তর করে।
  • বিগডেসিমালঃ একটি সংখ্যা টাইপের বস্তুকে একটি গণনাযোগ্য বিগডেসিমাল অবজেক্টে রূপান্তর করে।

কোডটি পুনরায় সংশোধন করুনঃ

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()))
}

ভিটালিক ইথ ব্যালেন্সঃ ৫১৪৯.৬২৪৪৮৪৬৮৭৫২১৫

eth_chainId

eth_chainIdএবংnet_versionএই দুটি ফাংশন বর্তমান RPC নোডের অ্যাক্সেসের ব্লকচেইনের Id প্রদান করে, পার্থক্য হল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

img

ইথেরিয়াম টেস্টিং নেট ব্যবহার করে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))
}

img

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, " ,转换:", toAmount(gasPrice, 0))
}

এখানে আমরা ১৬ ডিজিটের স্ট্রিংকে পাঠযোগ্য সংখ্যার ফাংশনে রূপান্তর করেছিঃtoAmountগ্যাস প্রাইস এর একক হল:weiসুতরাং, আমরা শাকসব্জি ব্যবহার করিdecimalsসংশ্লিষ্ট বাস্তব পরামিতির মান ০।

eth_blockNumbe

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))
}

ডিবাগিং সরঞ্জামগুলিঃ

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)
    
    // 由于Log输出的内容过多,会自动截断,所以遍历返回的区块信息各个字段,逐个打印
    for (let key in blockMsg) {
        Log("key:", key, ", val:", blockMsg[key])
    }
}

"ডিবাগিং টুল" এর মাধ্যমে আপনি নিম্নলিখিত তথ্য পেতে পারেনঃ

img


চুক্তির তথ্য পড়ুন

ইথেরিয়ামে অনেকগুলি স্মার্ট কন্ট্রাক্ট অ্যাপ্লিকেশন রয়েছে।ENSআমি তাদের মধ্যে একজন।ENSইথেরিয়াম নাম পরিষেবা (ইংরেজিঃ Ethereum Name Service) হল ইথেরিয়াম ব্লকচেইনের উপর ভিত্তি করে একটি বিকেন্দ্রীভূত ডোমেইন নাম বিশ্লেষণ পরিষেবা। মনে আছে কি, টিউটোরিয়ালে আমরা ইথেরিয়ামের প্রতিষ্ঠাতা ভি গডের ওয়ালেট ব্যালেন্সের উদাহরণ দিয়েছিলাম?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" যুক্ত করতে হবে।0xee6c4522aab0003e8d14cd40a6af439055fd2577951148c14b6cea9a53475835এনএসএস স্মার্ট কন্ট্রাক্টresolverপদ্ধতির পরামিতি ।

let ensNode = "0x" + nameHash("vitalik.eth")    // 准备好调用resolver方法的参数ensNode

এনএস ডকুমেন্টেশন অনুসন্ধান করে আপনি দেখতে পাবেন যে এনএস স্মার্ট কন্ট্রাক্ট অ্যাপ্লিকেশনটির চুক্তি ঠিকানাটি হলঃ0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e❖ স্মার্ট কন্ট্রাক্ট কল করা হচ্ছেresolverতবে, এই পদ্ধতির আগে, আমাদের অবশ্যই চুক্তি প্রস্তুত করতে হবে।ABI

নিবন্ধিত 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/আপনি যদি এই প্রকল্পের জন্য আবেদন করতে চান তবে আপনি এই প্রকল্পের জন্য আবেদন করতে পারেন।

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"}]`

এফএমজেড প্ল্যাটফর্মে আমরা নতুন একটি কলিং পদ্ধতি শিখতে যাচ্ছি।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চুক্তির ঠিকানা।

img

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

ব্যবহারENS: Public Resolverচুক্তিaddrকিভাবে V দেবতার মানিব্যাগের ঠিকানা পাবেন?ENS: Public Resolverএই স্মার্ট কন্ট্রাক্টের 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)

img

সর্বশেষ কলENS: Public Resolverচুক্তিaddrপদ্ধতি, প্যারামিটার এখনওensNode

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

লগ ফাংশন আউটপুটঃ

img

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() {
    // 计算名称
    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","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/*******ইনফুরা প্রতিটি নিবন্ধিত ব্যবহারকারীর জন্য বিভিন্ন নোটের ঠিকানা বরাদ্দ করে।*******এই ভিডিওটি একটি ভিডিওর অংশ।

function main() {
    let walletAddress = exchange.IO("address")
    Log("测试网 goerli 钱包地址:", walletAddress)
}

img

আপনি আপনার ওয়ালেট ঠিকানা জানার পর ইথেরিয়ামের RPC পদ্ধতি ব্যবহার করতে পারেন।eth_getTransactionCountওয়ালেট ঠিকানা অনুসন্ধানের জন্য লেনদেনের গণনা। ইথেরিয়ামে এই গণনাটি খুব সাধারণভাবে ব্যবহৃত হয়, আসলে স্থানান্তর অপারেশন করার সময় এটি প্রবেশ করা দরকার।nonceপ্যারামিটার, ইথেরিয়ামে, nonce ব্যবহার করা হয় যাতে প্রতিটি লেনদেনের জন্য একটি অনন্য সংখ্যা থাকে। এটি একটি ক্রমবর্ধমান সংখ্যা যা প্রতিটি নতুন লেনদেন প্রেরণের সাথে সাথে স্বয়ংক্রিয়ভাবে বৃদ্ধি পায়। অতএব, যখন আপনি স্মার্ট কন্ট্রাক্টগুলিতে লেনদেন প্রেরণ করেন তখন একটি nonce সরবরাহ করা প্রয়োজন যাতে লেনদেনটি অনন্য এবং সঠিক ক্রমে হয়। কিছু তথ্য এবং নথিতে আমরা অনুসন্ধান করতে পারিঃ

https://goethereumbook.org/en/

img

এখানে Go ভাষার ইথেরিয়ামের ভান্ডারPendingNonceAtফাংশন আসলে কল করা হয়eth_getTransactionCountপদ্ধতি. আমরা RPC পদ্ধতিতে কল করতে শিখেছি এবং আমরা এখানে আবার এটি ব্যবহার করব।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("测试网 goerli 钱包地址:", 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 = exchange.IO("api", "eth", "eth_getTransactionCount", walletAddress, "pending")
    Log("钱包地址:", walletAddress, "当前的 nonce:", nonce, ",转换为10进制:", toAmount(nonce, 0))
}

ট্রান্সফার অপারেশনের ব্যাখ্যা দেওয়ার আগে, আমরা কিছু ধারণার সংক্ষিপ্ত ব্যাখ্যা দিচ্ছি যে ইথেরিয়ামে ট্রান্সফার করার সময় একটি নির্দিষ্ট পরিমাণ ইটিএইচ টোকেন (গ্যাস ফি হিসাবে) খরচ হয়। এই গ্যাস ফি দুটি পরামিতি দ্বারা নির্ধারিত হয়ঃ

  • গ্যাস মূল্য

    যাইহোক, ইথেরিয়ামের নেটওয়ার্কে জ্বালানীর খরচ সর্বদা বাজারের চাহিদা এবং ব্যবহারকারীদের জন্য কি খরচ করতে ইচ্ছুক তার উপর নির্ভর করে পরিবর্তিত হয়, তাই কোডের মধ্যে স্থির জ্বালানীর খরচ লিখতে কখনও কখনও আদর্শ বিকল্প নয়।eth_gasPriceগ্যাসের গড় মূল্য পেতে এই পদ্ধতি ব্যবহার করা হয়।

  • গ্যাস লিমিট

    একটি স্ট্যান্ডার্ড ইথেরিয়ামের লেনদেনের গ্যাস সীমা 21000 ইউনিট।

বুঝলাম।noncegasPricegasLimitএই ধারণাগুলি পরীক্ষা করা যেতে পারে। FMZ-তে প্যাকেজ করা খুব সহজ এবং সহজ ব্যবহারযোগ্য স্থানান্তর ফাংশন।

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

এই তথ্যের ভিত্তিতে, আপনি কি মনে করেন যে, এই তথ্যটি সত্য?exchange.IOএই প্যারামিটারটির তৃতীয় প্যারামিটারটি স্থিরভাবে "send" হিসেবে লেখা আছে।toAddressএই প্যারামিটারটি হল ETH-এর ঠিকানা যা স্থানান্তরের সময় গ্রহণ করা হয়।toAmountইটিএইচ-এর পরিমাণ যা স্থানান্তরিত হয়।

noncegasPricegasLimitএই প্যারামিটারগুলি FMZ-তে সিস্টেম ডিফল্টরূপে স্বয়ংক্রিয়ভাবে প্রাপ্ত মানগুলি ব্যবহার করতে পারে। এছাড়াও আপনি নির্দিষ্ট করতে পারেনঃ

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

এরপরে আমরা একটি নির্দিষ্ট পরিমাণ ইটিএইচ ট্রান্সফার করি একটি পরীক্ষামূলক নেটওয়ার্কের Goerli-তে একটি ঠিকানায়ঃ

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

function main() {
    let walletAddress = exchange.IO("address")
    Log("测试网 goerli 钱包地址:", walletAddress)

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

কারণ ইথেরিয়ামের লেনদেনের একক হলweiএকটি কাস্টম ফাংশন ব্যবহার করতে হবেtoInnerAmountএই পদ্ধতিতেweiইউনিটের সংখ্যাগত মান।

এদিকেhttps://etherscan.io/লেনদেনের হ্যাশ অনুসন্ধান করুনঃ0xa6f9f51b00d8ae850b0f204380b59da98f4bbce34b813577d3d948f61de4734e

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 - 该交易所在区块的哈希值
blockNumber - 以十六进制编码的该交易所在区块的块号
contractAddress - 如果是合约创建,该合约的地址;否则为null
cumulativeGasUsed - 该交易在区块中执行时使用的总燃气量
effectiveGasPrice - 每单位燃气的总基础费用加小费
from - 发送者的地址
gasUsed - 该特定交易使用的燃气量
logs - 生成该交易的日志对象数组
  address - 生成该日志的地址
  topics - 0到4个32字节索引日志参数的数据数组。在Solidity中,第一个主题是事件签名的哈希值(例如Deposit(address,bytes32,uint256)),除非你使用匿名说明符声明该事件
  data - 日志的32字节非索引参数
  blockNumber - 该日志所在区块的块号
  transactionHash - 该日志创建时的交易哈希值。如果该日志处于待定状态,则为null
  transactionIndex - 该日志创建时的交易索引位置。如果该日志处于待定状态,则为null
  blockHash - 该日志所在区块的哈希值
  logIndex - 该日志在区块中的索引位置,以十六进制编码的整数。如果该日志处于待定状态,则为null
  removed - 如果该日志已被删除,则为true,由于链重组而被删除;如果是有效的日志,则为false
logsBloom - 用于检索相关日志的布隆过滤器
status - 以十六进制编码的值,它要么是1(成功),要么是0(失败)
to - 接收者的地址。如果是合约创建交易,则为null
transactionHash - 该交易的哈希值
transactionIndex - 以十六进制编码的该交易在区块中的索引位置
type - 值的类型

ইথেরিয়ামের স্মার্ট কন্ট্রাক্ট

আমরাচুক্তির তথ্য পড়ুনএই অধ্যায়ে একটি সম্পূর্ণ উদাহরণের মাধ্যমে, ইথেরিয়ামে স্থাপন করা ENS চুক্তির পদ্ধতিগুলি কল করে V দেবতার মানিব্যাগের ঠিকানা পাওয়া যায়।Readপদ্ধতি, এই পদ্ধতিগুলি কল করার প্রয়োজন নেই।gasআমরা এখানে ইথেরিয়ামের কিছু স্মার্ট কন্ট্রাক্ট নিয়ে আলোচনা করব।Writeপদ্ধতি এবং পেমেন্টgas◦ এই অপারেশনগুলি পুরো নেটওয়ার্কের প্রতিটি নোড এবং খনির দ্বারা যাচাই করা হবে এবং ব্লকচেইনের অবস্থা পরিবর্তন করবে।

ERC20

ERC20 চুক্তির জন্য (ERC20 টোকেন চুক্তি), FMZ প্ল্যাটফর্মটি ERC20 চুক্তির ABI কে সরাসরি সিস্টেমে অন্তর্নির্মিত একটি সাধারণ ABI হিসাবে তালিকাভুক্ত করে।

এবিআই সম্পর্কে আরও ভাল ধারণা পাওয়ার জন্য, এটি ব্যবহারের আগে দেখুন, এখানে 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":"transfer","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"deposit","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"},{"name":"","type":"address"}],"name":"allowance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":true,"name":"src","type":"address"},{"indexed":true,"name":"guy","type":"address"},{"indexed":false,"name":"wad","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"src","type":"address"},{"indexed":true,"name":"dst","type":"address"},{"indexed":false,"name":"wad","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"dst","type":"address"},{"indexed":false,"name":"wad","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"src","type":"address"},{"indexed":false,"name":"wad","type":"uint256"}],"name":"Withdrawal","type":"event"}]

এই অধ্যায়ে নিম্নলিখিত বিষয়বস্তু ব্যবহার করা হয়Goerliএই ভিডিওতে, আপনি একটি ওয়েব পরিবেশ পরীক্ষা করতে পারেন।

ব্যালেন্স

এবং তারপর আমরা আবার অনুশীলন করি কিভাবে চুক্তি কল করতে হয়।Readকিভাবে ERC20 চুক্তির তথ্য পড়তে এবং কল করতেbalanceOfটোকন ব্যালেন্স অনুসন্ধান করার পদ্ধতিbalanceOfপদ্ধতির শুধুমাত্র একটি প্যারামিটার আছে, কিন্তু এটি নামকরণ করা হয় না, যা টাইপ দ্বারা দেখা যায় একটি ঠিকানা (যেমন, অনুসন্ধান করা টোকেন ঠিকানা) । যেহেতু ফিরে আসা তথ্য একটি টোকেন দ্বারা একক নয়, তাই টোকনটির নির্ভুলতার ডেটাও প্রয়োজন।decimalsআমরা ইথেরিয়াম টেস্ট নেট ব্যবহার করি।goerliএটি পরীক্ষা করার জন্য, মনে রাখবেন যে বিভিন্ন চেইনে টোকেন চুক্তির ঠিকানাও আলাদা হতে পারে।

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

function main() {
    let walletAddress = exchange.IO("address")
    
    // goerli WETH address 
    let wethAddress = "0xB4FBF271143F4FBf7B91A5ded31805e42b2208d6"
    // goerli LINK address 
    let linkAddress = "0x326C977E6efc84E512bB9C30f76E30c160eD06FB"

    // 由于是ERC20合约,FMZ已经内置ABI注册,所以这里不用注册ERC20 ABI
    let wethDecimals = exchange.IO("api", wethAddress, "decimals")
    let linkDecimals = exchange.IO("api", linkAddress, "decimals")

    let wethBalance = exchange.IO("api", wethAddress, "balanceOf", walletAddress)
    let linkBalance = exchange.IO("api", linkAddre

আরো