Python区块链教程

区块链Transaction

Python区块链Transaction类详细操作教程
在本章中,让我们创建一个 Transaction 类,以便客户能够向他人汇款。请注意,客户可以是这笔钱的发送者或接收者。当您想收款时,其他汇款人会创建交易并在其中指定您的 公开地址。我们定义事务类的初始化如下-
# Filename : example.py
# Copyright : 2020 By Lidihuo
# Author by : www.lidihuo.com
# Date : 2020-08-28
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 ,如果是,我们只需为身份变量分配一些字符串值即可;否则,我们将发件人的身份分配给 identity 变量。
# Filename : example.py
# Copyright : 2020 By Lidihuo
# Author by : www.lidihuo.com
# Date : 2020-08-28
if self.sender == "Genesis":
   identity = "Genesis"
else:
   identity = self.sender.identity
我们使用以下代码行构建字典
# Filename : example.py
# Copyright : 2020 By Lidihuo
# Author by : www.lidihuo.com
# Date : 2020-08-28
return collections.OrderedDict({
   'sender': identity,
   'recipient': self.recipient,
   'value': self.value,
   'time' : self.time})
to_dict 方法的整个代码如下所示-
# Filename : example.py
# Copyright : 2020 By Lidihuo
# Author by : www.lidihuo.com
# Date : 2020-08-28
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 方法代码显示在此处-
# Filename : example.py
# Copyright : 2020 By Lidihuo
# Author by : www.lidihuo.com
# Date : 2020-08-28
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的客户端。
# Filename : example.py
# Copyright : 2020 By Lidihuo
# Author by : www.lidihuo.com
# Date : 2020-08-28
Dinesh = Client()
Ramesh = Client()
请记住,当实例化 Client 类时,将创建该客户机唯一的 公钥和私钥。当Dinesh向Ramesh发送付款时,他将需要Ramesh的公钥,该公钥是通过使用客户端的identity属性获得的。
因此,我们将使用以下代码创建事务实例-
# Filename : example.py
# Copyright : 2020 By Lidihuo
# Author by : www.lidihuo.com
# Date : 2020-08-28
t = Transaction(
   Dinesh,
   Ramesh.identity,
   5.0
)
请注意,第一个参数是发送方,第二个参数是接收方的公钥,第三个参数是要转移的金额。 sign_transaction 方法从第一个参数中检索发件人的私钥,以触发交易。
创建交易对象后,您将通过调用其 sign_transaction 方法对其进行签名。此方法以可打印格式返回生成的签名。我们使用以下两行代码生成并打印签名-
# Filename : example.py
# Copyright : 2020 By Lidihuo
# Author by : www.lidihuo.com
# Date : 2020-08-28
signature = t.sign_transaction()
print (signature)
运行上面的代码时,您将看到类似于此的输出-
# Filename : example.py
# Copyright : 2020 By Lidihuo
# Author by : www.lidihuo.com
# Date : 2020-08-28
7c7e3c97629b218e9ec6e86b01f9abd8e361fd69e7d373c38420790b655b9abe3b575e343c7
13703ca1aee781acd7157a0624db3d57d7c2f1172730ee3f45af943338157f899965856f6b0
0e34db240b62673ad5a08c8e490f880b568efbc36035cae2e748f1d802d5e8e66298be826f5
c6363dc511222fb2416036ac04eb972
现在,随着我们创建客户和交易的基本基础架构已经准备就绪,我们现在将拥有多个客户,就像现实生活中那样进行多个交易。
昵称: 邮箱:
Copyright © 2022 立地货 All Rights Reserved.
备案号:京ICP备14037608号-4