Python Blockchain 简明教程
Creating Multiple Transactions
由多个客户端进行的交易在系统中排队;矿工从这个队列中选取交易,并将其添加到区块。然后,他们将挖掘区块,获胜的矿工有权将区块添加到区块链,从而为自己赚取一些钱。
当我们讨论区块链的创建时,稍后我们将描述这个挖掘过程。在我们编写用于多笔交易的代码之前,让我们添加一个小的实用的函数来打印给定交易的内容。
Displaying 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 ('-----')
接下来,我们定义一个事务队列来存储我们的事务对象。
Transaction Queue
若要创建一个队列,我们声明一个名为 transactions 的全局 list 变量,如下所示 −
transactions = []
我们将简单地把每个新创建的事务附加到此队列。请注意,为了简洁,我们不会在本教程中实现队列管理逻辑。
Creating Multiple Clients
现在,我们将开始创建事务。首先,我们将创建四个客户端,他们将彼此发送资金,以从其他方获取各种服务或商品。
Dinesh = Client()
Ramesh = Client()
Seema = Client()
Vijay = Client()
此时,我们有四个客户端,分别称为 Dinesh、Ramesh、Seema 和 Vijay。我们目前假设,这些客户端每人都持有钱包中的 TPCoin,以便进行交易。这些客户端每个人的身份都将通过使用这些对象的 identity 属性来指定。
Creating First Transaction
现在,我们启动我们的第一个事务,如下所示 −
t1 = Transaction(
Dinesh,
Ramesh.identity,
15.0
)
在此事务中,Dinesh 向 Ramesh 发送 5 个 TPCoin。为了使事务成功,我们将不得不确保 Dinesh 钱包中有足够的资金用于此付款。请注意,我们需要一个创世事务来启动系统中的 TPCoin 流通。您将很快在阅读的同时编写此创世事务的事务代码。
我们将使用 Dinesh 的私钥对该事务进行签名,并将其添加到事务队列,如下所示 −
t1.sign_transaction()
transactions.append(t1)
在 Dinesh 进行第一个交易之后,我们将在上面创建的不同客户端之间创建更多交易。
Adding More Transactions
我们现在将创建更多的事务,每个事务向另一方提供几枚 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)
当您运行以上代码时,队列中将有十笔交易供矿工创建区块。
Dumping Transactions
作为区块链管理器,您可能定期查看交易队列的内容。为此,您可以使用我们先前开发的 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 循环来迭代尚未开采的事务。
到目前为止,您已经了解了如何创建客户端,允许它们相互使用,并维护一个待开采的未决交易的队列。现在,是本教程中最重要的部分,即创建区块链本身。您将在下一课中学习此内容。