Python区块链教程:如何创建多个交易并加入队列
本文详解在Python区块链中创建多个交易的方法。通过定义Client和Transaction类,将多笔交易加入待处理队列,并由矿工验证余额后打包。教程涵盖交易签名、队列遍历及显示逻辑,帮助理解区块链交易从生成到上链的基本流程。
创建多个交易
系统中,各客户发起的交易会进入排队状态;矿工从该队列中选取交易,将其打包进区块。随后进行区块挖矿,获胜的矿工获得将区块附加至区块链的权利,并以此获取收益。
关于区块链的创建与挖掘过程,将在后续章节详细讨论。在编写多交易代码前,先添加一个辅助函数,用于打印指定交易的具体内容。
显示事务
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 的列表变量,具体实现如下。
transactions = []只需将每个新创建的交易对象追加至该队列。请注意,为保持教程简洁,此处未实现完整的队列管理逻辑。
创建多个客户端
现在开始创建交易。首先,创建四个客户,他们将相互汇款以获取各种服务或商品。
Dinesh = Client()
Ramesh = Client()
Seema = Client()
Vijay = Client()此时,我们有四个客户:Dinesh、Ramesh、Seema 和 Vijay。假设每个客户的钱包中持有一定数量的 TPCoins 用于交易。通过指定每个客户端对象的标识属性来确立其身份。
创建第一个事务
首先启动如下交易:
t1 = Transaction(
Dinesh,
Ramesh.identity,
15.0
)在此交易中,Dinesh 向 Ramesh 发送了 5 个 TPCoins。为确保交易成功,必须保证 Dinesh 钱包中有足够余额支付该款项。注意,系统中需要存在一个创世交易(genesis transaction)来启动 TPCoins 的流通。读者稍后将编写此创世交易的代码。
使用 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 循环来迭代未开采的交易。
至此,您已学会如何创建客户端,允许它们相互交易,并维护待挖掘的交易队列。接下来是本教程最重要的部分:创建区块链。更多关于 Python 区块链创建交易的资料,请关注本站其他相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













