} .leaderboard{ padding-top: 20px; margin-bottom: -10px; }

Panduan Utama untuk Python dan Blockchain: Bagian 2

Panduan Utama untuk Python dan Blockchain: Bagian 2

Memulihkan Bagian Pertama

Pada bagian pertama , kami mempelajari dasar-dasar Python. Kami belajar bagaimana if-elif-else dan loop bekerja di sistem. Kami pada dasarnya telah belajar bagaimana melakukan kode sederhana pada Python. Di bagian ini, kita akan mulai membuat blockchain kita . Jadi, tanpa basa-basi, mari kita mulai!

Membuat Python Blockchain Kami: Memperkenalkan Daftar

Baiklah, cukup dengan dasar-dasarnya. Sekarang mari kita buat blockchain kami!

Kami akan melakukannya dengan memperkenalkan daftar. Daftar pada dasarnya adalah sekelompok data yang bisa dari jenis apa pun. Mereka didefinisikan seperti ini:

List_name = [elemen 1, elemen 2, elemen 3 …… elemen n]

Elemen-elemen, seperti yang telah kami jelaskan sebelumnya, dapat berupa tipe data apa pun. Ini bisa berupa integer, float, string, atau bahkan daftar lain (yang akan kita gunakan nanti). Mari kita lihat bagaimana ini akan bekerja. Kami akan menggunakan terminal kami untuk ini:

Beberapa hal yang perlu diperhatikan dari kode di atas.

Pikirkan elemen individual dari daftar sebagai blok di blockchain. Tidak terlalu banyak, jelas, kita akan membuat ini lebih canggih nanti. Daftar itu sendiri mengikat semua data ini untuk memberikan elemen “rantai” dari blockchain.

Sekarang, hal lain yang akan Anda perhatikan adalah nomor indeks setiap elemen. Elemen pertama memiliki indeks 0. Inilah sebabnya, ketika kita ingin mencetak elemen pertama, kita mengatakan “blockchain [0]”.

Memodifikasi Elemen Daftar

Daftar yang tidak dapat diubah tidak berguna. Anda perlu ketentuan untuk menambah dan menghapus elemen dari daftar. Sekarang, kita tahu bahwa dalam blockchain seperti Bitcoin tidak mungkin untuk menghapus elemen, namun, kita masih berurusan dengan daftar sekarang.

Jadi, bagaimana kita akan melakukannya?

Kami akan menggunakan dua fungsi daftar:

  • menambahkan()
  • pop ()

Fungsi append menambahkan lebih banyak elemen ke daftar. Jadi, bawa kembali daftar lama kita:

blockchain = [1, 2, 5.6].

Jika kita ingin menambahkan “Blockgeeks” ke dalamnya, kita hanya akan mengatakan: blockchain.append (“Blockgeeks”)

Sekarang ketika kita mencetaknya, itu menunjukkan:

[1, 2, 5.6, “Blockgeeks”]

Sekarang mari kita hapus beberapa data.

Untuk itu, kita akan menggunakan fungsi pop (), yang akan menghapus elemen terakhir dari daftar. Jadi, jika kita melakukan blockchain.pop [], sekarang ia akan menghapus “Blockgeeks” dan menunjukkan:

[1, 2, 5.6]

Menambahkan Elemen Selama Runtime melalui Fungsi

Sekarang, mari bersenang-senang.

Kami akan menggunakan fungsi untuk menambahkan elemen ke daftar saat runtime. Pertimbangkan program ini:

blockchain = []



def  add_list ():

   blockchain . tambahkan ( 3.2 )

   cetak (blockchain)



add_list ()

add_list ()

add_list ()

Jadi, kami telah mendefinisikan fungsi yang disebut “add_list ()” yang akan menambahkan 3,2 ke daftar blockchain setiap kali dipanggil. Apakah Anda memperhatikan bagaimana kami mendeklarasikan daftar kosong dengan: blockchain = []? Itu dilakukan agar kami bisa menunjukkan kepada Anda bagaimana Anda bisa memasukkan data dari awal.

Jadi, jika kita mencetaknya, beginilah tampilannya. Kami kembali pada Visual Studio Code btw.

Panduan Utama untuk Python dan Blockchain: Bagian 2

Memberi Daftar Lebih Banyak Properti Seperti Blockchain

Sampai sekarang kita sudah cukup banyak berurusan dengan daftar normal. Namun, perlu ada koneksi yang lebih organik antara blok.

Alasan mengapa blok terhubung satu sama lain dalam blockchain nyata adalah karena mereka juga menyertakan data dari blok sebelumnya. Itulah yang akan kita lakukan dengan menambahkan data dari elemen terakhir ke elemen terbaru melalui daftar bersarang. Dengan python, Anda bisa mendapatkan data daftar terakhir menggunakan indeks [-1].

Jadi jika blockchain memiliki [1, 2, 3], maka blockchain [-1] memberi Anda 3.

Bagaimanapun, mari kita periksa kodenya, kita akan menggunakan fungsi input () untuk mendapatkan nilai elemen blockchain dari pengguna.

element1 =  input ( "Berikan elemen pertama dari blockchain" )

blockchain = [element1]

def  add_list ():

   blockchain . append ([blockchain [ - 1 ], 3.2 ])

   cetak (blockchain)



add_list ()

add_list ()

add_list ()

Jadi, sekarang saat Anda mencetak ini, Anda akan mendapatkan:

Ok, sejauh ini kami telah memberikan beberapa karakter ke blockchain kami, tetapi kami masih belum memiliki sesuatu yang dekat dengan model kerja kami. Jangan khawatir itu akan segera diselesaikan.

Semakin Dekat dengan Blockchain yang Bekerja

blockchain = []

“”” Bagian 1 “””

def  get_last_value ():

   "" "mengekstraksi elemen terakhir dari daftar blockchain" ""

   kembali (blockchain [ - 1 ])



def  add_value (transaction_amount, last_transaction = [ 1 ]):

   blockchain . append ([last_transaction, transaction_amount])

“”” Seksi 2 “””

def  get_transaction_value ():

   user_value =  float ( masukan ( 'Masukkan jumlah transaksi Anda' ))

   kembalikan nilai user_



def  get_user_choice ():

   user_input =  input ( "Tolong beri pilihan Anda di sini:" )

   kembalikan user_input

“” “Bagian 3” “”

def  print_block ():

   untuk block di blockchain:

       print ( "Ini blokmu" )

       cetak (blok)

“” “Bagian 4” “”

def  verifikasi_chain ():

   indeks =  0

   valid =  Benar

   untuk block di blockchain:

       jika indeks ==  0 :

           indeks + =  1

           terus

       blok elif [ 0 ] == blockchain [indeks -  1 ]:

           valid =  Benar

       lain :

           valid =  Salah

           istirahat

       indeks + =  1

   kembali valid

“” “Bagian 5” “”

tx_amount = get_transaction_value ()

add_value (tx_amount)



sementara  Benar :

   cetak ( "Pilih opsi" )

   cetak ( 'Pilih 1 untuk menambah transaksi baru' )

   print ( 'Pilih 2 untuk mencetak blockchain' )

   cetak ( 'Pilih 3 jika Anda ingin memanipulasi data' )

   print ( 'Pilih hal lain jika Anda ingin berhenti' )



   user_choice = get_user_choice ()

   

   jika user_choice ==  1 :

       tx_amount = get_transaction_value ()

       add_value (tx_amount, get_last_value ())

   

   elif user_choice ==  2 :

       print_block ()

   

   elif user_choice ==  3 :

       jika  len (blockchain) > =  1 :

           blockchain [ 0 ] =  2

   

   lain :

       istirahat

   

   jika  tidak verifikasi_chain ():

       print ( 'Blockchain dimanipulasi' )

       istirahat

Ya, kami tahu bahwa itu adalah blok kode yang sangat besar, namun kami telah membagi semuanya menjadi beberapa bagian yang berbeda untuk membantu Anda memahami apa yang sedang terjadi dan setiap bagian dari kode.

Apa yang kami coba lakukan di sini adalah membuat prototipe blockchain yang tidak bergantung pada deklarasi statis. Artinya, Pengguna sendiri dapat mengisi data selama waktu berjalan. Inilah sebabnya, jika Anda melihat baris pertama kode, maka Anda akan melihat bahwa kita mulai dengan blockchain kosong.

Baiklah, jadi mari kita mulai melihat ke bagian.

Catatan: Sebaiknya salin tempel kode di atas dan biarkan tetap terbuka di jendela baru atau file doc. Kami akan terus merujuk ke bagian kode yang berbeda dalam penjelasan di bawah ini, dan akan lebih mudah bagi Anda untuk melacak.

Bagian 1

def  get_last_value ():

   "" "mengekstraksi elemen terakhir dari daftar blockchain" ""

   kembali (blockchain [ - 1 ])



def  add_value (transaction_amount, last_transaction = [ 1 ]):

   blockchain . append ([last_transaction, transaction_amount])

Jadi, bagian pertama ini Anda harus cukup berpengalaman dengan sekarang. Kami melakukan dua hal di sini:

  • Mengekstrak elemen terakhir dari blockchain
  • Menambahkan elemen terakhir bersama dengan elemen saat ini di blok ke blockchain.

Lihatlah argumen di fungsi add_value:

  • Last_transaction
  • Jumlah transaksi

Jumlah_pertukaran adalah nilai transaksi yang akan dimasukkan ke dalam blockchain. Variabel last_transaction, di sisi lain, adalah nilai transaksi di blok terakhir yang akan dimasukkan ke dalam blok baru.

Jadi, mengapa kita menginisialisasi last_transaction ke [1]?

Ini dilakukan murni untuk menghindari kesalahan selama runtime. Pikirkan ini, jika kita berurusan dengan blok pertama dari blockchain, maka itu tidak akan memiliki “transaksi terakhir” kan? Anda memerlukan setidaknya dua blok agar konsep “last_transaction” ada. Inilah sebabnya, untuk menghapus kemungkinan kesalahan di blok pertama, last_transaction diinisialisasi ke [1].

Seksi 2

def  get_transaction_value ():

   user_value =  float ( masukan ( 'Masukkan jumlah transaksi Anda' ))

   kembalikan nilai user_



def  get_user_choice ():

   user_input =  input ( "Tolong beri pilihan Anda di sini:" )

   kembalikan user_input

Sebut bagian ini bagian masukan. Kami memiliki dua fungsi di sini:

  • get_transaction_value ()
  • get_user_choice ()

Dalam fungsi pertama, kami meminta pengguna untuk memasukkan nilai jumlah transaksi yang ingin mereka masukkan ke dalam blockchain.Sekarang ingat, fungsi input () mengembalikan nilai string. Jadi, kami menggunakan fungsi float () untuk mengubah angka itu menjadi angka mengambang.

Pada fungsi kedua, kita akan meminta pengguna untuk memasukkan pilihan mereka.

Sekarang, Anda mungkin bertanya-tanya, “Pilihan apa yang Anda bicarakan?”

Nah, ambil Bagian 5. Khusus loop sementara. Apakah Anda melihat opsi yang kami tanyakan di sana?

cetak ( "Pilih opsi" )

cetak ( 'Pilih 1 untuk menambah transaksi baru' )

print ( 'Pilih 2 untuk mencetak blockchain' )

cetak ( 'Pilih 3 jika Anda ingin memanipulasi data' )

print ( 'Pilih hal lain jika Anda ingin berhenti' )

Jadi, fungsi get_user_choice () digunakan untuk mengambil pilihan dari pengguna untuk membantu memahami apa yang ingin mereka lakukan.

Bagian 3

def  print_block ():

   untuk block di blockchain:

       print ( "Ini blokmu" )

       cetak (blok)

Ini adalah bagian yang sangat mudah. Kami menggunakan loop for untuk mencetak setiap blok blockchain.

Bagian 4

def  verifikasi_chain ():

   indeks =  0

   valid =  Benar

   untuk block di blockchain:

       jika indeks ==  0 :

           indeks + =  1

           terus

       blok elif [ 0 ] == blockchain [indeks -  1 ]:

           valid =  Benar

       lain :

           valid =  Salah

           istirahat

       indeks + =  1

   kembali valid

Sekarang ini adalah sesuatu yang belum kita lakukan sejauh ini.

Di bagian ini, kami memverifikasi validitas blockchain. Apa sebenarnya yang kita maksud dengan itu.

Seperti yang Anda ketahui, blockchain harus tidak berubah. Karena kita belum menggunakan fungsi hash, mari kita gunakan sesuatu yang lain untuk menunjukkan bahwa rantai telah dirusak. Inilah sebabnya, dalam fungsi ini kami menggunakan fungsi memverifikasi_kunci.

Jadi, apa yang kita lakukan di sini?

Pertama, kami memiliki dua variabel:

  • Indeks = Penghitung yang akan kita gunakan untuk melewati blok di blockchain
  • Valid = A variabel Boolean yang akan mengembalikan Benar atau Salah sebagai nilai akhir dari fungsi ini

Setelah itu, kami menggunakan loop for untuk melalui blockchain, sangat mirip dengan bagian sebelumnya di mana kami menggunakan loop untuk mencetak blok. Di dalam loop kita menggunakan tiga pernyataan kondisional, mari kita lihat masing-masing:

Subbagian if

Ini memeriksa apakah indeksnya 0 atau tidak. Jika ya, maka indeks bertambah 1

Subbagian elif

Ini adalah bagian di mana kami memeriksa apakah ada gangguan atau tidak. Untuk memahami cara kerjanya, bayangkan skenario ini.

Jadi, seperti yang Anda lihat, elemen pertama dari Blok B adalah isi dari blok sebelumnya. Jadi, dalam ayat ini, kami memeriksa apakah elemen pertama dari Blok sama dengan elemen dari blok sebelumnya. Jika sudah maka fungsi ini Benar jika tidak mengembalikan False.

Bagian 5

tx_amount = get_transaction_value ()

add_value (tx_amount)



sementara  Benar :

   cetak ( "Pilih opsi" )

   cetak ( 'Pilih 1 untuk menambah transaksi baru' )

   print ( 'Pilih 2 untuk mencetak blockchain' )

   cetak ( 'Pilih 3 jika Anda ingin memanipulasi data' )

   print ( 'Pilih hal lain jika Anda ingin berhenti' )



   user_choice = get_user_choice ()

   

   jika user_choice ==  1 :

       tx_amount = get_transaction_value ()

       add_value (tx_amount, get_last_value ())

   

   elif user_choice ==  2 :

       print_block ()

   

   elif user_choice ==  3 :

       jika  len (blockchain) > =  1 :

           blockchain [ 0 ] =  2

   

   lain :

       istirahat

   

   jika  tidak verifikasi_chain ():

       print ( 'Blockchain dimanipulasi' )

       Istirahat

Jadi, ini adalah bagian yang panjang, itulah sebabnya kita perlu membedakannya menjadi subbagian yang berbeda (lagi).

Subbagian 1: Inisialisasi

tx_amount = get_transaction_value ()

add_value (tx_amount

Kami memulai dengan menginisialisasi blok pertama blockchain. Kami mendapatkan nilai dari jumlah transaksi (tx_amount) dan kemudian memasukkan nilai ke dalam blok blockchain.

Subbagian 2: Memberi Pilihan

sementara  Benar :

   cetak ( "Pilih opsi" )

   cetak ( 'Pilih 1 untuk menambah transaksi baru' )

   print ( 'Pilih 2 untuk mencetak blockchain' )

   cetak ( 'Pilih 3 jika Anda ingin memanipulasi data' )

   print ( 'Pilih hal lain jika Anda ingin berhenti' )



   user_choice = get_user_choice ()

Ok jadi Subbagian 1 dan seterusnya, semua subbagian lain akan dieksekusi dalam loop sementara ini. Jadi, hal pertama yang kami lakukan adalah memberi pengguna opsi untuk memilih apa yang ingin mereka lakukan:

  • Tambahkan transaksi baru
  • Cetak blockchain
  • Memanipulasi data
  • Hentikan prosesnya

Setelah itu, user_choice menyimpan data pengguna

Subbagian 3: if-elif-elif-else

Jadi, tergantung pada pilihan, kami memiliki 4 kemungkinan. Kode ini terlihat seperti ini:

jika user_choice ==  1 :

       tx_amount = get_transaction_value ()

       add_value (tx_amount, get_last_value ())

   

   elif user_choice ==  2 :

       print_block ()

   

   elif user_choice ==  3 :

       jika  len (blockchain) > =  1 :

           blockchain [ 0 ] =  2

   lain :

       istirahat
  • Pertama, kami menambahkan transaksi ke blockchain. Kami mengisi input dari pengguna dan menyimpannya di tx_amount. Setelah kami memiliki nilai transaksi, kami menambahkannya, bersama dengan nilai elemen dari blok terakhir ke dalam blockchain
  • Kedua, kami memanggil fungsi cetak untuk mencetak blockchain
  • Ketiga, adalah fungsi memanipulasi. Kami telah memasukkan ini hanya untuk menunjukkan kepada Anda bagaimana blockchain ini akan bereaksi jika data dimanipulasi. Jadi, yang terjadi di sini adalah kita mengubah elemen pertama dari blockchain menjadi 2. Ini hanya berfungsi jika blockchain memiliki lebih dari 1 elemen (kondisi if memeriksa itu) Periksa subbagian berikut untuk mengetahui apa yang terjadi selanjutnya
  • Bagian terakhir cukup mudah. Jika pengguna mengirim beberapa opsi lain, maka blok lain akan aktif yang hanya menggunakan “break” untuk keluar dari loop sementara

Subbagian 4: Panggilan Verifikasi

jika  tidak verifikasi_chain ():

       print ( 'Blockchain dimanipulasi' )

       Istirahat

Jika pengguna memilih untuk memanipulasi blockchain, maka subbagian ini akan terpengaruh. Sekarang ingat, memverifikasi_chain () mengembalikan nilai Boolean:

  • Benar
  • Salah

Verify_chain () mengembalikan False jika manipulasi telah dilakukan.

Sekarang, subbagian ini menggunakan bukan kata kunci, yang mengubah False menjadi True. Ini pada gilirannya mengaktifkan fungsi cetak di dalam blok if untuk mencetak “Blockchain dimanipulasi”.

Output dari Program

Baiklah, jadi sekarang kita tahu bagaimana program itu bekerja. Mari kita lihat hasilnya.

Jadi, untuk melewati apa yang telah kita lakukan di atas

Kami memasukkan 3 nilai ke blockchain kami: 23.5, 43,1, dan 5.89

Kami kemudian mencetak blockchain yang memberikan ini:

Kami kemudian mencoba memanipulasi blockchain kami dengan mengubah data, tetapi sistem verifikasi bawaan kami menangkapnya dan memberikan hasil ini:

Baik, jadi kami memiliki struktur yang cukup bagus. Namun, kita masih perlu memasukkan fitur hashing dan proof-of-work ke kode kita. Jadi, karena kita sudah tahu daftar apa itu, mari kenali diri kita dengan tupel dan kamus.

Tuples dan Kamus

Tuples dan Kamus adalah struktur data beserta daftar. Mari kita bandingkan ketiga ini dan mencari tahu cara kerjanya.

Tuples sangat mirip dengan Daftar, namun, mereka tidak dapat diedit setelah dibuat. Kamus, di sisi lain, memiliki pengidentifikasi unik seperti NAME1 DAN NAME2 dalam contoh kami di atas yang menyimpan nilai.Mereka dapat diedit setelah dibuat.

Kami akan menggunakan struktur data ini di blockchain baru dan yang ditingkatkan.

Anda mungkin bertanya-tanya, “Apa gunanya melakukan itu?”

Nah, transaksi, blokir dll mengandung banyak metadata yang perlu disimpan. Pikirkan semua metadata yang dapat disimpan dalam transaksi:

  • ID pengirim
  • Id Penerima
  • Tanggal transaksi
  • Jumlah transaksi

Menambahkan semua data ini membantu kami melacak transaksi kami.

Menambahkan Fitur Penambangan dan Bukti Pekerjaan

Jadi, hal pertama yang perlu kita lakukan adalah menambahkan fiturpenambangan dan bukti kerja. Penambangan adalah proses dimana para penambang memecahkan teka-teki kriptografis sulit untuk menemukan blok untuk ditambahkan ke blockchain. Untuk menambang blok ini, para penambang mendapatkan hadiah yang disebut blok hadiah.

Di sisi lain, proof-of-work adalah metode penambangan dan konsensus yang digunakan dalam banyak cryptocurrency seperti Bitcoin . Kami akan menggunakan bukti kerja di blockchain kami.

Jika kita meringkas bagaimana Proof Of Work Protocol bekerja dengan blockchain.

  • Para penambang memecahkan teka-teki kriptografi untuk “menambang” satu blok untuk ditambahkan ke blockchain.
  • Proses ini membutuhkan sejumlah besar energi dan penggunaan komputasi. Teka-teki telah dirancang sedemikian rupa sehingga menyulitkan dan membebani sistem.
  • Ketika seorang penambang memecahkan teka-teki, mereka menyajikan blok mereka ke jaringan untuk verifikasi.
  • Memverifikasi apakah blok milik rantai atau tidak adalah proses yang sangat sederhana.

Baiklah, jadi mari kita lihat kode kita:

“”” Bagian 1 “””

impor  hashlib

impor  json



hadiah =  10,0



genesis_block = {

   'before_hash' : '' ,

   'indeks' : 0 ,

   'transaksi' : [],

   'nonce' : 23

}

blockchain = [genesis_block]

open_transactions = []

owner =  'Blockgeeks'



def  hash_block (blok):

   kembalikan hashlib . sha256 (json . kesedihan (blok) . encode ()) . hexdigest ()

“”” Seksi 2 “””

def  valid_proof (transaksi, last_hash, nonce):

   tebak = ( str (transaksi) +  str (last_hash) +  str (nonce)) . menyandi()

   guess_hash = hashlib . sha256 (tebak) . hexdigest ()

   print (guess_hash)

   return guess_hash [ 0 : 2 ] ==  '00'



def  pow ():

   last_block = blockchain [ - 1 ]

   last_hash = hash_block (last_block)

   nonce =  0

   sementara  tidak valid_proof (open_transactions, last_hash, nonce):

       nonce + =  1

   mengembalikan nonce

“” “Bagian 3” “”

def  get_last_value ():

   "" "mengekstraksi elemen terakhir dari daftar blockchain" ""

   kembali (blockchain [ - 1 ])



def  add_value (penerima, pengirim = pemilik, jumlah = 1.0 ):

   transaction = { 'sender' : sender,

   'penerima' : penerima,

   'jumlah' : jumlah}

   transaksi open_t . tambahkan (transaksi)

“” “Bagian 4” “”

def  mine_block ():

   last_block = blockchain [ - 1 ]

   hashed_block = hash_block (last_block)

   nonce =  pow ()

   reward_transaction = {

           'pengirim' : 'MINING' ,

           'penerima' : pemilik,

           'jumlah' : hadiah

       }

   transaksi open_t . append (reward_transaction)

   blok = {

       ' before_hash ' : hashed_block,

       'index' : len (blockchain),

       'transaksi' : open_transactions,

       'nonce' : nonce

   }

   blockchain . tambahkan (blok)

“” “Bagian 5” “”

def  get_transaction_value ():

   tx_recipient =  input ( 'Masukkan penerima transaksi:' )

   tx_amount =  float ( masukan ( 'Masukkan jumlah transaksi Anda' ))

   kembalikan tx_recipient, tx_amount



def  get_user_choice ():

   user_input =  input ( "Tolong beri pilihan Anda di sini:" )

   kembalikan user_input

“” “Bagian 6” “”

def  print_block ():

   untuk block di blockchain:

       print ( "Ini blokmu" )

       cetak (blok)

“” “Bagian 7” “”

sementara  Benar :

   cetak ( "Pilih opsi" )

   cetak ( 'Pilih 1 untuk menambah transaksi baru' )

   print ( 'Pilih 2 untuk menambang blok baru' )

   print ( 'Pilih 3 untuk mencetak blockchain' )

   print ( 'Pilih hal lain jika Anda ingin berhenti' )

   user_choice = get_user_choice ()

   

   jika user_choice ==  1 :

       tx_data = get_transaction_value ()

       penerima, jumlah = tx_data

       add_value (penerima, jumlah = jumlah)

       cetak (open_transactions)



   elif user_choice ==  2 :

       mine_block ()



   elif user_choice ==  3 :

       print_block ()

   

   lain :

       istirahat

Ok, jadi mari kita menganalisis kodenya.

Bagian 1

impor  hashlib

impor  json



hadiah =  10,0



genesis_block = {

   'before_hash' : '' ,

   'indeks' : 0 ,

   'transaksi' : [],

   'nonce' : 23

}

blockchain = [genesis_block]

open_transactions = []

owner =  'Blockgeeks'



def  hash_block (blok):

   kembalikan hashlib . sha256 (json . kesedihan (blok) . encode ()) . hexdigest ()

Hal pertama yang kami lakukan di sini adalah mengimpor perpustakaan hash. Kami secara khusus mengimpor:

  • hashlib: Untuk menggunakan fungsi hashing mereka
  • json: Kami membutuhkan paket ini untuk mengubah blok dari kamus ke string.

Setelah itu, kami mendeklarasikan “hadiah”, variabel global yang akan menyimpan hadiah blok penambangan yang akan kami berikan kepada penambang kami untuk menambang blok.

Selanjutnya kita memiliki blok genesis kita. Blok genesis adalah blok pertama di blockchain. Kami menggunakan 4 metadatas di blok kami:

  • Previous_hash : Menyimpan hash dari blok sebelumnya. Ini akan menjadi string kosong karena blok genesis tidak akan memiliki hash sebelumnya.
  • Indeks : Ini adalah indeks blok di blockchain. Karena blok genesis adalah blok pertama, indeksnya diinisialisasi ke 0. Ingat dalam terminologi pemrograman, elemen pertama dalam daftar berada di posisi ke-0
  • Transaksi : Transaksi yang disimpan di dalam blockchain. Karena ini tidak ada, itu adalah daftar kosong.
  • Nonce : Kami akan menjelaskan ini nanti. Ini diinisialisasi ke 23 yang merupakan nilai dummy.

Setelah blok genesis diinisialisasi, itu akan ditambahkan ke blockchain pada langkah selanjutnya melalui blockchain = [genesis_block].

Open_transactions : Daftar yang mengelola semua transaksi yang beredar di blockchain. Ini adalah daftar kosong di awal.

Karena kami adalah pemilik dan pengirim transaksi ini, kami telah menginisialisasi ini sejak awal

Selanjutnya kita memiliki fungsi hash_block ()

Di dalamnya kita mengembalikan hash dari blok menggunakan ungkapan ini:

hashlib.sha256 (json.dumps (blok) .encode ()). hexdigest ()

Jadi, mari kita lihat apa yang kita lakukan di sini:

  • Menggunakan algoritma hashing sha256 hashlib.
  • Fungsi json.dumps kemudian ikut bermain dan mengubah blok yang merupakan kamus menjadi string berformat json. Namun, hashlib tidak dapat membacanya sehingga selanjutnya kita memiliki….
  • Fungsi encode (). Ini mengubah string yang diformat json menjadi string UTF-8 yang dapat dibaca oleh hashlib.
  • Output hashlib adalah hash byte. Jadi kami akhirnya menggunakan metode hexdigest () untuk mengubahnya menjadi string normal.

Seksi 2

def  valid_proof (transaksi, last_hash, nonce):

   tebak = ( str (transaksi) +  str (last_hash) +  str (nonce)) . menyandi()

   guess_hash = hashlib . sha256 (tebak) . hexdigest ()

   print (guess_hash)

   return guess_hash [ 0 : 2 ] ==  '00'



def  pow ():

   last_block = blockchain [ - 1 ]

   last_hash = hash_block (last_block)

   nonce =  0

   sementara  tidak valid_proof (open_transactions, last_hash, nonce):

       nonce + =  1

   mengembalikan nonce

Di bagian 2, kami memiliki dua fungsi:

  • Valid_proof
  • Fungsi pow
valid_proof ()



def  valid_proof (transaksi, last_hash, nonce):

   tebak = ( str (transaksi) +  str (last_hash) +  str (nonce)) . menyandi()

   guess_hash = hashlib . sha256 (tebak) . hexdigest ()

   print (guess_hash)

   return guess_hash [ 0 : 2 ] ==  '00'

Jadi, fungsi valid_proof () memiliki tiga argumen:

  • Transaksi: Transaksi di dalam blok
  • Hash terakhir: Hash dari blok terakhir
  • Nonce

Ok, jadi apa sebenarnya nonce? Nah sebelum itu, kita perlu tahu apa artinya kesulitan. “Kesulitan” adalah ide untuk membuat penambangan sekeras mungkin. Jika penambangan tidak sulit, maka semua koin dalam sistem akan dipompa keluar dengan mudah, membuat mereka sama sekali tidak berguna.

Jadi, cara kita menghitung hash sistem adalah dengan menggabungkan transaksi, hash dari blok terakhir dan nonce menjadi string tunggal dan kemudian hashing. Hash hanya dapat diterima jika dua huruf pertama adalah nol.

Itulah cara kami membawa kesulitan. Tidak mungkin untuk memprediksi bagaimana hash akan berubah menjadi dan itu lebih merupakan undian.Inilah sebabnya, sangat sulit untuk mendapatkan hash yang dimulai dengan pola tertentu (seperti 2 0s).

Fungsi mengembalikan True jika program memiliki hash yang valid dan False jika tidak.

Fungsi pow ()

Selanjutnya kami memiliki bukti kerja atau fungsi pow ().

def  pow ():

   last_block = blockchain [ - 1 ]

   last_hash = hash_block (last_block)

   nonce =  0

   sementara  tidak valid_proof (open_transactions, last_hash, nonce):

       nonce + =  1

   mengembalikan nonce

Fungsi ini sangat mudah:

  • Pertama kita mengekstraksi blok terakhir dari blockchain dan memasukkannya ke last_block
  • Kami kemudian hashing the last_block dan menempatkan mereka ke last_hash
  • Loop sementara terus berjalan sampai fungsi valid_proof mengembalikan TRUE. (The not convert akan mengkonversi TRUE menjadi FALSE dan karenanya keluar dari loop)
  • Nonce kemudian dikembalikan.

Bagian 3

def  get_last_value ():

   "" "mengekstraksi elemen terakhir dari daftar blockchain" ""

   kembali (blockchain [ - 1 ])



def  add_value (penerima, pengirim = pemilik, jumlah = 1.0 ):

   transaction = { 'sender' : sender,

   'penerima' : penerima,

   'jumlah' : jumlah}

   transaksi open_t . tambahkan (transaksi)

Di bagian ini kita memiliki dua fungsi lagi:

  • get_last_value
  • Tambahkan nilai

Nilai get_last_value ()

Yang ini cukup mudah. Itu mengekstrak blok terakhir dari blockchain.

Tambahkan nilai()

Fungsi menerima metadata transaksi, yaitu:

  • Nama pengirim
  • Nama penerima
  • Jumlah transaksi

Setelah itu, transaksi ditambahkan ke daftar transaksi open_t.

Bagian 4

def  mine_block ():

   last_block = blockchain [ - 1 ]

   hashed_block = hash_block (last_block)

   nonce =  pow ()

   reward_transaction = {

           'pengirim' : 'MINING' ,

           'penerima' : pemilik,

           'jumlah' : hadiah

       }

   transaksi open_t . append (reward_transaction)

   blok = {

       ' before_hash ' : hashed_block,

       'index' : len (blockchain),

       'transaksi' : open_transactions,

       'nonce' : nonce

   }

   blockchain . tambahkan (blok)

Di bagian ini kami memiliki satu fungsi, fungsi mine_block () yang akan memungkinkan Anda untuk menambang blok

Jadi, dalam fungsi ini, berikut ini akan terjadi:

  • Ekstrak blok terakhir dari blockchain dan taruh di last_block
  • Hash blok terakhir
  • Gunakan fungsi pow () untuk mengekstrak nonce
  • Buat transaksi reward_transaksi yang memberi penghargaan kepada penambang, yaitu, kami dengan jumlah hadiah yang telah kami tentukan sebelumnya (koin 10,0)
  • Transaksi reward_t akan ditambahkan ke daftar open_transaction
  • Akhirnya, dengan notce baru yang disetujui, kami akhirnya memiliki blok baru, yang membantu kami mendapatkan metadata dari blok baru,
  • Blok baru ditambahkan ke blockchain

Bagian 5

def  get_transaction_value ():

   tx_recipient =  input ( 'Masukkan penerima transaksi:' )

   tx_amount =  float ( masukan ( 'Masukkan jumlah transaksi Anda' ))

   kembalikan tx_recipient, tx_amount



def  get_user_choice ():

   user_input =  input ( "Tolong beri pilihan Anda di sini:" )

   kembalikan user_input

Di bagian ini kami memiliki dua fungsi:

  • get_transaction_value ()
  • get_user_choice ()

# 1 get_transaction_value ()

Fungsi ini menerima metadata transaksi seperti nama penerima dan jumlah transaksi.

Pada saat yang sama, lihat pernyataan pengembalian.

kembalikan tx_recipient, tx_amount

Fungsi ini mengembalikan sebuah tuple (kita berbicara tentang tuple sebelum diingat?)

# 2 get_user_choice

Fungsi ini pada dasarnya mengambil pilihan pengguna dan mengembalikannya. Ini sangat mirip dengan fungsi get_user_choice () di program sebelumnya.

Bagian 6

def  print_block ():

   untuk block di blockchain:

       print ( "Ini blokmu" )

       cetak (blok)

Mirip dengan program terakhir, ini adalah fungsi cetak yang mencetak blockchain.

Bagian 7

sementara  Benar :

   cetak ( "Pilih opsi" )

   cetak ( 'Pilih 1 untuk menambah transaksi baru' )

   print ( 'Pilih 2 untuk menambang blok baru' )

   print ( 'Pilih 3 untuk mencetak blockchain' )

   print ( 'Pilih hal lain jika Anda ingin berhenti' )

   user_choice = get_user_choice ()

   

   jika user_choice ==  1 :

       tx_data = get_transaction_value ()

       penerima, jumlah = tx_data

       add_value (penerima, jumlah = jumlah)

       cetak (open_transactions)



   elif user_choice ==  2 :

       mine_block ()



   elif user_choice ==  3 :

       print_block ()

   

   lain :

       istirahat

Ini juga mirip dengan program terakhir. Pengguna mendapat pilihan untuk:

  • Masukkan transaksi
  • Milik saya satu blok
  • Cetak blockchain

Sekarang mari kita periksa output dari program.

Output dari Program

Pertama dan terpenting, mari kita pilih opsi 2 dan menambang blok. Saat Anda melakukannya, kami mendapatkan blok hash berikut:

Tampaknya membingungkan, sampai Anda memperhatikan sedikit lebih dekat dan memeriksa hash terakhir:

“001f946e8c2172affa830ef27761270aab2de515ffac8ae90e5de95b48dc366c”

Apakah Anda melihat apa yang istimewa dari hash ini?

Ingat kesulitan yang kita atur sebelumnya? Kami secara khusus mencarihash yang dimulai dengan “00”. Inilah sebabnya, komputer dijalankan melalui banyak hash dengan mengubah nonce sampai akhirnya menemukan hash yang memenuhi kriteria kesulitan yang diberikan.

Baiklah, jadi sekarang mari kita tambahkan transaksi. Misalkan saya ingin mengirim Sam, 2,4 koin, kami akan memilih opsi 1 dan mendapatkan output berikut:

Perhatikan baris terakhir. Ini menunjukkan dua transaksi yang telah kami lakukan sejauh ini.

Tunggu … dua transaksi? Kami baru saja melakukan yang benar?

Tidak terlalu. Ingat bahwa kami telah menambang satu blok sebelum ini, kan? Jadi transaksi blok hadiah juga ditampilkan di sini.

Akhirnya, mari kita cetak blockchain.

Jadi, kami memiliki dua blok:

  • Pertama-tama, kita memiliki blok genesis yang telah kita nyatakan sendiri. The nonce adalah sesuatu yang kita masukkan ke dalam diri kita sendiri yaitu 23
  • Selanjutnya, kita memiliki blok kedua, yang mencakup transaksi penambangan dan transaksi yang kita lakukan sendiri dengan “Sam”.Kekurangan dari blok adalah 93

Kesimpulan

Jadi, begitulah. Kami setidaknya memiliki sedikit blockchain yang berfungsidikodekan melalui Python. Jika Anda tertarik untuk mengetahui lebih banyak, silakan lanjutkan penelitian Anda sendiri. Kami merasa bahwa python adalah bahasa yang harus Anda kuasai jika Anda ingin berkembang. Ini adalah bahasa yang sangat menyenangkan dan mudah dipelajari yang dapat membuka pintu untuk peluang tak terbatas.

Source :
https://blockgeeks.com/guides/python-blockchain-2/