Python 区块链 - 交易类


在本章中,让我们创建一个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,如果是,我们只需将一些字符串值分配给标识变量即可;否则,我们将发送者的身份分配给身份变量。

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

最后,我们将使用发送者的私钥对该字典对象进行签名。和以前一样,我们使用带有 SHA 算法的内置 PKI。生成的签名被解码以获得 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类。

测试事务类

为此,我们将创建两个用户,名为DineshRamesh。Dinesh 将发送 5 个 TPCoins 给 Ramesh。为此,我们首先创建名为 Dinesh 和 Ramesh 的客户端。

Dinesh = Client()
Ramesh = Client()

请记住,当您实例化Client类时,将创建客户端特有的公钥和私钥。当 Dinesh 向 Ramesh 发送付款时,他将需要通过使用客户端的身份属性获得的 Ramesh 的公钥。

因此,我们将使用以下代码创建事务实例 -

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

请注意,第一个参数是发送方,第二个参数是接收方的公钥,第三个参数是要转账的金额。Sign_transaction方法从第一个参数中检索发送者的私钥以用于签署交易。

创建交易对象后,您将通过调用其sign_transaction方法对其进行签名。此方法以可打印格式返回生成的签名。我们使用以下两行代码生成并打印签名 -

signature = t.sign_transaction()
print (signature) 

当您运行上面的代码时,您将看到类似于此的输出 -

7c7e3c97629b218e9ec6e86b01f9abd8e361fd69e7d373c38420790b655b9abe3b575e343c7
13703ca1aee781acd7157a0624db3d57d7c2f1172730ee3f45af943338157f899965856f6b0
0e34db240b62673ad5a08c8e490f880b568efbc36035cae2e748f1d802d5e8e66298be826f5
c6363dc511222fb2416036ac04eb972

现在,随着创建客户端和交易的基本基础设施准备就绪,我们现在将有多个客户端执行多个交易,就像在现实生活中一样。