
- 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
现在,我们创建客户端和交易的基本基础架构已准备就绪,我们将让多个客户端在现实生活场景中执行多个交易。