Python区块链 交易类
在这一章中,让我们创建一个 交易 类,这样一个客户端就可以向某人发送钱。请注意,一个客户端既可以是钱的发送者,也可以是钱的接收者。当你想收到钱的时候,其他一些发送者会创建一个交易,并在其中指定你的 公共 地址。我们对交易类的初始化定义如下
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 变量。
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将向Ramesh发送5个TPCoins。为此,我们首先创建名为Dinesh和Ramesh的客户端。
Dinesh = Client()
Ramesh = 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
现在,我们创建客户和交易的基本基础设施已经准备就绪,我们现在将有多个客户进行多个交易,就像在现实生活中一样。