Python-blockchain-creating-multiple-transactions

提供:Dev Guides
移動先:案内検索

複数のトランザクションを作成する

さまざまなクライアントによって行われたトランザクションは、システムのキューに入れられます。マイナーはこのキューからトランザクションを取得し、ブロックに追加します。 その後、彼らはブロックを採掘し、勝った採掘者はブロックをブロックチェーンに追加する特権を持ち、それによって自分のためにいくらかのお金を稼ぐでしょう。

このマイニングプロセスについては、後でブロックチェーンの作成について説明するときに説明します。 複数のトランザクションのコードを記述する前に、特定のトランザクションの内容を出力する小さなユーティリティ関数を追加しましょう。

トランザクションの表示

*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 = []

新しく作成された各トランザクションをこのキューに追加するだけです。 簡潔にするため、このチュートリアルではキュー管理ロジックを実装しないことに注意してください。

複数のクライアントを作成する

ここで、トランザクションの作成を開始します。 最初に、他の人からさまざまなサービスや商品を入手するために互いにお金を送る4つのクライアントを作成します。

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

この時点で、Dinesh、Ramesh、Seema、およびVijayという4つのクライアントがあります。 現在、これらの各クライアントは、取引のためにウォレットにTPCoinを保持していると想定しています。 これらの各クライアントのIDは、これらのオブジェクトのidentityプロパティを使用して指定されます。

最初のトランザクションの作成

今、私たちは次のように最初のトランザクションを開始します-

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

このトランザクションでは、Dineshは5つのTPCoinsをRameshに送信します。 取引を成功させるには、Dineshがこの支払いのために財布に十分なお金があることを確認する必要があります。 システムでTPCoinの循環を開始するには、ジェネシストランザクションが必要であることに注意してください。 この創世記トランザクションのトランザクションコードは、読み進めながらすぐに記述します。

Dineshの秘密鍵を使用してこのトランザクションに署名し、次のようにトランザクションキューに追加します-

t1.sign_transaction()
transactions.append(t1)

Dineshが最初に行ったトランザクションの後、上記で作成したさまざまなクライアント間にさらにいくつかのトランザクションを作成します。

トランザクションを追加する

ここでさらにいくつかのトランザクションを作成し、各トランザクションがいくつかのTPCoinを別のパーティに渡します。 誰かがお金を使うとき、彼はこの財布の十分な残高をチェックする必要はありません。 とにかくマイナーは、トランザクションを開始する間に送信者が持っている残高の各トランザクションを検証します。

残高が不足している場合、マイナーはこのトランザクションを無効としてマークし、このブロックに追加しません。

次のコードは、さらに9つのトランザクションを作成してキューに追加します。

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)

上記のコードを実行すると、鉱夫がブロックを作成するためのキューに10個のトランザクションができます。

トランザクションのダンプ

ブロックチェーンマネージャーとして、定期的にトランザクションキューの内容を確認することができます。 この目的のために、前に開発した 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
-----
--------------

簡潔にするために、リストの最初のいくつかのトランザクションのみを印刷しました。 上記のコードでは、このリストに追加されなかったGenesisトランザクションを除き、最初のトランザクションから始まるすべてのトランザクションを出力します。 トランザクションは定期的にブロックに追加されるため、通常、まだマイニングされていないトランザクションのリストのみを表示することに関心があります。 その場合、適切な for ループを作成して、まだマイニングされていないトランザクションを繰り返す必要があります。

これまで、クライアントを作成し、クライアント間でそれらを許可し、マイニングされる保留中のトランザクションのキューを維持する方法を学習しました。 さて、このチュートリアルの最も重要な部分は、ブロックチェーン自体の作成です。 これについては、次のレッスンで学習します。