Pengantar bagi pengembang Python untuk Ethereum, bagian 1
Jadi, Anda pernah mendengar hal-hal tentang Ethereum dan siap untuk melanjutkan perjalanan yang menakjubkan memasuki lubang kelinci? Postingan ini akan membahas dengan cepat beberapa dasar-dasar blockchain, lalu membawa Anda berinteraksi dengan node Ethereum yang disimulasi – membaca data blok, memeriksa saldo akun, dan mengirim transaksi. Sepanjang perjalanan, kita akan menyoroti perbedaan antara cara tradisional dalam membuat aplikasi dan paradigma terdesentralisasi baru ini.
Prasyarat (perangkat lunak)
Postingan ini bertujuan agar dapat diakses oleh berbagai pengembang. Peralatan Python akan dilibatkan, tetapi hanya sebagai kendaraan bagi ide – bukan masalah jika Anda bukan seorang pengembang Python. Namun, saya akan membuat beberapa asumsi tentang apa yang telah Anda ketahui, sehingga kita dapat dengan cepat beralih dari informasi rinci Ethereum.
Asumsi:
- Anda dapat menguasai penggunaan terminal,
- Anda telah menulis beberapa baris kode Python,
- Versi Python 3.6 atau yang lebih baru diinstal di mesin Anda (penggunaan lingkungan virtual(opens in a new tab) sangat direkomendasikan), dan
- Anda telah menggunakan
pip
, instaler paket Python. Sekali lagi, jika salah satu dari asumsi ini tidak benar, atau Anda tidak berencana untuk membuat kembali kode dalam artikel ini, Anda kemungkinan masih dapat mengikuti penjelasannya dengan baik.
Blockchain, secara singkat
Ada banyak cara untuk mendeskripsikan Ethereum, tetapi pada intinya ini adalah sebuah blockchain. Blockchain terbuat dari kumpulan blok, jadi mari mulai dari sana. Dalam istilah paling sederhana, setiap blok di blockchain Ethereum hanya merupakan beberapa metadata dan sebuah daftar transaksi. Dalam format JSON, itu tampak seperti ini:
1{2 "number": 1234567,3 "hash": "0xabc123...",4 "parentHash": "0xdef456...",5 "miner": "0xa1b2c3...",6 ...,7 "transactions": [...]8}Salin
Setiap blok memiliki rujukan ke blok yang ada sebelumnya; parentHash
merupakan hash dari blok sebelumnya.
Sebuah blockchain pada dasarnya adalah daftar yang terhubung; setiap blok memiliki rujukan ke blok sebelumnya.
Struktur data ini bukanlah hal yang baru, tetapi aturan (maksudnya protokol peer-to-peer) yang mengelola jaringannya itulah yang baru. Tidak ada otoritas terpusat; jaringan rekan sejawat harus berkolaborasi untuk mempertahankan jaringan, dan berkompetisi untuk memutuskan transaksi mana yang dimasukkan ke blok berikutnya. Jadi, ketika Anda ingin mengirim sejumlah uang ke seorang teman, Anda harus menyiarkan transaksi tersebut ke jaringan, lalu menunggunya untuk dimasukkan ke dalam blok berikutnya.
Satu-satunya cara agar blockchain memverifikasi bahwa uang tersebut benar-benar dikirim dari seorang pengguna ke pengguna lainnya adalah dengan menggunakan mata uang asli dari (maksudnya yang dibuat dan dikelola oleh) blockchain tersebut. Di Ethereum, mata uang ini disebut ether, dan blockchain Ethereum hanya berisi catatan saldo akun yang resmi.
Sebuah paradigma baru
Tumpukan teknologi terdesentralisasi yang baru ini telah memunculkan peralatan pengembang yang baru. Peralatan seperti ini ada dalam banyak bahasa pemrograman, tetapi kita akan membahasnya melalui lensa Python. Untuk mengulanginya: meskipun Python bukanlah bahasa pilihan Anda, seharusnya tidak menjadi masalah memahami penjelasan artikel ini.
Para pengembang Python yang ingin berinteraksi dengan Ethereum lebih mungkin untuk menggunakan Web3.py(opens in a new tab). Web3.py adalah sebuah pustaka yang sangat menyederhanakan cara Anda terhubung dengan sebuah node Ethereum, lalu mengirim dan menerima data darinya.
Klien Ethereum dapat dikonfigurasi agar dapat dicapai oleh IPC(opens in a new tab), HTTP, atau Websocket, sehingga Web3.py perlu menyerupai konfigurasi ini. Web3.py merujuk pada opsi koneksi ini sebagai penyedia. Anda akan memilih salah satu dari tiga penyedia untuk menghubungkan instance Web3.py dengan node Anda.
Konfigurasikan node Ethereum dan Web3.py agar berkomunikasi melalui protokol yang sama, misalnya IPC dalam diagram ini.
Setelah Web3.py dikonfigurasikan dengan benar, Anda dapat memulai interaksi dengan blockchain. Berikut adalah beberapa contoh penggunaan Web3.py sebagai pratinjau dari bagian selanjutnya:
1# read block data:2w3.eth.get_block('latest')34# send a transaction:5w3.eth.send_transaction({'from': ..., 'to': ..., 'value': ...})Salin
Instalasi
Dalam panduan ini, kita hanya akan berkerja di dalam penerjemah Python. Kita tidak akan membuat direktori, file, kelas, atau fungsi apa pun.
Pertama, instal IPython(opens in a new tab) untuk lingkungan ramah pengguna yang dapat dijelajahi. IPython menawarkan penyelesaian tab, di antara fitur lainnya, yang memudahkan untuk melihat apa yang dimungkinkan di Web3.py.
pip install ipython
Web3.py dipublikasikan dengan nama web3
. Instal seperti ini:
pip install web3
Satu hal lagi – kita akan mensimulasikan sebuah blockchain nanti, yang memerlukan beberapa dependensi lagi. Anda dapat menginstal itu melalui:
pip install 'web3[tester]'
Anda siap untuk langkah berikutnya!
Putar kotak pasir
Buka lingkungan Python yang baru dengan menjalankan ipython
di terminal Anda. Ini dapat dibandingkan dengan menjalankan python
, tetapi hadir dengan lebih banyak fitur spesial.
ipython
Ini akan mencetak beberapa informasi tentang versi Python dan IPython yang Anda jalankan, maka Anda akan melihat permintaan yang menunggu untuk menerima input:
1In [1]:Salin
Anda sedang melihat cangkang Python interaktif. Pada dasarnya, ini adalah sandbox untuk dimainkan. If you’ve made it this far, its time to import Web3.py:
1In [1]: from web3 import Web3Salin
Memperkenalkan modul Web3
Selain menjadi gerbang masuk ke Ethereum, modul Web3(opens in a new tab) menawarkan beberapa fungsi yang praktis. Mari kita telusuri beberapa di antaranya.
Di aplikasi Ethereum, umumnya Anda perlu mengubah denominasi mata uang. Modul Web3 menyediakan beberapa metode pembantu yang sesuai untuk ini: fromWei(opens in a new tab) dan toWei(opens in a new tab).
Pola yang sama digunakan ketika menangani transaksi dalam ether. Namun, alih-alih dua poin desimal, ether memiliki 18! Denominasi ether yang terkecil disebut wei, jadi itulah nilai yang ditetapkan ketika mengirim transaksi.
1 ether = 1000000000000000000 wei
1 wei = 0,000000000000000001 ether
Cobalah untuk mengubah beberapa nilai ke dan dari wei. Perhatikan bahwa ada nama untuk banyak denominasi(opens in a new tab) di antara ether dan wei. Salah satu yang lebih dikenal di antaranya adalah gwei, karena sering menjadi cara mewakili biaya transaksi.
1In [2]: Web3.toWei(1, 'ether')2Out[2]: 100000000000000000034In [3]: Web3.fromWei(500000000, 'gwei')5Out[3]: Decimal('0.5')Salin
Metode utilitas lainnya di modul Web3 memasukkan pengubah format data (misalnya, toHex
(opens in a new tab)), pembantu alamat (misalnya, isAddress
(opens in a new tab)), dan fungsi hash (misalnya, keccak
(opens in a new tab)). Beberapa di antaranya akan dibahas nanti dalam seri. Untuk melihat semua metode dan properti yang tersedia, manfaatkan fitur pelengkap otomatis IPython dengan mengetik Web3
. dan menekan tombol tab dua kali setelah tanda titik.
Berbicara dengan rantai
Metode praktis memang menarik, tetapi mari beralih ke blockchain. Langkah berikutnya adalah mengonfigurasi Web3.py untuk berkomunikasi dengan node Ethereum. Di sini kita memiliki opsi untuk menggunakan penyedia IPC, HTTP, atau Websocket.
Kita tidak akan menuju ke jalur ini, tetapi contoh dari alur kerja yang lengkap menggunakan Penyedia HTTP mungkin tampak seperti ini:
- Unduh sebuah node Ethereum, misalnya Geth(opens in a new tab).
- Jalankan Geth di salah satu jendela terminal dan tunggu sampai disinkronkan dengan jaringan. Porta HTTP defaultnya adalah
8545
, tetapi ini dapat dikonfigurasi. - Beri tahu Web3.py untuk terhubung dengan node melalui HTTP, di
localhost:8545
.w3 = Web3(Web3.HTTPProvider('http://127.0.0.1:8545'))
- Gunakan instance
w3
untuk berinteraksi dengan node.
Sekalipun ini merupakan salah satu cara "nyata" untuk melakukannya, proses sinkronisasi memakan waktu berjam-jam dan tidak diperlukan jika Anda hanya ingin menggunakan lingkungan pengembangan. Web3.py menampilkan penyedia keempat untuk tujuan ini, EthereumTesterProvider. Penyedia penguji ini terhubung dengan sebuah node Ethereum yang disimulasikan dengan izin yang longgar dan mata uang palsu untuk dimainkan.
EthereumTesterProvider terhubung dengan sebuah node yang disimulasikan berguna untuk lingkungan pengembangan yang cepat.
Node yang disimulasikan itu disebut eth-tester(opens in a new tab) dan kita menginstalnya sebagai bagian dari perintah pip install web3[tester]
. Mengonfigurasi Web3.py untuk menggunakan penyedia penguji ini semudah:
1In [4]: w3 = Web3(Web3.EthereumTesterProvider())Salin
Sekarang Anda siap untuk berselancar di atas rantai! Itu bukanlah sesuatu yang dikatakan orang-orang. Saya baru membuat itu. Mari ikuti sebuah tur singkat.
Tur singkat
Pertama-tama, pemeriksaan kewarasan:
1In [5]: w3.isConnected()2Out[5]: TrueSalin
Karena kita menggunakan penyedia penguji, ini bukanlah tes yang sangat berharga, tetapi jika gagal, kemungkinannya Anda mengetik sesuatu dengan salah ketika membuat instance variabel w3
. Periksa ulang apakah Anda memasukkan tanda kurung dalam, misalnya, Web3.EthereumTesterProvider()
.
Pemberhentian tur #1: akun
Untuk kemnyamanan, penyedia penguji membuat beberapa akun dan memuatnya terlbih dahulu dengan ether pengujian.
Pertama-tama, mari lihat daftar akun tersebut:
1In [6]: w3.eth.accounts2Out[6]: ['0x7E5F4552091A69125d5DfCb7b8C2659029395Bdf',3 '0x2B5AD5c4795c026514f8317c7a215E218DcCD6cF',4 '0x6813Eb9362372EEF6200f3b1dbC3f819671cBA69', ...]Salin
Jika Anda menjalankan perintah ini, Anda akan melihat sebuah daftar sepuluh string yang dimulai dengan 0x
. Masing-masing merupakan alamat publik dan, dalam beberapa cara, sama dengan nomor akun pada akun pemeriksaan. Anda akan memberikan alamat ini kepada seseorang yang ingin mengirim ether kepada Anda.
Seperti yang disebutkan, penyedia penguji telah memasukkan pra-isian ke dalam masing-masing akun ini dengan ether pengujian. Mari cari tahu berapa jumlahnya dalam akun pertama:
1In [7]: w3.eth.get_balance(w3.eth.accounts[0])2Out[7]: 1000000000000000000000000Salin
Itu berangka nol sangat banyak! Sebelum Anda menuju ke bank palsunya sambil tertawa, coba ingat kembali pelajaran tentang denominasi mata uang dari bagian sebelumnya. Nilai ether diwakilkan dalam denominasi terkecil, wei. Ubah itu ke ether:
1In [8]: w3.fromWei(1000000000000000000000000, 'ether')2Out[8]: Decimal('1000000')Salin
Satu juta ether pengujian — itu masih tidak terlalu buruk.
Pemberhentian tur #2: data blok
Mari mengintip state dari blockchain yang disimulasikan ini:
1In [9]: w3.eth.get_block('latest')2Out[9]: AttributeDict({3 'number': 0,4 'hash': HexBytes('0x9469878...'),5 'parentHash': HexBytes('0x0000000...'),6 ...7 'transactions': []8})Salin
Banyak informasi tentang sebuah blok dikembalikan, tetapi hanya beberapa hal yang ditunjukkan di sini:
- Nomor bloknya nol — tidak peduli sudah berapa lama sebelumnya Anda mengonfigurasi penyedia pengujinya. Tidak seperti jaringan Ethereum asli, yang menambang sebuah blok baru kira-kira setiap 15 detik, simulasi ini akan menunggu sampai Anda memberinya beberapa pekerjaan untuk dilakukan.
transactions
adalah sebuah daftar kosong, untuk alasan yang sama: kita belum melakukan apa pun. Blok pertama ini merupakan sebuah blok kosong, hanya untuk memulai rantainya.- Perhatikan bahwa
parentHash
hanya merupakan sekelompok bita kosong. Ini menandakan bahwa ini adalah blok pertama dalam rantai, yang juga dikenal sebagai blok genesis.
Pemberhentian tur #3: transaksi
Kita akan terhenti pada blok nol sampai ada transaksi yang akan ditambang, jadi mari kita memberikannya satu transaksi. Kirim sejumlah ether pengujian dari satu akun ke akun lainnya:
1In [10]: tx_hash = w3.eth.send_transaction({2 'from': w3.eth.accounts[0],3 'to': w3.eth.accounts[1],4 'value': w3.toWei(3, 'ether'),5 'gas': 210006})Salin
Ini umumnya merupakan titik di mana Anda akan menunggu selama beberapa detik untuk transaksi Anda ditambang ke dalam sebuah blok baru. Proses penuhnya berlansung seperti ini:
- Kirimkan sebuah transaksi dan pegang hash transaksinya. Sampai ditambang, transaksinya berstatus "menunggu."
tx_hash = w3.eth.send_transaction({ … })
- Tunggu sampai transaksinya ditambang:
w3.eth.wait_for_transaction_receipt(tx_hash)
- Lanjutkan logika aplikasi. Untuk melihat transaksi yang berhasil:
w3.eth.get_transaction(tx_hash)
Lingkungan yang disimulasikan akan menambah transaksi dalam sebuah blok baru dengan segera, sehingga kita dapat dengan segera melihat transaksinya:
1In [11]: w3.eth.get_transaction(tx_hash)2Out[11]: AttributeDict({3 'hash': HexBytes('0x15e9fb95dc39...'),4 'blockNumber': 1,5 'transactionIndex': 0,6 'from': '0x7E5F4552091A69125d5DfCb7b8C2659029395Bdf',7 'to': '0x2B5AD5c4795c026514f8317c7a215E218DcCD6cF',8 'value': 3000000000000000000,9 ...10})Tampilkan semuaSalin
You’ll see some familiar details here: the from
, to
, and value
fields should match the inputs of our send_transaction
call. Informasi kecil lainnya yang meyakinkan adalah bahwa transaksi ini dimasukkan sebagai transaksi pertama ('transactionIndex': 0
) dalam blok nomor 1.
Kita juga dapat dengan mudah memverifikasi keberhasilan transaksi ini dengan memeriksa saldo kedua akun yang terlibat. Tiga ether akan berpindah dari satu akun ke akun lainnya.
1In [12]: w3.eth.get_balance(w3.eth.accounts[0])2Out[12]: 99999699999999999996900034In [13]: w3.eth.get_balance(w3.eth.accounts[1])5Out[13]: 1000003000000000000000000Salin
Yang terakhir ini tampak baik! Saldonya bertambah dari 1.000.000 ke 1.000.003 ether. Tapi apa yang terjadi pada akun pertama? Tampaknya telah kehilangan lebih dari tiga ether. Sayangnya, tidak ada yang gratis dalam hidup ini, dan menggunakan jaringan publik Ethereum mengharuskan Anda membayar kompensasi kepada para rekan sejawat Anda untuk peran pendukung mereka. Sejumlah kecil biaya transaksi diambil dari akun yang membuat transaksi sebesar 31000 wei.
Dan bernafaslah
Kita telah ada di sini untuk beberapa saat, sehingga ini tampaknya tempat yang baik untuk beristirahat sejenak. Perjalanan yang menakjubkan kita terus berlanjut, dan kita akan melanjutkan analisa dalam bagian kedua dari seri panduan ini. Beberapa konsep yang berikutnya akan dibahas: menghubungkan dengan sebuah node asli, kontrak pintar, dan token. Punya pertanyaan tindak lanjut? Beri tahu saya! Umpan balik Anda akan memengaruhi ke mana kita akan pergi dari sini. Permintaan diterima melalui Twitter(opens in a new tab).
Terakhir diedit: @pettinarip(opens in a new tab), 15 Januari 2024