📅  最后修改于: 2020-11-08 08:24:57             🧑  作者: Mango
在本章中,让我们创建一个Transaction类,以便客户能够向他人汇款。请注意,客户可以是这笔钱的发送者或接收者。当您想收款时,其他发送者将创建交易并在其中指定您的公共地址。我们定义事务类的初始化如下:
def __init__(self, sender, recipient, value):
self.sender = sender
self.recipient = recipient
self.value = value
self.time = datetime.datetime.now()
init方法有三个参数-发送者的公钥,接收方的公钥和金额发送。这些存储在实例变量中,以供其他方法使用。此外,我们再创建一个变量来存储交易时间。
接下来,我们编写一个称为to_dict的实用程序方法,该方法将上述四个实例变量全部合并到一个字典对象中。这只是为了通过单个变量访问整个交易信息。
从上一教程中您知道,区块链中的第一个块是Genesis块。创世块包含由区块链创建者发起的第一笔交易。像比特币一样,此人的身份可以保密。因此,当创建此第一笔交易时,创建者可以将其身份发送为Genesis 。因此,在创建字典时,我们检查发件人是否为Genesis ,如果是,我们只是将一些字符串值分配给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')
现在,我们将测试此Transaction类。
为此,我们将创建两个用户,分别为Dinesh和Ramesh 。 Dinesh将发送5个TPCoins到Ramesh。首先,我们创建名为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
现在,随着我们创建客户和交易的基本基础架构已经准备就绪,我们现在将拥有多个客户,就像现实生活中那样进行多个交易。