- Python区块链教程
- Python区块链 - 首页
- Python区块链 - 简介
- 区块链 - 开发客户端
- 区块链 - 客户端类
- 区块链 - 交易类
- 创建多个交易
- 区块链 - 区块类
- 区块链 - 创建创世区块
- 区块链 - 创建区块链
- 区块链 - 添加创世区块
- 区块链 - 创建矿工
- 区块链 - 添加区块
- 区块链 - 范围与结论
- Python区块链资源
- Python区块链 - 快速指南
- Python区块链 - 资源
- Python区块链 - 讨论
创建多个交易
各个客户端进行的交易会排队进入系统;矿工会从这个队列中提取交易并将其添加到区块中。然后他们会挖掘该区块,获胜的矿工将有权将该区块添加到区块链中,从而为自己赚取一些钱。
我们稍后在讨论区块链创建时会描述这个挖掘过程。在我们编写多个交易的代码之前,让我们添加一个小的实用函数来打印给定交易的内容。
显示交易
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 的全局 list 变量,如下所示:
transactions = []
我们将简单地将每个新创建的交易添加到此队列中。请注意,为简洁起见,我们不会在此教程中实现队列管理逻辑。
创建多个客户端
现在,我们将开始创建交易。首先,我们将创建四个客户端,他们将互相发送钱以从他人那里获得各种服务或商品。
Dinesh = Client() Ramesh = Client() Seema = Client() Vijay = Client()
此时,我们有四个名为 Dinesh、Ramesh、Seema 和 Vijay 的客户端。我们目前假设这些客户端中的每一个都在他们的钱包中持有一些 TPCoin 用于交易。这些客户端的身份将使用这些对象的 identity 属性来指定。
创建第一笔交易
现在,我们启动我们的第一笔交易,如下所示:
t1 = Transaction( Dinesh, Ramesh.identity, 15.0 )
在这笔交易中,Dinesh 向 Ramesh 发送 5 个 TPCoin。为了使交易成功,我们必须确保 Dinesh 的钱包中有足够的钱进行此付款。请注意,我们将需要一笔创世交易来启动系统中的 TPCoin 流通。您将在阅读过程中很快编写这笔创世交易的代码。
我们将使用 Dinesh 的私钥签署此交易,并将其添加到交易队列中,如下所示:
t1.sign_transaction() transactions.append(t1)
在 Dinesh 进行第一笔交易后,我们将创建更多在上面创建的不同客户端之间的交易。
添加更多交易
现在,我们将创建更多交易,每笔交易都向另一方支付少量 TPCoin。当有人花钱时,他不必检查其钱包中是否有足够的余额。无论如何,矿工在发起交易时都会验证发送者拥有的余额。
如果余额不足,矿工会将此交易标记为无效,并且不会将其添加到此区块中。
以下代码创建并向我们的队列添加了九个交易。
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 函数。要转储队列中的所有交易,只需迭代 transactions 列表,并为每个引用的交易调用 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 循环来迭代尚未挖掘的交易。
到目前为止,您已经学习了如何创建客户端、允许他们在彼此之间进行交易以及维护待挖掘的未决交易队列。现在,本教程最重要的部分来了,那就是创建区块链本身。您将在下一课中学习这一点。