📜  创建多个事务

📅  最后修改于: 2020-11-08 08:25:51             🧑  作者: Mango


各种客户进行的交易在系统中排队;矿工从该队列中提取交易并将其添加到区块中。然后他们将开采该区块,获胜的矿工将有特权将该区块添加到区块链中,从而为自己赚钱。

我们将在稍后讨论区块链的创建时描述此挖掘过程。在为多个事务编写代码之前,让我们添加一个小的实用程序函数来打印给定事务的内容。

显示交易

display_transaction函数接受事务类型的单个参数。接收到的事务中的字典对象被复制到称为dict的临时变量中,并使用字典键将各种值打印在控制台上。

def display_transaction(transaction):
   #for transaction in transactions:
   dict = transaction.to_dict()
   print ("sender: " + dict['sender'])
   print ('-----')
   print ("recipient: " + dict['recipient'])
   print ('-----')
   print ("value: " + str(dict['value']))
   print ('-----')
   print ("time: " + str(dict['time']))
   print ('-----')

接下来,我们定义一个事务队列来存储我们的事务对象。

交易队列

为了创建一个队列,我们声明一个称为事务的全局列表变量,如下所示:

transactions = []

我们将简单地将每个新创建的事务添加到此队列。请注意,为简便起见,在本教程中我们将不会实现队列管理逻辑。

创建多个客户端

现在,我们将开始创建交易。首先,我们将创建四个客户,他们将互相汇款以从他人那里获得各种服务或商品。

Dinesh = Client()
Ramesh = Client()
Seema = Client()
Vijay = Client()

至此,我们有四个客户,分别是Dinesh,Ramesh,Seema和Vijay。我们目前假设这些客户中的每一个在其钱包中都持有一些TPCoin进行交易。这些客户端中每个客户端的身份将通过使用这些对象的identity属性来指定。

创建第一笔交易

现在,我们开始如下的第一笔交易:

t1 = Transaction(
   Dinesh,
   Ramesh.identity,
   15.0
)

在此交易中,Dinesh将5个TPCoins发送给Ramesh。为了使交易成功,我们必须确保Dinesh的钱包中有足够的钱来进行此付款。注意,我们将需要一个创始交易来启动系统中的TPCoin流通。在阅读过程中,您将很快为该创世交易编写交易代码。

我们将使用Dinesh的私钥签署此交易,并将其添加到交易队列中,如下所示:

t1.sign_transaction()
transactions.append(t1)

在Dinesh进行第一笔交易后,我们将在上面创建的不同客户之间再创建几笔交易。

添加更多交易

现在,我们将创建更多交易,每笔交易都会向对方提供一些TPCoins。当有人花钱时,他不必检查这个钱包中是否有足够的余额。无论如何,矿工将针对发件人在发起交易时拥有的余额验证每笔交易。

如果余额不足,矿工将将此交易标记为无效交易,并且不会将其添加到该区块中。

以下代码将创建九个事务,并将其添加到我们的队列中。

t2 = Transaction(
   Dinesh,
   Seema.identity,
   6.0
)
t2.sign_transaction()
transactions.append(t2)
t3 = Transaction(
   Ramesh,
   Vijay.identity,
   2.0
)
t3.sign_transaction()
transactions.append(t3)
t4 = Transaction(
   Seema,
   Ramesh.identity,
   4.0
)
t4.sign_transaction()
transactions.append(t4)
t5 = Transaction(
   Vijay,
   Seema.identity,
   7.0
)
t5.sign_transaction()
transactions.append(t5)
t6 = Transaction(
   Ramesh,
   Seema.identity,
   3.0
)
t6.sign_transaction()
transactions.append(t6)
t7 = Transaction(
   Seema,
   Dinesh.identity,
   8.0
)
t7.sign_transaction()
transactions.append(t7)
t8 = Transaction(
   Seema,
   Ramesh.identity,
   1.0
)
t8.sign_transaction()
transactions.append(t8)
t9 = Transaction(
   Vijay,
   Dinesh.identity,
   5.0
)
t9.sign_transaction()
transactions.append(t9)
t10 = Transaction(
   Vijay,
   Ramesh.identity,
   3.0
)
t10.sign_transaction()
transactions.append(t10)

运行上述代码时,队列中将有十笔交易,供矿工创建其区块。

倾销交易

作为区块链经理,您可能会定期喜欢查看交易队列的内容。为此,您可以使用我们先前开发的display_transaction函数。要转储队列中的所有事务,只需迭代事务列表,然后为每个引用的事务调用display_transaction函数,如下所示-

for transaction in transactions:
   display_transaction (transaction)
   print ('--------------')

为了区别起见,交易用虚线分开。如果运行上面的代码,您将看到如下所示的事务列表-

sender:
30819f300d06092a864886f70d010101050003818d0030818902818100bb064c99c49214
4a9f463480273aba93ac1db1f0da3cb9f3c1f9d058cf499fd8e54d244da0a8dd6ddd329e
c86794b04d773eb4841c9f935ea4d9ccc2821c7a1082d23b6c928d59863407f52fa05d8b
47e5157f8fe56c2ce3279c657f9c6a80500073b0be8093f748aef667c03e64f04f84d311
c4d866c12d79d3fc3034563dfb0203010001
-----
recipient:
30819f300d06092a864886f70d010101050003818d0030818902818100be93b516b28c6e
674abe7abdb11ce0fdf5bb728b75216b73f37a6432e4b402b3ad8139b8c0ba541a72c8ad
d126b6e1a1308fb98b727beb63c6060356bb177bb7d54b54dbe87aee7353d0a6baa93977
04de625d1836d3f42c7ee5683f6703259592cc24b09699376807f28fe0e00ff882974484
d805f874260dfc2d1627473b910203010001
-----
value: 15.0
-----
time: 2019-01-14 16:18:01.859915
-----
--------------
sender:
30819f300d06092a864886f70d010101050003818d0030818902818100bb064c99c49214
4a9f463480273aba93ac1db1f0da3cb9f3c1f9d058cf499fd8e54d244da0a8dd6ddd329e
c86794b04d773eb4841c9f935ea4d9ccc2821c7a1082d23b6c928d59863407f52fa05d8b
47e5157f8fe56c2ce3279c657f9c6a80500073b0be8093f748aef667c03e64f04f84d311
c4d866c12d79d3fc3034563dfb0203010001
-----
recipient:
30819f300d06092a864886f70d010101050003818d0030818902818100a070c82b34ae14
3cbe59b3a2afde7186e9d5bc274955d8112d87a00256a35369acc4d0edfe65e8f9dc93fb
d9ee74b9e7ea12334da38c8c9900e6ced1c4ce93f86e06611e656521a1eab561892b7db0
961b4f212d1fd5b5e49ae09cf8c603a068f9b723aa8a651032ff6f24e5de00387e4d0623
75799742a359b8f22c5362e5650203010001
-----
value: 6.0
-----
time: 2019-01-14 16:18:01.860966
-----
--------------
sender:
30819f300d06092a864886f70d010101050003818d0030818902818100be93b516b28c6e
674abe7abdb11ce0fdf5bb728b75216b73f37a6432e4b402b3ad8139b8c0ba541a72c8ad
d126b6e1a1308fb98b727beb63c6060356bb177bb7d54b54dbe87aee7353d0a6baa93977
04de625d1836d3f42c7ee5683f6703259592cc24b09699376807f28fe0e00ff882974484
d805f874260dfc2d1627473b910203010001
-----
recipient:
30819f300d06092a864886f70d010101050003818d0030818902818100cba097c0854876
f41338c62598c658f545182cfa4acebce147aedf328181f9c4930f14498fd03c0af6b0cc
e25be99452a81df4fa30a53eddbb7bb7b203adf8764a0ccd9db6913a576d68d642d8fd47
452590137869c25d9ff83d68ebe6d616056a8425b85b52e69715b8b85ae807b84638d8f0
0e321b65e4c33acaf6469e18e30203010001
-----
value: 2.0
-----
time: 2019-01-14 16:18:01.861958
-----
--------------

为简便起见,我仅在列表中打印了前几笔交易。在上面的代码中,我们打印从第一个事务开始的所有事务,除了创始事务(从未添加到此列表中)。由于交易会定期添加到区块中,因此您通常只希望查看尚未开采的交易清单。在这种情况下,您将需要创建一个适当的for循环来遍历尚未挖掘的事务。

到目前为止,您已经了解了如何创建客户,允许客户之间以及如何维护待挖掘的待处理事务的队列。现在,这是本教程最重要的部分,它本身就是创建区块链。您将在下一课中学习。