Sumber daya yang dimuat... Pemuatan...

Mulailah dengan Pengembangan web3 Mudah Berdasarkan Ethereum Menggunakan FMZ

Penulis:FMZ~Lydia, Dibuat: 2023-06-25 09:17:53, Diperbarui: 2023-09-18 20:28:19

[TOC]

img

Mulailah dengan Pengembangan web3 Mudah Berdasarkan Ethereum Menggunakan FMZ

EtherEaseWithFMZ Tutorial

Mulailah dengan pengembangan web3 berdasarkan Ethereum menggunakan FMZ dengan mudah

Ethereum adalah platform kontrak pintar berdasarkan teknologi blockchain, yang menyediakan cara terdesentralisasi untuk menulis dan menyebarkan kontrak pintar.

FMZ Quant Trading Platform (FMZ.COMIni menyediakan API yang mudah digunakan, memungkinkan pengembang untuk berinteraksi lebih mudah dengan blockchain Ethereum dan ekosistemnya.

Dalam tutorial ini, contohnya ditulis dalamJavaScriptbahasa, lingkungan pengujian menggunakan keduaJaringan utama EthereumdanJaringan uji Goerli. Dan Anda juga dapat melihat antarmuka API dan deskripsi terkait, contoh kode yang digunakan dalam tutorial di FMZ platforms API dokumentasi.


FMZ Dimulai

Sebelum belajar menggunakan Platform Perdagangan Kuantum FMZ, kita perlu membiasakan diri dengan beberapa konsep dasar:

1. Arsitektur Platform Perdagangan Kuantum FMZ

Setelah mendaftar dan masuk ke situs resmi FMZ Quant Trading Platform (https://www.fmz.com), Anda dapat menggunakan berbagai fungsi platform. Situs web FMZ adalah akhir manajemen dari seluruh sistem, dan program yang ditulis pengguna berjalan di docker sebenarnya. Program perangkat lunak docker dapat digunakan di berbagai perangkat, seperti server, komputer, dll. Ketika pengguna menulis program dan membuat instance yang berjalan di situs web FMZ, platform FMZ akan berkomunikasi dengan docker dan memulai instance program di atasnya.

2. Docker

Jika Anda ingin menjalankan contoh program, Anda harus menyebarkan docker. Penyebaran docker juga sangat sederhana, dan ada tutorial penyebaran di platform. Anda juga dapat menggunakan One-click Deployment yang disediakan oleh FMZ untuk menyebarkan secara otomatis di server yang disewa atas nama FMZ.

  • Mengerahkan docker pada perangkat pribadi

Anda dapat menyebarkan dan menjalankan program docker pada server, komputer pribadi dan perangkat lainnya, selama jaringan normal (perlu dapat mengakses target yang sesuai, seperti antarmuka pertukaran tertentu, alamat node, dll.).

  1. Masuk atau buka perangkat di mana program docker akan digunakan, sepertimasuk ke serverataumenyalakan komputer untuk masuk ke sistem operasi.
  2. Unduh versi yang sesuai dari program docker (tergantung pada sistem operasi perangkat), halaman unduhan:https://www.fmz.com/m/add-node

img

  1. Apa yang Anda unduh adalah paket terkompresi, perlu untuk dekompresi.
  2. Jalankan program docker, program docker adalah file eksekusi yang disebutrobot. Mengkonfigurasi alamat komunikasi docker, yang unik untuk setiap akun FMZ, setelah masuk ke FMZ, Anda dapat melihat alamat Anda sendiri dihttps://www.fmz.com/m/add-nodehalaman (yaitu,./robot -s node.fmz.com/xxxxxstring alamat ini, di mana konten dixxxxxposisi berbeda untuk setiap akun FMZ). Akhirnya, Anda perlu memasukkan kata sandi akun FMZ Anda. Setelah mengkonfigurasi pengaturan ini, jalankan program docker.
  • Gunakan fungsi One-Click Deployment dari platform FMZ

    Tambahkan halaman docker di platform FMZ, alamat:https://www.fmz.com/m/add-node

    img

3. Alat Debugging

FMZ Quant Trading Platform menyediakan alat debugging gratis yang mendukungJavaScript, TypeScript, dan halamannya adalah:https://www.fmz.com/m/debug. Karena membuat instansi untuk dijalankan ditagih. Selama periode pembelajaran awal, Anda dapat menggunakan alat debugging ini untuk pengujian dan pembelajaran. Kecuali batas waktu berjalan maksimum 3 menit, tidak ada perbedaan antara menggunakan alat debugging dan membuat instance untuk dijalankan.

Saat menggunakanTypeScriptbahasa, Anda perlu menulis// @ts-checkpada baris pertama kode untuk beralih keTypeScriptmode; jika tidak beralih, default adalahJavaScript language.

4. Platform

Pada FMZ, Platform adalah konsep umum. Untuk bursa CEX, ini mengacu pada konfigurasi akun pertukaran tertentu. Untuk web3, pertukaran ini mengacu pada informasi konfigurasi yang mencakup alamat node dan konfigurasi kunci pribadi.

Dalam keadaan log-in dari platform FMZ, dihttps://www.fmz.com/m/add-platformhalaman, Anda dapat mengkonfigurasi informasi pertukaran, di mana pertukaran adalah konsep umum.

img

PilihWeb3, mengkonfigurasi alamat node RPC, mengkonfigurasi kunci pribadi, Anda dapat mengklik sudut kanan bawah Informasi sensitif akan disimpan terenkripsi untuk melihat mekanisme keamanan.

Node dapat menjadi node yang dibuat sendiri atau node yang disediakan oleh penyedia layanan node.Infura. Setelah pendaftaran, Anda dapat melihat alamat node akun Anda sendiri. Baik mainnet dan testnet tersedia, yang cukup nyaman.Rpc Addresslabel dapat dinamai sendiri untuk membedakan antara objek pertukaran yang dikonfigurasi.

img

Dalam gambar,https://mainnet.infura.io/v3/xxxxxxxxxxxxxadalah alamat node RPC infura ETH utama pribadi.


Berinteraksi dengan Ethereum dengan menggunakan FMZ

Setelah menyebarkan program docker dan mengkonfigurasi objek pertukaran, Anda dapat menggunakanFMZ.COMs Debugging Tool untuk pengujian. Panggil metode Ethereum RPC dan berinteraksi dengan Ethereum, selain beberapa metode RPC yang tercantum dan diperkenalkan dalam bab ini, metode RPC lainnya dapat ditemukan dengan konsultasi materi, sepertihttps://www.quicknode.com/docs.

Untuk berbagai bahasa dan alat, ada cara untuk mengakses web3, seperti yang ditunjukkan pada gambar:

img

Pada FMZ, panggilan metode RPC juga dikemas, dan fungsi ini dikemas dalam fungsi FMZ APIexchange.IOMetode panggilan adalahexchange.IO("api", "eth", ...). Parameter pertama ditetapkan untuk"api", parameter kedua ditetapkan untuk"eth", dan parameter lainnya tergantung pada metode RPC tertentu yang dipanggil.

Untuk informasi output, kita akan menggunakanLogfungsi dari platform FMZ.Logfungsi dapat menerima beberapa parameter dan kemudian output mereka di area log dari Debug Tool atau Bot halaman di platform FMZ. Debug Tool halaman akan menjadi alat pengujian utama kami.

Eth_getBalance

Peraturaneth_getBalancemetode Ethereum digunakan untuk menanyakan saldo ETH dari alamat di Ethereum, dan metode ini membutuhkan dua parameter.

  • Alamat yang harus ditanyakan.
  • Label, kita biasanya menggunakan latest. Mari kita periksa pendiri EthereumVitalik Buterinalamat dompet ETH, alamat yang diketahui adalah:0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045.
function main() {
    let ethBalance = exchange.IO("api", "eth", "eth_getBalance", "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045", "latest")
    Log("ethBalance:", ethBalance)
}

Sudah menyebarkan docker (dalam gambar: linux/amd64...) dan mengkonfigurasi objek pertukaran (dalam gambar: Web3 tes), menguji kode dalam alat debugging:

img

Klik tombol Execute untuk menjalankan kode dan menampilkan hasilnya:

EthBalance: 0x117296558f185bbc4c6

Peraturanlogfungsi mencetak keluarethBalancenilai variabel sebagai:0x117296558f185bbc4c6, yang merupakan jenis string.nilai heksadesimal saldo ETHdalamweiunit, dengan1e18 weisama dengan 1ETHOleh karena itu, perlu dikonversi menjadi saldo ETH desimal yang dapat dibaca.

MengkonversiethBalanceke dalam data yang dapat dibaca:

function main() {
    let ethBalance = exchange.IO("api", "eth", "eth_getBalance", "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045", "latest")
    Log("ethBalance:", ethBalance)
    
    // Converting ethBalance into readable data
    let vitalikEthBalance = parseInt(ethBalance.substring(2), 16) / 1e18
    Log("vitalikEthBalance:", vitalikEthBalance)
}

Cari terushttps://etherscan.io/:

img

Namun, karena masalah presisi bahasa itu sendiri, akan ada penyimpangan dalam cara pemrosesan ini.

  • BigInt: Mengkonversi string hexadecimal ke objek BigInt.
  • BigDecimal: Mengkonversi objek tipe numerik ke objek BigDecimal yang dapat dihitung.

Sesuaikan kode lagi:

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

    // The precision unit of ETH is 1e18
    let ethDecimal = 18
    Log("vitalikEthBalance:", Number((BigDecimal(BigInt(ethBalance)) / BigDecimal(Math.pow(10, ethDecimal))).toString()))
}

vitalikEthBalanse: 5149.6244846875215

Eth_chainId

eth_chainIddannet_versionKedua fungsi ini mengembalikan Id dari blockchain yang node RPC saat ini terhubung ke, dengan perbedaan adalah bahwanet_versionMengembalikan angka desimal Id daneth_chainIdMengembalikan ID heksadesimal.

Nama jaringan yang sesuai dengan chainId

1 - ethereum mainnet
2 - morden testnet (deprecated)
3 - ropsten testnet
4 - rinkeby testnet
5 - goerli testnet
11155111 - sepolia testnet
10 - optimism mainnet
69 - optimism kovan testnet
42 - kovan testnet
137 - matic/polygon mainnet
80001 - matic/polygon mumbai testnet
250 - fantom mainnet
100 - xdai mainnet
56 - bsc mainnet

Uji dengan testnet Ethereum yang dikonfigurasigoerlisimpul:

function main() {
    let netVersionId = exchange.IO("api", "eth", "net_version")
    let ethChainId = exchange.IO("api", "eth", "eth_chainId")

    Log("netVersionId:", netVersionId)
    Log("ethChainId:", ethChainId, " , conversion:", parseInt(ethChainId.substring(2), 16))
}

Eth_gasPrice

Panggileth_gasPricemetode untuk menanyakan arusgas pricedi rantai.

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

Di sini kita menulis fungsi untuk mengkonversi string heksadesimal menjadi nilai numerik yang dapat dibaca:toAmountSelain itu, perhatikan bahwa unitgasPriceadalahwei, jadi lulus nilai 0 ke parameter riil yang sesuai dengan parameter formaldecimals.

Eth_blockNumber

"eth_blockNumberdigunakan 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 alat debugging:

img

Cari terushttps://etherscan.io/:

img

eth_getBlockByNumber

Informasi blok kueri.

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)
    
    // Due to the excessive content of Log output, it will be truncated automatically, so traverse each field of the returned block information and print them one by one
    for (let key in blockMsg) {
        Log("key:", key, ", val:", blockMsg[key])
    }
}

Melakukan di Debugging Tool dapat memperoleh informasi berikut:

img

Baca informasi kontrak

Banyak aplikasi kontrak pintar berjalan di Ethereum, danENSadalah salah satunya.ENS, atau Ethereum Name Service, adalah layanan resolusi nama domain terdesentralisasi berdasarkan blockchain Ethereum. Apakah Anda ingat contoh di tutorial di mana kita memeriksa saldo dompet pendiri Ethereum Vitalik Buterin?0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045. Jadi bagaimana kita tahu alamatnya? Bahkan, itu dapat ditanyakan melaluiENSkontrak pintar menggunakan nama intuitifvitalik.eth.

Konten berikut dalam bab ini menggunakan lingkungan Ethereum mainnet, menurutENSdokumentasi,Hashing Namesdiperlukan untuk menanyakan nama domain Ethereum. Gunakan kode berikut untuk memprosesvitalik.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))
    }
}

Dalam contoh kode di atas, kita melihat fungsi lain yang tidak dikenalEncode. Fungsi ini adalah fungsi API dari platform FMZ dan secara khusus digunakan untuk mengkodekan operasi pada platform FMZ. Fungsi ini mendukung beberapa metode pengkodean dan berbagai algoritma hash.

Encode(algo, inputFormat, outputFormat, data, keyFormat, key string)

Sesuai dengan deskripsi dalam dokumen ENS, gunakansha3.keccak256algoritma untuk memproses data.

PanggilnameHashfungsi, misalnya:Log(nameHash("vitalik.eth")), Anda bisa mendapatkan:ee6c4522aab0003e8d14cd40a6af439055fd2577951148c14b6cea9a53475835, dan Anda perlu menambahkan 0x awalan.0xee6c4522aab0003e8d14cd40a6af439055fd2577951148c14b6cea9a53475835digunakan sebagai parameter dariresolvermetode dalam kontrak cerdas ENS.

let ensNode = "0x" + nameHash("vitalik.eth")    // Prepare the parameters ensNode for calling the resolver method

Menurut dokumentasi ENS, alamat kontrak untuk aplikasi kontrak cerdas ENS adalah:0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e. Sebelum memanggilresolvermetode kontrak pintar, kita juga perlu mempersiapkanABIdari kontrak.

Daftarkan ABI

Setelah mengetahui hal ini, Anda mungkin bertanya:ABIdari kontrak pintar?

ABI, or Application Binary Interface, is the interface standard for smart contracts to communicate with the external world.
The ABI of a smart contract defines the contract's function interfaces, parameter types, return values, and other information, as well as specifications for calling the contract and passing parameters.

The ABI of a smart contract is usually stored in JSON format and contains the following information:

Contract function interfaces: function names, parameter lists, return values, etc.
Function parameter types: such as uint256, bool, string etc.
Encoding methods for input and output parameters of functions: Smart contracts use an encoding method called Solidity ABI to encode input and output parameters of functions so that they can interact with Ethereum network.
In Ethereum network ,the ABI of a smart contract is used to call its functions. When you need to call a contract function, you need to provide the name of the function, its parameters, and bytecode encoded according to ABI encoding method.
Ethereum nodes will package this information into transactions and send them out on Ethereum network for execution.

In Solidity language,the keyword 'interface' can be used define ABIs for smart contracts. Ethereum development tools like Remix IDE ,Truffle also provide editing & generation tools making it easier developers create & use ABIs.

EkstrakresolverAnda dapat menggunakan ABI lengkap. Anda dapat menanyakan ABI kontrak dihttps://etherscan.io/atau mendapatkan ABI melalui saluran lain (misalnya, dokumentasi proyek yang relevan).

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

Di sini kita akan belajar metode panggilan baru pada platform FMZ,exchange.IO("abi", address, abiContent), yang digunakan untuk mendaftarkan ABI.addressparameter adalah alamat kontrak pintar danabiContentParameter adalah kontrak cerdas yang sesuai ABI (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 is the address of the ENS smart contract deployed on the Ethereum mainnet

Metode untuk memanggil kontrak pintar

Selanjutnya, Anda dapat memanggilresolvermetode kontrak pintar ENS, yang mengembalikan alamatENS: Public Resolver contract.

img

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

GunakanENS: Public ResolverkontrakaddrCara untuk mendapatkan alamat dompet Vitalik Buterin.ENS: Public Resolverinformasi ABI untuk kontrak pintar ini masih dapat diperoleh darihttps://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

Akhirnya, hubungiENS: Public Resolverkontrakaddrmetode, dengan parameter masih menjadiensNode.

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

Output fungsi log:

vitalikAddress: 0xd8da6bf26964af9d7eed9e03e53415d37aa96045

Panggil Kode Lengkap 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() {
    // Calculate the name
    let ensNode = "0x" + nameHash("vitalik.eth")    

    // Register ENS contract
    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)
    
    // Register ENS Public Resolver contract
    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)
}

Kirim ETH

Dalam bab kursus sebelumnya, kita telah belajar bagaimana untuk mengkonfigurasi kunci pribadi. Bagaimana kita tahu alamat dompet yang sesuai dengan kunci pribadi ini untuk objek pertukaran yang dikonfigurasi?exchange.IO("address")fungsi untuk mendapatkan alamat dompet yang sesuai dengan kunci pribadi yang dikonfigurasi.

Konten berikut dalam bab ini menggunakan lingkungan Goerli testnet, jadi node yang saya gunakan adalah:https://goerli.infura.io/v3/*******, dan Infura menetapkan alamat node yang berbeda untuk setiap pengguna terdaftar.*******menyembunyikan konten tertentu.

function main() {
    let walletAddress = exchange.IO("address")
    Log("Testnet goerli wallet address:", walletAddress)
}

Setelah mengetahui alamat dompet Anda, Anda dapat menggunakan metode RPC Ethereumeth_getTransactionCountuntuk menanyakan jumlah transaksi dari alamat dompet. di Ethereum, jumlah ini sangat umum, dan itu sebenarnyanoncenonce adalah nomor unik yang digunakan untuk memastikan bahwa setiap transaksi adalah unik. ini adalah angka yang meningkat, dan akan meningkat secara otomatis setiap kali transaksi baru dikirim. oleh karena itu, ketika Anda mengirim transaksi ke kontrak pintar, Anda perlu memberikan nonce untuk memastikan bahwa transaksi itu unik dan dalam urutan yang benar. kita dapat menemukan informasi ini dalam beberapa bahan dan dokumen:

https://goethereumbook.org/en/

img

Di sini,PendingNonceAtfungsi di perpustakaan Ethereum dari bahasa Go sebenarnya memanggileth_getTransactionCountmetode. Pada kursus sebelumnya, kita juga telah belajar bagaimana untuk memanggil metode RPC.exchange.IO("api", "eth", ...)berfungsi lagi.

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

function main() {
    let walletAddress = exchange.IO("address")
    Log("Testnet goerli wallet address:", 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: string = exchange.IO("api", "eth", "eth_getTransactionCount", walletAddress, "pending")
    Log("wallet address:", walletAddress, "current nonceļ¼š", nonce, ", convert to decimal:", toAmount(nonce, 0))
}

Sebelum menjelaskan operasi transfer, mari kita pahami beberapa konsep secara singkat. Saat mentransfer di Ethereum, sejumlah token ETH akan dikonsumsi (sebagai biaya gas). Biaya gas ditentukan oleh dua parameter:

  • Gas Harga

    Namun, biaya gas di jaringan Ethereum selalu berfluktuasi sesuai dengan permintaan pasar dan biaya yang pengguna bersedia membayar, sehingga menulis biaya gas tetap dalam kode kadang-kadang bukan pilihan yang ideal.eth_gasPricemetode yang kita pelajari sebelumnya, yang dapat mendapatkan harga bensin rata-rata.

  • gasLimit

    Transfer Ether standar memiliki batas gas 21.000 unit.

Setelah memahami konsepnonce, gasPrice, dangasLimitFMZ menyediakan fungsi transfer yang sangat sederhana dan mudah digunakan.

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

Ketika digunakan untuk transfer, parameter ketiga dariexchange.IOditetapkan sebagai mengirim,toAddressparameter adalah alamat yang menerima ETH selama transfer, dantoAmountadalah jumlah ETH yang ditransfer.

Parameternonce, gasPrice, dangasLimitsemua dapat menggunakan nilai default sistem yang diperoleh secara otomatis di FMZ. Mereka juga dapat ditentukan:

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

Selanjutnya, kita akan mentransfer sejumlah ETH ke alamat tertentu di jaringan uji coba Goerli:

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

function main() {
    let walletAddress = exchange.IO("address")
    Log("Testnet goerli wallet address:", walletAddress)

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

Karena unit dari jumlah transfer Ethereum adalahwei, fungsi khusustoInnerAmountperlu digunakan untuk memproses nilai dalamwei units.

Hash Transaksi Kueri:0xa6f9f51b00d8ae850b0f204380b59da98f4bbce34b813577d3d948f61de4734epadahttps://etherscan.io/.

img

Anda juga dapat menulis kode untuk query transfer hash0xa6f9f51b00d8ae850b0f204380b59da98f4bbce34b813577d3d948f61de4734e, menggunakaneth_getTransactionReceiptmetode untuk pertanyaan.

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 yang sesuai dengan setiap bidang:

blockHash - The hash value of the block where the transaction is located.
blockNumber - The block number of the block where the transaction is located, encoded in hexadecimal.
contractAddress - If it's a contract creation, the address of the contract; otherwise null.
cumulativeGasUsed - The total gas used when executing this transaction in the block.
effectiveGasPrice - Total base fee plus tip per unit of gas.
from - Sender's address.
gasUsed - Gas used by this specific transaction.
logs - Array of log objects generated by this transaction.
  address - Address that generated this log.
  topics - Data array with 0 to 4 indexed log parameters, each with 32 bytes. In Solidity, first topic is event signature hash (e.g., Deposit(address,bytes32,uint256)), unless you declare an event using anonymous specifier.
  data - Non-indexed parameters for logs with length of 32 bytes.
  blockNumber - The block number of the block where this log is located.
  transactionHash - Transaction hash at time when log was created. Null if pending state.
  transactionIndex - Index position during creation. Null if pending state.
  blockHash - The hash value for containing block.
  logIndex - Hexadecimal-encoded integer index position within containing block. Null if pending state.
  removed - True if deleted due to chain reorganization; false for valid logs.
logsBloom - Bloom filter for retrieving related logs.
status - Hexadecimal-encoded value either being '1' (success) or '0' (failure).
to - Receiving party's address; null for contract creation transactions.
transactionHash - The hash value associated with given transaction.
transactionIndex - Hexadecimal-encoded index position within its respective containing-block.
type - Type value.

Panggilan Ethereum Smart Contract

Dalam bab tentang Membaca Informasi Kontrak, kami menggunakan contoh lengkap untuk memanggil metode kontrak ENS yang digunakan di Ethereum untuk mendapatkan alamat dompet Vitalik Buterin.Readmetode, dan memanggil metode ini tidak memerlukangas(ingat apa yang kita bicarakan tentang gas sebelumnya?).Writemetode kontrak pintar di Ethereum dan membayar untukgasOperasi ini akan diverifikasi oleh setiap node dan penambang di seluruh jaringan dan mengubah keadaan blockchain.

ERC20

Untuk kontrak ERC20 (kontrak token ERC20), platform FMZ mencantumkan ABI dari kontrak ERC20 ABI sebagai ABI umum yang dibangun langsung ke dalam sistem, menghilangkan langkah pendaftaran ABI.

Untuk lebih memahami ABI, Anda dapat memeriksanya sebelum menggunakannya.

[{"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":"tran

Berkaitan

Lebih banyak