Python Blockchain - İşlem Sınıfı
Bu bölümde bir oluşturalım Transactionsınıf, böylece müşteri birisine para gönderebilecektir. Bir müşterinin paranın hem göndereni hem de alıcısı olabileceğini unutmayın. Para almak istediğinizde, başka bir gönderici bir işlem oluşturacak ve sizinpubliciçindeki adres. Bir işlem sınıfının başlatılmasını şu şekilde tanımlıyoruz -
def __init__(self, sender, recipient, value):
self.sender = sender
self.recipient = recipient
self.value = value
self.time = datetime.datetime.now()
init yöntem üç parametre alır - gönderenin public anahtar, alıcının publicanahtarı ve gönderilecek miktar. Bunlar, diğer yöntemler tarafından kullanılmak üzere örnek değişkenlerinde saklanır. Ek olarak, işlem zamanını saklamak için bir değişken daha oluşturuyoruz.
Ardından, adında bir yardımcı yöntem yazıyoruz to_dictyukarıda belirtilen dört örnek değişkeninin tümünü bir sözlük nesnesinde birleştiren. Bu sadece tüm işlem bilgisini tek bir değişken üzerinden erişilebilir hale getirmek içindir.
Önceki öğreticiden bildiğiniz gibi, blok zincirindeki ilk bloğun bir Genesisblok. Genesis bloğu, blok zincirinin yaratıcısı tarafından başlatılan ilk işlemi içerir. Bu kişinin kimliği, Bitcoin'de olduğu gibi gizli tutulabilir. Dolayısıyla, bu ilk işlem oluşturulduğunda, içerik oluşturucu kimliğini şu şekilde gönderebilir:Genesis. Böylelikle sözlüğü oluştururken göndereninGenesisve eğer öyleyse, kimlik değişkenine basitçe bir dizi değeri atarız; aksi takdirde, gönderenin kimliğiniidentity değişken.
if self.sender == "Genesis":
identity = "Genesis"
else:
identity = self.sender.identity
Sözlüğü aşağıdaki kod satırını kullanarak oluşturuyoruz
return collections.OrderedDict({
'sender': identity,
'recipient': self.recipient,
'value': self.value,
'time' : self.time})
İçin kodun tamamı to_dict yöntem aşağıda gösterilmiştir -
def to_dict(self):
if self.sender == "Genesis":
identity = "Genesis"
else:
identity = self.sender.identity
return collections.OrderedDict({
'sender': identity,
'recipient': self.recipient,
'value': self.value,
'time' : self.time})
Son olarak, gönderenin özel anahtarını kullanarak bu sözlük nesnesini imzalayacağız. Daha önce olduğu gibi, yerleşik PKI'yi SHA algoritması ile kullanıyoruz. Oluşturulan imzanın kodu, blok zincirimizde yazdırmak ve depolamak için ASCII temsilini almak için çözülür. sign_transaction yöntem kodu burada gösterilmektedir -
def sign_transaction(self):
private_key = self.sender._private_key
signer = PKCS1_v1_5.new(private_key)
h = SHA.new(str(self.to_dict()).encode('utf8'))
return binascii.hexlify(signer.sign(h)).decode('ascii')
Şimdi bunu test edeceğiz Transaction sınıf.
İşlem Sınıfının Test Edilmesi
Bu amaçla, adında iki kullanıcı oluşturacağız. Dinesh ve Ramesh. Dinesh, Ramesh'e 5 TPCoin gönderecek. Bunun için ilk olarak Dinesh ve Ramesh adlı istemcileri oluşturduk.
Dinesh = Client()
Ramesh = Client()
Unutmayın ki bir Client sınıf public andistemciye özel özel anahtarlar oluşturulacaktır. Dinesh, Ramesh'e ödeme gönderirken, müşterinin kimlik özelliği kullanılarak elde edilen Ramesh'in genel anahtarına ihtiyaç duyacaktır.
Böylece, aşağıdaki kodu kullanarak işlem örneğini oluşturacağız -
t = Transaction(
Dinesh,
Ramesh.identity,
5.0
)
İlk parametrenin gönderen, ikinci parametrenin alıcının genel anahtarı ve üçüncü parametrenin aktarılacak miktar olduğuna dikkat edin. sign_transaction yöntemi, gönderenin özel anahtarını işlemi söylemek için ilk parametreden alır.
İşlem nesnesi oluşturulduktan sonra, bunu çağırarak imzalayacaksınız. sign_transactionyöntem. Bu yöntem, üretilen imzayı yazdırılabilir biçimde döndürür. İmzayı aşağıdaki iki kod satırını kullanarak oluşturur ve yazdırırız -
signature = t.sign_transaction()
print (signature)
Yukarıdaki kodu çalıştırdığınızda, çıktının buna benzer olduğunu göreceksiniz -
7c7e3c97629b218e9ec6e86b01f9abd8e361fd69e7d373c38420790b655b9abe3b575e343c7
13703ca1aee781acd7157a0624db3d57d7c2f1172730ee3f45af943338157f899965856f6b0
0e34db240b62673ad5a08c8e490f880b568efbc36035cae2e748f1d802d5e8e66298be826f5
c6363dc511222fb2416036ac04eb972
Artık bir müşteri oluşturmaya yönelik temel altyapımız ve bir işlem hazır olduğu için, artık gerçek hayatta olduğu gibi birden fazla işlem yapan birden fazla müşterimiz olacak.