[TOC]

Gunakan FMZ untuk memulai pengembangan web3 berbasis Ethereum dengan mudah
Ethereum adalah platform kontrak pintar berdasarkan teknologi blockchain, yang menyediakan cara terdesentralisasi untuk menulis dan menyebarkan kontrak pintar. Kontrak pintar adalah program komputer khusus yang dapat dieksekusi secara otomatis pada blockchain dan dapat menerapkan berbagai logika bisnis tanpa perlu mempercayai pihak ketiga.
Platform Perdagangan Kuantitatif Inventor (FMZ.COM) menyediakan API yang mudah digunakan yang memudahkan pengembang untuk berinteraksi dengan blockchain Ethereum dan ekosistemnya. Mewujudkan fungsi seperti akses ke bursa terdesentralisasi (DEX), memperoleh data on-chain, dan mengirimkan transaksi.
Contoh dalam tutorial ini menggunakanJavaScriptPenulisan bahasa, penggunaan lingkungan pengujianJaringan Utama Ethereum、Jaringan Uji Goerli. Anda juga dapat melihat antarmuka API yang digunakan dalam tutorial serta deskripsi terkait dan contoh kode dalam dokumentasi API platform FMZ.
Sebelum mempelajari cara menggunakan platform perdagangan kuantitatif FMZ, kita perlu memahami beberapa konsep dasar:
Setelah mendaftar dan masuk ke situs web resmi platform perdagangan kuantitatif FMZ (https://www.fmz.com), Anda dapat menggunakan berbagai fungsi platform. Situs web FMZ merupakan ujung tombak manajemen keseluruhan sistem, dan program-program yang ditulis oleh pengguna benar-benar dijalankan di host. Host adalah program perangkat lunak yang dapat digunakan pada berbagai perangkat, seperti server, komputer, dan lain-lain. Saat pengguna menulis program dan membuat contoh yang berjalan di situs web FMZ, platform FMZ akan berkomunikasi dengan host dan memulai contoh program di host.

Jika Anda ingin menjalankan program, Anda harus memasang host. Pemasangan host juga sangat mudah, dan ada tutorial pemasangan di platform. Anda juga dapat menggunakan “host penerapan satu-klik” yang disediakan di FMZ untuk menerapkan secara otomatis menggunakan server yang disewa oleh FMZ.
Program kustodian dapat disebarkan dan dijalankan di server, komputer pribadi, dan perangkat lain, selama jaringannya normal (target terkait harus dapat diakses, seperti antarmuka pertukaran, alamat node, dll.). Langkah-langkah utama penyebaran adalah:

robotberkas yang dapat dieksekusi. Konfigurasikan alamat komunikasi kustodian. Alamat komunikasi ini unik untuk setiap akun FMZ. Setelah masuk ke FMZ,https://www.fmz.com/m/add-nodeHalaman tersebut dapat melihat alamatnya sendiri (misalnya:./robot -s node.fmz.com/xxxxxRangkaian alamat ini, di sinixxxxxKonten lokasi ditampilkan berbeda untuk setiap akun FMZ). Terakhir, Anda perlu memasukkan kata sandi akun FMZ. Setelah mengonfigurasinya, jalankan program host.Tambahkan halaman kustodian pada platform FMZ, alamat:https://www.fmz.com/m/add-node

Platform perdagangan kuantitatif FMZ menyediakan alat debugging gratis yang mendukungJavaScript,TypeScriptHalamannya adalah: https://www.fmz.com/m/debug, karena membuat instance dan menjalankannya ditagih. Alat debugging ini dapat digunakan untuk pengujian dan pembelajaran selama periode pembelajaran awal. Alat debugging tidak berbeda dengan pembuatan instance, kecuali waktu berjalannya dibatasi hingga 3 menit.
menggunakanTypeScriptSaat menggunakan bahasa tersebut, Anda perlu menuliskannya di baris pertama kode// @ts-checkUntuk beralih keTypeScriptMode, jika tidak diubah, defaultnya adalahJavaScriptbahasa.
Di FMZ, “pertukaran” merupakan konsep umum. Untuk pertukaran CEX, ini merujuk pada konfigurasi akun pertukaran tertentu. Untuk web3, pertukaran ini mengacu pada informasi konfigurasi, termasuk alamat node dan konfigurasi kunci privat.
Saat masuk ke platform FMZ,https://www.fmz.com/m/add-platformHalaman, Anda dapat mengonfigurasikan informasi pertukaran, di mana pertukaran merupakan konsep umum.

memilihWeb3, konfigurasikan alamat simpul RPC dan kunci privat. Anda dapat mengeklik “Informasi sensitif dienkripsi dan disimpan menggunakan kunci privat independen” di sudut kanan bawah untuk melihat mekanisme keamanan.
Node dapat dibangun sendiri atau disediakan oleh penyedia layanan node. Ada banyak penyedia layanan node, seperti:Infura. Setelah mendaftar, Anda dapat melihat alamat node akun Anda. Ada mainnet dan testnet, yang mana lebih praktis. Konfigurasikan alamat node ini pada gambar di atas.Rpc Addressdalam kontrol. Tag dapat diberi nama sendiri untuk membedakan objek pertukaran yang dikonfigurasi.

Pada gambarhttps://mainnet.infura.io/v3/xxxxxxxxxxxxxIni adalah alamat node RPC mainnet ETH Infura yang bersifat pribadi.
Setelah menerapkan program kustodian dan mengonfigurasi objek pertukaran, Anda dapat menggunakan “alat debugging” FMZ.COM untuk pengujian. Panggil metode Ethereum RPC untuk berinteraksi dengan Ethereum. Selain beberapa metode RPC yang tercantum dalam bab ini, Anda dapat merujuk ke dokumentasi untuk metode RPC lainnya, sepertihttps://www.quicknode.com/docs。
Mari kita ambil beberapa contoh sederhana dan mulai dengan dasar-dasarnya. Ada cara untuk mengakses web3 untuk berbagai bahasa dan alat, seperti yang ditunjukkan pada gambar:

Panggilan metode RPC juga dienkapsulasi pada FMZ. Fungsi-fungsi ini dienkapsulasi dalam fungsi API FMZexchange.IOtengah. Metode pemanggilannya adalahexchange.IO("api", "eth", ...). Parameter pertama sudah diperbaiki."api", parameter kedua sudah diperbaiki"eth", parameter lainnya bergantung pada metode RPC spesifik yang dipanggil.
Untuk mengeluarkan informasi, kami menggunakan platform FMZLogfungsi,LogFungsi ini dapat memasukkan beberapa parameter dan kemudian menampilkannya di area log pada halaman “Debug Tool” atau “Real Trading” di platform FMZ. Halaman “Debug Tool” akan menjadi alat utama untuk pengujian kami.
Etereumeth_getBalanceMetode ini digunakan untuk memeriksa saldo ETH suatu alamat di Ethereum. Metode ini memerlukan dua parameter yang harus dimasukkan.
Yuk cek siapa pendiri EthereumV神Alamat dompet ETH, alamat yang diketahui adalah:0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045。
function main() {
let ethBalance = exchange.IO("api", "eth", "eth_getBalance", "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045", "latest")
Log("ethBalance:", ethBalance)
}
Kustodian telah diterapkan (pada gambar: linux/amd64 …) dan objek pertukaran telah dikonfigurasi (pada gambar: uji Web3). Uji kode pada alat debugging:

Klik tombol “Execute” untuk menjalankan kode ini dan menampilkan hasilnya:
ethBalance: 0x117296558f185bbc4c6
LogFungsi mencetakethBalanceNilai variabelnya adalah:0x117296558f185bbc4c6, yang merupakan tipe string. YaSaldo ETH dalam nilai heksadesimal,olehweiSebagai satu kesatuan,1e18 weiadalah 1ETH. Oleh karena itu, perlu diubah menjadi saldo ETH desimal yang dapat dibaca.
AkanethBalanceUbah menjadi data yang dapat 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:

Namun, pemrosesan ini akan memiliki penyimpangan karena keakuratan bahasa itu sendiri, sehingga platform FMZ memiliki dua fungsi bawaan untuk memproses data:
Sesuaikan kode 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_chainIdDannet_versionPenggunaannya serupa, jadi kami mengujinya bersama. Kedua fungsi tersebut mengembalikan ID blockchain yang terhubung dengan node RPC saat ini. Perbedaannya adalahnet_versionMengembalikan Id desimal.eth_chainIdMengembalikan ID heksadesimal.
Nama jaringan sesuai dengan ID rantai
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 jaringan uji Ethereum yang dikonfigurasigoerliUji simpul:
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))
}

Panggilaneth_gasPriceMetode untuk menanyakan rantai saat inigas 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 mengubah string heksadesimal menjadi nilai yang dapat dibaca:toAmount. Hal lain yang perlu diperhatikan adalah bahwa unit harga gas adalahwei, jadi parameternyadecimalsParameter aktual yang terkait dapat dilewatkan sebagai 0.
eth_blockNumbeDigunakan untuk menanyakan tinggi 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 debugger:

https://etherscan.io/Pada pertanyaan:

Kueri informasi blok.
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])
}
}
Informasi berikut dapat diperoleh dengan menjalankan “Debug Tool”:

Ada sejumlah besar aplikasi kontrak pintar yang berjalan di Ethereum.ENSadalah salah satunya.ENS, yaitu Ethereum Name Service, adalah layanan resolusi nama domain terdesentralisasi yang berbasis pada blockchain Ethereum.
Ingat contoh dalam tutorial saat kami menanyakan saldo dompet pendiri Ethereum Vitalik Buterin? Salah satu alamat dompet Vitalik adalah:0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045. Jadi bagaimana kita tahu alamat ini? Faktanya, melaluiENSKontrak pintar, menggunakan nama yang intuitifvitalik.eth(vitalik adalah nama Vitalik) untuk melakukan penyelidikan.
Konten berikut dalam bab ini menggunakan lingkungan jaringan utama Ethereum.ENSDokumen tersebut menunjukkan bahwa nama domain Ethereum yang akan ditanyakan perluHashing Names, gunakan kode berikut untukvitalik.ethNamanya 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))
}
}
Pada contoh kode di atas, kita melihat fungsi lain yang tidak dikenalEncodeFungsi ini adalah fungsi API dari platform FMZ, yang secara khusus digunakan untuk melakukan operasi pengodean pada platform FMZ. Fungsi ini mendukung beberapa metode pengodean dan beberapa algoritma hash.
Encode(algo, inputFormat, outputFormat, data, keyFormat, key string)
Menurut dokumentasi ENS, gunakansha3.keccak256Algoritma memproses data.
PanggilannameHashFungsi, misalnya:Log(nameHash("vitalik.eth")), kita bisa mendapatkan:ee6c4522aab0003e8d14cd40a6af439055fd2577951148c14b6cea9a53475835, Anda perlu menambahkan awalan “0x”.0xee6c4522aab0003e8d14cd40a6af439055fd2577951148c14b6cea9a53475835Sebagai kontrak pintar ENSresolverParameter metode.
let ensNode = "0x" + nameHash("vitalik.eth") // 准备好调用resolver方法的参数ensNode
Menurut dokumen ENS, alamat kontrak aplikasi kontrak pintar ENS adalah:0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e. Dalam menyebut kontrak pintarresolverSebelum kita melanjutkan, kita perlu menyiapkan kontraknyaABI。
Setelah mengetahui ini, saya jadi bertanya, apa itu kontrak pintar?ABIKain wol?
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 ini dari ENS ABI:resolverABI penuh juga dapat digunakan dihttps://etherscan.io/Anda dapat menanyakan ABI kontrak di GitHub, atau memperoleh ABI melalui cara lain (misalnya, dokumen proyek yang relevan).

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 harus mempelajari metode pemanggilan baru pada platform FMZ.exchange.IO("abi", address, abiContent), gunakan metode ini untuk mendaftarkan ABI,addressParameternya adalah alamat kontrak pintar.abiContentParameternya adalah ABI kontrak pintar yang sesuai (string).
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智能合约的地址
Selanjutnya, Anda dapat memanggil kontrak pintar ENSresolvermetode yang mengembalikanENS: Public ResolverAlamat kontrak.

let resolverAddress = exchange.IO("api", "0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e", "resolver", ensNode)
menggunakanENS: Public ResolverKontraktualaddrMetode untuk mendapatkan alamat dompet Vitalik. Untuk meneleponENS: Public ResolverKontrak tersebut masih perlu mendaftarkan ABI terlebih dahulu. Informasi ABI dari kontrak pintar ini masih dapat ditemukan dihttps://etherscan.io/Mendapatkan.
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 ResolverKontraktualaddrMetode, parameternya masihensNode。
let vitalikAddress = exchange.IO("api", resolverAddress, "addr", ensNode)
Log("vitalikAddress:", vitalikAddress)
Keluaran 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)
}
Pada bab-bab kursus sebelumnya, kita telah mempelajari cara mengonfigurasi kunci privat. Untuk objek pertukaran yang dikonfigurasi, bagaimana kita mengetahui alamat dompet yang sesuai dengan kunci privat ini? Tersedia di FMZexchange.IO("address")Fungsi ini memperoleh alamat dompet yang sesuai dengan kunci pribadi yang dikonfigurasi.
Karena isi bab berikut ini menggunakanGoerliPengujian lingkungan jaringan, jadi node yang saya gunakan adalah:https://goerli.infura.io/v3/*******Infura menetapkan alamat node yang berbeda untuk setiap pengguna terdaftar.*******Konten spesifik disembunyikan.
function main() {
let walletAddress = exchange.IO("address")
Log("测试网 goerli 钱包地址:", walletAddress)
}

Setelah Anda mengetahui alamat dompet Anda, Anda dapat menggunakan metode RPC Ethereumeth_getTransactionCountMenanyakan jumlah transaksi dari alamat dompet. Jumlah ini sangat umum digunakan di Ethereum. Faktanya, jumlah ini adalah jumlah yang perlu dimasukkan saat mentransfer uang.nonceParameter, Di Ethereum, nonce adalah angka yang digunakan untuk memastikan bahwa setiap transaksi bersifat unik. Ini adalah angka yang terus bertambah dan otomatis bertambah setiap kali transaksi baru dikirim. Oleh karena itu, ketika Anda mengirim transaksi ke kontrak pintar, Anda perlu memberikan nonce untuk memastikan bahwa transaksi tersebut unik dan dalam urutan yang benar. Dalam beberapa data dan dokumen kita dapat menemukan:

Berikut adalah pustaka Ethereum dalam bahasa GoPendingNonceAtFungsi sebenarnya memanggileth_getTransactionCountmetode. Pada kursus sebelumnya, kita juga mempelajari cara memanggil metode RPC. Kita akan menggunakannya lagi 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 menjelaskan operasi transfer, mari kita pahami beberapa konsep secara singkat. Saat mentransfer uang di Ethereum, sejumlah token ETH akan dikonsumsi (sebagai biaya gas). Biaya gas ditentukan oleh dua parameter:
Namun, biaya gas pada jaringan Ethereum selalu berfluktuasi berdasarkan permintaan pasar dan apa yang bersedia dibayar pengguna, jadi menulis biaya gas tetap ke dalam kode terkadang tidaklah ideal. Kita bisa menggunakan apa yang kita pelajari sebelumnyaeth_gasPriceMetode yang dapat memperoleh harga gas rata-rata.
Batas gas untuk transfer eter standar adalah 21.000 unit.
Mengertinonce,gasPrice,gasLimitDengan konsep ini, Anda dapat menguji transfer. Fungsi transfer yang sangat sederhana dan mudah digunakan dienkapsulasi pada FMZ.
exchange.IO("api", "eth", "send", toAddress, toAmount)
Ketika digunakan untuk transfer,exchange.IOParameter ketiga selalu “kirim”.toAddressParameter adalah alamat yang menerima ETH selama transfer.toAmountJumlah ETH yang ditransfer.
nonce,gasPrice,gasLimitParameter ini dapat menggunakan nilai yang diperoleh secara otomatis oleh sistem secara default di FMZ. Anda juga dapat menentukan:
exchange.IO("api", "eth", "send", toAddress, toAmount, {gasPrice: 5000000000, gasLimit: 21000, nonce: 100})
Selanjutnya, kami mentransfer sejumlah ETH ke alamat tertentu di jaringan uji 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
}
Karena unit jumlah transfer Ethereum adalahwei, Anda perlu menggunakan fungsi kustomtoInnerAmountDiproses sebagaiweiNilai unit.
adahttps://etherscan.io/Kueri Hash Transaksi:0xa6f9f51b00d8ae850b0f204380b59da98f4bbce34b813577d3d948f61de4734e。

Anda juga dapat menulis kode untuk menanyakan hash transfer0xa6f9f51b00d8ae850b0f204380b59da98f4bbce34b813577d3d948f61de4734e,menggunakaneth_getTransactionReceiptMetode untuk menanyakan.
function main() {
let transHash = "0xa6f9f51b00d8ae850b0f204380b59da98f4bbce34b813577d3d948f61de4734e"
let info = exchange.IO("api", "eth", "eth_getTransactionReceipt", transHash)
return info
}
Hasil kueri:
{
"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": []
}
Deskripsi setiap bidang:
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 - 值的类型
Kami adalahBaca informasi kontrakBagian ini menggunakan contoh lengkap untuk memanggil metode kontrak ENS yang diterapkan pada Ethereum untuk memperoleh alamat dompet Vitalik. Metode ini termasuk dalamReadMetode, memanggil metode ini tidak perlugas(Ingat apa yang kita bicarakan tentang gas sebelumnya?). Pada bagian ini kita akan menyebutkan beberapa kontrak pintar di EthereumWriteMetode dan pembayarangas. Operasi ini akan diverifikasi oleh setiap node dan penambang di seluruh jaringan dan mengubah status blockchain.
Untuk kontrak ERC20 (kontrak token ERC20), platform FMZ mencantumkan ABI kontrak ERC20 sebagai ABI yang umum digunakan dan langsung membangunnya ke dalam sistem, sehingga menghilangkan langkah pendaftaran ABI. Kita juga telah mempelajari tentang ABI pada tutorial sebelumnya. Saat kita memanggil metode kontrak ENS, pertama-tama kita mendaftarkan ABI dari kontrak ENS.
Untuk memahami ABI dengan lebih jelas, Anda dapat memeriksanya sebelum menggunakannya. Berikut ini adalah 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”:false,“name”:“wad”,“type”:“uint256”}],“name”:“Transfer