- Python 區塊鏈教程
- Python 區塊鏈 - 首頁
- Python 區塊鏈 - 簡介
- 區塊鏈 - 開發客戶端
- 區塊鏈 - 客戶端類
- 區塊鏈 - 交易類
- 建立多個交易
- 區塊鏈 - 區塊類
- 區塊鏈 - 建立創世區塊
- 區塊鏈 - 建立區塊鏈
- 區塊鏈 - 新增創世區塊
- 區塊鏈 - 建立礦工
- 區塊鏈 - 新增區塊
- 區塊鏈 - 範圍和結論
- Python 區塊鏈資源
- Python 區塊鏈 - 快速指南
- Python 區塊鏈 - 資源
- Python 區塊鏈 - 討論
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
現在,我們建立客戶端和交易的基本基礎架構已準備就緒,我們將讓多個客戶端在現實生活場景中執行多個交易。