Python-blockchain-transaction-class

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

Pythonブロックチェーン-トランザクションクラス

この章では、クライアントが誰かにお金を送ることができるように Transaction クラスを作成しましょう。 クライアントは、お金の送信者または受信者の両方になることができることに注意してください。 お金を受け取りたいときは、他の送信者がトランザクションを作成し、その中に*公開*アドレスを指定します。 私たちは次のようにトランザクションクラスの初期化を定義します-

def __init__(self, sender, recipient, value):
   self.sender = sender
   self.recipient = recipient
   self.value = value
   self.time = datetime.datetime.now()
*init* メソッドは、送信者の*公開*キー、受信者の*公開*キー、および送信金額の3つのパラメーターを取ります。 これらは、他のメソッドで使用するためにインスタンス変数に保存されます。 さらに、トランザクションの時間を保存するためのもう1つの変数を作成します。

次に、上記の4つのインスタンス変数すべてをディクショナリオブジェクトに結合する to_dict というユーティリティメソッドを記述します。 これは、1つの変数を介してトランザクション情報全体にアクセスできるようにするためです。

前のチュートリアルで知っているように、ブロックチェーンの最初のブロックは Genesis ブロックです。 Genesisブロックには、ブロックチェーンの作成者によって開始された最初のトランザクションが含まれます。 この人物の身元は、ビットコインの場合のように秘密にされる場合があります。 したがって、この最初のトランザクションが作成されると、作成者は自分のIDを Genesis として送信するだけです。 したがって、ディクショナリの作成中に、送信者が Genesis であるかどうかを確認し、そうであれば、単純にID変数に何らかの文字列値を割り当てます。それ以外の場合は、送信者のIDを identity 変数に割り当てます。

if self.sender == "Genesis":
   identity = "Genesis"
else:
   identity = self.sender.identity

次のコード行を使用して辞書を作成します

return collections.OrderedDict({
   'sender': identity,
   'recipient': self.recipient,
   'value': self.value,
   'time' : self.time})
*to_dict* メソッドのコード全体を以下に示します-
def to_dict(self):
   if self.sender == "Genesis":
      identity = "Genesis"
   else:
      identity = self.sender.identity

   return collections.OrderedDict({
      'sender': identity,
      'recipient': self.recipient,
      'value': self.value,
      'time' : self.time})

最後に、送信者の秘密鍵を使用してこの辞書オブジェクトに署名します。 前と同様に、SHAアルゴリズムを備えた組み込みのPKIを使用します。 生成された署名はデコードされ、ASCII表現を取得して印刷し、ブロックチェーンに保存します。 sign_transaction メソッドのコードはここに示されています-

def sign_transaction(self):
   private_key = self.sender._private_key
   signer = PKCS1_v1_5.new(private_key)
   h = SHA.new(str(self.to_dict()).encode('utf8'))
   return binascii.hexlify(signer.sign(h)).decode('ascii')

この Transaction クラスをテストします。

トランザクションクラスのテスト

この目的のために、 Dinesh および Ramesh という2人のユーザーを作成します。 Dineshは、5つのTPCoinsをRameshに送信します。 最初に、DineshおよびRameshというクライアントを作成します。

Dinesh = Client()
Ramesh = Client()
*Client* クラスをインスタンス化すると、クライアントに固有の* publicおよび *privateキーが作成されることに注意してください。 DineshはRameshに支払いを送信するため、クライアントのidentityプロパティを使用して取得したRameshの公開キーが必要になります。

したがって、次のコードを使用してトランザクションインスタンスを作成します-

t = Transaction(
   Dinesh,
   Ramesh.identity,
   5.0
)

最初のパラメーターは送信者であり、2番目のパラメーターは受信者の公開鍵であり、3番目のパラメーターは転送される金額であることに注意してください。* sign_transaction *メソッドは、トランザクションを歌うための最初のパラメーターから送信者の秘密鍵を取得します。

トランザクションオブジェクトを作成したら、 sign_transaction メソッドを呼び出して署名します。 このメソッドは、生成された署名を印刷可能な形式で返します。 次の2行のコードを使用して署名を生成および印刷します-

signature = t.sign_transaction()
print (signature)

上記のコードを実行すると、次のような出力が表示されます-

7c7e3c97629b218e9ec6e86b01f9abd8e361fd69e7d373c38420790b655b9abe3b575e343c7
13703ca1aee781acd7157a0624db3d57d7c2f1172730ee3f45af943338157f899965856f6b0
0e34db240b62673ad5a08c8e490f880b568efbc36035cae2e748f1d802d5e8e66298be826f5
c6363dc511222fb2416036ac04eb972

クライアントとトランザクションを作成する基本的なインフラストラクチャの準備ができたので、実際の状況と同様に、複数のクライアントが複数のトランザクションを実行します。