Python 區塊鏈 - 交易類



在本章中,讓我們建立一個**交易**類,以便客戶端能夠向某人傳送資金。請注意,客戶端可以既是傳送者又是接收者。當您想要接收資金時,其他一些傳送者將建立一個交易並在其中指定您的**公鑰**地址。我們如下定義交易類的初始化:

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

**init**方法接受三個引數:傳送者的**公鑰**、接收者的**公鑰**以及要傳送的金額。這些儲存在例項變數中,供其他方法使用。此外,我們建立了一個變數來儲存交易時間。

接下來,我們編寫一個名為**to_dict**的實用程式方法,該方法將上述所有四個例項變數組合到一個字典物件中。這只是為了透過單個變數訪問整個交易資訊。

正如您從之前的教程中瞭解到的,區塊鏈中的第一個區塊是**創世**區塊。創世區塊包含由區塊鏈建立者發起的第一個交易。此人的身份可能會保密,例如比特幣的情況。因此,當建立此第一個交易時,建立者可能只需將其身份傳送為**創世**。因此,在建立字典時,我們檢查傳送者是否為**創世**,如果是,則只需將某個字串值分配給identity變數;否則,我們將傳送者的身份分配給**identity**變數。

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

**to_dict**方法的完整程式碼如下所示:

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

最後,我們將使用傳送者的私鑰對該字典物件進行簽名。與之前一樣,我們使用內建的PKI與SHA演算法。生成的簽名被解碼以獲取ASCII表示形式,以便列印並將其儲存在我們的區塊鏈中。**sign_transaction**方法程式碼如下所示:

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

現在我們將測試此**交易**類。

測試交易類

為此,我們將建立兩個使用者,稱為**Dinesh**和**Ramesh**。Dinesh將向Ramesh傳送5個TPCoins。為此,我們首先建立名為Dinesh和Ramesh的客戶端。

Dinesh = Client()
Ramesh = Client()

請記住,當您例項化**Client**類時,將建立客戶端特有的**公鑰和**私鑰。由於Dinesh正在向Ramesh付款,因此他將需要Ramesh的公鑰,該公鑰是透過使用客戶端的identity屬性獲得的。

因此,我們將使用以下程式碼建立交易例項:

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

請注意,第一個引數是傳送者,第二個引數是接收者的公鑰,第三個引數是要轉移的金額。**sign_transaction**方法從第一個引數中檢索傳送者的私鑰以對交易進行簽名。

建立交易物件後,您將透過呼叫其**sign_transaction**方法對其進行簽名。此方法以可列印格式返回生成的簽名。我們使用以下兩行程式碼生成並列印簽名:

signature = t.sign_transaction()
print (signature) 

執行上述程式碼時,您將看到類似於以下內容的輸出:

7c7e3c97629b218e9ec6e86b01f9abd8e361fd69e7d373c38420790b655b9abe3b575e343c7
13703ca1aee781acd7157a0624db3d57d7c2f1172730ee3f45af943338157f899965856f6b0
0e34db240b62673ad5a08c8e490f880b568efbc36035cae2e748f1d802d5e8e66298be826f5
c6363dc511222fb2416036ac04eb972

現在,我們建立客戶端和交易的基本基礎架構已準備就緒,我們將讓多個客戶端在現實生活場景中執行多個交易。

廣告

© . All rights reserved.