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

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

def __init__(self, sender, recipient, value):
   self.sender = sender
   self.recipient = recipient
   self.value = value
   self.time = datetime.datetime.now()

ザ・ init メソッドは3つのパラメータを取ります-送信者の public キー、受信者の publicキー、および送信される量。これらは、他のメソッドで使用するためにインスタンス変数に格納されます。さらに、トランザクションの時間を格納するための変数をもう1つ作成します。

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

以前のチュートリアルからご存知のように、ブロックチェーンの最初のブロックは 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 クラス。

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

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

Dinesh = Client()
Ramesh = Client()

インスタンス化するときは、 Client クラス、 public andクライアントに固有の秘密鍵が作成されます。DineshはRameshに支払いを送信しているため、クライアントのIDプロパティを使用して取得した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

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