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

第11回 BBc-1のアプリケーションプログラミング

この記事を読むのに必要な時間:およそ 5.5 分

前回は,githubに公開されているbbc1のfile_proof.pyというサンプルアプリケーションの使い方を紹介しました。file_proof.pyは,ファイルをcoreノードに書き込み,改ざんがないかを検証し,ファイルの所有権を移転できるツールで,BBc-1アプリケーションの主要な要素を含んでいます。そのため,アプリケーションの開発においても参考になります。今回から数回の記事は,file_proof.pyのソースコードを中心に,BBc-1のアプリケーションプログラミングについて解説します。

なお,BBc-1のアプリケーションプログラミングについては,github内にもドキュメントがありますのでご参考ください。

file_proof.pyのプログラムは,下記URLから確認いただけますが,bbc1リポジトリをgit cloneしていただけば,examples/file_proof/ディレクトリの中に格納されいます。

アプリケーションプログラムの処理の流れの全体像

BBc-1アプリケーションの処理は,主に次のような3つの流れがあります。

図1 BBc-1アプリケーション処理の主な流れ

図1 BBc-1アプリケーション処理の主な流れ

ドメイン作成は,coreノードごとに1度だけ実行します。また鍵生成も1度実行すれば,署名に使う鍵を変更しない限り再実行の必要はありません。一方,トランザクション登録は,アプリケーションの中で何度も実行する処理です。

トランザクションを作成するためには,過去のトランザクション情報が必要になることがほとんどであるため,トランザクション検索は登録の処理の流れの中に含んでいます。なお,このトランザクション登録という処理は,他のブロックチェーンプラットフォームにおいて「スマートコントラクト」と呼ばれる部分になります。

それでは,図1に沿って順番にみていきましょう。

まず,pipコマンドを用いてbbc1をインストールし,新しいターミナルを立ち上げて,coreノードを起動しておきましょう。第10回の環境整備とBBc-1 Coreのインストールや起動などをご参照ください。

BBc-1の機能を利用するには,アプリケーションプログラムの冒頭で必要なモジュールをimportしておく必要があります。file_proof.pyの中では以下のように宣言しています。ご自身でアプリケーションを開発される際にも,プログラムの冒頭に同様の宣言を記載するようにしてください。

file_proof.py 31~35行目

from bbc1.core import bbc_app
from bbc1.core.bbc_config import DEFAULT_CORE_PORT
from bbc1.core import bbclib
from bbc1.core.message_key_types import KeyType
from bbc1.core.bbc_error import *

ドメインの作成

ドメインとはデータを共有する範囲を表します。ドメインの作成は,アプリケーションの管理者(サービス提供者)が行うべき作業です。coreノード上にドメインを作成することにより,coreノードはドメインごとのデータベースを作成したりストレージを確保したりします。また接続関係にあるcoreノードに同じドメインが設定されていれば,他のcoreノードに自分の存在を知らせます。つまり,coreノードごとにドメイン作成を実施する必要があります。

ドメインを作成するコードは,file_proof.pyの129行目のdomain_setup()という関数で行われます。中を見てみましょう。

file_proof.py 129~137行目

def domain_setup():
    tmpclient = bbc_app.BBcAppClient(port=DEFAULT_CORE_PORT, multiq=False, loglevel="all")
    if os.path.exists("node_key.pem"):
        tmpclient.set_node_key("node_key.pem")
    tmpclient.domain_setup(domain_id)
    tmpclient.callback.synchronize()
    tmpclient.unregister_from_core()
    print("Domain %s is created." % (binascii.b2a_hex(domain_id[:4]).decode()))
    print("Setup is done.")

この関数では,まずcoreノードに接続します。同じホストでbbc_core.pyが動作していれば,bbc_app.BBcAppClient()という関数を呼ぶことで接続できます。引数のmultiqは,bbc_coreに対して複数の機能を同時に要求する(非同期処理)場合にTrueに指定しますが,シンプルなアプリケーションではFalseで構いません。戻り値がクライアントオブジェクトになっており(tmpclient)⁠このオブジェクトがbbc_coreに対するさまざまな機能を提供します。

tmpclient.domain_setup(domain_id)というところで,接続しているcoreノード上にdomain_idで指定された識別子のドメインを作成します。なお,domain_idはPythonのbytes型の32バイトの適当な値です(file_proof.pyの42行目で設定しています)⁠なお32バイトは256ビットで,BBc-1では識別子の長さを256ビットとしています第4回の「BBc-1の識別子たち」の節を参照)⁠ tmpclient.callback.synchronize()は,戻り値を待ちます。いわゆる同期処理のための関数です。 また,tmpclient.unregister_from_core()でcoreノードから切断します。

鍵作成

BBc-1のトランザクションには必ず署名(つまり電子署名)が必要です。署名を作るためには公開鍵ペアが必要で,ユーザ1人ひとりが異なる鍵ペアを作り,管理しておく必要があります。署名を付与する本人だけが秘密鍵を持っていて,トランザクションには対応する公開鍵と署名本体を付加します。実際には,第4回の「トランザクションの構造」の節で解説したBBcSignatureオブジェクトにこれらの情報が格納されます。

bbc1モジュールでは,KeyPairというクラスを使うことで,鍵ペアを簡単に取り扱うことができます。file_proof.pyでは432行目のcreate_keypair()という関数で鍵を生成し,保存しています。

file_proof.py 432~439行目

def create_keypair():
    keypair = bbclib.KeyPair()
    keypair.generate()
    with open(PRIVATE_KEY, "wb") as fout:
        fout.write(keypair.private_key)
    with open(PUBLIC_KEY, "wb") as fout:
        fout.write(keypair.public_key)
    print("created private_key and public_key : %s, %s" % (PRIVATE_KEY, PUBLIC_KEY))

keypair = bbclib.KeyPair()で鍵ペアオブジェクトを作成し,keypair.generate()で実際に秘密鍵と公開鍵のペアを生成します。生成された鍵は,この鍵ペアオブジェクト(keypair)が保持しています。鍵本体のバイナリデータはkeypair.private_keyやkeypair.public_keyで取得できます。また,file_proof.pyでは使っていませんが,KeyPairクラスはPEM形式やDER形式で鍵を読み書きすることも可能です。公開鍵についてはX509形式の公開鍵証明書を読み込むことも可能です。

著者プロフィール

久保健(くぼたけし)

1977年生まれ,大阪出身。

株式会社ゼタント代表取締役/一般社団法人ビヨンドブロックチェーン理事。大手通信会社の研究所での研究,企画部門でのプロジェクトマネジメントなどを経て,独立。気がつけばBeyond Blockchain One(BBc-1)のメイン開発者になっていたが,あくまで趣味の位置づけ。本業では,技術者・研究者も報われる会社を目指す。

コメント

コメントの記入