Python ile Blockchain Nasıl Oluşturulur?
Blockchain üzerine inşa edilen Bitcoin’in dünyanın en çok kullanılan dijtal para olduğunu hepimiz biliyoruz
Blockchain nedir?
2008’de Bitcoin makalesi, Satoshi Nakamoto adlı bilinmeyen bir kişi veya grup tarafından yayınlandı. Bitcoin, merkezi kurumlardan (bankalar) geçmeden işlemlere izin veren elektronik paranın eşler arası bir versiyonu olarak ortaya çıktı. Çoğu insan, aynı makalede Satoshi’nin günümüzde Blockchain olarak bilinen dağıtılmış bir bilgi depolama yöntemi tanımladığını bilmiyor.
Basitçe söylemek gerekirse, Blockchain, işlemleri merkezi olmayan bir bilgisayar ağı üzerinden depolayan paylaşılan, değişmez bir dijital defterdir.
Blockchain’i iki basit terime ayırabiliriz:
- Blok: İşlemleri depoladığımız bir alan
- Zincir: Bir dizi bağlantılı kayıt
Bu, Blockchain’i, her bloğun belirli parametrelerle yapılan bir işlemi sakladığı bağlantılı bloklar zinciri olarak tanımlar.
Her blok, geri dönüşü olmayan bir blok zinciri oluşturarak başka bir bloğun üzerine inşa edilmiştir. Başka bir deyişle, her blok diğerine bağlıdır. Bu, doğru izinlere sahip herkesin bütünlüğü gözden geçirebileceği sağlam ve değişmez bir sisteme dönüşüyor.
Blockchain, ilginç bir dizi özellik sunar:
- Geçmiş değişmezliği
- Bilgi kalıcılığı
- Depolanan verilerde hata yok
Şu anda kripto para birimleri, varlık transferi ( NFT’ler ) ve muhtemelen yakın gelecekte oylama gibi birçok sistem Blockchain’e güveniyor .
Python Blockchain’in binlerce kod satırı içeren karmaşık bir program olmaması gerektiğini belirtmekte fayda var . Özünde, birbirine bağlı işlemlerin bir listesi olacaktır.
Tabii ki, bu kısa bir açıklamaydı, ancak tam bir rehber istiyorsanız, yeni başlayanlar için Blockchain hakkında eksiksiz bir eğitim hazırladık. Kontrol ettiğinizden emin olun.
Daha fazla gecikmeden Python ile basit bir Blockchain oluşturalım.
Python ile Blockchain Oluşturma
Başlamadan önce, bu eğitimde ne yapacağımızı tanımlayalım:
- Python ile yazılmış basit Blockchain sistemi oluşturun
- Dizeler olarak temsil edilen önceden belirlenmiş işlemlerle Blockchain’imizi kullanın
- Blockchain’imizin değişmezliğini test edin
JSON değil Python listelerini kullanmayacağız . Bu, süreci basitleştirmemize ve bir Blockchain’in temel kavramlarını uygulamaya odaklanmamıza izin verecektir.
Bu öğreticiyi takip etmek için ihtiyacınız olacak:
Blok sınıfını oluşturma
Favori kod düzenleyicinizi açın ve bir main.py dosyası oluşturun. Bu, üzerinde çalışacağımız dosya olacak.
Şimdi, tek yönlü şifreli mesajlar oluşturmamıza izin veren bir modül olan hashlib’i içe aktarın. Karma gibi şifreleme teknikleri, Blockchain’in güvenli işlemler oluşturmasını sağlar.
Karma işlevi, bazı verileri (genellikle kodlanmış bir dize) alan ve genellikle “özet” veya “imza” olarak adlandırılan benzersiz bir tanımlayıcı döndüren bir algoritmadır. Bu son kısım hayati önem taşımaktadır; bir karma işleviyle, girdideki küçük bir fark, çıktı olarak kökten farklı bir tanımlayıcı üretir. Bunu daha sonra uygulamada göreceğiz.
Şimdilik, yerleşik hashlib modülünü içe aktarın:
# main.py file
"""
A simple Blockchain in Python
"""
import hashlib
kopyala
Bu modül, ihtiyaç duyacağınız karma algoritmaların çoğunu içerir. Hashlib.sha256() işlevini kullanacağımızı unutmayın .
Şimdi tamamen orijinal blok zinciri adımız olan GeekCoinBlock’a girelim.
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()
kopyala
Bunun karmaşık bir kod parçasıyla sonuçlanabileceğini biliyorum. Bir sonraki bölümde her bir parçayı parçalayalım.
GeekCoinBlock Açıklama
İlk olarak, belirli özelliklere (nitelikler) ve davranışlara (yöntemler) sahip olacak nesneler için bir sarmalayıcı olan GeekCoinBlock adlı bir sınıf oluşturuyoruz .
Ardından , bir GeekCoinBlock nesnesi her oluşturulduğunda çağrılan __ init__ yöntemini (yapıcı olarak da adlandırılır) tanımlarız.
Bu yöntemin üç parametresi vardır:
- self (her nesnenin örneği)
- önceki_block_hash (önceki bloğa referans)
- işlem_listesi (geçerli blokta yapılan işlemlerin listesi).
Önceki hash ve işlem listesini saklarız ve bir string olarak blok_data örnek değişkeni yaratırız . Bu, bu tür verileri başka bir karma olarak depoladığımız gerçek kripto para birimlerinde olmaz, ancak basitlik amacıyla her veri bloğunu bir dize olarak depolayacağız.
Son olarak, diğer blokların zincire devam etmek için kullanacağı block_hash’i oluşturuyoruz . İşte hashlib’in kullanışlı olduğu yer; özel bir karma işlevi oluşturmak yerine, değişmez bloklar yapmak için önceden oluşturulmuş sha256’yı kullanabiliriz.
Bu işlev, kodlanmış dizeleri (veya baytları) parametre olarak alır. Bu yüzden block_data.encode() yöntemini kullanıyoruz. Bundan sonra , kodlanmış verileri onaltılık biçime döndürmek için hexdigest() öğesini çağırırız .
Tüm bunların ezici olabileceğini biliyorum, o yüzden bir Python kabuğunda hashlib ile oynayalım.
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'
kopyala
Gördüğünüz gibi, “Python harika” gibi “Python harika değil” gibi bir girdide küçük bir değişiklik, tamamen farklı bir karma üretebilir. Bunun tamamen Blockchain bütünlüğü ile ilgisi var. Bir blok zincirine küçük bir değişiklik getirirseniz, hash değeri önemli ölçüde değişecektir. “Bir Blockchain’i bozamazsınız” sözünün doğru olmasının nedeni budur.
Blok Sınıfımızı Kullanmak
Daha sonra tam bir Blockchain sınıfı oluşturacağız, ancak şimdilik bir blok zinciri (Blockchain) oluşturmak için Block sınıfımızı kullanalım.
Aynı dosyada, değişkenlerde saklanan basit dizelerden oluşan birkaç işlem oluşturun, örneğin:
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"
kopyala
Tabii ki, GC GeekCoin’i ifade eder
Şimdi GeekCoinBlock sınıfını kullanarak Blockchain’imizin ilk bloğunu oluşturun ve özelliklerini yazdırın. Dikkate aldığından emin previous_hash genesis bloğunun her zaman bu durumda, bazı keyfi dize veya karma olacaktır (ilerlettiği diğer bloklar ilk bloğun) parametresi “firstblock.”
block1 = GeekCoinBlock('firstblock', [t1, t2])
print(f"Block 1 data: {block1.block_data}")
print(f"Block 1 hash: {block1.block_hash}")
kopyala
Sonra, ikinci blokta ile aynı şeyi, ancak ilk blok karma geçen previous_hash argüman.
block2 = GeekCoinBlock(block1.block_hash, [t3, t4])
print(f"Block 2 data: {block2.block_data}")
print(f"Block 2 hash: {block2.block_hash}")
kopyala
Bu kod parçasından aldığımız çıktıyı çalıştıralım ve analiz edelim. Bir kez daha terminalinizi yazın:
❯ 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
kopyala
Şimdilik sadece metin ve 64 karakterlik hash görüyorsunuz, ancak bu hemen hemen bir Blockchain mekanizmasını devam ettiriyor.
Diğer tüm blokların temeli olan bir genesis bloğu ile başlarsınız.
Herkes zincirin bütünlüğünü doğrulayabilir ve bu nedenle Blockchain çok güvenli bir sistemdir. Örneğin, bir işlemin içeriğini biraz değiştirirsek, şunu söyleyin:
t2 = "Mark sends 2.3 GC to James" -> t2 = "Mark sends 3.2 GC to James"
kopyala
Blokların hash değerinde dramatik bir değişiklik görüyoruz.
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
kopyala
Mevcut projeyi bu GitHub deposunda görebilirsiniz .
Blockchain Kodlama
Sistem bütünlüğümüzü elle kodlanmış değişkenlere dayandırmak o kadar akıllıca değil, bu yüzden başka bir yaklaşıma ihtiyacımız var.
Bloklarımız var. Onları bir Blockchain’de birleştiren bir sınıf oluşturmanın zamanı geldi.
Önce önceki işlemlerimizi ve blok nesneleri silerek başlayalım, ardından aşağıdaki kodu kullanarak başlayalım.
# 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]
kopyala
Bu yine büyük bir kod parçası. Her bir parçayı parçalayalım:
- self.chain — Tüm blokların kaydedildiği liste. Liste dizinleri aracılığıyla her bloğa erişebiliriz.
- create_genesis_block — Genesis’i veya ilk bloğu zincire ekler. Bloğun önceki karması “0” ve işlemlerin listesi basitçe “Genesis Block”tur.
- create_block_from_transaction — Bu, yalnızca bir işlem listesiyle zincire blok eklememize olanak tanır. Her işlem kaydetmek istediğimizde manuel olarak blok oluşturmak çok can sıkıcı olurdu.
- display_chain — Bir for döngüsü ile blok zincirini yazdırır
- last_block — Zincirin son öğesine erişmemizi sağlayan bir özellik. Bunu create_block_from_transaction yönteminde kullandık.
Hadi bu Blockchain’i test edelim.
# 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()
kopyala
Şimdi main.py dosyasını çalıştırın .
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
kopyala
Tebrikler! 🙌 Sıfırdan basit bir Python Blockchain oluşturdunuz.
Artık alıcıları ve ayarlayıcıları kullanarak Blockchain değişmezliğini güçlendirebilir ve iş kanıtı, madencilik veya Bitcoin Madenciliği temelleri makalesinde açıkladığımız diğer herhangi bir kavram gibi diğer özellikleri uygulayabilirsiniz .
Çözüm
Blockchain, Bitcoin , Etherium ve diğer tüm kripto para birimlerinin arkasındaki teknolojidir . Bu makalede, sha256 , sınıflar ve nesneler gibi karma algoritmaları kullanarak Python ile nasıl Blockchain oluşturulacağını öğrendiniz .
Zorluğunuz bir madencilik sistemi oluşturmak ve neden olmasın, bunu Django veya Flask gibi çerçeveler kullanarak bir REST API ile uygulayın .
Birçok insan kripto para birimlerinden servet kazanıyor. Kendi başınıza bir tane yaratırsanız neler yapabileceğinizi hayal edin. 🤑
Kodlamaya devam edin! 👨💻
Makalenin orjinal kaynağını bu linkten okuyabilirsiniz