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
Pengembang menulis kontrak pintar untuk meminta kontrak lain, yang memungkinkan program di jaringan Ethereum digunakan kembali, sehingga membangun ekosistem yang berkembang. Banyak proyek web3 mengandalkan penerapan kontrak lain, seperti yield farming. Dalam pembicaraan ini, kami akan menunjukkan kepada Anda bagaimana memanggil fungsi kontrak target ketika kode kontrak (atau antarmuka) dan alamat diketahui.
Mari kita mulai dengan menulis kontrak sederhana, OtherContract, untuk menyebutnya.
Kontrak ini berisi variabel status x, log peristiwa yang dipicu saat ETH diterima, dan tiga fungsi:
getBalance(): Mengembalikan saldo ETH kontrak.
setX(): fungsi hutang eksternal, yang dapat mengatur nilai x dan mengirim ETH ke kontrak.
getX(): Membaca nilai x.
Kita dapat membuat referensi ke kontrak menggunakan alamat kontrak dan kode kontrak (atau antarmuka): _Name(_Address), di mana _Name adalah nama kontrak dan _Address adalah alamat kontrak. Kemudian panggil fungsinya dengan mengacu pada kontrak: _Name(_Address).f(), di mana f() adalah fungsi yang akan dipanggil.
Berikut adalah 4 contoh memohon kontrak:
Kita dapat meneruskan alamat kontrak target ke dalam fungsi, menghasilkan referensi ke kontrak target, dan kemudian memanggil fungsi target. Misalnya, kita menulis fungsi callSetX dalam kontrak baru, meneruskan alamat kontrak OtherContract yang disebarkan _Address dan parameter setX x:
Kita dapat langsung meneruskan referensi kontrak dalam fungsi, dan hanya perlu mengubah jenis alamat parameter di atas ke nama kontrak target, yang lebih baik daripada OtherContract. Contoh berikut mengimplementasikan fungsi getX() yang memanggil kontrak target.
Kita dapat membuat variabel kontrak dan kemudian menggunakannya untuk memanggil fungsi objektif. Dalam contoh berikut, kami menyimpan referensi ke kontrak OtherContract untuk variabel oc:
Jika fungsi kontrak target dibayarkan, maka kita dapat mentransfer uang ke kontrak dengan menyebutnya: _Name(_Address).f{value: _Value}(), di mana _Name adalah nama kontrak, _Address adalah alamat kontrak, f adalah nama fungsi objektif, dan _Value adalah jumlah ETH yang akan ditransfer (dalam wei).
Fungsi setX dari kontrak OtherContract harus dibayarkan, dan dalam contoh berikut, kami mentransfer uang ke dan dari kontrak target dengan memanggil setX.
Setelah transfer, kita dapat mengamati perubahan saldo ETH dari kontrak target melalui peristiwa Log dan fungsi getBalance().
Dalam pembicaraan ini, kami akan menunjukkan kepada Anda cara membuat referensi ke kontrak melalui kode kontrak target (atau antarmuka) dan alamat, sehingga dapat memanggil fungsi kontrak target.