Gunakan FMZ untuk memulakan pembangunan web3 berasaskan Ethereum dengan mudah

Dicipta dalam: 2023-03-28 13:32:48, dikemas kini pada: 2024-11-11 22:28:24
comments   0
hits   2675

[TOC]

Gunakan FMZ untuk memulakan pembangunan web3 berasaskan Ethereum dengan mudah

Tutorial EtherEaseWithFMZ

Gunakan FMZ untuk memulakan pembangunan web3 berasaskan Ethereum dengan mudah

Ethereum ialah platform kontrak pintar berdasarkan teknologi blockchain, yang menyediakan cara terdesentralisasi untuk menulis dan menggunakan kontrak pintar. Kontrak pintar ialah program komputer khas yang boleh dilaksanakan secara automatik pada blockchain dan boleh melaksanakan pelbagai logik perniagaan tanpa perlu mempercayai pihak ketiga.

Platform Dagangan Kuantitatif Inventor (FMZ.COM) menyediakan API yang mudah digunakan yang memudahkan pembangun berinteraksi dengan blockchain Ethereum dan ekosistemnya. Realisasikan fungsi seperti akses kepada pertukaran terdesentralisasi (DEX), mendapatkan data dalam rantaian dan menghantar transaksi.

Contoh dalam tutorial ini menggunakanJavaScriptPenulisan bahasa, penggunaan persekitaran ujianEthereum MainnetGoerli Testnet. Anda juga boleh melihat antara muka API yang digunakan dalam tutorial serta penerangan dan contoh kod yang berkaitan dalam dokumentasi API platform FMZ.


Bermula dengan FMZ

Sebelum belajar menggunakan platform dagangan kuantitatif FMZ, kita perlu membiasakan diri dengan beberapa konsep asas:

1. Seni bina platform dagangan kuantitatif FMZ

Selepas mendaftar dan log masuk ke laman web rasmi platform dagangan kuantitatif FMZ (https://www.fmz.com), anda boleh menggunakan pelbagai fungsi platform. Laman web FMZ ialah penghujung pengurusan keseluruhan sistem, dan program yang ditulis oleh pengguna sebenarnya dijalankan pada hos. Hos ialah program perisian yang boleh digunakan pada pelbagai peranti, seperti pelayan, komputer, dsb. Apabila pengguna menulis program dan mencipta contoh berjalan di tapak web FMZ, platform FMZ akan berkomunikasi dengan hos dan memulakan contoh program pada hos.

Gunakan FMZ untuk memulakan pembangunan web3 berasaskan Ethereum dengan mudah

2. Hos

Jika anda ingin menjalankan contoh program, anda mesti menggunakan hos Penggunaan hos juga sangat mudah, dan terdapat tutorial penggunaan pada platform. Anda juga boleh menggunakan “hos penggunaan satu klik” yang disediakan di FMZ untuk menggunakan pelayan secara automatik yang disewa oleh FMZ.

  • Gunakan hos pada peranti peribadi

Program penjaga boleh digunakan dan dijalankan pada pelayan, komputer peribadi dan peranti lain, selagi rangkaian itu normal (sasaran yang sepadan perlu boleh diakses, seperti antara muka pertukaran, alamat nod, dll.). Langkah-langkah utama penempatan ialah:

  1. Log masuk atau buka peranti di mana anda ingin menggunakan program hos, sepertiLog masuk ke pelayanatauHidupkan komputer dan masukkan sistem pengendalian
  2. Muat turun versi program hos yang sepadan (bergantung pada sistem pengendalian peranti), halaman muat turun: https://www.fmz.com/m/add-node Gunakan FMZ untuk memulakan pembangunan web3 berasaskan Ethereum dengan mudah
  3. Fail yang dimuat turun ialah pakej termampat, yang perlu dinyahmampat.
  4. Jalankan program tuan rumah Program tuan rumah ialah program yang dipanggilrobotfail boleh laku. Konfigurasikan alamat komunikasi penjaga ini adalah unik untuk setiap akaun FMZ Selepas log masuk ke FMZ.https://www.fmz.com/m/add-nodeHalaman itu boleh melihat alamatnya sendiri (mis../robot -s node.fmz.com/xxxxxRentetan alamat ini, di sinixxxxxKandungan lokasi dipaparkan secara berbeza untuk setiap akaun FMZ). Akhir sekali, anda perlu memasukkan kata laluan akaun FMZ Selepas mengkonfigurasinya, jalankan program hos.
  • Gunakan fungsi “pengerahan satu klik penjaga” platform FMZ

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

Gunakan FMZ untuk memulakan pembangunan web3 berasaskan Ethereum dengan mudah

3. Alat Penyahpepijatan

Platform dagangan kuantitatif FMZ menyediakan alat penyahpepijatan percuma yang menyokongJavaScriptTypeScriptHalaman tersebut ialah: https://www.fmz.com/m/debug, kerana membuat tika dan menjalankannya dibilkan. Alat penyahpepijatan ini boleh digunakan untuk ujian dan pembelajaran semasa tempoh pembelajaran awal. Alat penyahpepijatan tidak berbeza daripada mencipta contoh, kecuali masa berjalan adalah terhad kepada 3 minit.

gunaTypeScriptApabila menggunakan bahasa, anda perlu menulisnya dalam baris pertama kod// @ts-checkUntuk bertukar kepadaTypeScriptMod, jika tidak ditukar, lalainya ialahJavaScriptbahasa.

4. Pertukaran

Di FMZ, “pertukaran” ialah konsep umum Untuk pertukaran CEX, ia merujuk kepada konfigurasi akaun pertukaran tertentu. Untuk web3, pertukaran ini merujuk kepada maklumat konfigurasi, termasuk alamat nod dan konfigurasi kunci peribadi.

Apabila log masuk ke platform FMZ,https://www.fmz.com/m/add-platformHalaman, anda boleh mengkonfigurasi maklumat pertukaran, di mana pertukaran adalah konsep umum.

Gunakan FMZ untuk memulakan pembangunan web3 berasaskan Ethereum dengan mudah

pilihWeb3, konfigurasikan alamat nod RPC dan kunci peribadi Anda boleh mengklik “Maklumat sensitif disulitkan dan disimpan menggunakan kunci peribadi bebas” di sudut kanan bawah untuk melihat mekanisme keselamatan.

Nod boleh dibina sendiri atau disediakan oleh pembekal perkhidmatan nod. Terdapat banyak penyedia perkhidmatan nod, seperti:Infura. Selepas pendaftaran, anda boleh melihat alamat nod akaun anda. Terdapat kedua-dua mainnet dan testnet, yang lebih mudah Konfigurasikan alamat nod ini dalam rajah di atas.Rpc Addressdalam kawalan. Tag boleh dinamakan sendiri untuk membezakan objek pertukaran yang dikonfigurasikan.

Gunakan FMZ untuk memulakan pembangunan web3 berasaskan Ethereum dengan mudah

Dalam rajahhttps://mainnet.infura.io/v3/xxxxxxxxxxxxxIa ialah alamat nod RPC utama Infura ETH peribadi.


Menggunakan FMZ untuk berinteraksi dengan Ethereum

Selepas menggunakan program penjaga dan mengkonfigurasi objek pertukaran, anda boleh menggunakan “alat nyahpepijat” FMZ.COM untuk ujian. Panggil kaedah RPC Ethereum untuk berinteraksi dengan Ethereum Sebagai tambahan kepada beberapa kaedah RPC yang disenaraikan dalam bab ini, anda boleh merujuk kepada dokumentasi untuk kaedah RPC lain, seperti.https://www.quicknode.com/docs

Mari kita ambil beberapa contoh mudah dan mulakan dari asas. Terdapat cara untuk mengakses web3 untuk pelbagai bahasa dan alatan, seperti yang ditunjukkan dalam rajah:

Gunakan FMZ untuk memulakan pembangunan web3 berasaskan Ethereum dengan mudah

Panggilan kaedah RPC juga dikapsulkan pada FMZ Fungsi ini terkandung dalam fungsi API FMZexchange.IOtengah. Kaedah panggilan ialahexchange.IO("api", "eth", ...). Parameter pertama ditetapkan."api", parameter kedua ditetapkan"eth", parameter lain bergantung pada kaedah RPC khusus yang dipanggil.

Untuk mengeluarkan maklumat, kami menggunakan platform FMZLogfungsi,LogFungsi ini boleh lulus dalam berbilang parameter dan kemudian mengeluarkannya dalam kawasan log halaman “Alat Nyahpepijat” atau “Perdagangan Sebenar” pada platform FMZ Halaman “Alat Nyahpepijat” akan menjadi alat utama untuk ujian kami.

eth_getBalance

Ethereumeth_getBalanceKaedah ini digunakan untuk menanya baki ETH alamat pada Ethereum Kaedah ini memerlukan dua parameter untuk dihantar.

  • Alamat yang ingin ditanya.
  • Tag, biasanya “terbaru”.

Mari kita semak pengasas EthereumV神Alamat dompet ETH, alamat yang diketahui ialah:0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045

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

Penjaga telah digunakan (dalam rajah: linux/amd64 …) dan objek pertukaran telah dikonfigurasikan (dalam rajah: Ujian Web3 Uji kod dalam alat penyahpepijatan:

Gunakan FMZ untuk memulakan pembangunan web3 berasaskan Ethereum dengan mudah

Klik butang “Laksanakan” untuk menjalankan kod ini dan memaparkan hasilnya:

ethBalance: 0x117296558f185bbc4c6

LogFungsi mencetakethBalanceNilai pembolehubah adalah:0x117296558f185bbc4c6, yang merupakan jenis rentetan. yaImbangan ETH dalam nilai perenambelasan,olehweiSebagai satu unit,1e18 weiialah 1ETH. Oleh itu, ia perlu ditukar kepada baki ETH perpuluhan yang boleh dibaca.

akanethBalanceTukar kepada data yang boleh dibaca:

function main() {
    let ethBalance = exchange.IO("api", "eth", "eth_getBalance", "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045", "latest")
    Log("ethBalance:", ethBalance)
    
    // 将ethBalance转换为可读的数据
    let vitalikEthBalance = parseInt(ethBalance.substring(2), 16) / 1e18
    Log("vitalikEthBalance:", vitalikEthBalance)
}

Gunakan FMZ untuk memulakan pembangunan web3 berasaskan Ethereum dengan mudah

Di atashttps://etherscan.io/Pertanyaan:

Gunakan FMZ untuk memulakan pembangunan web3 berasaskan Ethereum dengan mudah

Walau bagaimanapun, pemprosesan ini akan mempunyai penyelewengan disebabkan oleh ketepatan bahasa itu sendiri, jadi platform FMZ mempunyai dua fungsi terbina dalam untuk memproses data:

  • BigInt: Tukar rentetan perenambelasan kepada objek BigInt.
  • BigDecimal: Tukar objek jenis angka kepada objek BigDecimal yang boleh dikendalikan.

Laraskan kod sekali lagi:

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

    // ETH的精度单位为1e18
    let ethDecimal = 18
    Log("vitalikEthBalance:", Number((BigDecimal(BigInt(ethBalance)) / BigDecimal(Math.pow(10, ethDecimal))).toString()))
}

vitalikEthBalance: 5149.6244846875215

eth_chainId

eth_chainIddannet_versionKegunaannya adalah serupa, jadi kami mengujinya bersama-sama. Kedua-dua fungsi mengembalikan ID blok yang disambungkan ke nod RPC semasanet_versionMengembalikan id perpuluhan.eth_chainIdMengembalikan ID perenambelasan.

Nama rangkaian yang sepadan dengan ID rantaian

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

Gunakan FMZ untuk memulakan pembangunan web3 berasaskan Ethereum dengan mudah

Gunakan rangkaian ujian Ethereum yang dikonfigurasikangoerliUjian nod:

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

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

Gunakan FMZ untuk memulakan pembangunan web3 berasaskan Ethereum dengan mudah

eth_gasPrice

Panggileth_gasPriceKaedah untuk menanyakan rantaian semasagas price

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

function main() {
    let gasPrice = exchange.IO("api", "eth", "eth_gasPrice")
    Log("gasPrice:", gasPrice, " ,转换:", toAmount(gasPrice, 0))
}

Di sini kita menulis fungsi untuk menukar rentetan heksadesimal kepada nilai yang boleh dibaca:toAmount. Satu lagi perkara yang perlu diberi perhatian ialah unit gasPrice ialahwei, jadi parameterdecimalsParameter sebenar yang sepadan boleh diluluskan sebagai 0.

eth_blockNumbe

eth_blockNumbeDigunakan untuk menanyakan ketinggian blok.

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

function main() {
    let blockNumber = exchange.IO("api", "eth", "eth_blockNumber")
    Log(toAmount(blockNumber, 0))
}

Jalankan dalam penyahpepijat:

Gunakan FMZ untuk memulakan pembangunan web3 berasaskan Ethereum dengan mudah

https://etherscan.io/atas pertanyaan:

Gunakan FMZ untuk memulakan pembangunan web3 berasaskan Ethereum dengan mudah

eth_getBlockByNumber

Maklumat blok pertanyaan.

function main() {
    let blockNumber = exchange.IO("api", "eth", "eth_blockNumber")    
    Log(blockNumber)
    let blockMsg = exchange.IO("api", "eth", "eth_getBlockByNumber", blockNumber, true)
    Log(typeof(blockMsg), blockMsg)
    
    // 由于Log输出的内容过多,会自动截断,所以遍历返回的区块信息各个字段,逐个打印
    for (let key in blockMsg) {
        Log("key:", key, ", val:", blockMsg[key])
    }
}

Maklumat berikut boleh diperolehi dengan melaksanakan dalam “Alat Nyahpepijat”:

Gunakan FMZ untuk memulakan pembangunan web3 berasaskan Ethereum dengan mudah


Baca maklumat kontrak

Terdapat sejumlah besar aplikasi kontrak pintar yang dijalankan di Ethereum.ENSadalah salah satu daripadanya.ENS, iaitu Perkhidmatan Nama Ethereum, adalah perkhidmatan resolusi nama domain terdesentralisasi berdasarkan blockchain Ethereum. Ingat contoh dalam tutorial di mana kami menanyakan baki dompet pengasas Ethereum Vitalik Buterin? Salah satu alamat dompet Vitalik ialah:0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045. Jadi bagaimana kita tahu alamat ini? Malah, melaluiENSKontrak pintar, menggunakan nama intuitifvitalik.eth(vitalik ialah nama Vitalik) untuk menjalankan pertanyaan.

Kandungan berikut dalam bab ini menggunakan persekitaran rangkaian utama Ethereum.ENSDokumen itu menunjukkan bahawa nama domain Ethereum yang ingin ditanya perluHashing Names, gunakan kod berikut untukvitalik.ethNama sedang diproses.

function nameHash(name) {
    if (name == "") {
        return "0000000000000000000000000000000000000000000000000000000000000000"
    } else {
        let arr = name.split(".")
        let label = arr[0]
        
        arr.shift()
        let remainder = arr.join(".")
        return Encode("sha3.keccak256", "hex", "hex", nameHash(remainder) + Encode("sha3.keccak256", "raw", "hex", label))
    }
}

Dalam contoh kod di atas, kita melihat satu lagi fungsi yang tidak dikenaliEncodeFungsi ini ialah fungsi API platform FMZ, yang digunakan secara khusus untuk melaksanakan operasi pengekodan pada platform FMZ Fungsi ini menyokong berbilang kaedah pengekodan dan berbilang algoritma cincang.

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

Menurut dokumentasi ENS, gunakansha3.keccak256Algoritma memproses data.

PanggilnameHashFungsi, contohnya:Log(nameHash("vitalik.eth")), kita boleh dapat:ee6c4522aab0003e8d14cd40a6af439055fd2577951148c14b6cea9a53475835, anda perlu menambah awalan “0x”.0xee6c4522aab0003e8d14cd40a6af439055fd2577951148c14b6cea9a53475835Sebagai kontrak pintar ENSresolverParameter kaedah.

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

Menurut dokumen ENS, alamat kontrak permohonan kontrak pintar ENS ialah:0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e. Dalam memanggil kontrak pintarresolverSebelum kita meneruskan, kita perlu menyediakan kontrakABI

Daftar ABI

Selepas belajar ini, saya tidak boleh tidak bertanya, apakah kontrak pintar?ABIKain bulu?

ABI,即应用程序二进制接口(Application Binary Interface),是智能合约与外部世界进行通信的接口标准。
智能合约的 ABI 定义了合约的函数接口、参数类型、返回值等信息,以及调用合约的方式和参数传递方式等规范。

智能合约的 ABI 通常以 JSON 格式存储,包含以下信息:

合约的函数接口:函数名、参数列表、返回值等信息。
函数参数类型:如 uint256、bool、string 等。
函数的输入参数和输出参数的编码方式:智能合约使用一种称为 Solidity ABI 的编码方式来编码函数的输入参数和输出参数,
以便与以太坊网络进行交互。
在以太坊网络中,使用智能合约的 ABI 来调用合约的函数。当需要调用合约函数时,需要提供函数名和函数参数,以及将函数参数按照 ABI 编码方式编码后的字节码。
以太坊节点会将这些信息打包成一笔交易,并将交易发送到以太坊网络中执行。

智能合约的 ABI 在 Solidity 语言中可以通过 interface 关键字来定义。以太坊开发工具如 Remix IDE、Truffle 等也提供了 ABI 编辑和生成工具,
使得开发者可以方便地创建和使用智能合约的 ABI。

Ekstrak yang berikut daripada ENS ABI:resolverABI penuh juga boleh digunakan dalamhttps://etherscan.io/Anda boleh menanyakan ABI kontrak di GitHub, atau mendapatkan ABI melalui cara lain (contohnya, dokumen projek yang berkaitan).

Gunakan FMZ untuk memulakan pembangunan web3 berasaskan Ethereum dengan mudah

let abiENS_resolver = `[{"constant":true,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"resolver","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"}]`

Di sini kita perlu mempelajari kaedah panggilan baharu pada platform FMZ.exchange.IO("abi", address, abiContent), gunakan kaedah ini untuk mendaftar ABI,addressParameter ialah alamat kontrak pintar.abiContentParameter ialah kontrak pintar ABI (rentetan) yang sepadan.

let abiENS_resolver = `[{"constant":true,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"resolver","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"}]`
exchange.IO("abi", "0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e", abiENS_resolver)  // 0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e 是在以太坊主网上部署的ENS智能合约的地址

Memanggil kaedah kontrak pintar

Seterusnya, anda boleh menghubungi kontrak pintar ENSresolverkaedah, yang kembaliENS: Public ResolverAlamat kontrak.

Gunakan FMZ untuk memulakan pembangunan web3 berasaskan Ethereum dengan mudah

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

gunaENS: Public ResolverBerkontrakaddrKaedah untuk mendapatkan alamat dompet Vitalik. Untuk menelefonENS: Public ResolverKontrak masih perlu mendaftar ABI terlebih dahulu. Maklumat ABI kontrak pintar ini masih boleh didapati dihttps://etherscan.io/Dapatkan.

let abiENSPublicResolver = `[{"inputs":[{"internalType":"contract ENS","name":"_ens","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":true,"internalType":"uint256","name":"contentType","type":"uint256"}],"name":"ABIChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"address","name":"a","type":"address"}],"name":"AddrChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"coinType","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"newAddress","type":"bytes"}],"name":"AddressChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"target","type":"address"},{"indexed":false,"internalType":"bool","name":"isAuthorised","type":"bool"}],"name":"AuthorisationChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"bytes","name":"hash","type":"bytes"}],"name":"ContenthashChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"bytes","name":"name","type":"bytes"},{"indexed":false,"internalType":"uint16","name":"resource","type":"uint16"},{"indexed":false,"internalType":"bytes","name":"record","type":"bytes"}],"name":"DNSRecordChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"bytes","name":"name","type":"bytes"},{"indexed":false,"internalType":"uint16","name":"resource","type":"uint16"}],"name":"DNSRecordDeleted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"DNSZoneCleared","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":true,"internalType":"bytes4","name":"interfaceID","type":"bytes4"},{"indexed":false,"internalType":"address","name":"implementer","type":"address"}],"name":"InterfaceChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"string","name":"name","type":"string"}],"name":"NameChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"bytes32","name":"x","type":"bytes32"},{"indexed":false,"internalType":"bytes32","name":"y","type":"bytes32"}],"name":"PubkeyChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":true,"internalType":"string","name":"indexedKey","type":"string"},{"indexed":false,"internalType":"string","name":"key","type":"string"}],"name":"TextChanged","type":"event"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"uint256","name":"contentTypes","type":"uint256"}],"name":"ABI","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"addr","outputs":[{"internalType":"address payable","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"uint256","name":"coinType","type":"uint256"}],"name":"addr","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"authorisations","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"clearDNSZone","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"contenthash","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"bytes32","name":"name","type":"bytes32"},{"internalType":"uint16","name":"resource","type":"uint16"}],"name":"dnsRecord","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"bytes32","name":"name","type":"bytes32"}],"name":"hasDNSRecords","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"bytes4","name":"interfaceID","type":"bytes4"}],"name":"interfaceImplementer","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes[]","name":"data","type":"bytes[]"}],"name":"multicall","outputs":[{"internalType":"bytes[]","name":"results","type":"bytes[]"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"pubkey","outputs":[{"internalType":"bytes32","name":"x","type":"bytes32"},{"internalType":"bytes32","name":"y","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"uint256","name":"contentType","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"setABI","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"uint256","name":"coinType","type":"uint256"},{"internalType":"bytes","name":"a","type":"bytes"}],"name":"setAddr","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"address","name":"a","type":"address"}],"name":"setAddr","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"address","name":"target","type":"address"},{"internalType":"bool","name":"isAuthorised","type":"bool"}],"name":"setAuthorisation","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"bytes","name":"hash","type":"bytes"}],"name":"setContenthash","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"setDNSRecords","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"bytes4","name":"interfaceID","type":"bytes4"},{"internalType":"address","name":"implementer","type":"address"}],"name":"setInterface","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"string","name":"name","type":"string"}],"name":"setName","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"bytes32","name":"x","type":"bytes32"},{"internalType":"bytes32","name":"y","type":"bytes32"}],"name":"setPubkey","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"string","name":"key","type":"string"},{"internalType":"string","name":"value","type":"string"}],"name":"setText","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes4","name":"interfaceID","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"string","name":"key","type":"string"}],"name":"text","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"}]`
exchange.IO("abi", resolverAddress, abiENSPublicResolver)

Gunakan FMZ untuk memulakan pembangunan web3 berasaskan Ethereum dengan mudah

Panggilan terakhirENS: Public ResolverBerkontrakaddrKaedah, parameter masihensNode

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

Output fungsi log:

Gunakan FMZ untuk memulakan pembangunan web3 berasaskan Ethereum dengan mudah

vitalikAddress: 0xd8da6bf26964af9d7eed9e03e53415d37aa96045

Kod lengkap untuk memanggil ENS

function nameHash(name) {
    if (name == "") {
        return "0000000000000000000000000000000000000000000000000000000000000000"
    } else {
        let arr = name.split(".")
        let label = arr[0]
        
        arr.shift()
        let remainder = arr.join(".")
        return Encode("sha3.keccak256", "hex", "hex", nameHash(remainder) + Encode("sha3.keccak256", "raw", "hex", label))
    }
}

function main() {
    // 计算名称
    let ensNode = "0x" + nameHash("vitalik.eth")

    // 注册ENS合约
    let abiENS_resolver = `[{"constant":true,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"resolver","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"}]`
    exchange.IO("abi", "0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e", abiENS_resolver)
    let resolverAddress = exchange.IO("api", "0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e", "resolver", ensNode)
    
    // 注册ENS Public Resolver合约
    let abiENSPublicResolver = `[{"inputs":[{"internalType":"contract ENS","name":"_ens","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":true,"internalType":"uint256","name":"contentType","type":"uint256"}],"name":"ABIChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"address","name":"a","type":"address"}],"name":"AddrChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"coinType","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"newAddress","type":"bytes"}],"name":"AddressChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"target","type":"address"},{"indexed":false,"internalType":"bool","name":"isAuthorised","type":"bool"}],"name":"AuthorisationChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"bytes","name":"hash","type":"bytes"}],"name":"ContenthashChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"bytes","name":"name","type":"bytes"},{"indexed":false,"internalType":"uint16","name":"resource","type":"uint16"},{"indexed":false,"internalType":"bytes","name":"record","type":"bytes"}],"name":"DNSRecordChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"bytes","name":"name","type":"bytes"},{"indexed":false,"internalType":"uint16","name":"resource","type":"uint16"}],"name":"DNSRecordDeleted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"DNSZoneCleared","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":true,"internalType":"bytes4","name":"interfaceID","type":"bytes4"},{"indexed":false,"internalType":"address","name":"implementer","type":"address"}],"name":"InterfaceChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"string","name":"name","type":"string"}],"name":"NameChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"bytes32","name":"x","type":"bytes32"},{"indexed":false,"internalType":"bytes32","name":"y","type":"bytes32"}],"name":"PubkeyChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":true,"internalType":"string","name":"indexedKey","type":"string"},{"indexed":false,"internalType":"string","name":"key","type":"string"}],"name":"TextChanged","type":"event"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"uint256","name":"contentTypes","type":"uint256"}],"name":"ABI","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"addr","outputs":[{"internalType":"address payable","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"uint256","name":"coinType","type":"uint256"}],"name":"addr","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"authorisations","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"clearDNSZone","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"contenthash","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"bytes32","name":"name","type":"bytes32"},{"internalType":"uint16","name":"resource","type":"uint16"}],"name":"dnsRecord","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"bytes32","name":"name","type":"bytes32"}],"name":"hasDNSRecords","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"bytes4","name":"interfaceID","type":"bytes4"}],"name":"interfaceImplementer","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes[]","name":"data","type":"bytes[]"}],"name":"multicall","outputs":[{"internalType":"bytes[]","name":"results","type":"bytes[]"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"pubkey","outputs":[{"internalType":"bytes32","name":"x","type":"bytes32"},{"internalType":"bytes32","name":"y","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"uint256","name":"contentType","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"setABI","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"uint256","name":"coinType","type":"uint256"},{"internalType":"bytes","name":"a","type":"bytes"}],"name":"setAddr","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"address","name":"a","type":"address"}],"name":"setAddr","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"address","name":"target","type":"address"},{"internalType":"bool","name":"isAuthorised","type":"bool"}],"name":"setAuthorisation","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"bytes","name":"hash","type":"bytes"}],"name":"setContenthash","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"setDNSRecords","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"bytes4","name":"interfaceID","type":"bytes4"},{"internalType":"address","name":"implementer","type":"address"}],"name":"setInterface","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"string","name":"name","type":"string"}],"name":"setName","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"bytes32","name":"x","type":"bytes32"},{"internalType":"bytes32","name":"y","type":"bytes32"}],"name":"setPubkey","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"string","name":"key","type":"string"},{"internalType":"string","name":"value","type":"string"}],"name":"setText","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes4","name":"interfaceID","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"string","name":"key","type":"string"}],"name":"text","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"}]`
    exchange.IO("abi", resolverAddress, abiENSPublicResolver)
    let vitalikAddress = exchange.IO("api", resolverAddress, "addr", ensNode)
    Log("vitalikAddress:", vitalikAddress)
}

Hantar ETH

Dalam bab kursus sebelumnya, kami telah mempelajari cara mengkonfigurasi kunci peribadi Untuk objek pertukaran yang dikonfigurasikan, bagaimana kami mengetahui alamat dompet yang sepadan dengan kunci peribadi ini? Tersedia di FMZexchange.IO("address")Fungsi ini mendapatkan alamat dompet yang sepadan dengan kunci peribadi yang dikonfigurasikan.

Oleh kerana kandungan berikut dalam bab ini menggunakanGoerliUji persekitaran rangkaian, jadi nod yang saya gunakan ialah:https://goerli.infura.io/v3/*******, Infura memberikan alamat nod yang berbeza kepada setiap pengguna berdaftar.*******Kandungan khusus disembunyikan.

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

Gunakan FMZ untuk memulakan pembangunan web3 berasaskan Ethereum dengan mudah

Sebaik sahaja anda mengetahui alamat dompet anda, anda boleh menggunakan kaedah RPC Ethereumeth_getTransactionCountTanya kiraan transaksi alamat dompet. Kiraan ini sangat biasa digunakan dalam Ethereum Malah, ia adalah apa yang perlu diluluskan semasa memindahkan wang.nonceParameter, Dalam Ethereum, nonce ialah nombor yang digunakan untuk memastikan setiap transaksi adalah unik. Ia adalah bilangan yang semakin meningkat yang dinaikkan secara automatik setiap kali transaksi baharu dihantar. Oleh itu, apabila anda menghantar transaksi kepada kontrak pintar, anda perlu memberikan nonce untuk memastikan transaksi itu unik dan mengikut susunan yang betul. Dalam beberapa data dan dokumen yang kami dapati:

https://goethereumbook.org/en/

Gunakan FMZ untuk memulakan pembangunan web3 berasaskan Ethereum dengan mudah

Berikut ialah perpustakaan Ethereum dalam bahasa GoPendingNonceAtFungsi sebenarnya memanggileth_getTransactionCountkaedah. Dalam kursus sebelumnya, kami juga mempelajari cara memanggil kaedah RPC Kami akan menggunakannya semula di sini.exchange.IO("api", "eth", ...)fungsi.

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

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

    /**
    * eth_getTransactionCount
    * @param address - string - The address from which the transaction count to be checked.
    * @param blockNumber - string - The block number as a string in hexadecimal format or tags.
    * @returns The integer of the number of transactions sent from an address encoded as hexadecimal.
    */
    let nonce = exchange.IO("api", "eth", "eth_getTransactionCount", walletAddress, "pending")
    Log("钱包地址:", walletAddress, "当前的 nonce:", nonce, ",转换为10进制:", toAmount(nonce, 0))
}

Sebelum menerangkan operasi pemindahan, mari kita fahami secara ringkas beberapa konsep Semasa memindahkan wang pada Ethereum, sejumlah token ETH akan digunakan (sebagai bayaran gas). Yuran gas ditentukan oleh dua parameter:

  • gasPrice

Walau bagaimanapun, yuran gas pada rangkaian Ethereum sentiasa berubah-ubah berdasarkan permintaan pasaran dan apa yang pengguna sanggup bayar, jadi menulis yuran gas tetap ke dalam kod kadangkala tidak sesuai. Kita boleh menggunakan apa yang kita pelajari sebelum inieth_gasPriceKaedah, yang boleh mendapatkan purata harga gas.

  • gasLimit

Had gas untuk pemindahan eter standard ialah 21,000 unit.

fahamnoncegasPricegasLimitDengan konsep ini, anda boleh menguji pemindahan. Fungsi pemindahan yang sangat ringkas dan mudah digunakan terkandung pada FMZ.

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

Apabila digunakan untuk pemindahan,exchange.IOParameter ketiga sentiasa “hantar”.toAddressParameter ialah alamat yang menerima ETH semasa pemindahan.toAmountJumlah ETH yang dipindahkan.

noncegasPricegasLimitParameter ini boleh menggunakan nilai yang diperoleh secara automatik oleh sistem secara lalai pada FMZ. Anda juga boleh menentukan:

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

Seterusnya, kami memindahkan sejumlah ETH ke alamat tertentu pada rangkaian ujian goerli:

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

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

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

Kerana unit jumlah pemindahan Ethereum adalahwei, anda perlu menggunakan fungsi tersuaitoInnerAmountDiproses sebagaiweiNilai unit.

wujudhttps://etherscan.io/Hash Transaksi Pertanyaan:0xa6f9f51b00d8ae850b0f204380b59da98f4bbce34b813577d3d948f61de4734e

Gunakan FMZ untuk memulakan pembangunan web3 berasaskan Ethereum dengan mudah

Anda juga boleh menulis kod untuk menanyakan cincang pemindahan0xa6f9f51b00d8ae850b0f204380b59da98f4bbce34b813577d3d948f61de4734e, gunakaneth_getTransactionReceiptKaedah untuk membuat pertanyaan.

function main() {
    let transHash = "0xa6f9f51b00d8ae850b0f204380b59da98f4bbce34b813577d3d948f61de4734e"
    let info = exchange.IO("api", "eth", "eth_getTransactionReceipt", transHash)
    return info
}

Keputusan pertanyaan:

{
	"cumulativeGasUsed": "0x200850",
	"effectiveGasPrice": "0x1748774421",
	"transactionHash": "0xa6f9f51b00d8ae850b0f204380b59da98f4bbce34b813577d3d948f61de4734e",
	"type": "0x0",
	"blockHash": "0x6bdde8b0f0453ecd24eecf7c634d65306f05511e0e8f09f9ed3f59eee2d06ac7",
	"contractAddress": null,
	"blockNumber": "0x868a50",
	"logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
	"gasUsed": "0x5208",
	"to": "0x4d75a08e870674e68cae611f329a27f446a66813",
	"status": "0x1",
	"transactionIndex": "0x23",
	"from": "0x6b3f11d807809b0b1e5e3243df04a280d9f94bf4",
	"logs": []
}

Penerangan setiap medan:

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

Memanggil kontrak pintar Ethereum

KamiBaca maklumat kontrakBahagian ini menggunakan contoh lengkap untuk memanggil kaedah kontrak ENS yang digunakan pada Ethereum untuk mendapatkan alamat dompet Vitalik. Kaedah ini tergolong dalamReadKaedah, memanggil kaedah ini tidak perlugas(Ingat apa yang kita bincangkan tentang gas sebelum ini?). Dalam bahagian ini kami akan memanggil beberapa kontrak pintar pada EthereumWriteKaedah dan pembayarangas. Operasi ini akan disahkan oleh setiap nod dan pelombong pada keseluruhan rangkaian dan menukar keadaan blockchain.

ERC20

Untuk kontrak ERC20 (kontrak token ERC20), platform FMZ menyenaraikan ABI kontrak ERC20 sebagai ABI yang biasa digunakan dan secara langsung membinanya ke dalam sistem, menghapuskan langkah mendaftarkan ABI. Kami juga telah mempelajari tentang ABI dalam tutorial sebelumnya Apabila kami memanggil kaedah kontrak ENS, kami mula-mula mendaftarkan ABI kontrak ENS.

Untuk memahami ABI dengan lebih jelas, anda boleh menyemaknya sebelum menggunakannya Berikut ialah ABI kontrak ERC20:

”`javascript [{“constant”:true,“inputs”:[],“name”:“name”,“outputs”:[{“name”:“”,“type”:“string”}],“payable”:false,“stateMutability”:“view”,“type”:“function”},{“constant”:false,“inputs”:[{“name”:“guy”,“type”:“address”},{“name”:“wad”,“type”:“uint256”}],“name”:“approve”,“outputs”:[{“name”:“”,“type”:“bool”}],“payable”:false,“stateMutability”:“nonpayable”,“type”:“function”},{“constant”:true,“inputs”:[],“name”:“totalSupply”,“outputs”:[{“name”:“”,“type”:“uint256”}],“payable”:false,“stateMutability”:“view”,“type”:“function”},{“constant”:false,“inputs”:[{“name”:“src”,“type”:“address”},{“name”:“dst”,“type”:“address”},{“name”:“wad”,“type”:“uint256”}],“name”:“transferFrom”,“outputs”:[{“name”:“”,“type”:“bool”}],“payable”:false,“stateMutability”:“nonpayable”,“type”:“function”},{“constant”:false,“inputs”:[{“name”:“wad”,“type”:“uint256”}],“name”:“withdraw”,“outputs”:[],“payable”:false,“stateMutability”:“nonpayable”,“type”:“function”},{“constant”:true,“inputs”:[],“name”:“decimals”,“outputs”:[{“name”:“”,“type”:“uint8”}],“payable”:false,“stateMutability”:“view”,“type”:“function”},{“constant”:true,“inputs”:[{“name”:“”,“type”:“address”}],“name”:“balanceOf”,“outputs”:[{“name”:“”,“type”:“uint256”}],“payable”:false,“stateMutability”:“view”,“type”:“function”},{“constant”:true,“inputs”:[],“name”:“symbol”,“outputs”:[{“name”:“”,“type”:“string”}],“payable”:false,“stateMutability”:“view”,“type”:“function”},{“constant”:false,“inputs”:[{“name”:“dst”,“type”:“address”},{“name”:“wad”,“type”:“uint256”}],“name”:“transfer”,“outputs”:[{“name”:“”,“type”:“bool”}],“payable”:false,“stateMutability”:“nonpayable”,“type”:“function”},{“constant”:false,“inputs”:[],“name”:“deposit”,“outputs”:[],“payable”:true,“stateMutability”:“payable”,“type”:“function”},{“constant”:true,“inputs”:[{“name”:“”,“type”:“address”},{“name”:“”,“type”:“address”}],“name”:“allowance”,“outputs”:[{“name”:“”,“type”:“uint256”}],“payable”:false,“stateMutability”:“view”,“type”:“function”},{“payable”:true,“stateMutability”:“payable”,“type”:“fallback”},{“anonymous”:false,“inputs”:[{“indexed”:true,“name”:“src”,“type”:“address”},{“indexed”:true,“name”:“guy”,“type”:“address”},{“indexed”:false,“name”:“wad”,“type”:“uint256”}],“name”:“Approval”,“type”:“event”},{“anonymous”:false,“inputs”:[{“indexed”:true,“name”:“src”,“type”:“address”},{“indexed”:true,“name”:“dst”,“type”:“address”},{“indexed