Python Blockchain - Kelas Transaksi

Dalam bab ini, mari kita buat file Transactionkelas sehingga klien dapat mengirim uang ke seseorang. Perhatikan bahwa klien bisa menjadi pengirim atau penerima uang. Saat Anda ingin menerima uang, beberapa pengirim lain akan membuat transaksi dan menentukanpublicalamat di dalamnya. Kami mendefinisikan inisialisasi kelas transaksi sebagai berikut -

def __init__(self, sender, recipient, value):
   self.sender = sender
   self.recipient = recipient
   self.value = value
   self.time = datetime.datetime.now()

Itu init Metode mengambil tiga parameter - pengirim public kunci, penerima publickunci, dan jumlah yang akan dikirim. Ini disimpan dalam variabel instan untuk digunakan oleh metode lain. Selain itu, kami membuat satu variabel lagi untuk menyimpan waktu transaksi.

Selanjutnya, kami menulis metode utilitas yang disebut to_dictyang menggabungkan keempat variabel contoh yang disebutkan di atas dalam objek kamus. Ini hanya untuk menempatkan seluruh informasi transaksi yang dapat diakses melalui satu variabel.

Seperti yang Anda ketahui dari tutorial sebelumnya bahwa blok pertama dalam blockchain adalah a Genesisblok. Blok Genesis berisi transaksi pertama yang dimulai oleh pembuat blockchain. Identitas orang ini mungkin dirahasiakan seperti dalam kasus Bitcoin. Jadi saat transaksi pertama ini dibuat, pencipta boleh saja mengirimkan identitasnya sebagaiGenesis. Jadi, saat membuat kamus, kami memeriksa apakah pengirimnyaGenesisdan jika demikian, kami hanya menetapkan beberapa nilai string ke variabel identitas; jika tidak, kami menetapkan identitas pengirim keidentity variabel.

if self.sender == "Genesis":
   identity = "Genesis"
else:
   identity = self.sender.identity

Kami membangun kamus menggunakan baris kode berikut

return collections.OrderedDict({
   'sender': identity,
   'recipient': self.recipient,
   'value': self.value,
   'time' : self.time})

Seluruh kode untuk to_dict metode ditunjukkan di bawah ini -

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})

Terakhir, kami akan menandatangani objek kamus ini menggunakan kunci pribadi pengirim. Seperti sebelumnya, kami menggunakan PKI bawaan dengan algoritme SHA. Tanda tangan yang dihasilkan diterjemahkan untuk mendapatkan representasi ASCII untuk dicetak dan menyimpannya di blockchain kami. Itusign_transaction kode metode ditampilkan di sini -

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')

Kami sekarang akan menguji ini Transaction kelas.

Menguji Kelas Transaksi

Untuk tujuan ini, kami akan membuat dua pengguna, yang disebut Dinesh dan Ramesh. Dinesh akan mengirim 5 TPCoin ke Ramesh. Untuk ini pertama kami membuat klien bernama Dinesh dan Ramesh.

Dinesh = Client()
Ramesh = Client()

Ingatlah bahwa saat Anda membuat Client kelas, itu public andkunci pribadi yang unik untuk klien akan dibuat. Saat Dinesh mengirim pembayaran ke Ramesh, dia akan membutuhkan kunci publik Ramesh yang diperoleh dengan menggunakan properti identitas klien.

Jadi, kami akan membuat contoh transaksi menggunakan kode berikut -

t = Transaction(
   Dinesh,
   Ramesh.identity,
   5.0
)

Perhatikan bahwa parameter pertama adalah pengirim, parameter kedua adalah kunci publik penerima dan parameter ketiga adalah jumlah yang akan ditransfer. Itusign_transaction metode mengambil kunci pribadi pengirim dari parameter pertama untuk menyanyikan transaksi.

Setelah objek transaksi dibuat, Anda akan menandatanganinya dengan memanggilnya sign_transactionmetode. Metode ini mengembalikan tanda tangan yang dihasilkan dalam format yang dapat dicetak. Kami menghasilkan dan mencetak tanda tangan menggunakan dua baris kode berikut -

signature = t.sign_transaction()
print (signature)

Ketika Anda menjalankan kode di atas, Anda akan melihat output yang mirip dengan ini -

7c7e3c97629b218e9ec6e86b01f9abd8e361fd69e7d373c38420790b655b9abe3b575e343c7
13703ca1aee781acd7157a0624db3d57d7c2f1172730ee3f45af943338157f899965856f6b0
0e34db240b62673ad5a08c8e490f880b568efbc36035cae2e748f1d802d5e8e66298be826f5
c6363dc511222fb2416036ac04eb972

Sekarang karena infrastruktur dasar kami untuk membuat klien dan transaksi sudah siap, kami sekarang akan memiliki banyak klien yang melakukan banyak transaksi seperti dalam situasi kehidupan nyata.