ブロックチェーンの課題と可能性~BBc-1(Beyond Blockchain One)から学ぶブロックチェーン開発

第13回BBc-1プログラミングガイド ~トランザクション検証

前回に引き続き、file_proof.pyに沿ってBBc-1プログラミングの概要を説明します。今回はトランザクションの検証方法について説明します。なお、file_proof.pyのプログラムは、下記URLから確認いただけますが、bbc1リポジトリをgit cloneしていただけば、examples/file_proof/ディレクトリの中に格納されています。

また、BBc-1のアプリケーションプログラミングに関するドキュメント群につきましては、第11回冒頭リード文にまとめていますので、ご参考ください。

トランザクションの検証

トランザクションの検証とは、トランザクションに含まれている署名が正しいか、すなわちトランザクションデータが改ざんされていないかの確認を意味します。

トランザクションの中のBBcSignatureオブジェクトに、署名情報とそれを検証するための公開鍵がセットで格納されています。署名情報はトランザクション識別子(transaction_id)を秘密鍵で暗号化したものです。署名を検証する際には、まずそのトランザクションのtransaction_idを算出します(これをtransaction_id_Xとします⁠⁠。そして、署名情報を署名に用いた秘密鍵のペアの公開鍵で復号します(復号結果をtransaction_id_Yとします⁠⁠。ここで得られた、transaction_id_Xとtransaction_id_Yが一致していれば、トランザクションは改ざんされておらず、署名検証が成功します。BBcSignatureオブジェクトは署名検証用のverify関数も提供しており、算出したトランザクション識別子(transaction_id_X)を引数としてそのメソッドを呼び出すだけでトランザクションを検証できます。なお、トランザクション識別子は、BBcTransactionオブジェクトのdigest関数を呼び出すだけで算出できます。ダイジェストの計算方法は、こちらに記載されています。

さて、具体例を見てみましょう。

file_proof.py 413~417行目(vefiry_file関数内)
transaction, fmt_type = bbclib.deserialize(response_data[KeyType.transactions][0])
digest = transaction.digest()
ret = transaction.signatures[0].verify(digest)
if not ret:
    print("Transaction data is invalid.")

このコードの直前で、第12回で紹介したsearch_transaction_with_condition関数を使ってトランザクションデータを取得しています。その検索結果であるresponse_data[KeyType.transactions][0]をbbclib.deserialize関数でBBcTransactionオブジェクトに変換しています。変換されたオブジェクトはtransactionに格納されます。次に、BBcTransactionオブジェクトのdigest関数を呼ぶことで、そのトランザクションのトランザクション識別子を計算します。その後、BBcSignatureオブジェクトのverify関数で署名を検証します。結果はretに入っており、Trueなら検証成功(valid⁠⁠、Falseなら失敗です(invalid⁠⁠。このコード例では、transactionはBBcSignatureオブジェクトを1つしか持っていないことがわかっているため、transaction.signatures[0]でverify関数を呼んでいますが、もし複数のBBcSignatureオブジェクトを持っている場合は、[0]の数値を上げてそれらすべてについてverify関数を呼んだ方がよいでしょう。

トランザクション検証の実施タイミング

トランザクションの検証は実はcoreノードの中でも実施されています。実施タイミングは以下のとおりです。

  • トランザクション登録依頼を受けたとき
  • 他のcoreノードからトランザクションの複製を受け取ったとき
  • トランザクション取得依頼を受け、トランザクションを自身のデータベースから取得したとき

登録依頼を受けたときに改ざんを検出した場合は、登録しません。

他のcoreノードから受け取った複製が改ざんされていた場合は破棄します。

取得依頼を受けたときに改ざんを検出した場合は、依頼者に改ざんされている旨を通知します。わざわざ通知するのは、⁠改ざんが発生した」という事実自体にも情報があると考えているためです(内部犯行や装置トラブルなど⁠⁠。

なお、他のcoreノードから改ざんされていないトランザクションを探して上書き・修復する機能(request_to_repair_transaction関数やrequest_to_repair_asset関数)を呼び出せば、修復できます。詳しくは、こちらをご覧ください。

このように、coreノードでも署名検証は行われていますので、アプリケーションでもわざわざ検証する必要はないと考えることもできます。しかし、coreノードが正しいことを無条件に信用するのではなく、クライアントでもその検証が可能であることが、BBc-1などのブロックチェーン関連技術の特徴だといえます。

まとめ

今回は、トランザクションを検証するためのBBc-1プログラミング方法について、file_proof.pyに沿って概要を説明しました。トランザクションの検証とは、トランザクションのデータが作成された時点のものから改ざんされていないことを確認するために、トランザクション内のBBcSignatureオブジェクトの署名を検証するということです。トランザクションにかかれている内容、file_proof.pyの例でいえば、ファイルの所有者が誰なのかという事実そのものを検証するわけではないことに注意してください。

次回は2者間でトランザクションの内容に合意する方法について説明する予定です。

おすすめ記事

記事・ニュース一覧