Bagaimana Cara Membuat Blockchain dengan Python?

Diterbitkan: 2021-11-03

Tahukah Anda bahwa Bitcoin dibangun di atas Blockchain? Hari ini kita akan membangun Blockchain dengan Python dari awal.

Apa itu Blockchain?

Pada tahun 2008 kertas Bitcoin diterbitkan oleh individu atau kelompok yang tidak dikenal bernama Satoshi Nakamoto. Bitcoin keluar sebagai versi peer-to-peer dari uang elektronik yang memungkinkan transaksi tanpa melalui lembaga terpusat (bank). Kebanyakan orang tidak tahu bahwa dalam makalah yang sama, Satoshi mendefinisikan cara terdistribusi untuk menyimpan informasi, yang sekarang dikenal sebagai Blockchain.

Teknologi Blockchain
Teknologi Blockchain

Sederhananya, Blockchain adalah buku besar digital bersama yang tidak dapat diubah yang menyimpan transaksi melalui jaringan komputer yang terdesentralisasi.

Kita dapat membagi Blockchain menjadi dua istilah sederhana:

  • Blok: Ruang tempat kami menyimpan transaksi
  • Rantai: Satu set catatan terkait

Ini mendefinisikan Blockchain sebagai rantai blok yang terhubung, di mana setiap blok menyimpan transaksi yang dibuat dengan parameter tertentu.

Setiap blok dibangun di atas blok lain, menciptakan rantai blok yang tidak dapat diubah. Dengan kata lain, setiap blok bergantung pada blok lainnya. Ini berubah menjadi sistem yang kuat dan tidak dapat diubah di mana siapa pun dengan izin yang benar dapat meninjau integritas.

Blockchain memperkenalkan serangkaian fitur menarik:

  • Kekekalan sejarah
  • Persistensi informasi
  • Tidak ada kesalahan dengan data yang disimpan

Banyak sistem saat ini mengandalkan Blockchain, seperti cryptocurrency, transfer aset (NFT), dan mungkin dalam waktu dekat, pemungutan suara.

Perlu disebutkan bahwa Python Blockchain tidak harus menjadi program yang kompleks dengan ribuan baris kode. Pada intinya, itu akan menjadi daftar transaksi yang terhubung satu sama lain.

Tentu saja, ini adalah penjelasan singkat, tetapi jika Anda menginginkan panduan lengkap, kami telah membuat tutorial lengkap tentang Blockchain untuk pemula. Pastikan untuk memeriksanya.

Tanpa penundaan lebih lanjut, mari kita membangun Blockchain sederhana dengan Python.

Membangun Blockchain Dengan Python

Sebelum memulai, mari kita tentukan apa yang akan kita lakukan dalam tutorial ini:

  • Bangun sistem Blockchain sederhana yang ditulis dengan Python
  • Gunakan Blockchain kami dengan transaksi yang telah ditetapkan sebelumnya yang direpresentasikan sebagai string
  • Uji kekekalan Blockchain kami

Kami tidak akan menggunakan JSON tetapi daftar Python. Ini akan memungkinkan kami menyederhanakan proses dan fokus pada penerapan konsep kunci Blockchain.

Apa yang Anda perlukan untuk mengikuti tutorial ini:

  • Memahami kelas dan metode dalam Python
  • Penggunaan dasar baris perintah

Membuat kelas Blok

Buka editor kode favorit Anda dan buat file main.py. Ini akan menjadi file yang akan kita kerjakan.

Sekarang, import hashlib, sebuah modul yang memungkinkan kita membuat pesan terenkripsi satu arah. Teknik kriptografi seperti hashing membuat Blockchain membuat transaksi aman.

Fungsi hash adalah algoritme yang mengambil beberapa data (biasanya string yang disandikan) dan mengembalikan pengidentifikasi unik, sering disebut "intisari" atau "tanda tangan." Bagian terakhir ini sangat penting; dengan fungsi hash, sedikit perbedaan dalam input menghasilkan pengidentifikasi yang sangat berbeda sebagai output. Kita akan melihat ini beraksi nanti.

Untuk saat ini, cukup impor hashlib modul bawaan:

 # main.py file """ A simple Blockchain in Python """ import hashlib

Modul ini mencakup sebagian besar algoritme hashing yang Anda perlukan. Ingatlah bahwa kita akan menggunakan fungsi hashlib.sha256() .

Sekarang, mari masuk ke GeekCoinBlock, nama blockchain kami yang benar-benar asli.

 class GeekCoinBlock: def __init__(self, previous_block_hash, transaction_list): self.previous_block_hash = previous_block_hash self.transaction_list = transaction_list self.block_data = f"{' - '.join(transaction_list)} - {previous_block_hash}" self.block_hash = hashlib.sha256(self.block_data.encode()).hexdigest()

Saya tahu ini dapat menghasilkan potongan kode yang kikuk. Mari kita uraikan setiap bagian di bagian selanjutnya.

Penjelasan GeekCoinBlock

Pertama, kita membuat kelas bernama GeekCoinBlock , pembungkus untuk objek yang akan memiliki karakteristik (atribut) dan perilaku (metode) tertentu.

Kemudian kita mendefinisikan metode __ init__ (juga disebut konstruktor), yang dipanggil setiap kali objek GeekCoinBlock dibuat.

Metode ini memiliki tiga parameter:

  • self (instance dari setiap objek)
  • sebelumnya_block_hash (referensi ke blok sebelumnya)
  • transaction_list (daftar transaksi yang dilakukan di blok saat ini).

Kami menyimpan hash dan daftar transaksi sebelumnya dan membuat variabel instance block_data sebagai string. Ini tidak terjadi dengan cryptocurrency nyata, di mana kami menyimpan data semacam itu sebagai hash lain, tetapi untuk tujuan kesederhanaan, kami akan menyimpan setiap blok data sebagai string.

Terakhir, kita membuat block_hash , yang akan digunakan blok lain untuk melanjutkan rantai. Di sinilah hashlib berguna; alih-alih membuat fungsi hash khusus, kita dapat menggunakan sha256 yang dibuat sebelumnya untuk membuat blok yang tidak dapat diubah.

Fungsi ini menerima string yang disandikan (atau byte) sebagai parameter. Itu sebabnya kami menggunakan metode block_data.encode() . Setelah itu, kami memanggil hexdigest() untuk mengembalikan data yang dikodekan ke dalam format heksadesimal.

Saya tahu semua ini bisa membuat Anda kewalahan, jadi mari kita bermain dengan hashlib di shell Python.

 In [1]: import hashlib In [2]: message = "Python is great" In [3]: h1 = hashlib.sha256(message.encode()) In [4]: h1 Out[4]: <sha256 ... object @ 0x7efcd55bfbf0> In [5]: h1.hexdigest() Out[5]: 'a40cf9cca ... 42ab97' In [6]: h2 = hashlib.sha256(b"Python is not great") In [7]: h2 Out[7]: <sha256 ... object @ 0x7efcd55bfc90> In [8]: h2.hexdigest() Out[8]: 'fefe510a6a ... 97e010c0ea34'

Seperti yang Anda lihat, sedikit perubahan pada input seperti “Python is great” menjadi “Python is not great” dapat menghasilkan hash yang sama sekali berbeda. Ini semua berkaitan dengan integritas Blockchain. Jika Anda memperkenalkan beberapa perubahan kecil ke dalam blockchain, hashnya akan berubah secara dramatis. Inilah alasan mengapa pepatah "Anda tidak dapat merusak Blockchain" adalah benar.

Menggunakan Kelas Blok kami

Kami akan membangun seluruh kelas Blockchain nanti, tetapi untuk saat ini, mari gunakan kelas Blok kami untuk membuat rantai blok (Blockchain).

Dalam file yang sama, buat beberapa transaksi yang terdiri dari string sederhana yang disimpan dalam variabel, misalnya:

 class GeekCoinBlock: ... t1 = "Noah sends 5 GC to Mark" t2 = "Mark sends 2.3 GC to James" t3 = "James sends 4.2 GC to Alisson" t4 = "Alisson sends 1.1 GC to Noah"

Tentu saja, GC mengacu pada GeekCoin

Sekarang, bangun blok pertama Blockchain kami dengan menggunakan kelas GeekCoinBlock dan cetak atributnya. Memperhitungkan bahwa parameter previous_hash dari blok-usul (blok pertama yang mendahului blok lainnya) akan selalu ada beberapa string yang sewenang-wenang atau hash, dalam hal ini, “firstblock.”

 block1 = GeekCoinBlock('firstblock', [t1, t2]) print(f"Block 1 data: {block1.block_data}") print(f"Block 1 hash: {block1.block_hash}")

Kemudian, kami melakukan hal yang sama dengan blok kedua, tapi melewati blok hash pertama sebagai argumen previous_hash.

 block2 = GeekCoinBlock(block1.block_hash, [t3, t4]) print(f"Block 2 data: {block2.block_data}") print(f"Block 2 hash: {block2.block_hash}")

Mari kita jalankan dan analisis output yang kita dapatkan dari potongan kode ini. Sekali lagi, ketik terminal Anda:

 ❯ python main.py Block 1 data: Noah sends 5 GC to Mark - Mark sends 2.3 GC to James - firstblock Block 1 hash: 01e4e15242a9601725f4a86ca01fbddaaec7105b442955bb0efcadbfc759806d Block 2 data: James sends 4.2 GC to Alisson - Alisson sends 1.1 GC to Noah - 01e4e15242a9601725f4a86ca01fbddaaec7105b442955bb0efcadbfc759806d Block 2 hash: 448c4306caf7f6937b0307f92f27fbea3bb73b3470363dee5026a1209dadcfa8

Untuk saat ini, Anda hanya melihat teks dan beberapa 64 karakter hash, tetapi ini melanjutkan mekanisme Blockchain.

Anda mulai dengan blok genesis, dasar dari semua blok lainnya.

Siapa pun dapat memvalidasi integritas rantai, dan itulah sebabnya Blockchain adalah sistem yang sangat aman. Misalnya, jika kami sedikit mengubah konten transaksi, katakan:

 t2 = "Mark sends 2.3 GC to James" -> t2 = "Mark sends 3.2 GC to James"

Kami melihat perubahan dramatis dalam hash blok.

 Block 1 data: Noah sends 5 GC to Mark - Mark sends 3.2 GC to James - firstblock Block 1 hash: 7a990bf1d70230bf2dad6160496c0b3046da7a17b1281fd1d4c63d4eac58e78c Block 2 data: James sends 4.2 GC to Alisson - Alisson sends 1.1 GC to Noah - 7a990bf1d70230bf2dad6160496c0b3046da7a17b1281fd1d4c63d4eac58e78c Block 2 hash: 569b977306ce88b53e001dca7ba00c03a51c60d6df4650e7657dcd136f2da0ac

Anda dapat melihat proyek saat ini di repo GitHub ini.

Mengkodekan Blockchain

Tidaklah pintar untuk mendasarkan integritas sistem kami pada variabel yang dikodekan secara manual, jadi kami membutuhkan pendekatan lain.

Kami memiliki blok. Saatnya membangun kelas yang menggabungkan mereka ke dalam Blockchain.

Mari kita mulai dengan menghapus transaksi sebelumnya dan memblokir objek, kemudian menggunakan kode di bawah ini.

 # main.py class Blockchain: def __init__(self): self.chain = [] self.generate_genesis_block() def generate_genesis_block(self): self.chain.append(GeekCoinBlock("0", ['Genesis Block'])) def create_block_from_transaction(self, transaction_list): previous_block_hash = self.last_block.block_hash self.chain.append(GeekCoinBlock(previous_block_hash, transaction_list)) def display_chain(self): for i in range(len(self.chain)): print(f"Data {i + 1}: {self.chain[i].block_data}") print(f"Hash {i + 1}: {self.chain[i].block_hash}\n") @property def last_block(self): return self.chain[-1]

Sekali lagi ini adalah bagian besar dari kode. Mari kita uraikan setiap bagian:

  • self.chain — Daftar tempat semua blok direkam. Kita dapat mengakses setiap blok melalui indeks daftar.
  • generate_genesis_block — Tambahkan genesis atau blok pertama ke rantai. Hash blok sebelumnya adalah "0", dan daftar transaksinya hanyalah "Genesis Block."
  • create_block_from_transaction — Ini memungkinkan kita untuk menambahkan blok ke rantai hanya dengan daftar transaksi. Akan sangat menjengkelkan untuk membuat blok secara manual setiap kali kita ingin mencatat transaksi
  • display_chain — Mencetak rantai blok dengan for loop
  • last_block — Properti yang memungkinkan kita mengakses elemen terakhir dari rantai. Kami menggunakannya pada metode create_block_from_transaction .

Mari kita uji Blockchain ini.

 # main.py import hashlib class GeekCoinBlock: ... class Blockchain: ... t1 = "George sends 3.1 GC to Joe" t2 = "Joe sends 2.5 GC to Adam" t3 = "Adam sends 1.2 GC to Bob" t4 = "Bob sends 0.5 GC to Charlie" t5 = "Charlie sends 0.2 GC to David" t6 = "David sends 0.1 GC to Eric" myblockchain = Blockchain() myblockchain.create_block_from_transaction([t1, t2]) myblockchain.create_block_from_transaction([t3, t4]) myblockchain.create_block_from_transaction([t5, t6]) myblockchain.display_chain()

Sekarang, jalankan file main.py.

 Data 1: Genesis Block - 0 Hash 1: 39331a6a2ea1cf31a5014b2a7c9e8dfad82df0b0666e81ce04cf8173cc5aed3e Data 2: George sends 3.1 GC to Joe - Joe sends 2.5 GC to Adam - 39331a6a2ea1cf31a5014b2a7c9e8dfad82df0b0666e81ce04cf8173cc5aed3e Hash 2: 98cf363aecb33989aea0425a3c1287268bd86f63851bc08c0734a31db08506d5 Data 3: Adam sends 1.2 GC to Bob - Bob sends 0.5 GC to Charlie - 98cf363aecb33989aea0425a3c1287268bd86f63851bc08c0734a31db08506d5 Hash 3: 6f1cfcc3082488b97db8fdf8ed33f9ac7519be3e285a37a6fcc2f1904f373589 Data 4: Charlie sends 0.2 GC to David - David sends 0.1 GC to Eric - 6f1cfcc3082488b97db8fdf8ed33f9ac7519be3e285a37a6fcc2f1904f373589 Hash 4: 869df2f03c9860767d35b30a46233fbeea89a3000ae5019d1491e3829d1ab929

Selamat! Anda baru saja membuat Blockchain Python sederhana dari awal.

Anda sekarang dapat memperkuat kekekalan Blockchain dengan menggunakan getter dan setter dan mengimplementasikan fitur lain seperti proof-of-work, mining, atau konsep lain yang kami jelaskan di artikel dasar Bitcoin Mining.

Kesimpulan

Blockchain adalah teknologi di balik Bitcoin, Etherium, dan setiap cryptocurrency lainnya di luar sana. Dalam artikel ini, Anda telah mempelajari cara membuat Blockchain dengan Python menggunakan algoritma hash seperti sha256 , kelas, dan objek.

Tantangan Anda adalah membuat sistem penambangan, dan mengapa tidak, mengimplementasikannya dengan REST API menggunakan kerangka kerja seperti Django atau Flask.

Banyak orang menghasilkan banyak uang dari cryptocurrency. Bayangkan saja apa yang bisa Anda lakukan jika Anda membuatnya sendiri.

Terus Coding!