ایف ایم زیڈ کا استعمال کرتے ہوئے ایتھرون پر مبنی ویب 3 کی ترقی میں آسان تعارف

مصنف:چھوٹا سا خواب, تخلیق: 2023-03-28 13:32:48, تازہ کاری: 2023-09-18 20:27:13

[TOC]

img

EtherEaseWithFMZ سبق

ایف ایم زیڈ کا استعمال کرتے ہوئے ایتھرون پر مبنی ویب 3 کی ترقی میں آسان تعارف

ایتھرین ایک اسمارٹ معاہدہ پلیٹ فارم ہے جو بلاکچین ٹیکنالوجی پر مبنی ہے ، جو اسمارٹ معاہدوں کو لکھنے اور تعینات کرنے کا ایک غیر مرکزی طریقہ فراہم کرتا ہے۔ اسمارٹ معاہدہ ایک خاص کمپیوٹر پروگرام ہے جو بلاکچین پر خود بخود انجام دے سکتا ہے اور کسی تیسرے فریق پر بھروسہ کرنے کی ضرورت کے بغیر مختلف کاروباری منطق کو نافذ کرسکتا ہے۔

ایجاد کاروں کی طرف سے مقداری تجارت کا پلیٹ فارمFMZ.COMڈی ایچ ایچ ایچ ایچ (DEX) ایک آسان استعمال کے قابل API فراہم کرتا ہے جو ڈویلپرز کو ایتھروئن بلاکچین اور اس کے ماحولیاتی نظام کے ساتھ آسانی سے بات چیت کرنے کی اجازت دیتا ہے۔ ڈی ایچ ایچ ایچ (DEX) تک رسائی حاصل کرنے ، چین پر ڈیٹا حاصل کرنے ، ٹرانزیکشن بھیجنے وغیرہ کی سہولیات کو قابل بناتا ہے۔

اس سبق میں مثالیں استعمال کریںJavaScriptزبان لکھنا، ٹیسٹنگ ماحول کا استعمالایتھرین نیٹGoerli ٹیسٹ نیٹ ورک◄ ایف ایم زیڈ پلیٹ فارم کی اے پی آئی دستاویزات میں سبق میں استعمال ہونے والے اے پی آئی انٹرفیس اور متعلقہ وضاحتیں، کوڈ مثالیں بھی دیکھی جاسکتی ہیں۔


ایف ایم زیڈ کا استعمال کریں

ایف ایم زیڈ کوالٹی ٹریڈنگ پلیٹ فارم کو استعمال کرنے سے پہلے ، ہمیں کچھ بنیادی تصورات سے واقف ہونے کی ضرورت ہے۔

ایف ایم زیڈ کوانٹیمیٹڈ ٹریڈنگ پلیٹ فارم کا فن تعمیر

ایف ایم زیڈ کوالٹی ٹریڈنگ پلیٹ فارم کی ویب سائٹ پرhttps://www.fmz.comایف ایم زیڈ ویب سائٹ پورے نظام کا ایڈمنسٹریٹر ہے ، صارف کے لکھے ہوئے پروگرام دراصل میزبان پر چلتے ہیں۔ میزبان یہ سافٹ ویئر پروگرام مختلف آلات پر تعینات کیا جاسکتا ہے ، جیسے سرور ، کمپیوٹر وغیرہ۔ جب صارف ایف ایم زیڈ ویب سائٹ پر ایک اچھا پروگرام لکھتا ہے تو چلنے والا مثال بناتا ہے ، ایف ایم زیڈ پلیٹ فارم میزبان کے ساتھ بات چیت کرتا ہے اور میزبان پر ایک پروگرام کی مثال شروع کرتا ہے۔

img

2، منتظمین

اگر آپ کسی پروگرام کی مثال کو چلانے کے لئے چاہتے ہیں تو آپ کو ایک میزبان کو تعینات کرنا ہوگا ، اور میزبان کی تعیناتی بھی بہت آسان ہے ، پلیٹ فارم پر تعیناتی کے سبق موجود ہیں۔ FMZ پر فراہم کردہ "ایک کلک تعیناتی کے منتظم" کا استعمال کرکے خود بخود تعینات کیا جاسکتا ہے ، FMZ کے بجائے کرایے کے سرورز۔

  • ذاتی آلات پر منتظمین کی تعیناتی

    سرورز، پی سیز وغیرہ جیسے آلات پر منتظم پروگرام چلانے کے لئے تعینات کیا جا سکتا ہے، جب تک کہ یہ یقینی بنایا جائے کہ نیٹ ورک کام کر رہا ہے، تو تعیناتی کے اہم اقدامات یہ ہیں:

    1، لاگ ان کریں یا اس آلہ کو کھولیں جس پر آپ میزبان پروگراموں کو تعینات کرنا چاہتے ہیں، جیسےسرور میں لاگ ان کریںیاآپریٹنگ سسٹم میں کمپیوٹر کھولیں◄ 2، ڈاؤن لوڈ کے مطابق ورژن کے منتظم پروگرام (مختلف آلات کے آپریٹنگ سسٹم پر منحصر ہے) ، ڈاؤن لوڈ کے صفحے:https://www.fmz.com/m/add-node img3، ڈاؤن لوڈ کرنے کے لئے ایک کمپریشن پیکج ہے، جس کو کھولنے کی ضرورت ہے۔ 4، اس مینیجر پروگرام کو چلانے کے لئے، مینیجر پروگرام ایک نام ہے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، ڈیبگنگ ٹولز

ایف ایم زیڈ کیوٹی ٹریڈنگ پلیٹ فارم ایک مفت ڈیبگنگ کا آلہ فراہم کرتا ہےJavaScriptTypeScriptیہ صفحہ:https://www.fmz.com/m/debugمثال کے طور پر ، آپ کو یہ کام کرنے کا طریقہ سیکھنے کے لئے استعمال کرنا چاہئے ، کیونکہ مثال کے طور پر چلنے کے لئے ادائیگی کی جاتی ہے۔ ابتدائی اسکول کے دوران ، آپ اس ڈیبگنگ ٹول کو جانچنے ، سیکھنے کے ل use استعمال کرسکتے ہیں۔ مثال کے طور پر ، مثال کے طور پر چلنے کے علاوہ ، ڈیبگنگ ٹول میں کوئی فرق نہیں ہے۔

استعمالTypeScriptزبانوں میں، آپ کو کوڈ کی پہلی لائن میں لکھنا پڑتا ہے// @ts-checkکے لئے استعمال کیا جاتا ہےTypeScriptموڈ، غیر سوئچنگ ڈیفالٹ ہےJavaScriptزبانوں کا استعمال۔

4، ایکسچینج

ایف ایم زیڈ پر "ایکسچینج" ایک عمومی تصور ہے جو سی ای ایکس ایکسچینج کے لئے ایک مخصوص ایکسچینج اکاؤنٹ کی تشکیل کا مطلب ہے۔ ویب 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

ایف ایم زیڈ پر آر پی سی کے طریقہ کار کے کالز کے لئے بھی احاطہ کرتا ہے ، جو ایف ایم زیڈ کے API افعال میں احاطہ کرتا ہے۔exchange.IOمَیں نے کہا:exchange.IO("api", "eth", ...)◄ پہلی پیرامیٹر فکسڈ ان پٹ"api"، دوسرا پیرامیٹر فکسڈ ٹرانسمیشن"eth"، دیگر پیرامیٹرز مخصوص کال کرنے والے آر پی سی کے طریقہ کار پر منحصر ہیں۔

ہم FMZ پلیٹ فارم کا استعمال کرتے ہیں.Logفنکشن،Logایک فنکشن کئی پیرامیٹرز کو منتقل کرسکتا ہے اور پھر ایف ایم زیڈ پلیٹ فارم کے "ڈیبگ ٹولز" یا "ریئل ڈسک" کے صفحے میں لاگ ان کے علاقے میں آؤٹ پٹ کرسکتا ہے ، "ڈیبگ ٹولز" کا صفحہ ہمارا بنیادی ٹول ہوگا۔

eth_getBalance

ایتھرینeth_getBalanceایک طریقہ جس سے ایتھریم ایڈریس پر ایتھین بیلنس کے بارے میں پوچھا جاتا ہے جس میں دو پیرامیٹرز کی ضرورت ہوتی ہے۔

  • آپ کو اس کے بارے میں جاننے کی ضرورت ہے۔
  • اس کے علاوہ ، یہ بھی کہا جاتا ہے کہ یہ ایک بہت ہی عام ٹیگ ہے ، جس میں عام طور پر "latest" استعمال ہوتا ہے۔

آئیے ایتھرین کے بانی سے پوچھیںV神ای ٹی ایچ والیٹ کا پتہ، جو کہ معلوم ہے:0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045

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

ہسٹریٹر (شکل میں: لینکس / amd64...) کو تعینات کیا گیا ہے اور ایکسچینج آبجیکٹ (شکل میں: ویب 3 ٹیسٹ) کو ترتیب دیا گیا ہے ، ڈیبگنگ ٹولز میں کوڈ کی جانچ:

img

اس کوڈ کو چلانے کے لئے "پر عمل کریں" پر کلک کریں اور نتائج دکھائیں:

ethتوازن: 0x117296558f185bbc4c6

Logفنکشن پرنٹ کیا جاتا ہےethBalanceمتغیر کی قدر:0x117296558f185bbc4c6، سٹرنگ کی قسم ہے۔ETH کا 16 ہندسوں کا بیلنس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)
}

img

اوپرhttps://etherscan.io/انکوائری:

img

تاہم ، اس کی وجہ یہ ہے کہ زبان کی درستگی کے مسئلے میں بھی انحراف ہوسکتا ہے ، لہذا ایف ایم زیڈ پلیٹ فارم میں ڈیٹا پروسیسنگ کے لئے دو فنکشنز بلٹ ان ہیں:

  • بگ انٹ: 16 ہندسوں کی تار کو بگ انٹ آبجیکٹ میں تبدیل کرتا ہے۔
  • بگ ڈیسیمل: عددی قسم کے اشیاء کو قابل عمل بگ ڈیسیمل اشیاء میں تبدیل کرتا ہے۔

ایک بار پھر کوڈ کو تبدیل کریں:

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

وٹالیک ایتھ بیلنس: 5149.6244846875215

eth_chainId

eth_chainIdاورnet_versionیہ دونوں افعال موجودہ آر پی سی نوڈ تک رسائی حاصل کرنے والے بلاکچین کا آئی ڈی واپس کرتے ہیں ، فرق یہ ہے کہnet_versionاس کے بعد آپ کو ایک بار پھر آپ کے پاس آنے والے اعداد و شمار کو واپس کرنے کی ضرورت ہے۔eth_chainIdواپس سولہ ہندسوں کی شناخت چلو

نیٹ ورک کا نام جس کے ساتھ سلسلہ ID مطابقت رکھتا ہے

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

یہاں ہم ایک فعل میں لکھتے ہیں جو 16 ہندسوں کی سٹرنگ کو پڑھنے کے قابل عددی اقدار میں تبدیل کرتا ہے:toAmountاس کے علاوہ، یہ بھی نوٹ کرنا ضروری ہے کہ گیس کی قیمت کا یونٹ ہے:weiاور اس کے بعد،decimalsاس کے مطابق حقیقی پیرامیٹرز کی قیمت 0 ہے۔

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) ، ایتھرئم بلاکچین پر مبنی ایک وکندریقرت ڈومین نام تجزیہ سروس ہے۔ کیا آپ کو یاد ہے کہ سبق میں ہم نے ایتھرین کے بانی V خدا کے بٹوے کے توازن کی مثال کے بارے میں پوچھا تھا؟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یہ فنکشن ایف ایم زیڈ پلیٹ فارم کا ایک API فنکشن ہے جو ایف ایم زیڈ پلیٹ فارم پر انکوڈنگ کے لئے خاص طور پر استعمال ہوتا ہے۔ یہ فنکشن متعدد انکوڈنگ طریقوں کی حمایت کرتا ہے اور متعدد ہیشنگ الگورتھم کی حمایت کرتا ہے۔

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

این ایس ایس دستاویزات کی تلاش میں ، این ایس ایس اسمارٹ کنٹریکٹ ایپلی کیشنز کا معاہدہ ایڈریس یہ ہے: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)اس کے علاوہ ، آپ کو اس کے بارے میں مزید جاننے کی ضرورت ہے۔addressاس کے علاوہ، آپ کو اس بات کا یقین کرنے کی ضرورت ہے کہ آپ کو اس بات کا یقین کرنے کی ضرورت نہیں ہے کہ آپ کو اس بات کا یقین کرنے کی ضرورت نہیں ہے کہ آپ کو کیا کرنا ہے.abiContentاس کے علاوہ، اس کے علاوہ، اس کے علاوہ، اس کے علاوہ، اس کے علاوہ، اس کے علاوہ، اس کے علاوہ، اس کے علاوہ، اس کے علاوہ، اس کے علاوہ، اس کے علاوہ، اس کے علاوہ، اس کے علاوہ، اس کے علاوہ، اس کے علاوہ، اس کے علاوہ، اس کے علاوہ، اس کے علاوہ، اس کے علاوہ، اس کے علاوہ، اس کے علاوہ، اس کے علاوہ، اس کے علاوہ، اس کے علاوہ، اس کے علاوہ، اس کے علاوہ، اس کے علاوہ، اس کے علاوہ، اس کے علاوہ، اس کے علاوہ، اس کے بعد، اس کے بعد، اس کے بعد، اس کے بعد، اس کے بعد، اس کے بعد، اس کے بعد.

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وی دیوتا کی پرس کا پتہ حاصل کرنے کا طریقہ۔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)

لاگ فنکشن آؤٹ پٹ:

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

ایک بار جب آپ اپنے بٹوے کا پتہ جانتے ہیں تو ، آپ ایتھروئن کے آر پی سی کے طریقوں کا استعمال کرسکتے ہیں۔eth_getTransactionCountبٹوے کے پتے کی تلاش کے لئے ٹرانزیکشن کی گنتی۔ ایتھرین میں یہ گنتی بہت عام ہے ، دراصل منتقلی کے عمل میں داخل ہونے کی ضرورت ہے۔nonceپیرامیٹرز، ایتھرین میں، nonce کو اس بات کا یقین کرنے کے لئے استعمال کیا جاتا ہے کہ ہر ٹرانزیکشن ایک منفرد نمبر ہے۔ یہ ایک بڑھتی ہوئی تعداد ہے جو ہر بار جب کوئی نیا ٹرانزیکشن بھیجا جاتا ہے تو خود بخود بڑھ جاتی ہے۔ لہذا ، جب آپ سمارٹ کنٹریکٹ کو ٹرانزیکشن بھیجتے ہیں تو ، اس بات کا یقین کرنے کے لئے کہ ٹرانزیکشن منفرد ہے اور ترتیب درست ہے ، ایک nonce فراہم کرنے کی ضرورت ہوتی ہے۔ کچھ معلومات ، دستاویزات میں ہم پوچھ سکتے ہیں:

https://goethereumbook.org/en/

img

یہاں گو زبان میں ایتھرین ذخیرہ ہے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اس کے علاوہ، آپ کے پاس ای ٹی ایچ کے لئے ایک ٹرانسفر ایڈریس ہے، جس میں آپ کو ای ٹی ایچ وصول کرنے کی ضرورت ہے.toAmountٹرانسفر کے لیے ETH کی مقدار۔

noncegasPricegasLimitیہ پیرامیٹرز ایف ایم زیڈ پر استعمال کیے جاسکتے ہیں ، جو نظام کے ذریعہ پہلے سے طے شدہ خود بخود حاصل کردہ اقدار ہیں۔

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

اس کے بعد ہم نے ٹیسٹ نیٹ ورک Goerli پر ایک ایڈریس پر کچھ ETH منتقل کیا:

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 - 值的类型

ایتھرین کے سمارٹ معاہدوں کو کال کریں

ہم ہیںمعاہدے کی معلومات پڑھنااس باب میں ایک مکمل مثال کے ذریعے ، ایتھروئن پر تعینات این ایس معاہدوں کو کال کرنے کے طریقوں کو وی کے والٹ ایڈریس حاصل کیا گیا ہے۔ یہ طریقوں میں سے ایک ہیں۔Readاور اس کا استعمال کرنے کی ضرورت نہیں ہے۔gasاس باب میں ہم ایتھرین پر اسمارٹ معاہدوں کے بارے میں بات کریں گے۔Writeطریقہ اور ادائیگیgasیہ کارروائیاں پورے نیٹ ورک کے ہر نوڈس اور کان کنوں کے ذریعہ تصدیق کی جائیں گی اور بلاکچین کی حالت کو تبدیل کردیں گی۔

ERC20

ERC20 معاہدوں کے لئے (ERC20 ٹوکن معاہدوں کے لئے) ، FMZ پلیٹ فارم نے ERC20 معاہدوں کے ABI کو عام طور پر استعمال ہونے والے ABI کے طور پر براہ راست سسٹم میں شامل کیا ہے ، جس میں رجسٹرڈ ABI کا اس مرحلے کو چھوڑ دیا گیا ہے۔

اے بی آئی کو بہتر طور پر سمجھنے کے لئے ، استعمال کرنے سے پہلے ، ذیل میں ای آر سی 20 معاہدے کا اے بی آئی ملاحظہ کریں:

[{"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ویب ماحول کی جانچ پڑتال کریں۔

توازن

اور پھر ہم نے ایک بار پھر اس پر عمل کیا کہ ہم کس طرح معاہدوں کو کال کرتے ہیں۔ReadERC20 معاہدے کو کال کرنے کے لئے معاہدے کی معلومات کو پڑھنے کا طریقہbalanceOfٹوکن بیلنس کی تلاش کا طریقہbalanceOfطریقہ کار میں صرف ایک پیرامیٹر ہے ، لیکن اس کا نام نہیں لیا گیا ہے ، جس کی قسم سے پتہ چلتا ہے کہ یہ ایک پتہ ہے (یعنی استفسار کرنے والے ٹوکن کا پتہ) ؛ چونکہ واپس آنے والا ڈیٹا ایک ٹوکن کے مطابق نہیں ہے ، لہذا اس کے بدلے میں ٹوکن کی درستگی کے اعداد و شمار کی ضرورت ہوتی ہے ، جس کی وجہ سے ٹوکن کی درستگی کو ERC20 معاہدے کے مطابق کیا جاسکتا ہے۔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

مزید