[TOC]
Gunakan FMZ untuk memulakan pembangunan web3 berasaskan Ethereum dengan mudah
Ethereum ialah platform kontrak pintar berdasarkan teknologi blockchain, yang menyediakan cara terdesentralisasi untuk menulis dan menggunakan kontrak pintar. Kontrak pintar ialah program komputer khas yang boleh dilaksanakan secara automatik pada blockchain dan boleh melaksanakan pelbagai logik perniagaan tanpa perlu mempercayai pihak ketiga.
Platform Dagangan Kuantitatif Inventor (FMZ.COM) menyediakan API yang mudah digunakan yang memudahkan pembangun berinteraksi dengan blockchain Ethereum dan ekosistemnya. Realisasikan fungsi seperti akses kepada pertukaran terdesentralisasi (DEX), mendapatkan data dalam rantaian dan menghantar transaksi.
Contoh dalam tutorial ini menggunakanJavaScript
Penulisan bahasa, penggunaan persekitaran ujianEthereum Mainnet、Goerli Testnet. Anda juga boleh melihat antara muka API yang digunakan dalam tutorial serta penerangan dan contoh kod yang berkaitan dalam dokumentasi API platform FMZ.
Sebelum belajar menggunakan platform dagangan kuantitatif FMZ, kita perlu membiasakan diri dengan beberapa konsep asas:
Selepas mendaftar dan log masuk ke laman web rasmi platform dagangan kuantitatif FMZ (https://www.fmz.com), anda boleh menggunakan pelbagai fungsi platform. Laman web FMZ ialah penghujung pengurusan keseluruhan sistem, dan program yang ditulis oleh pengguna sebenarnya dijalankan pada hos. Hos ialah program perisian yang boleh digunakan pada pelbagai peranti, seperti pelayan, komputer, dsb. Apabila pengguna menulis program dan mencipta contoh berjalan di tapak web FMZ, platform FMZ akan berkomunikasi dengan hos dan memulakan contoh program pada hos.
Jika anda ingin menjalankan contoh program, anda mesti menggunakan hos Penggunaan hos juga sangat mudah, dan terdapat tutorial penggunaan pada platform. Anda juga boleh menggunakan “hos penggunaan satu klik” yang disediakan di FMZ untuk menggunakan pelayan secara automatik yang disewa oleh FMZ.
Program penjaga boleh digunakan dan dijalankan pada pelayan, komputer peribadi dan peranti lain, selagi rangkaian itu normal (sasaran yang sepadan perlu boleh diakses, seperti antara muka pertukaran, alamat nod, dll.). Langkah-langkah utama penempatan ialah:
robot
fail boleh laku. Konfigurasikan alamat komunikasi penjaga ini adalah unik untuk setiap akaun FMZ Selepas log masuk ke FMZ.https://www.fmz.com/m/add-node
Halaman itu boleh melihat alamatnya sendiri (mis../robot -s node.fmz.com/xxxxx
Rentetan alamat ini, di sinixxxxx
Kandungan lokasi dipaparkan secara berbeza untuk setiap akaun FMZ). Akhir sekali, anda perlu memasukkan kata laluan akaun FMZ Selepas mengkonfigurasinya, jalankan program hos.Tambahkan halaman penjaga pada platform FMZ, alamat:https://www.fmz.com/m/add-node
Platform dagangan kuantitatif FMZ menyediakan alat penyahpepijatan percuma yang menyokongJavaScript
,TypeScript
Halaman tersebut ialah: https://www.fmz.com/m/debug, kerana membuat tika dan menjalankannya dibilkan. Alat penyahpepijatan ini boleh digunakan untuk ujian dan pembelajaran semasa tempoh pembelajaran awal. Alat penyahpepijatan tidak berbeza daripada mencipta contoh, kecuali masa berjalan adalah terhad kepada 3 minit.
gunaTypeScript
Apabila menggunakan bahasa, anda perlu menulisnya dalam baris pertama kod// @ts-check
Untuk bertukar kepadaTypeScript
Mod, jika tidak ditukar, lalainya ialahJavaScript
bahasa.
Di FMZ, “pertukaran” ialah konsep umum Untuk pertukaran CEX, ia merujuk kepada konfigurasi akaun pertukaran tertentu. Untuk web3, pertukaran ini merujuk kepada maklumat konfigurasi, termasuk alamat nod dan konfigurasi kunci peribadi.
Apabila log masuk ke platform FMZ,https://www.fmz.com/m/add-platform
Halaman, anda boleh mengkonfigurasi maklumat pertukaran, di mana pertukaran adalah konsep umum.
pilihWeb3
, konfigurasikan alamat nod RPC dan kunci peribadi Anda boleh mengklik “Maklumat sensitif disulitkan dan disimpan menggunakan kunci peribadi bebas” di sudut kanan bawah untuk melihat mekanisme keselamatan.
Nod boleh dibina sendiri atau disediakan oleh pembekal perkhidmatan nod. Terdapat banyak penyedia perkhidmatan nod, seperti:Infura. Selepas pendaftaran, anda boleh melihat alamat nod akaun anda. Terdapat kedua-dua mainnet dan testnet, yang lebih mudah Konfigurasikan alamat nod ini dalam rajah di atas.Rpc Address
dalam kawalan. Tag boleh dinamakan sendiri untuk membezakan objek pertukaran yang dikonfigurasikan.
Dalam rajahhttps://mainnet.infura.io/v3/xxxxxxxxxxxxx
Ia ialah alamat nod RPC utama Infura ETH peribadi.
Selepas menggunakan program penjaga dan mengkonfigurasi objek pertukaran, anda boleh menggunakan “alat nyahpepijat” FMZ.COM untuk ujian. Panggil kaedah RPC Ethereum untuk berinteraksi dengan Ethereum Sebagai tambahan kepada beberapa kaedah RPC yang disenaraikan dalam bab ini, anda boleh merujuk kepada dokumentasi untuk kaedah RPC lain, seperti.https://www.quicknode.com/docs。
Mari kita ambil beberapa contoh mudah dan mulakan dari asas. Terdapat cara untuk mengakses web3 untuk pelbagai bahasa dan alatan, seperti yang ditunjukkan dalam rajah:
Panggilan kaedah RPC juga dikapsulkan pada FMZ Fungsi ini terkandung dalam fungsi API FMZexchange.IO
tengah. Kaedah panggilan ialahexchange.IO("api", "eth", ...)
. Parameter pertama ditetapkan."api"
, parameter kedua ditetapkan"eth"
, parameter lain bergantung pada kaedah RPC khusus yang dipanggil.
Untuk mengeluarkan maklumat, kami menggunakan platform FMZLog
fungsi,Log
Fungsi ini boleh lulus dalam berbilang parameter dan kemudian mengeluarkannya dalam kawasan log halaman “Alat Nyahpepijat” atau “Perdagangan Sebenar” pada platform FMZ Halaman “Alat Nyahpepijat” akan menjadi alat utama untuk ujian kami.
Ethereumeth_getBalance
Kaedah ini digunakan untuk menanya baki ETH alamat pada Ethereum Kaedah ini memerlukan dua parameter untuk dihantar.
Mari kita semak pengasas EthereumV神
Alamat dompet ETH, alamat yang diketahui ialah:0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045
。
function main() {
let ethBalance = exchange.IO("api", "eth", "eth_getBalance", "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045", "latest")
Log("ethBalance:", ethBalance)
}
Penjaga telah digunakan (dalam rajah: linux/amd64 …) dan objek pertukaran telah dikonfigurasikan (dalam rajah: Ujian Web3 Uji kod dalam alat penyahpepijatan:
Klik butang “Laksanakan” untuk menjalankan kod ini dan memaparkan hasilnya:
ethBalance: 0x117296558f185bbc4c6
Log
Fungsi mencetakethBalance
Nilai pembolehubah adalah:0x117296558f185bbc4c6
, yang merupakan jenis rentetan. yaImbangan ETH dalam nilai perenambelasan,olehwei
Sebagai satu unit,1e18 wei
ialah 1ETH
. Oleh itu, ia perlu ditukar kepada baki ETH perpuluhan yang boleh dibaca.
akanethBalance
Tukar kepada data yang boleh dibaca:
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)
}
Di atashttps://etherscan.io/
Pertanyaan:
Walau bagaimanapun, pemprosesan ini akan mempunyai penyelewengan disebabkan oleh ketepatan bahasa itu sendiri, jadi platform FMZ mempunyai dua fungsi terbina dalam untuk memproses data:
Laraskan kod sekali lagi:
function main() {
let ethBalance = exchange.IO("api", "eth", "eth_getBalance", "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045", "latest")
// ETH的精度单位为1e18
let ethDecimal = 18
Log("vitalikEthBalance:", Number((BigDecimal(BigInt(ethBalance)) / BigDecimal(Math.pow(10, ethDecimal))).toString()))
}
vitalikEthBalance: 5149.6244846875215
eth_chainId
dannet_version
Kegunaannya adalah serupa, jadi kami mengujinya bersama-sama. Kedua-dua fungsi mengembalikan ID blok yang disambungkan ke nod RPC semasanet_version
Mengembalikan id perpuluhan.eth_chainId
Mengembalikan ID perenambelasan.
Nama rangkaian yang sepadan dengan ID rantaian
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
Gunakan rangkaian ujian Ethereum yang dikonfigurasikangoerli
Ujian nod:
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))
}
Panggileth_gasPrice
Kaedah untuk menanyakan rantaian semasagas 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))
}
Di sini kita menulis fungsi untuk menukar rentetan heksadesimal kepada nilai yang boleh dibaca:toAmount
. Satu lagi perkara yang perlu diberi perhatian ialah unit gasPrice ialahwei
, jadi parameterdecimals
Parameter sebenar yang sepadan boleh diluluskan sebagai 0.
eth_blockNumbe
Digunakan untuk menanyakan ketinggian blok.
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))
}
Jalankan dalam penyahpepijat:
https://etherscan.io/
atas pertanyaan:
Maklumat blok pertanyaan.
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])
}
}
Maklumat berikut boleh diperolehi dengan melaksanakan dalam “Alat Nyahpepijat”:
Terdapat sejumlah besar aplikasi kontrak pintar yang dijalankan di Ethereum.ENS
adalah salah satu daripadanya.ENS
, iaitu Perkhidmatan Nama Ethereum, adalah perkhidmatan resolusi nama domain terdesentralisasi berdasarkan blockchain Ethereum.
Ingat contoh dalam tutorial di mana kami menanyakan baki dompet pengasas Ethereum Vitalik Buterin? Salah satu alamat dompet Vitalik ialah:0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045
. Jadi bagaimana kita tahu alamat ini? Malah, melaluiENS
Kontrak pintar, menggunakan nama intuitifvitalik.eth
(vitalik ialah nama Vitalik) untuk menjalankan pertanyaan.
Kandungan berikut dalam bab ini menggunakan persekitaran rangkaian utama Ethereum.ENS
Dokumen itu menunjukkan bahawa nama domain Ethereum yang ingin ditanya perluHashing Names
, gunakan kod berikut untukvitalik.eth
Nama sedang diproses.
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))
}
}
Dalam contoh kod di atas, kita melihat satu lagi fungsi yang tidak dikenaliEncode
Fungsi ini ialah fungsi API platform FMZ, yang digunakan secara khusus untuk melaksanakan operasi pengekodan pada platform FMZ Fungsi ini menyokong berbilang kaedah pengekodan dan berbilang algoritma cincang.
Encode(algo, inputFormat, outputFormat, data, keyFormat, key string)
Menurut dokumentasi ENS, gunakansha3.keccak256
Algoritma memproses data.
PanggilnameHash
Fungsi, contohnya:Log(nameHash("vitalik.eth"))
, kita boleh dapat:ee6c4522aab0003e8d14cd40a6af439055fd2577951148c14b6cea9a53475835
, anda perlu menambah awalan “0x”.0xee6c4522aab0003e8d14cd40a6af439055fd2577951148c14b6cea9a53475835
Sebagai kontrak pintar ENSresolver
Parameter kaedah.
let ensNode = "0x" + nameHash("vitalik.eth") // 准备好调用resolver方法的参数ensNode
Menurut dokumen ENS, alamat kontrak permohonan kontrak pintar ENS ialah:0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e
. Dalam memanggil kontrak pintarresolver
Sebelum kita meneruskan, kita perlu menyediakan kontrakABI
。
Selepas belajar ini, saya tidak boleh tidak bertanya, apakah kontrak pintar?ABI
Kain bulu?
ABI,即应用程序二进制接口(Application Binary Interface),是智能合约与外部世界进行通信的接口标准。
智能合约的 ABI 定义了合约的函数接口、参数类型、返回值等信息,以及调用合约的方式和参数传递方式等规范。
智能合约的 ABI 通常以 JSON 格式存储,包含以下信息:
合约的函数接口:函数名、参数列表、返回值等信息。
函数参数类型:如 uint256、bool、string 等。
函数的输入参数和输出参数的编码方式:智能合约使用一种称为 Solidity ABI 的编码方式来编码函数的输入参数和输出参数,
以便与以太坊网络进行交互。
在以太坊网络中,使用智能合约的 ABI 来调用合约的函数。当需要调用合约函数时,需要提供函数名和函数参数,以及将函数参数按照 ABI 编码方式编码后的字节码。
以太坊节点会将这些信息打包成一笔交易,并将交易发送到以太坊网络中执行。
智能合约的 ABI 在 Solidity 语言中可以通过 interface 关键字来定义。以太坊开发工具如 Remix IDE、Truffle 等也提供了 ABI 编辑和生成工具,
使得开发者可以方便地创建和使用智能合约的 ABI。
Ekstrak yang berikut daripada ENS ABI:resolver
ABI penuh juga boleh digunakan dalamhttps://etherscan.io/
Anda boleh menanyakan ABI kontrak di GitHub, atau mendapatkan ABI melalui cara lain (contohnya, dokumen projek yang berkaitan).
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"}]`
Di sini kita perlu mempelajari kaedah panggilan baharu pada platform FMZ.exchange.IO("abi", address, abiContent)
, gunakan kaedah ini untuk mendaftar ABI,address
Parameter ialah alamat kontrak pintar.abiContent
Parameter ialah kontrak pintar ABI (rentetan) yang sepadan.
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智能合约的地址
Seterusnya, anda boleh menghubungi kontrak pintar ENSresolver
kaedah, yang kembaliENS: Public Resolver
Alamat kontrak.
let resolverAddress = exchange.IO("api", "0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e", "resolver", ensNode)
gunaENS: Public Resolver
Berkontrakaddr
Kaedah untuk mendapatkan alamat dompet Vitalik. Untuk menelefonENS: Public Resolver
Kontrak masih perlu mendaftar ABI terlebih dahulu. Maklumat ABI kontrak pintar ini masih boleh didapati dihttps://etherscan.io/
Dapatkan.
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)
Panggilan terakhirENS: Public Resolver
Berkontrakaddr
Kaedah, parameter masihensNode
。
let vitalikAddress = exchange.IO("api", resolverAddress, "addr", ensNode)
Log("vitalikAddress:", vitalikAddress)
Output fungsi log:
vitalikAddress: 0xd8da6bf26964af9d7eed9e03e53415d37aa96045
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)
}
Dalam bab kursus sebelumnya, kami telah mempelajari cara mengkonfigurasi kunci peribadi Untuk objek pertukaran yang dikonfigurasikan, bagaimana kami mengetahui alamat dompet yang sepadan dengan kunci peribadi ini? Tersedia di FMZexchange.IO("address")
Fungsi ini mendapatkan alamat dompet yang sepadan dengan kunci peribadi yang dikonfigurasikan.
Oleh kerana kandungan berikut dalam bab ini menggunakanGoerli
Uji persekitaran rangkaian, jadi nod yang saya gunakan ialah:https://goerli.infura.io/v3/*******
, Infura memberikan alamat nod yang berbeza kepada setiap pengguna berdaftar.*******
Kandungan khusus disembunyikan.
function main() {
let walletAddress = exchange.IO("address")
Log("测试网 goerli 钱包地址:", walletAddress)
}
Sebaik sahaja anda mengetahui alamat dompet anda, anda boleh menggunakan kaedah RPC Ethereumeth_getTransactionCount
Tanya kiraan transaksi alamat dompet. Kiraan ini sangat biasa digunakan dalam Ethereum Malah, ia adalah apa yang perlu diluluskan semasa memindahkan wang.nonce
Parameter, Dalam Ethereum, nonce ialah nombor yang digunakan untuk memastikan setiap transaksi adalah unik. Ia adalah bilangan yang semakin meningkat yang dinaikkan secara automatik setiap kali transaksi baharu dihantar. Oleh itu, apabila anda menghantar transaksi kepada kontrak pintar, anda perlu memberikan nonce untuk memastikan transaksi itu unik dan mengikut susunan yang betul. Dalam beberapa data dan dokumen yang kami dapati:
Berikut ialah perpustakaan Ethereum dalam bahasa GoPendingNonceAt
Fungsi sebenarnya memanggileth_getTransactionCount
kaedah. Dalam kursus sebelumnya, kami juga mempelajari cara memanggil kaedah RPC Kami akan menggunakannya semula di sini.exchange.IO("api", "eth", ...)
fungsi.
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))
}
Sebelum menerangkan operasi pemindahan, mari kita fahami secara ringkas beberapa konsep Semasa memindahkan wang pada Ethereum, sejumlah token ETH akan digunakan (sebagai bayaran gas). Yuran gas ditentukan oleh dua parameter:
Walau bagaimanapun, yuran gas pada rangkaian Ethereum sentiasa berubah-ubah berdasarkan permintaan pasaran dan apa yang pengguna sanggup bayar, jadi menulis yuran gas tetap ke dalam kod kadangkala tidak sesuai. Kita boleh menggunakan apa yang kita pelajari sebelum inieth_gasPrice
Kaedah, yang boleh mendapatkan purata harga gas.
Had gas untuk pemindahan eter standard ialah 21,000 unit.
fahamnonce
,gasPrice
,gasLimit
Dengan konsep ini, anda boleh menguji pemindahan. Fungsi pemindahan yang sangat ringkas dan mudah digunakan terkandung pada FMZ.
exchange.IO("api", "eth", "send", toAddress, toAmount)
Apabila digunakan untuk pemindahan,exchange.IO
Parameter ketiga sentiasa “hantar”.toAddress
Parameter ialah alamat yang menerima ETH semasa pemindahan.toAmount
Jumlah ETH yang dipindahkan.
nonce
,gasPrice
,gasLimit
Parameter ini boleh menggunakan nilai yang diperoleh secara automatik oleh sistem secara lalai pada FMZ. Anda juga boleh menentukan:
exchange.IO("api", "eth", "send", toAddress, toAmount, {gasPrice: 5000000000, gasLimit: 21000, nonce: 100})
Seterusnya, kami memindahkan sejumlah ETH ke alamat tertentu pada rangkaian ujian 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
}
Kerana unit jumlah pemindahan Ethereum adalahwei
, anda perlu menggunakan fungsi tersuaitoInnerAmount
Diproses sebagaiwei
Nilai unit.
wujudhttps://etherscan.io/
Hash Transaksi Pertanyaan:0xa6f9f51b00d8ae850b0f204380b59da98f4bbce34b813577d3d948f61de4734e
。
Anda juga boleh menulis kod untuk menanyakan cincang pemindahan0xa6f9f51b00d8ae850b0f204380b59da98f4bbce34b813577d3d948f61de4734e
, gunakaneth_getTransactionReceipt
Kaedah untuk membuat pertanyaan.
function main() {
let transHash = "0xa6f9f51b00d8ae850b0f204380b59da98f4bbce34b813577d3d948f61de4734e"
let info = exchange.IO("api", "eth", "eth_getTransactionReceipt", transHash)
return info
}
Keputusan pertanyaan:
{
"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": []
}
Penerangan setiap medan:
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 - 值的类型
KamiBaca maklumat kontrakBahagian ini menggunakan contoh lengkap untuk memanggil kaedah kontrak ENS yang digunakan pada Ethereum untuk mendapatkan alamat dompet Vitalik. Kaedah ini tergolong dalamRead
Kaedah, memanggil kaedah ini tidak perlugas
(Ingat apa yang kita bincangkan tentang gas sebelum ini?). Dalam bahagian ini kami akan memanggil beberapa kontrak pintar pada EthereumWrite
Kaedah dan pembayarangas
. Operasi ini akan disahkan oleh setiap nod dan pelombong pada keseluruhan rangkaian dan menukar keadaan blockchain.
Untuk kontrak ERC20 (kontrak token ERC20), platform FMZ menyenaraikan ABI kontrak ERC20 sebagai ABI yang biasa digunakan dan secara langsung membinanya ke dalam sistem, menghapuskan langkah mendaftarkan ABI. Kami juga telah mempelajari tentang ABI dalam tutorial sebelumnya Apabila kami memanggil kaedah kontrak ENS, kami mula-mula mendaftarkan ABI kontrak ENS.
Untuk memahami ABI dengan lebih jelas, anda boleh menyemaknya sebelum menggunakannya Berikut ialah ABI kontrak ERC20:
”`javascript [{“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