İlk Kısmı Tekrarlamak

İlk bölümde Python’un temellerini öğrendik. İf-elif-else ve döngülerin sistemde nasıl çalıştığını öğrendik. Temel olarak Python’da basit kod yapmayı öğrendik. Bu bölümde blok zincirimizi oluşturmaya başlayacağız. Yani, daha fazla uzatmadan başlayalım!

Python ve Blockchain İçin En İyi Kılavuz: Bölüm 2

Python Blok Zincirimizi Oluşturmak: Listelerin Tanıtımı

Pekala, temel bilgiler için bu kadar yeter. Şimdi blok zincirimizi oluşturalım!

Bunu listeleri tanıtarak yapacağız. Listeler temelde herhangi bir türde olabilecek bir veri grubudur. Şöyle tanımlanırlar:

Liste_adı = [öğe 1, öğe 2, öğe 3 …… öğe n]

Öğeler, daha önce açıkladığımız gibi, herhangi bir veri türünde olabilir. Bir tamsayı, kayan nokta, dizge veya hatta başka bir liste (daha sonra kullanacağız) olabilir. Bunun nasıl çalışacağını görelim. Bunun için terminalimizi kullanacağız:

Yukarıdaki koddan not edilecek bazı şeyler.

Listenin tek tek öğelerini blok zincirindeki bloklar olarak düşünün. Aslında o kadar da zor değil, belli ki bunu daha sonra daha karmaşık hale getireceğiz. Listenin kendisi, blok zincirinin bu “zincir” öğesini vermek için tüm bu verileri birbirine bağlar..

Şimdi, fark edeceğiniz başka bir şey, her bir elemanın dizin numarasıdır. İlk elemanın indeksi 0’dır. Bu yüzden, ilk elemanı yazdırmak istediğimizde “blok zinciri [0]” diyoruz..

Listenin Öğelerini Değiştirme

Değiştirilemeyen bir liste işe yaramaz. Listeden öğe eklemek ve çıkarmak için hükümlere ihtiyacınız var. Şimdi, Bitcoin benzeri bir blok zincirinde öğeleri kaldırmanın imkansız olduğunu biliyoruz, ancak şu anda hala bir listeyle uğraşıyoruz.

Peki bunu nasıl yapacağız?

İki liste işlevi kullanacağız:

  • ekle ()
  • pop()

Ekleme işlevi, listeye daha fazla öğe ekler. Öyleyse eski listemizi geri getirin:

blok zinciri = [1, 2, 5.6].

Buna “Blockgeeks” eklemek istiyorsak, basitçe şunu söyleyeceğiz: blockchain.append (“Blockgeeks”)

Şimdi onu yazdırdığımızda şunu gösteriyor:

[1, 2, 5.6, “Blockgeeks”]

Şimdi bazı verileri kaldıralım.

Bunun için son öğeyi listeden kaldıracak olan pop () işlevini kullanacağız. Yani, blockchain.pop [] yaparsak, şimdi “Blockgeeks” i kaldıracak ve şunu gösterecektir:

[1, 2, 5.6]

İşlevler aracılığıyla Çalışma Süresi Sırasında Eleman Ekleme

Şimdi biraz eğlenelim.

Çalışma zamanı sırasında listeye eleman eklemek için bir fonksiyon kullanacağız. Bu programı düşünün:

blockchain = []

def add_list ():

   blockchain.append (3.2)

   baskı (blok zinciri)

liste ekle()

liste ekle()

liste ekle()

Bu nedenle, her çağrıldığında blok zinciri listesine 3.2 ekleyecek “add_list ()” adlı bir işlev tanımladık. Boş listeyi blockchain = [] ile nasıl ilan ettiğimizi fark ettiniz mi? Bu, verileri nasıl sıfırdan ekleyebileceğinizi size gösterebilmemiz için yapıldı..

Yani, eğer basarsak, böyle görünecek. Visual Studio Code btw’ye geri döndük.

Python ve Blockchain İçin En İyi Kılavuz: Bölüm 2

Listeye Blockchain Benzeri Mülkiyet Verme

Şimdiye kadar hemen hemen normal bir liste ile uğraştık. Ancak bloklar arasında daha organik bir bağlantı olması gerekiyor..

Blokların gerçek bir blok zincirinde birbirine bağlı olmasının nedeni, önceki bloğun verilerini de içermeleridir. Son elemanın verilerini iç içe geçmiş bir liste aracılığıyla en son elemana ekleyerek yapacağımız tam olarak budur. Python’da, [-1] dizinini kullanarak listenin sonunun verilerini alabilirsiniz..

Dolayısıyla, blok zincirinde [1, 2, 3] varsa, blok zinciri [-1] size 3 verir.

Her neyse, kodu kontrol edelim, kullanıcıdan blockchain elemanının değerini almak için input () fonksiyonunu kullanacağız..

element1 = input ("Blok zincirinin ilk unsurunu verin ")

blockchain = [element1]

def add_list ():

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

   baskı (blok zinciri)

liste ekle()

liste ekle()

liste ekle()

Şimdi bunu yazdırdığınızda şunları alacaksınız:

Python ve Blockchain İçin En İyi Kılavuz: Bölüm 2

Tamam, şimdiye kadar blok zincirimize biraz karakter verdik, ancak hala çalışma modelimize yakın bir şeyimiz yok. Endişelenmeyin, bu yakında çözülecek.

Çalışan Bir Blok Zincirine Yaklaşmak

blockchain = []

“”” Bölüm 1 “””

def get_last_value ():

   """ blok zinciri listesinin son unsurunu çıkarmak """

   dönüş (blok zinciri [-1])

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

   blockchain.append ([last_transaction, transaction_amount])

“”” Bölüm 2 “””

def get_transaction_value ():

   user_value = float (input (‘İşlem tutarınızı girin’))

   user_value döndür

def get_user_choice ():

   user_input = input ("Lütfen seçiminizi burada belirtin: ")

   user_input döndür

“” “Bölüm 3” “”

def print_block ():

   blok zincirinde blok için:

       Yazdır("İşte bloğun")

       yazdır (engelle)

“”” Bölüm 4 “””

def valid_chain ():

   dizin = 0

   valid = True

   blok zincirinde blok için:

       indeks == 0 ise:

           dizin + = 1

           devam et

       elif bloğu [0] == blok zinciri [dizin – 1]:

           valid = True

       Başka:

           valid = False

           kırmak

       dizin + = 1

   geçerli dönüş

“” “Bölüm 5” “”

tx_amount = get_transaction_value ()

add_value (tx_amount)

True iken:

   Yazdır("Bir seçenek seçin")

   print (‘Yeni bir işlem eklemek için 1’i seçin’)

   print (‘Blok zincirini yazdırmak için 2 seçin’)

   print (‘Verileri değiştirmek istiyorsanız 3 seçin’)

   print (‘Çıkmak istiyorsanız başka bir şey seçin’)

   user_choice = get_user_choice ()

   

   user_choice == 1 ise:

       tx_amount = get_transaction_value ()

       add_value (tx_amount, get_last_value ())

   

   elif user_choice == 2:

       print_block ()

   

   elif user_choice == 3:

       eğer len (blockchain) >= 1:

           blok zinciri [0] = 2

   

   Başka:

       kırmak

   

   valid_chain () değilse:

       print (‘Blockchain değiştirildi’)

       kırmak

Evet, bunun çok büyük bir kod bloğu olduğunu biliyoruz, ancak kodun her bölümünde neler olduğunu anlamanıza yardımcı olmak için her şeyi farklı bölümlere ayırdık..

Burada yapmaya çalıştığımız şey, statik bildirime bağlı olmayan bir prototip blok zinciri oluşturmaktır. Yani, kullanıcılar çalışma süresi boyunca verileri kendileri doldurabilir. Bu yüzden kodun ilk satırını görürseniz boş bir blockchain ile başladığımızı göreceksiniz..

Pekala, hadi bölümleri incelemeye başlayalım.

Not: Yukarıdaki kodu kopyalayıp yapıştırmanızı ve yeni bir pencerede veya bir doc dosyasında açık tutmanızı öneririz. Aşağıdaki açıklamada kodun farklı bölümlerine atıfta bulunmaya devam edeceğiz ve takip etmeniz sizin için daha kolay olacaktır.

Bölüm 1

def get_last_value ():

   """ blok zinciri listesinin son unsurunu çıkarmak """

   dönüş (blok zinciri [-1])

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

   blockchain.append ([last_transaction, transaction_amount])

Yani, bu ilk bölümde şimdiye kadar oldukça bilgili olmalısınız. Burada iki şey yapıyoruz:

  • Blok zincirinin son unsurunu çıkarmak
  • Bir bloktaki mevcut öğeyle birlikte son öğeyi blok zincirine eklemek.

Add_value işlevindeki argümanlara bir göz atın:

  • Last_transaction
  • İşlem tutarı

İşlem_tutarı, blok zincirine konulacak işlemin değeridir. Last_transaction değişkeni ise yeni bloğa konulacak olan son bloktaki işlemin değeridir..

Öyleyse, neden last_transaction’ı [1] ‘e başlatıyoruz??

Bu, yalnızca çalışma sırasında bir hatayı önlemek için yapılır. Şunu bir düşünün, eğer blok zincirinin ilk bloğuyla uğraşıyorsak, o zaman herhangi bir “last_transaction” olmayacak mı? “Last_transaction” kavramının var olması için en az iki bloğa ihtiyacınız olacak. Bu nedenle, ilk blokta herhangi bir hata olasılığını ortadan kaldırmak için, last_transaction [1] olarak başlatılır..

Bölüm 2

def get_transaction_value ():

   user_value = float (input (‘İşlem tutarınızı girin’))

   user_value döndür

def get_user_choice ():

   user_input = input ("Lütfen seçiminizi burada belirtin: ")

   user_input döndür

Bu bölüme giriş bölümü diyelim. Burada iki fonksiyonumuz var:

  • get_transaction_value ()
  • get_user_choice ()

İlk işlevde, kullanıcıdan blok zincirine girmek istediği işlem tutarının değerini girmesini istiyoruz. Şimdi unutmayın, input () işlevi bir dize değeri döndürür. Bu nedenle, bu sayıyı kayan bir sayıya dönüştürmek için float () işlevini kullanıyoruz.

İkinci işlevde, kullanıcıdan seçimini girmesini isteyeceğiz.

Şimdi merak ediyor olabilirsiniz, “Hangi seçimden bahsediyorsunuz?”

Peki, Bölüm 5’i ele alalım. Özellikle while döngüsünü. Orada sorduğumuz seçeneği görüyor musun?

Yazdır("Bir seçenek seçin")

print (‘Yeni bir işlem eklemek için 1’i seçin’)

print (‘Blok zincirini yazdırmak için 2 seçin’)

print (‘Verileri değiştirmek istiyorsanız 3 seçin’)

print (‘Çıkmak istiyorsanız başka bir şey seçin’)

Bu nedenle get_user_choice () işlevi, kullanıcının ne yapmak istediğini anlamasına yardımcı olmak için seçim yapmak için kullanılır..

3. Bölüm

def print_block ():

   blok zincirinde blok için:

       Yazdır("İşte bloğun")

       yazdır (engelle)

Bu çok basit bir bölümdür. Blok zincirinin her bloğunu yazdırmak için for döngüsünü kullanıyoruz.

Bölüm 4

def valid_chain ():

   dizin = 0

   valid = True

   blok zincirinde blok için:

       indeks == 0 ise:

           dizin + = 1

           devam et

       elif bloğu [0] == blok zinciri [dizin – 1]:

           valid = True

       Başka:

           valid = False

           kırmak

       dizin + = 1

   geçerli dönüş

Şimdi bu şimdiye kadar yapmadığımız bir şey.

Bu bölümde, blok zincirinin geçerliliğini doğruluyoruz. Bununla tam olarak ne demek istiyoruz.

Bildiğiniz gibi, bir blockchain değişmez olmalıdır. Henüz herhangi bir karma işlevi kullanmadığımız için, zincirin kurcalanmış olduğunu göstermek için başka bir şey kullanalım. Bu nedenle, bu işlevde bir doğrulama_ zinciri işlevi kullanıyoruz.

Peki, burada ne yapıyoruz?

Öncelikle iki değişkenimiz var:

  • İndeks = Blok zincirindeki bloklardan geçmek için kullanacağımız bir sayaç
  • Geçerli = Bu işlevin son değeri olarak Doğru veya Yanlış döndüren bir Boole değişkeni

Bundan sonra, blokları yazdırmak için bir döngü kullandığımız önceki bölüme oldukça benzer şekilde, blok zincirinden geçmek için bir for döngüsü kullanıyoruz. Döngünün içinde üç koşullu ifade kullanıyoruz, hadi bunların her birini gözden geçirelim:

İf Alt bölümü

Bu, dizinin 0 olup olmadığını kontrol eder. Öyleyse, dizin 1 artar

Elif Alt Bölümü

Bu, bazı tahrifatın yapılıp yapılmadığını kontrol ettiğimiz kısımdır. Bunun nasıl çalıştığını anlamak için bu senaryoyu hayal edin.

Python ve Blockchain İçin En İyi Kılavuz: Bölüm 2

Gördüğünüz gibi, B Blok’un ilk elemanı, önceki bloğunun içeriğidir. Dolayısıyla, bu alt bölümde, Bloğun ilk elemanının önceki bloğun elemanlarına eşit olup olmadığını kontrol ediyoruz. Eğer öyleyse bu işlev True ise aksi takdirde False döndürür.

Bölüm 5

tx_amount = get_transaction_value ()

add_value (tx_amount)

True iken:

   Yazdır("Bir seçenek seçin")

   print (‘Yeni bir işlem eklemek için 1’i seçin’)

   print (‘Blok zincirini yazdırmak için 2 seçin’)

   print (‘Verileri değiştirmek istiyorsanız 3 seçin’)

   print (‘Çıkmak istiyorsanız başka bir şey seçin’)

   user_choice = get_user_choice ()

   

   user_choice == 1 ise:

       tx_amount = get_transaction_value ()

       add_value (tx_amount, get_last_value ())

   

   elif user_choice == 2:

       print_block ()

   

   elif user_choice == 3:

       eğer len (blockchain) >= 1:

           blok zinciri [0] = 2

   

   Başka:

       kırmak

   

   valid_chain () değilse:

       print (‘Blockchain değiştirildi’)

       Break

Yani, bu uzun bir bölüm, bu yüzden onu farklı alt bölümlere ayırmamız gerekecek (tekrar).

Alt bölüm 1: Başlatma

tx_amount = get_transaction_value ()

add_value (tx_amount

Blok zincirinin ilk bloğunu başlatarak başlıyoruz. İşlem tutarının değerini (tx_amount) alıyoruz ve ardından değeri blok zincirinin bloğuna giriyoruz.

Alt Bölüm 2: Bir Seçim Yapma

True iken:

   Yazdır("Bir seçenek seçin")

   print (‘Yeni bir işlem eklemek için 1’i seçin’)

   print (‘Blok zincirini yazdırmak için 2 seçin’)

   print (‘Verileri değiştirmek istiyorsanız 3 seçin’)

   print (‘Çıkmak istiyorsanız başka bir şey seçin’)

   user_choice = get_user_choice ()

Tamam, altbölüm 1’den itibaren, diğer tüm alt bölümler bu while döngüsü içinde yürütülecek. Bu nedenle, yaptığımız ilk şey, kullanıcılara tam olarak ne yapmak istediklerini seçme seçeneği sunmaktır:

  • Yeni bir işlem ekleyin
  • Blok zincirini yazdırın
  • Verileri işleyin
  • İşlemden çıkın

Bundan sonra user_choice, kullanıcının verilerini depolar

Alt bölüm 3: if-elif-elif-else

Yani, seçime bağlı olarak 4 seçeneğimiz var. Kod şuna benzer:

user_choice == 1 ise:

       tx_amount = get_transaction_value ()

       add_value (tx_amount, get_last_value ())

   

   elif user_choice == 2:

       print_block ()

   

   elif user_choice == 3:

       eğer len (blockchain) >= 1:

           blok zinciri [0] = 2

   Başka:

       kırmak

  • İlk olarak işlemi blok zincirine ekliyoruz. Kullanıcıdan gelen girdiyi doldurur ve tx_amount’a kaydederiz. İşlem değerine sahip olduğumuzda, bunu son bloktan blok zincirine elemanların değeriyle birlikte ekliyoruz.
  • İkinci olarak, blok zincirini yazdırmak için yazdırma işlevini çağırıyoruz
  • Üçüncüsü, manipüle etme işlevidir. Bunu, veriler manipüle edilirse bu blok zincirinin nasıl tepki vereceğini size göstermek için dahil ettik. Yani burada olan şey, blok zincirinin ilk unsurunu 2’ye değiştirmemizdir. Bu sadece blok zincirinde 1’den fazla element varsa çalışır (if koşulu bunu kontrol eder)

    Daha sonra ne olacağını öğrenmek için aşağıdaki alt bölümü kontrol edin

  • Son kısım oldukça basit. Kullanıcı başka bir seçenek gönderirse, while döngüsünden çıkmak için sadece “break” kullanan else bloğu etkinleşir.

Alt Bölüm 4: Doğrulama Çağrısı

valid_chain () değilse:

       print (‘Blockchain değiştirildi’)

       Break

Kullanıcı blok zincirini manipüle etmeyi seçerse, bu alt bölüm etkilenir. Şimdi, valid_chain () işlevinin bir Boolean değeri döndürdüğünü unutmayın:

  • Doğru
  • Yanlış

Doğrulama zinciri (), manipülasyon yapıldıysa False döndürür.

Şimdi, bu alt bölüm, değil False’ı True’ya dönüştüren anahtar kelime. Bu, sırayla “Blockchain manipüle edilmiş” yazdırmak için if-bloğu içindeki yazdırma işlevini etkinleştirir..

Programın Çıktıları

Pekala, şimdi programın nasıl çalıştığını biliyoruz. Çıktılara bir göz atalım.

Python ve Blockchain İçin En İyi Kılavuz: Bölüm 2

Öyleyse, yukarıda yaptığımız şeyi gözden geçirmek için

Blok zincirimize 3 değer girdik: 23.5, 43,1 ve 5.89

Daha sonra bunu veren blockchain’i yazdırdık:

Python ve Blockchain İçin En İyi Kılavuz: Bölüm 2

Daha sonra bir veriyi değiştirerek blok zincirimizi değiştirmeye çalıştık, ancak yerleşik doğrulama sistemimiz bunu yakaladı ve şu çıktıyı verdi:

Python ve Blockchain İçin En İyi Kılavuz: Bölüm 2

Güzel, yani şimdiye kadar oldukça iyi bir yapıya sahibiz. Ancak, yine de dahil etmemiz gerekiyor hashing ve kodumuza çalışma kanıtı özellikleri. O halde, listelerin ne olduğunu zaten bildiğimiz için, lüleler ve sözlükler hakkında bilgi edelim.

Tuples ve Sözlükler

Tuples ve Sözlükler, listelerle birlikte veri yapılarıdır. Şimdi bu üçünü karşılaştıralım ve nasıl çalıştıklarını öğrenelim.

Python ve Blockchain İçin En İyi Kılavuz: Bölüm 2

Tuples, Listelere oldukça benzer, ancak oluşturulduktan sonra düzenlenemezler. Öte yandan sözlükler, yukarıdaki örneğimizde değerleri depolayan NAME1 VE NAME2 gibi benzersiz tanımlayıcılara sahiptir. Oluşturulduktan sonra düzenlenebilirler.

Bu veri yapılarını yeni ve geliştirilmiş blok zincirimizde kullanacağız.

Merak ediyor olabilirsiniz, “Bunu yapmanın anlamı nedir?”

İşlemler, bloklar vb. Saklanması gereken çok sayıda meta veri içerir. Bir işlemde depolanabilecek tüm meta verileri düşünün:

  • Gönderenin kimliği
  • Alıcının kimliği
  • İşlem Tarihi
  • İşlem tutarı

Tüm bu verileri eklemek, işlemlerimizi takip etmemize yardımcı olur.

Madencilik ve Çalışma Kanıtı Özelliklerinin Eklenmesi

Yani, yapmamız gereken ilk şey madencilik özellikleri ve iş kanıtı eklemek. Madencilik, madencilerin blok zincirine eklenecek blokları bulmak için kriptografik olarak zor bulmacaları çözme sürecidir. Bu blokları kazmak için madenciler blok ödülü adı verilen bir ödül alırlar..

Öte yandan, iş kanıtı, Bitcoin gibi birçok kripto para biriminde kullanılan madencilik ve fikir birliği yöntemidir. Blok zincirimizde iş kanıtı kullanacağız.

Proof of Work Protokolünün blockchain ile nasıl çalıştığını özetleyecek olursak.

  • Madenciler, blok zincirine eklemek için bir bloğu “çıkarmak” için kriptografik bulmacaları çözer.
  • Bu süreç, muazzam miktarda enerji ve hesaplamalı kullanım gerektirir. Bulmacalar, sistemi zorlaştıracak ve yorucu olacak şekilde tasarlanmıştır..
  • Bir madenci bulmacayı çözdüğünde, bloklarını doğrulama için ağa sunarlar.
  • Bloğun zincire ait olup olmadığını doğrulamak son derece basit bir işlemdir.

Pekala, şimdi kodumuza bakalım:

“”” Bölüm 1 “””

hashlib’i içe aktar

json içe aktar

ödül = 10.0

genesis_block = {

   ‘previous_hash’: ”,

   “dizin”: 0,

   “işlem”: [],

   “nonce”: 23

}

blockchain = [genesis_block]

open_transactions = []

owner = ‘Blockgeeks’

def hash_block (blok):

   hashlib.sha256 (json.dumps (blok) .encode ()). hexdigest () döndür

“”” Bölüm 2 “””

def valid_proof (işlemler, son_hash, nonce):

   tahmin = (str (işlemler) + str (son_hash) + str (nonce)). encode ()

   tahmin_hash = hashlib.sha256 (tahmin) .hexdigest ()

   yazdır (tahmin_hash)

   return tahmini_hash [0: 2] == ’00’

def pow ():

   last_block = blok zinciri [-1]

   last_hash = hash_block (last_block)

   nonce = 0

   geçerli değilken (open_transactions, last_hash, nonce):

       nonce + = 1

   dönüş

“” “Bölüm 3” “”

def get_last_value ():

   """ blok zinciri listesinin son unsurunu çıkarmak """

   dönüş (blok zinciri [-1])

def add_value (alıcı, gönderen = sahip, miktar = 1.0):

   transaction = {‘gönderen’: gönderen,

   “alıcı”: alıcı,

   “miktar”: miktar}

   open_transactions.append (işlem)

“”” Bölüm 4 “””

def mine_block ():

   last_block = blok zinciri [-1]

   hashed_block = hash_block (last_block)

   nonce = pow ()

   reward_transaction = {

           “gönderen”: “MADENCİLİK”,

           “alıcı”: sahip,

           “miktar”: ödül

       }

   open_transactions.append (reward_transaction)

   block = {

       “previous_hash”: hashed_block,

       ‘dizin’: len (blok zinciri),

       “işlem”: open_transactions,

       ‘nonce’: nonce

   }

   blockchain.append (blok)

“” “Bölüm 5” “”

def get_transaction_value ():

   tx_recipient = input (‘İşlemin alıcısını girin:’)

   tx_amount = float (input (‘İşlem tutarınızı girin’))

   return tx_recipient, tx_amount

def get_user_choice ():

   user_input = input ("Lütfen seçiminizi burada belirtin: ")

   user_input döndür

“” “Bölüm 6” “”

def print_block ():

   blok zincirinde blok için:

       Yazdır("İşte bloğun")

       yazdır (engelle)

“” “Bölüm 7” “”

True iken:

   Yazdır("Bir seçenek seçin")

   print (‘Yeni bir işlem eklemek için 1’i seçin’)

   print (‘Yeni bir blokta madencilik yapmak için 2 seçin’)

   print (‘Blok zinciri yazdırmak için 3’ü seçin’)

   print (‘Çıkmak istiyorsanız başka bir şey seçin’)

   user_choice = get_user_choice ()

   

   user_choice == 1 ise:

       tx_data = get_transaction_value ()

       alıcı, miktar = tx_data

       add_value (alıcı, miktar = miktar)

       baskı (open_transactions)

   elif user_choice == 2:

       mayın_block ()

   elif user_choice == 3:

       print_block ()

   

   Başka:

       kırmak

Tamam, şimdi kodu analiz edelim.

Bölüm 1

hashlib’i içe aktar

json içe aktar

ödül = 10.0

genesis_block = {

   ‘previous_hash’: ”,

   “dizin”: 0,

   “işlem”: [],

   “nonce”: 23

}

blockchain = [genesis_block]

open_transactions = []

owner = ‘Blockgeeks’

def hash_block (blok):

   hashlib.sha256 (json.dumps (blok) .encode ()). hexdigest () döndür

Burada yaptığımız ilk şey, karma kitaplıkların içe aktarılmasıdır. Özellikle ithal ediyoruz:

  • hashlib: Hashing işlevlerini kullanmak için
  • json: Bloğu sözlükten dizgeye dönüştürmek için bu pakete ihtiyacımız var.

Bundan sonra, madencilerimize bir blok madenciliği için vereceğimiz madencilik bloğu ödülünü saklayacak küresel bir değişken olan “ödül” ü açıklıyoruz..

Sırada oluşum bloğumuz var. Genesis bloğu, blok zincirindeki ilk bloktur. Bloğumuzda 4 metadata kullanıyoruz:

  • Previous_hash: Önceki bloğun karmasını saklar. Genesis bloğunun önceki karması olmayacağından bu boş bir dize olacaktır..
  • Dizin: Bu, blok zincirindeki bloğun indeksidir. Genesis bloğu ilk blok olduğundan, indeksi 0 olarak başlatılır. Programlama terminolojisinde hatırlayın, bir listedeki ilk eleman 0. pozisyondadır.
  • İşlem: Blockchain içerisinde depolanan işlem. Bunda hiç olmadığı için boş bir liste.
  • Nonce: Bunu daha sonra açıklayacağız. Sahte bir değer olan 23 olarak başlatılır.

Genesis bloğu başlatıldıktan sonra, bir sonraki adımda blockchain = [genesis_block] aracılığıyla blok zincirine eklenir..

Open_transactions: Blok zincirindeki tüm bekleyen işlemleri yöneten bir liste. Başlangıçta boş bir liste.

Bu işlemin sahibi ve göndereni olduğumuz için, bu hakkı başlangıçta başlattık.

Sırada hashing fonksiyonu var hash_block ()

İçinde şu ifadeyi kullanarak bloğun karmasını döndürüyoruz:

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

Öyleyse, burada ne yaptığımıza bakalım:

  • Hashlib’in sha256 hashing algoritmasını kullanma.
  • Daha sonra json.dumps işlevi devreye girer ve bir sözlük olan bloğu json formatlı bir dizeye dönüştürür. Ancak, hashlib bunu okuyamaz, bu yüzden bundan sonra elimizde….
  • Encode () işlevi. Bu, json formatlı dizeyi hashlib tarafından okunabilen bir UTF-8 dizesine dönüştürür..
  • Hashlib’in çıktısı bir bayt hashidir. Sonunda, onu normal bir dizeye dönüştürmek için hexdigest () yöntemini kullanıyoruz.

Bölüm 2

def valid_proof (işlemler, son_hash, nonce):

   tahmin = (str (işlemler) + str (son_hash) + str (nonce)). encode ()

   tahmin_hash = hashlib.sha256 (tahmin) .hexdigest ()

   yazdır (tahmin_hash)

   return tahmini_hash [0: 2] == ’00’

def pow ():

   last_block = blok zinciri [-1]

   last_hash = hash_block (last_block)

   nonce = 0

   geçerli değilken (open_transactions, last_hash, nonce):

       nonce + = 1

   dönüş

2. bölümde iki işleve sahibiz:

  • Valid_proof
  • Pow işlevi

valid_proof ()

def valid_proof (işlemler, son_hash, nonce):

   tahmin = (str (işlemler) + str (son_hash) + str (nonce)). encode ()

   tahmin_hash = hashlib.sha256 (tahmin) .hexdigest ()

   yazdır (tahmin_hash)

   return tahmini_hash [0: 2] == ’00’

Dolayısıyla, valid_proof () işlevinin üç bağımsız değişkeni vardır:

  • İşlemler: Blok içindeki işlemler
  • Son hash: Son bloğun hash değeri
  • Nonce

Tamam, tam olarak nonce nedir? Bundan önce, zorluğun ne anlama geldiğini bilmeliyiz. “Zorluk”, madenciliği mümkün olduğunca zor hale getirme fikridir. Madencilik zor değilse, sistemdeki tüm madeni paralar kolayca dışarı pompalanacak ve bu da onları kesinlikle işe yaramaz hale getirecektir..

Bu nedenle, sistemin karmasını hesaplama şeklimiz, işlemleri, son bloğun ve nonce’nin karmasını tek bir dizede birleştirip sonra onları karma hale getirmektir. Karma, yalnızca ilk iki harfi sıfır ise kabul edilebilir.

İşte bu şekilde zorluk çıkarıyoruz. Hash’in nasıl olacağını tahmin etmek imkansız ve daha çok şanslı bir çekiliş. Bu nedenle, belirli bir modelle (2 0s gibi) başlayan bir hash elde etmek son derece zordur..

Fonksiyon, programın geçerli bir karması varsa True, yoksa False döndürür.

Pow () işlevi

Sırada iş kanıtı veya pow () işlevi var.

def pow ():

   last_block = blok zinciri [-1]

   last_hash = hash_block (last_block)

   nonce = 0

   geçerli değilken (open_transactions, last_hash, nonce):

       nonce + = 1

   dönüş

Bu işlev oldukça basittir:

  • İlk önce son bloğu blok zincirinden çıkarıyoruz ve onu last_block’a koyuyoruz
  • Ardından last_block’a hash işlemi uyguluyor ve onları last_hash’e koyuyoruz
  • While döngüleri, valid_proof işlevi TRUE değerini döndürene kadar çalışmaya devam eder. (The değil convert TRUE’yu FALSE’a çevirecek ve bu nedenle döngüden çıkacaktır)
  • Nonce daha sonra iade edilir.

3. Bölüm

def get_last_value ():

   """ blok zinciri listesinin son unsurunu çıkarmak """

   dönüş (blok zinciri [-1])

def add_value (alıcı, gönderen = sahip, miktar = 1.0):

   transaction = {‘gönderen’: gönderen,

   “alıcı”: alıcı,

   “miktar”: miktar}

   open_transactions.append (işlem)

Bu bölümde yine iki işleve sahibiz:

  • get_last_value
  • değer katmak

Get_last_value ()

Bu oldukça basit. Blok zincirinin son bloğunu çıkarır.

değer katmak()

İşlev, işlemin meta verilerini alır, yani:

  • Gönderen ismi
  • Alıcı Adı
  • İşlem tutarı

Bundan sonra, işlem open_transactions listesine eklenir.

Bölüm 4

def mine_block ():

   last_block = blok zinciri [-1]

   hashed_block = hash_block (last_block)

   nonce = pow ()

   reward_transaction = {

           “gönderen”: “MADENCİLİK”,

           “alıcı”: sahip,

           “miktar”: ödül

       }

   open_transactions.append (reward_transaction)

   block = {

       “previous_hash”: hashed_block,

       ‘dizin’: len (blok zinciri),

       “işlem”: open_transactions,

       ‘nonce’: nonce

   }

   blockchain.append (blok)

Bu bölümde bir fonksiyonumuz var, mine_block () fonksiyonu blokları kazmanızı sağlayacak

Yani, bu işlevde aşağıdakiler gerçekleşecek:

  • Blockchain’in son bloğunu çıkarın ve last_block’a koyun
  • Son bloğu karma hale getirin
  • Nonce’yi çıkarmak için pow () işlevini kullanın
  • Madenciyi ödüllendiren bir reward_transaction oluşturun, yani bize daha önce belirlediğimiz ödül miktarı (10.0 jeton)
  • Reward_transaction open_transaction listesine eklenir
  • Son olarak, yeni onaylanmış nonce ile nihayet yeni bir bloğumuz var, bu da yeni bloğun meta verilerini almamıza yardımcı oluyor,
  • Yeni blok, blok zincirine eklenir

Bölüm 5

def get_transaction_value ():

   tx_recipient = input (‘İşlemin alıcısını girin:’)

   tx_amount = float (input (‘İşlem tutarınızı girin’))

   return tx_recipient, tx_amount

def get_user_choice ():

   user_input = input ("Lütfen seçiminizi burada belirtin: ")

   user_input döndür

Bu bölümde iki işlevimiz var:

  • get_transaction_value ()
  • get_user_choice ()

# 1 get_transaction_value ()

Bu işlev, alıcının adı ve işlem tutarı gibi işlemin meta verilerini alır..

Aynı zamanda, dönüş ifadesine bir göz atın.

return tx_recipient, tx_amount

Bu işlev bir demet döndürüyor (hatırlamadan önce tupllardan bahsettik mi?)

# 2 get_user_choice

Bu işlev temelde kullanıcının seçimini alır ve onu döndürür. Bu, önceki programdaki get_user_choice () işlevine oldukça benzer.

Bölüm 6

def print_block ():

   blok zincirinde blok için:

       Yazdır("İşte bloğun")

       yazdır (engelle)

Son programa benzer şekilde, bu, blok zincirini yazdıran yazdırma işlevidir..

Bölüm 7

True iken:

   Yazdır("Bir seçenek seçin")

   print (‘Yeni bir işlem eklemek için 1’i seçin’)

   print (‘Yeni bir blokta madencilik yapmak için 2 seçin’)

   print (‘Blok zinciri yazdırmak için 3’ü seçin’)

   print (‘Çıkmak istiyorsanız başka bir şey seçin’)

   user_choice = get_user_choice ()

   

   user_choice == 1 ise:

       tx_data = get_transaction_value ()

       alıcı, miktar = tx_data

       add_value (alıcı, miktar = miktar)

       baskı (open_transactions)

   elif user_choice == 2:

       mayın_block ()

   elif user_choice == 3:

       print_block ()

   

   Başka:

       kırmak

Bu aynı zamanda son programa benzer. Kullanıcı şunlardan birini seçebilir:

  • Bir işlem girin
  • Bir blok kazın
  • Blok zincirini yazdırın

Şimdi programın çıktılarına bir göz atalım.

Programın Çıktısı

İlk ve en önemlisi, 2. seçeneği seçelim ve bir blok çıkaralım. Bunu yaptığınızda, aşağıdaki karma blokları elde ederiz:

Python ve Blockchain İçin En İyi Kılavuz: Bölüm 2

Biraz daha dikkatli oluncaya ve son hash’i kontrol edene kadar bu akıllara durgunluk verecek gibi görünüyor:

“001f946e8c2172affa830ef27761270aab2de515ffac8ae90e5de95b48dc366c”

Bu hash hakkında neyin bu kadar özel olduğunu görüyor musun??

Daha önce belirlediğimiz zorluğu hatırlıyor musunuz? Özellikle “00” ile başlayan bir hash arıyorduk. Bu nedenle, bilgisayar, verilen zorluk ölçütlerini karşılayan bir hash ile nihayet karşılaşana kadar, birden fazla karma ile çalıştı..

Pekala, şimdi bir işlem ekleyelim. Diyelim ki Sam’e 2.4 jeton göndermek istiyorum, 1. seçeneği seçip aşağıdaki çıktıyı alacağız:

Python ve Blockchain İçin En İyi Kılavuz: Bölüm 2

Son satıra dikkat edin. Şimdiye kadar yaptığımız iki işlemi gösterir.

Bekle… iki işlem mi? Biz sadece bir doğru yaptık?

Pek değil. Bundan önce bir blok kazdığımızı hatırlıyor musunuz? Dolayısıyla blok ödül işlemi de burada gösterilmektedir.

Son olarak, blockchain’i yazdıralım.

Python ve Blockchain İçin En İyi Kılavuz: Bölüm 2

Yani iki bloğumuz var:

  • İlk önce, kendimiz ilan ettiğimiz oluşum bloğuna sahibiz. Nonce, kendimize koyduğumuz bir şeydi, yani 23
  • Ardından, madencilik işlemini ve “Sam” ile yaptığımız işlemi içeren ikinci bloğumuz var. Bloğun tek değeri 93’tür

Sonuç

İşte orada var. En azından biraz çalışıyoruz blok zinciri Python ile kodlanmıştır. Daha fazlasını öğrenmek istiyorsanız, lütfen kendi araştırmanıza devam edin. Python’un, geliştirmeye başlamak istiyorsanız ustalaşmanız gereken bir dil olduğunu düşünüyoruz. Sınırsız fırsatlar için kapılar açabilen, son derece eğlenceli ve öğrenmesi kolay bir dildir..

Mike Owergreen Administrator
Sorry! The Author has not filled his profile.
follow me