Baru-baru ini saya mempelajari kembali soliditas, mengkonsolidasikan detailnya, dan menulis “Solidity Minimalist Primer” untuk digunakan pemula (orang pemrograman dapat menemukan tutorial lain), diperbarui 1-3 kali seminggu.
Semua kode dan tutorial adalah open source di github:github.com/AmazingAng/WTFSolidity
Ketika kita memanggil fungsi kontrak pintar, 4 bytecode pertama yang dikirim adalah pemilih. Dalam pembicaraan ini, kita akan membahas apa itu pemilih dan bagaimana menggunakannya.
msg.data adalah variabel global dalam Solidity dengan nilai calldata penuh (bytecode yang memanggil fungsi).
Dalam kode berikut, kita dapat menggunakan peristiwa Log untuk menampilkan calldata yang memanggil fungsi mint:
Ketika parameter 0x2c44b726ADF1963cA47Af88B284C06f30380fC78, calldata output adalah
Bytecode berantakan ini dapat dipecah menjadi dua bagian:
Bahkan, calldata memberi tahu kontrak pintar fungsi mana yang ingin saya panggil dan apa parameternya.
Pemilih didefinisikan sebagai 4 byte pertama dari hash tanda tangan fungsi, jadi apa itu tanda tangan fungsi?
Bahkan, dalam Kuliah 21, kami secara singkat memperkenalkan tanda tangan fungsi, yaitu “nama fungsi (tipe parameter yang dipisahkan koma)”. Misalnya, tanda tangan fungsi untuk mint pada kode di atas adalah “mint (address)”. Dalam kontrak pintar, fungsi yang berbeda memiliki tanda tangan fungsi yang berbeda, sehingga kita dapat menentukan fungsi mana yang akan dipanggil melalui tanda tangan fungsi.
Perhatikan bahwa dalam tanda tangan fungsi, uint dan int harus ditulis sebagai uint256 dan int256.
Mari kita tulis fungsi untuk memverifikasi bahwa pemilih fungsi mint 0x6a627842. Anda dapat menjalankan fungsi berikut dan melihat hasilnya.
Kita dapat menggunakan pemilih untuk memanggil fungsi target. Misalnya, jika saya ingin memanggil fungsi mint, saya hanya perlu menggunakan abi.encodeWithSelector untuk menyandikan pemilih dan parameter fungsi mint dan meneruskannya ke fungsi panggilan:
Di log, kita dapat melihat bahwa fungsi mint berhasil dipanggil dan peristiwa Log adalah output.
Dalam pembicaraan ini, kami memperkenalkan apa itu pemilih fungsi, bagaimana hubungannya dengan msg.data, tanda tangan fungsi, dan bagaimana menggunakannya untuk memanggil fungsi objektif.