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

第10回file_proof.pyでBBc-1を体験しよう

前回は、GitHubのbbc1リポジトリのドキュメントについて紹介しました。ドキュメントを読んでいただきつつも、BBc-1の雰囲気を理解するための近道はサンプルを使っていただくことです。

bbc1リポジトリには、file_proof.pyというサンプルアプリケーションが入っています。これは、ファイルをcoreノードに書き込み、改ざんがないかを検証し、ファイルの所有権を移転できるツールです。

なお、このツールにおけるファイルの所有権とは、BBc-1トランザクションの中に「XXXの所有物です」と記述があり、その人の署名がついているかどうかで表現されます。つまり所有権の移転とは、XXXさんの所有物だったファイルについて、⁠YYYの所有物です」というXXXさんとYYYさんの署名付きトランザクションをBBc-1に登録することを意味します。

以降では、file_proof.pyの準備と利用方法について説明します。

環境整備

bbc1リポジトリに入っているプログラムはPython3で実装されています。まずはPython3および関連ライブラリをビルドするための環境を作る必要があります。ここでは、Linux(Ubuntu)やmacOSを前提として説明します。Python3のセットアップについては、詳細には説明しませんが、virtualenvを使って仮想環境を構築する前提で説明します。

ターミナルを起動してから、以下のコマンドで必要なツールをインストールしてください。

Linux(Ubuntu)の場合
# sudo apt-get install -y git tzdata openssh-server python3 python3-dev libffi-dev net-tools autoconf automake libtool libssl-dev make
macOSの場合(Homebrewを使います)
# brew install libtool automake python3

以下、LinuxとmacOS共通です。シェルはBashを利用することを前提にしています。

# python3 -mvenv venv
# source venv/bin/activate
# pip install bbc1

最初の2行は、カレントディレクトリにvenvという仮想環境を作り、その中に入るためのコマンドです。Python3のモジュール群をディレクトリごとに管理でき、OS全体に影響を与えないようにするための仕組みです。最後のpip installでbbc1およびそれに必要なPython3モジュール群がインストールされます。bbc1本体のインストール時に、OpenSSLという暗号化ライブラリをビルドするためかなり時間がかかりますが、気長にお待ち下さい。

うまくインストールできれば、

# file_proof.py -h

とすれば、ツールを起動するためのオプションが書かれた以下のようなヘルプが表示されます。

コマンド実行時の画面出力
usage: file_proof.py [-h]
                     {store,get,remove,list,update,verify,keypair,wait,send,setup}
                     ...

positional arguments:
  {store,get,remove,list,update,verify,keypair,wait,send,setup}
                        commands
    store               Store a file
    get                 Get a file
    remove              Remove a file
    list                Get a file list
    update              Update a file
    verify              Verify a file
    keypair             Create a key pair
    wait                Wait for receiving a file
    send                Send a file
    setup               Setup domain and asset group

optional arguments:
  -h, --help            show this help message and exit

これで準備完了です。いよいよ動作させてみましょう。

file_proof.pyを使ってみる

BBc-1 Coreのインストールや起動

file_proofの基本的な使い方は、BBc-1 Coreチュートリアル:file_proofを用いてで説明されていますので、こちらを参考にBBc-1 Coreのインストールや起動などを設定しておいてください。

新しくターミナルを立ち上げたときなどは、venvというディレクトリがあるところで、

# source venv/bin/activate

とするのを忘れないようにしてください。このコマンドで、bbc1がインストールされた仮想環境に入ります。

このツールは、BBc-1のアプリケーションですので、まずはcoreノードが必要です。coreノードの機能を動かすためには、以下のコマンドを打ちます。

# bbc_core.py --no_nodekey

“–no_nodekey⁠というのは、誰でもcoreノードに接続できるようにするオプションです。このオプションを指定しなければnodekeyという暗号鍵を持っているアプリしかcoreノードに接続できません。

coreノードが起動すると、実行したディレクトリに⁠.bbc1/⁠という名前のディレクトリが作られます。デフォルト設定では、このディレクトリの中にトランザクションおよびアセット(つまりファイル本体)がすべて格納されます。このディレクトリは削除しないようにしてください。

次に別のターミナルを開いて(新規ウィンドウを開いて⁠⁠、⁠source venv/bin/activate⁠というコマンドで仮想環境に入ってください。いよいよfile_proof.pyの出番です。file_proof.pyではファイルの所有権を示すために、BBc-1トランザクションを生成します。そのトランザクションには自分の所有物であること、また所有権を移転することの合意を表すために電子署名を付与します。そのため、自分専用の公開鍵ペアを作る必要があります。

# file_proof.py keypair

上記のコマンドを実行すると、カレントディレクトリに.private_keyと.public_keyという2つのファイルが生成されます(なお、本当は証明書などの形式にすべきところですが、簡易アプリなので単純なバイナリ形式のファイルになっています⁠⁠。なお、Finderなどのフォルダ表示ツールでは、ドット⁠.⁠で始まるファイル名は表示されない設定になっているかもしれません。もし表示されない場合は、ターミナルで⁠ls -a⁠というコマンドを実行すれば、ファイルの存在を確認できます。

さらに、coreノードにこのアプリケーション用のドメインを作成する必要がありますので、以下のコマンドを実行します。なおこのコマンドは、最初の1回だけ実行すれば大丈夫です。

# file_proof.py setup

これで、準備完了です。

ファイルの登録

では、ファイルを生成してから、ファイルを登録してみましょう。 今回はtestfile.txtという名前のテキストファイルにしますが、どんな形式のファイルでも構いません。またすでに存在するファイルを登録することも可能ですので、下記の説明の中の⁠testfile.txt⁠の部分を適宜読み替えてください。

# cat > testfile.txt
BBC HEAVEN.

念の為、⁠ls⁠コマンドでファイルが作成されているかを確認しましょう。

# ls

./      ../     testfile.txt

このように、testfile.txtが表示されれば大丈夫です。次に別のターミナルを開いて(新規ウィンドウを開いて⁠⁠、ファイルを登録します。

# file_proof.py store testfile.txt -o userA

これで、testfile.txtで指定したファイルがcoreノードに登録され、さらにuserAという名前のユーザが所有者である旨がトランザクションとして登録されます。そして登録したトランザクションの情報が表示されます。以下はその実行結果のターミナル出力の一部です。Bodyというところに、指定した名前のuserAが書かれている(body: b'Owner is userA')のが確認できます。

Relation[]: 1
 [0]
  asset_group_id: b'45b2a200ccdcdcc3fb80cc9d423e1069f3ca726157f6492b4a70a48e4a1713ab'
  Asset:
     asset_id: b'd2e509a4002b664b9c651c3bbf95f583bbfe2065eeeb63a5f20e903de20a2ba5'
     user_id: b'9367417d63903350aeb7e092bca792263d4fd82d4912252e014e073a8931b4c1'
     nonce: b'78d4e9d8c78175bc5bae25393d7afb66e39610ce73908f00a1203efe0a0614ae'
     file_size: 12
     file_digest: b'6aa951c7eb5886694b56ec7f74075f9d410cf9c9fb68d66ca889da5097066e3c'
     body_size: 14
     body: b'Owner is userA’

なお、先ほどご紹介したように⁠.bbc1/⁠配下にトランザクションやアセットが格納されており、とても長い名前のディレクトリやファイルが含まれています。もしご興味がありましたら、中を覗いてみてください。

登録したファイルの検証

では、次に登録したファイルを検証してみましょう。

# file_proof.py verify testfile.txt

上記のコマンドで、指定したファイルが登録されているファイルと同一であるかを検証します。少しわかりにくいですが、出力された結果の最初の行に、

testfile.txt is valid
done verify testfile.txt

となっていれば問題なしです。

試しにtestfile.txtの中身を、テキストエディタなどで、1文字書き換えて保存して、もう一度⁠verify⁠のコマンドを入力してみてください。すると以下のように、

testfile.txt is invalid
done verify testfile.txt

と、validがinvalidというように、表示内容が変わります。

ファイル所有権の移転

file_proofでは、生成したファイルを削除や復元したり、送受信したりできます。基本的なコマンドや操作は前述のBBc-1 Coreチュートリアル:file_proofを用いてで説明していますので、今回はファイル所有権の移転を紹介します。もう1つ別のターミナルを起動して(新規ウィンドウで開いて⁠⁠、別のディレクトリで鍵ペアを作ってください。便宜上、このディレクトリでの作業はBさん、さきほどstoreしたのをAさんという、2人のユーザの作業とします。

~Bさん(新規ウィンドウで)
# source venv/bin/activate
# mkdir otherDir/
# cd otherDir
# file_proof.py keypair

次に、ファイルの移転を待ち受けます

# file_proof.py wait -o userB

すると、次のように表示され、待受状態になります。

Your name is [ userB ] and user_id is [ 16進数の文字列 ]
Waiting for file transfer.....
~Aさん(さきほどstoreしたターミナルで)

testfile.txtで指定したファイルの所有権をBさんに移転します。

# file_proof.py send testfile.txt -o userA

すると、次のように表示され、入力待ち状態になります。

Your name is [ userA ] and user_id is [ 16進数の文字列 ]
Please enter the receiver user name for file testfile.txt.
>> 

最後に、送り先のユーザ名の入力を求められるので、userBと入力してenterキーを押します。

~Bさんでのファイル受け入れ~

Bさんのターミナルに次のように表示されます。

--------------------------
File digest written in the transaction data:   ⁠16進数の文字列⁠⁠
File digest calculated from the received file: ⁠16進数の文字列⁠⁠
--------------------------
====> Do you want to accept the file?
(Y/N) >>

⁠16進数の文字列⁠の部分はファイルによって異なりますが、大事なのは2つがまったく同じ文字列であることです。一致していないものは何らかの不正が考えられます。このファイルの所有権を受け入れるならYを、受け入れないならNを入力して、enterキーを押します。 ここでは、Yを押しておきましょう。

Waiting for the message from the sender...
--> file name is testfile.txt and the transaction_id is ⁠16進数の文字列⁠

と出れば、移転完了です。なお、ファイル自体が手に入るわけではなく、所有権のみが移転しました。ファイルが必要な場合は、下記のようにしてファイルを取得してください。

# file_proof.py get testfile.txt

以上がfile_proof.pyの一部使い方の紹介です。

まとめ

今回は、サンプルアプリケーションのfile_proof.pyの使い方を紹介しました。このfile_proof.pyには、BBc-1の多くの要素が含まれています。次回以降、file_proof.pyをベースにして、BBc-1プログラミングについて紹介する予定です。

おすすめ記事

記事・ニュース一覧