Lanjut ke konten utama

Pengantar bagi pengembang Python untuk Ethereum, bagian 1

memulaipythonweb3.py
Pemula
Marc Garreau
Snake charmers(opens in a new tab)
8 September 2020
11 bacaan singkat minute read

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.

Catatan: Ethereum selalu memakai fungsi hash(opens in a new tab) untuk menghasilkan nilai ukuran tetap ("hash"). Hash memainkan peran penting di Ethereum, tetapi untuk saat ini Anda bisa menganggapnya sebagai ID unik.

Diagram yang menggambarkan sebuah blockchain termasuk data di dalam setiap blok

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.

Catatan: "node Ethereum" dan "klien Ethereum" digunakan secara bergantian. Dalam kedua kasus tersebut, ini merujuk pada perangkat lunak yang dijalankan oleh seorang peserta di jaringan Ethereum. Perangkat lunak ini dapat membaca data blok, menerima pembaruan ketika blok baru ditambahkan ke rantai ("ditambang"), menyiarkan transaksi baru, dan banyak lagi.

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.

Sebuah diagram menunjukkan bagaimana cara web3.py menggunakan IPC untuk menghubungkan aplikasi Anda dengan node Ethereum

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')
3
4# 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.

Catatan: Dalam contoh di bawah, perintah yang dimulai dengan `$` dimaksudkan untuk dijalankan dalam terminalnya. (Jangan mengetik `$`, ini hanya menandakan permulaan baris.)

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 Web3
Salin

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).

Catatan: Komputer terkenal buruk dalam menangani matematika desimal. Untuk menyelesaikan hal ini, pengembang sering menyimpan sejumlah dolar dalam sen. Misalnya, sebuah item dengan harga $5,99 mungkin disimpan dalam basis data sebagai 599.

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]: 1000000000000000000
3
4In [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.

Sebuah diagram yang menunjukkan EthereumTesterProvider yang menghubungkan aplikasi web3.py Anda dengan sebuah node Ethereum yang disimulasikan

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]: True
Salin

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.accounts
2Out[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]: 1000000000000000000000000
Salin

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': 21000
6})
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:

  1. Kirimkan sebuah transaksi dan pegang hash transaksinya. Sampai ditambang, transaksinya berstatus "menunggu." tx_hash = w3.eth.send_transaction({ … })
  2. Tunggu sampai transaksinya ditambang: w3.eth.wait_for_transaction_receipt(tx_hash)
  3. 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 semua
Salin

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]: 999996999999999999969000
3
4In [13]: w3.eth.get_balance(w3.eth.accounts[1])
5Out[13]: 1000003000000000000000000
Salin

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.

Catatan: Pada jaringan publik, biaya transaksi bervariasi sesuai dengan permintaan jaringan dan seberapa cepat Anda menginginkan sebuah transaksi diproses. Jika Anda tertarik dengan analisa bagaimana biaya dihitung, lihat posting saya sebelumnya tentang bagaimana transaksi dimasukkan ke dalam sebuah blok(opens in a new tab).

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

Apakah tutorial ini membantu?